HandlerMapping    处理器映射

HTTP请求被DispatcherServlet拦截后,会调用HandlerMapping来处理,HandlerMapping根据 url<=>controller 之间的映射关系来确定要调用哪个controller来处理。

有2种HandlerMapping:

  • BeanNameUrlHandlerMapping

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<bean name="/userController" class="com.chy.controller.UserController" />
http://localhost:8080/springmvc_war_exploded/userController

BeanNameUrl,顾名思义,映射关系是BeanName <=> Url,url地址对应bean的name,根据url中的beanname确定要调用的controller。

  • SimpleUrlHandlerMapping

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<!-- 使用props配置url-controller之间的映射关系 -->
<props>
<!-- 一个prop配置一个映射,key指定url,value指定bean的id或name。可使用多个prop。 -->
<prop key="/userController">userController</prop>
</props>
</property>
</bean> <bean name="userController" class="com.chy.controller.UserController" />
http://localhost:8080/springmvc_war_exploded/userController

url是/userController,去<props>中找到key=/userController的<prop>,得到要调用的controller的name或id。


HandlerAdapter   处理器适配器

HandlerMapping确定要调用的controller后,将要调用的controller告诉DispatcherServlet,

由DispatcherServlet调用controller所属的HandlerAdapter,再由HandlerAdapter来调用controller。

HandlerAdapter有2种:

  • SimpleControllerHandlerAdapter(推荐)

    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
public class UserController implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
//视图可以在构造器中指定,也可以先使用空参构造器,在调用setter方法设置
ModelAndView mav = new ModelAndView("user_info");
User user = new User();
user.setUsername("chy");
user.setPassword("abcd");
//向视图传递数据
mav.addObject("user", user);
return mav;
}
}

SimpleControllerHandlerAdapter,名字中有Controller,实现的自然是Controller接口。

方法要返回一个ModelAndView类型的值。

这个ModelAndView由controller返回给HandlerAdapter,再由HandlerAdapter返回给DispatcherServlet。

DispatcherServlet调用配置的ViewResolver来解析ModelAndView,获取里面的model(数据)、view(视图名),并将数据、视图名返回给DispatcherServlet。

DispatcherServelt对View进行渲染(把模型数据填入视图中),把渲染好的视图返回个浏览器。

所以需要搭配ViewResolver使用:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/" />
<!--后缀-->
<property name="suffix" value=".jsp" />
</bean>

视图解析器也有好几种,此处不再一一介绍。

  • HttpRequestHandlerAdapter

<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />
public class UserController implements HttpRequestHandler{
@Override
public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
User user = new User();
user.setUsername("chy");
user.setPassword("abcd"); //向视图传递数据
httpServletRequest.setAttribute("user",user); //将请求转发到视图(地址栏的url不变)
RequestDispatcher dispatcher = httpServletRequest.getRequestDispatcher("/WEB-INF/jsp/user_info.jsp");
dispatcher.forward(httpServletRequest,httpServletResponse);
}
}

适配器与实现的接口是对应的。使用请求转发实现,返回值是void。

ViewResolver是解析ModelAndView用的,既然返回值是void,就不使用视图解析器,没有视图名的拼接,需要写视图的完整路径。

此种方式是Servlet的实现方式,不建议使用。尽量使用ModelAndView的方式,更加符合mvc的思想。

最新文章

  1. How to stop pycharm show files in project in red color?
  2. STM32与FreeRTOS实现低功耗
  3. Selenium_Selenium WebDriver 中鼠标和键盘事件分析及扩展
  4. 【jQuery基础学习】07 jQuery表单插件-Form
  5. 206. Reverse Linked List
  6. protobuf使用说明
  7. 在树莓派1B上编译安装lnmp服务器
  8. 二、C# 数据类型
  9. 【转】使用 NuGet 管理项目库-Phil Haack
  10. 端口扫描器之java实现
  11. java学习之网络编程之echo程序
  12. access窗口标签居中
  13. Spark 基本函数学习笔记一
  14. can物理信号-----------显性和隐性
  15. Debian下undefined reference to ‘pthread_create’问题解决
  16. 【一步步学OpenGL 20】 -《点光源》
  17. ubuntu git的安装更新及配置
  18. list基本代码
  19. break与continue,return结束循环区别
  20. leveldb源码分析--BloomFilter

热门文章

  1. 虚拟函数是否应该被声明仅为private/protected?
  2. 深入理解JDK、JRE(两套)、JVM、以及不同目录下的java.exe
  3. 【音乐欣赏】《JINGO JUNGLE》 - MYTH &amp; ROID
  4. ALSA driver基本概念
  5. jquer_shijian 增加初始化 年月日 及 结束时间 年月日
  6. java调用第三方接口(转载)
  7. Speech Bandwidth Extension With WaveNet
  8. JavaScript - what is &quot;this&quot;? this是什么?
  9. Django框架之Filters(过滤器)、母版的使用
  10. 多进程manager共享