标签:style blog http io ar color os 使用 sp
SpringMVC主要就是用来做流程控制的,这篇博客总结一下如何在流程控制添加Interceptor(拦截器),如何将进行流程Mapping映射解析,如何编写Controller(控制器)。
一,首先看一下框架中的映射解析器,用来将uri和控制器进行绑定的:
1, SpringMVC框架的默认解析器采用是:bean的name属性名称作为URI,与控制器进行映射绑定,BeanNameUrlHandlerMapping。例如:
-
<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 :通过映射关系将请求路径和控制器绑定在一起,设置更加灵活。这里看个例子:
-
<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>
这种方法,是将uri和类的id进行绑定,使彼此的耦合性更加低,独立性更高了。这样就将我们的映射关系和类独立开来了。当然了两个都可以,根据实际情况选择即可。这是我们两种最常用的映射解析器。
二,Interceptor,通过编写Interceptor可以对控制器进行拦截,对框架进行功能扩展,非常实用的。看一下如何将自己写的Interceptor融入到框架中。
1,自定义拦截器需要继承HandlerInterceptorAdapter父类,或者实现HandlerInterceptor接口。这里简单看一个方法前后打印系统时间的小拦截器:
-
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;
-
}
-
}
2,当然编写了拦截器后,就需要配置到我们的配置文件SpringMVC-servlet.xml中进行声明配置:
-
-
<bean id="timeInterceptor" class="com.ljh.springmvc.interceptor.TimeInterceptor"></bean>
3,这里还需要在SpringMVC-servlet.xml文件中配置,我们设置的拦截器对那些控制器起作用,这里声明拦截器和控制器的关系组合,利用SimpleUrlHandlerMapping进行映射的:
-
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
-
<property name="interceptors">
-
<list>
-
<ref bean="timeInterceptor"/>
-
</list>
-
</property>
-
<property name="urlMap">
-
<map>
-
<entry key="/hello*.html" value-ref="hello"></entry>
-
</map>
-
</property>
-
</bean>
这样就可以起作用了,对框架的功能扩展相对来说还是比较方便的。
三,最后看我们的Controller控制器的编写吧,这里的Controller和Struts2里边的action是相同的,但是这里有了侵入性。一般情况下需要实现Controller接口,上一遍博客有演示,同时也可以采用继承父类的方式,这里来看几个继承不同的父类,实现不同的功能。
1,继承AbstractController,这个和接口差不多,需要我们重写里边的方法,主要的是,一般情况下,需要将此方法由父类的protected该外public的类型,供其他类的使用,其中方法名是固定的,我们指定路径和此类即可由框架帮助我们调其中的方法。这里不再举例。
2,继承MultiActionController(多动作控制器),这样我们可以增加多个方法,处理多个客户的请求,例如:
-
public class MultiController extends MultiActionController {
-
-
-
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");
-
}
-
}
看一下配置文件的映射编写吧:
-
-
<bean id="multi" class="com.ljh.springmvc.controller.MultiController"></bean>
-
-
-
<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>
-
-
-
<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>
3,继承AbstractCommandController,指令控制器,用于获取页面的参数,将参数封装到指定的对象模型中。类似于Struts2框架的模型驱动。例如:
-
public class DemoController extends AbstractCommandController {
-
-
public DemoController(){
-
this.setCommandClass(User.class);
-
}
-
-
-
-
@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");
-
}
-
}
对于配置文件的映射就是类和路径的映射,这里不再赘述。这种方法就是将页面传过来的数据直接封装到了指定的对象,我们可以直接使用,非常方便。
综上,为SpringMVC流程控制方面的一些内容。其实任何的MVC框架都无在乎,核心控制器,映射文件,对应的action类,扩展可以通过拦截器,过滤器等。明白了大致方向,一些小的问题,我们可以通过查看API文档,那才是我们开发有力的助手!!!
SpringMVC(二)流程控制
标签:style blog http io ar color os 使用 sp
原文地址:http://blog.csdn.net/lovesomnus/article/details/41383015