首先通过前期对springmvc框架的介绍,了解到处理器映射器是从前端控制器获取url请求并且给以响应,处理器适配器,是从前端控制器那里获取到要执行的handler(action)方法,去执行并反馈。
(一)
配置处理器映射器的时候有两种情况:
第一种:BeanNameUrlHandlerMapping
<!-- 处理器映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
配置action的时候为:
<!--handler(aciton)-->
<bean name="/hello.action" class="zlt.helloworldtest.Hello"/>
这种方式action需要继承
第二种:SimpleUrlHandlerMapping
<!-- 简单url映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello1.action">hello_controller</prop>
<prop key="/hello2.action">hello_controller</prop>
</props>
</property>
</bean>
这种情况采用的是注解方式进行找到对应的action方法。hello_controller是action这个bean的id。优点可以action的url的进行集中配置。
小结:多个处理器映射器可以共存(同一个handler可以用不同的方法配置多次,可以共存)
(二)配置处理器适配器(这个适配器采用了适配器设计模式)
第一种:SimpleControllerHandlerAdapter
<!—处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
这个规则是action实现controller接口
例如:
/**
* <p>Title: package-info.java</p>
* <p>Description:测试SpringMVC框架 </p>
* <p>Copyright: Copyright (c) 2017</p>
* <p>Company: www.itcast.cn</p>
* @author 大米时代·周丽同
* @date 2017年6月10日下午5:21:49
* @version 1.0
*/
package zlt.helloworldtest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class Hello implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
//添加模型数据
mv.addObject("message", "Hello World!");
//设置逻辑视图名,最终视图地址=前缀+逻辑视图名+后缀
mv.setViewName("hello");
return mv;
}
}
第二种:HttpRequestHandlerAdapter
<!—处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
这个规则中要求action需要实现HttpRequestHandler。
例如:
Public class HelloWorldController2 implements HttpRequestHandler {
@Override
publicvoid handleRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("message", "HelloWorld!");
request.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(request, response);
//也可以自定义响应内容
//response.setCharacterEncoding("utf-8");
//response.getWriter().write("HelloWorld!");
}
}
从这种情况来看,此适配器的controller方法没有返回modelandview,可以通过response修改定义响应内容。
小结:多个处理器适配器可以共存。