3.1处理器映射器
处理器映射作用
通过处理器映射,你可以将Web 请求映射到正确的处理器 Controller 上。当接收到请求时,DispactherServlet 将请求交给 HandlerMapping 处理器映射,让他检查请求并找到一个合适的HandlerExecutionChain,这个HandlerExecutionChain 包含一个能处理该请求的处理器 Controller。然后,DispactherServlet 执行在HandlerExecutionChain 中的处理器 Controller。
Spring内置了许多处理器映射策略,目前主要由三个实现。SimpleUrlHandlerMapping、``BeanNameUrlHandlerMapping
和RequestMappingHandlerMapping
。
注意:Spring MVC3.1之前使用DefaultAnnotationHandlerMapping,Spring MVC3.1之后改为RequestMappingHandlerMapping。
1)SimpleUrlHandlerMapping
SimpleUrlHandlerMapping 在应用上下文中可以进行配置,并且有Ant 风格的路径匹配功能。例如我们在springmvc.xml 中配置一个SimpleUrlHandlerMapping 处理器映射。
<!--1.创建SimpleUrlHandlerMapping-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.do">helloController</prop>
</props>
</property>
</bean>
<!--2.创建Controller对象-->
<bean id="helloController" class="com.controller.HelloController"/>
<!--3.视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp" />
</bean>
对应的controller类
package com.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView("hello");
return mv;
}
}
2)BeanNameUrlHandlerMapping
BeanNameUrlHandlerMapping 将收到的Http请求映射到bean的名字上。如:我们用如下方式将包含http://localhost:8080/hello.do的访问请求映射到指定的HelloController上。
<!--1.创建BeanNameUrlHandlerMapping-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--2.创建Controller对象,这里的id必须页面访问的路径(以斜杠开头)-->
<bean id="/hello.do" class="com.controller.HelloController"/>
<!--3.视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".jsp" />
</bean>
对应的controller类
package com.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView("hello");
return mv;
}
}
注意:在bean的id中要加上斜杆,Controller的代码跟前面的SimpleUrlHandlerMapping一样,实现Controller,重写handlerRequest()方法即可。在默认情况下,如果没有在上下文中没有找到处理器映射,DispactherServlet 会为你创建一个BeanNameUrlHandlerMapping。
3)RequestMappingHandlerMapping
RequestMappingHandlerMapping是三个中最常用的HandlerMapping,因为注解方式比较通俗易懂,代码界面清晰,只需要在代码前加上@RequestMapping()的相关注释就可以了。代码示例如下:
package com.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello.do")
public String hello(){
System.out.println("进入控制器的方法");
//注意:这里返回的只是页面名称,不是完整的页面访问路径
return "hello";
}
}
springmvc配置
<!-- 1.扫描Controller的包-->
<context:component-scan base-package="com.yiidian.controller"/>
<!-- 2.配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 2.1 页面前缀 -->
<property name="prefix" value="/pages/"/>
<!-- 2.2 页面后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 3.创建RequestMappingHandlerMapping对象-->
<mvc:annotation-driven/>
重点是添加 <mvc:annotation-driven/>标签
3.2处理适配器
处理适配器作用
HandlerAdapter字面上的意思就是处理适配器,它的作用用一句话概括就是调用具体的方法对用户发来的请求来进行处理。当HandlerMapping获取到执行请求的Controller时,DispatcherServlte会根据Controller对应的Controller类型来调用相应的HandlerAdapter来进行处理。
HandlerAdapter的实现有:
HttpRequestHandlerAdapter
、SimpleServletHandlerAdapter
、SimpleControllerHandlerAdapter
、AnnotationMethodHandlerAdapter
(Spring MVC 3.1后已废弃)和RequestMappingHandlerAdapter。
1)HttpRequestHandlerAdapter
HttpRequestHandlerAdapter可以处理类型为HttpRequestHandler的handler,对handler的处理是调用HttpRequestHandler的handleRequest()方法。
2)SimpleServletHandlerAdapter
SimpleServletHandlerAdapter可以处理类型为Servlet,就是把Servlet当做Controller来处理,使用Servlet的service方法处理用户请求。
3)SimpleControllerHandlerAdapter
SimpleControllerHandlerAdapter可以处理类为Controller的控制器,使用Controller的handlerRequest方法处理用户请求。
4)RequestMappingHandlerAdapter
RequestMappingHandlerAdapter可以处理类型为HandlerMethod的控制器,通过Java反射调用HandlerMethod的方法来处理用户请求。
3.3视图解析器
视图解析器的作用
Spring MVC中的视图解析器的主要作用就是将逻辑视图转换成用户可以看到的物理视图。
当用户对SpringMVC应用程序发起请求时,这些请求都会被Spring MVC的DispatcherServlet处理,通过处理器找到最为合适的HandlerMapping定义的请求映射中最为合适的映射,然后通过HandlerMapping找到相对应的Handler,然后再通过相对应的HandlerAdapter处理该Handler。返回结果是一个ModelAndView对象,当该ModelAndView对象中不包含真正的视图,而是一个逻辑视图路径的时候,ViewResolver就会把该逻辑视图路径解析为真正的View视图对象,然后通过View的渲染,将最终结果返回给用户。
SpringMVC中处理视图最终要的两个接口就是ViewResolver
和View
,ViewResolver的作用是将逻辑视图解析成物理视图,View的主要作用是调用其render()方法将物理视图进行渲染。