SpringMVC(二)——流程控制
SpringMVC主要就是用来做流程控制的,这篇博客总结一下如何在流程控制添加Interceptor(拦截器),如何将进行流程Mapping映射解析,如何编写Controller(控制器)。
一,首先看一下框架中的映射解析器,用来将uri和控制器进行绑定的:
1, SpringMVC框架的默认解析器采用是:bean的name属性名称作为URI,与控制器进行映射绑定,BeanNameUrlHandlerMapping。例如:
- <span style="font-size:18px;"> <bean id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
- <bean name="/hello.html" class="com.ljh.springmvc.controller.HelloWorldController"></bean>
- </span>
这种情况看起来是很方便的,直接将uri和类进行了绑定。但是耦合性高了些,我们一般是希望将uri和类的id进行绑定,这样方便我们后期的修改,看下边框架为我们提供的这个对象。
2,SimpleUrlHandlerMapping :通过映射关系将请求路径和控制器绑定在一起,设置更加灵活。这里看个例子:
- <span style="font-size:18px;"> <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="urlMap">
- <map>
- <entry key="/hello*.html" value-ref="hello"></entry>
- </map>
- </property>
- </bean>
- <!-- 控制器类 -->
- <bean id="hello" class="com.ljh.springmvc.controller.HelloWorldController"></bean>
- </span>
这种方法,是将uri和类的id进行绑定,使彼此的耦合性更加低,独立性更高了。这样就将我们的映射关系和类独立开来了。当然了两个都可以,根据实际情况选择即可。这是我们两种最常用的映射解析器。
二,Interceptor,通过编写Interceptor可以对控制器进行拦截,对框架进行功能扩展,非常实用的。看一下如何将自己写的Interceptor融入到框架中。
1,自定义拦截器需要继承HandlerInterceptorAdapter父类,或者实现HandlerInterceptor接口。这里简单看一个方法前后打印系统时间的小拦截器:
- <span style="font-size:18px;"> public class TimeInterceptor extends HandlerInterceptorAdapter {
- //整个流程请求完成之后要执行的操作。
- @Override
- public void afterCompletion(HttpServletRequest request,
- HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- System.out.println("invoke afterCompletion..."+new Date());
- }
- //请求控制器结束后做的操作
- @Override
- public void postHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler,
- ModelAndView modelAndView) throws Exception {
- System.out.println("invoke postHandle..."+new Date());
- }
- //请求控制器执行之前做的操作
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- System.out.println("invoke preHandle..."+new Date());
- return true;
- }
- }
- </span>
2,当然编写了拦截器后,就需要配置到我们的配置文件SpringMVC-servlet.xml中进行声明配置:
- <span style="font-size:18px;"> <!-- 拦截器 -->
- <bean id="timeInterceptor" class="com.ljh.springmvc.interceptor.TimeInterceptor"></bean></span>
3,这里还需要在SpringMVC-servlet.xml文件中配置,我们设置的拦截器对那些控制器起作用,这里声明拦截器和控制器的关系组合,利用SimpleUrlHandlerMapping进行映射的:
- <span style="font-size:18px;"> <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="interceptors">
- <list>
- <ref bean="timeInterceptor"/>
- </list>
- </property>
- <property name="urlMap">
- <map><!-- SpringMVC提供了特殊的匹配方式 -->
- <entry key="/hello*.html" value-ref="hello"></entry>
- </map>
- </property>
- </bean></span>
这样就可以起作用了,对框架的功能扩展相对来说还是比较方便的。
三,最后看我们的Controller控制器的编写吧,这里的Controller和Struts2里边的action是相同的,但是这里有了侵入性。一般情况下需要实现Controller接口,上一遍博客有演示,同时也可以采用继承父类的方式,这里来看几个继承不同的父类,实现不同的功能。
1,继承AbstractController,这个和接口差不多,需要我们重写里边的方法,主要的是,一般情况下,需要将此方法由父类的protected该外public的类型,供其他类的使用,其中方法名是固定的,我们指定路径和此类即可由框架帮助我们调其中的方法。这里不再举例。
2,继承MultiActionController(多动作控制器),这样我们可以增加多个方法,处理多个客户的请求,例如:
- <span style="font-size:18px;"> public class MultiController extends MultiActionController {
- //自定义处理请求的方法,命名规则参照父类的handleRequestInternal
- public ModelAndView insert(HttpServletRequest request,HttpServletResponse response) throws Exception {
- return new ModelAndView("insertSuccess");
- }
- public ModelAndView delete(HttpServletRequest request,HttpServletResponse response) throws Exception {
- return new ModelAndView("deleteSuccess");
- }
- }
- </span>
看一下配置文件的映射编写吧:
- <span style="font-size:18px;"> <!-- 声明控制器类--> <bean id="multi" class="com.ljh.springmvc.controller.MultiController"></bean>
- <!--增加映射关系,注意其中uri的模糊匹配-->
- <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="urlMap">
- <map>
- <entry key="/multi-*.html" value-ref="multi"></entry>
- </map>
- </property>
- </bean>
- <!-- 增加映射关系:将请求的uri与控制中执行的方法进行映射-->
- <bean id="multiActionController" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
- <property name="methodNameResolver" ref="methodNameResolver"></property>
- <property name="delegate"> <!-- 委托,将目标对象委托给此对象进行路径和方法的映射 -->
- <ref bean="multi"/>
- </property>
- </bean>
- <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
- <property name="mappings">
- <props>
- <prop key="/multi-insert.html">insert</prop>
- <prop key="/multi-delete.html">delete</prop>
- </props>
- </property>
- </bean>
- </span>
3,继承AbstractCommandController,指令控制器,用于获取页面的参数,将参数封装到指定的对象模型中。类似于Struts2框架的模型驱动。例如:
- <span style="font-size:18px;"> public class DemoController extends AbstractCommandController {
- public DemoController(){
- this.setCommandClass(User.class); //这个就是用于接收客户端请求参数的数据模型类。
- }
- //command参数就是在构造方法中指定的数据模型对象。
- //SpringMVC框架将请求参数,封装到指定的数据模型对象中,传递给handle方法来使用。
- @Override
- protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response, Object command, BindException errors)
- throws Exception {
- User user = (User)command ;
- System.out.println(user.getUsercode());
- System.out.println(user.getUserpswd());
- return new ModelAndView("test");
- }
- }
- </span>
对于配置文件的映射就是类和路径的映射,这里不再赘述。这种方法就是将页面传过来的数据直接封装到了指定的对象,我们可以直接使用,非常方便。
综上,为SpringMVC流程控制方面的一些内容。其实任何的MVC框架都无在乎,核心控制器,映射文件,对应的action类,扩展可以通过拦截器,过滤器等。明白了大致方向,一些小的问题,我们可以通过查看API文档,那才是我们开发有力的助手!!!
SpringMVC(二)——流程控制的更多相关文章
- Python流程控制if判断以及whlie循环
一.基本运算符补充 1. 算术运算 print(10 / 3) print(10 // 3) print(10 ** 2) 2. 赋值运算 ...
- 04 Python入门学习-流程控制(if else elif while for)
一:流程控制if 语法一: if 条件: code1 code2 code3 ... age = 20 height = 170 weight = 60 sex = 'female' is_beaut ...
- 流程控制主while,for,python画金字塔,画9*9乘法表
5.6 自我总结 一.流程控制while 1.while while True: #while + 条件满足进行下面的循环 age = input('age:') #while 循环的内容 2.whi ...
- 数据类型(三) + 流程控制(一) day05
目录 昨日回顾 (三) 花式赋值 链式赋值 交叉赋值 (四) 列表list (五) 字典dict (六) 布尔值 (七) 解压缩 (八) python与用户交互的方式 (九) 三种格式化输出的方式 f ...
- Dart:3.Dart运算符、流程控制
一 . 运算符 以下列出 Dart 的运算符,从高到低按照优先级排列: 描述 运算符 一元运算符(后置) expr++ expr-- () [] . ?. 一元运算符(前置) -expr !expr ...
- Java中的流程控制(二)
关于Java程序的流程控制(二) 关于Java程序的流程控制(二) 3.switch选择语句 switch语句用于将一个表达式的值同许多其他值比较,并按比较结果选择下面该执行哪些语句. switch( ...
- JAVA之旅(二)——if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结
JAVA之旅(二)--if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结 JAVA的思想真的很重要,所以要专心的学-- ...
- C#基础课程之二变量常量及流程控制
课堂练习:.一个四位整数 输出它的千位,百位,十位,个位 数字. ; ; % ; % ; ; Console.WriteLine("千位数" + b+" 百位数" ...
- Go语言入门(二)Go语言中的变量、常量、数据类型、流程控制以及函数
Go语言中的变量 通常用var关键声明变量,有常规方式和简化方式. 常规方式: var name1 type1 name1 = value1 //赋值 简化方式: var name2 = value1 ...
随机推荐
- PHP设计模式笔记四:适配器模式 -- Rango韩老师 http://www.imooc.com/learn/236
适配器模式 1.适配器模式,可以将截然不同的函数接口封装成统一的API 2.实际应用举例,PHP的数据库操作有mysql.mysqli.pdo三种,可以用适配器模式统一成一致,类似的场景还有cache ...
- how tomcat works 读书笔记(一)----------一个简单的webserver
http协议 若是两个人能正常的说话交流,那么他们间必然有一套统一的语言规则<在网络上server与client能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertex ...
- android 新浪微博客户端的表情功能的实现
这是一篇好文章,我转来收藏,技术的最高境界是分享. 最近在搞android 新浪微博客户端,有一些心得分享弄android客户端表情功能可以用以下思路1.首页把新浪的表情下载到本地一文件夹种,表情图片 ...
- python - socket练习(输入系统命令)
socket_server端代码: #!/usr/bin/env python # -*- coding:utf-8 -*- # Auther: pangguoping import socket i ...
- VS2015 新Web项目(C#6)出现CS1617异常的解决
VS2015 新Web项目(C#6)出现CS1617错误的解决 VS2015新增了对C#6的支持. 在新的Web项目模板中通过引入nuget包Microsoft.CodeDom.Providers.D ...
- SqlDbType与DbType这间的转换关系
SqlDbType => DbType SqlDbType.BigInt DbType.Int64 SqlDbType.Binary DbType.Binary SqlDbType.Bit Db ...
- unity碰撞组件、刚体组件
游戏导入标准资源包“Character Controllers”后可以为游戏对象添加 character(角色控制器)组件: 添加角色控制器组建以后可以控制游戏对象移动: 角色控制器组件因为与碰撞组件 ...
- bootstrap小结
bootstrap总结 bootstrap总结 base css 我分为了几大类 1,列表 .unstyled(无样式列表),.dl-horizontal(dl列表水平排列) 2,代码 code(行级 ...
- hdu1520 第一道树形DP,激动哇咔咔!
A - 树形dp Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- eclipse 添加jar包的方式
参考资料地址:http://blog.csdn.net/mazhaojuan/article/details/21403717