springMVC学习记录——后端控制器之映射处理器
springMVC的后端处理器包括三个部分:
- 映射处理器(HandlerMapping)
- 控制器(Controller)
- 视图解析器(ViewResolver)
博文记录一下映射处理的的相关配置问题:
映射处理器:处理url到控制层的映射关系
tip:根据前端控制器(DispatcherServlet)传递过来的请求资源符URI去配置在映射处理器中的控制器,决定这一次的用户请求需要用哪个控制器去处理。
springMVC提供了多种匹配方式,同时也支持配置多个HandlerMapping通过指定order来设置优先级,order值越小,优先级越高,什么意思呢?
比如下面配置了两个映射处理器,映射处理1的order值设置为1,则它的优先级要高于 映射处理器2; 即要处理一个两个映射处理都可以处理的用户请求是,优先会使用映射处理器1
<!-- 映射处理1 -->
<bean ...>
.
.
<property name="order" value="1">
</bean>
<!-- 映射处理2 -->
<bean ...>
.
.
<property name="order" value="4">
</bean>
下面的配置中,控制器都用框架的控制器 ParameterizableViewController 做测试,如果你是自定义的控制器也是一样的配置
1、SimpleUrlHandlerMapping (类全路径eclipse中可以按 ctrl + shift + t 查找)
在类的mappings属性中匹配请求 url
<!-- 配置 映射处理器 SimpleUrlHandlerMapping -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.action">helloSpringMVC</prop>
</props>
</property>
<!-- order值越小,映射处理器优先级越高 -->
<property name="order" value="1"></property>
</bean>
2、BeanNameUrlHandlerMapping
按照bean 的name属性来匹配到控制器,在下面的配置中,控制器bean组件的name属性配置为和请求的url一致,这样,通过BeanNameUrlHandlerMapping映射处理器处理的用户请求就会找到这个控制器
<!-- 映射处理器 BeanNameUrlHandMapping -->
<bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<!-- order值越小,映射处理器优先级越高 -->
<property name="order" value="2"></property>
</bean>
<!-- 配置 后端控制器(这里配置的是框架自带的控制器ParameterizableViewController) -->
<bean id="helloSpringMVC" name="/hello.action" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="login/login"></property>
</bean>
3、ControllerClassNameHandlerMapping,按控制器层的类名访问
匹配规则:例如有一个用户请求是 /helloController.action , 则会找一个类名是HelloController 的控制层类来处理这个请求
<!-- 映射处理器 ControllerClassNameHandlerMapping -->
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
<!-- order值越小,优先级越高 -->
<property name="order" value="3"></property>
</bean>
<!-- 自定义的控制器 -->
<bean id="helloSpringMVC" class="com.chaol.controller.HelloController"></bean>
使用注解配置映射处理器及控制器
因为要开启注解自动扫描,和使用注解映射处理器 、控制器,springmvc-servlet.xml的头部信息加上:xmlns:mvc 、 xmlns:context
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
springmvc-servlet.xml中的配置:
<!-- 开启注解自动扫描 -->
<context:component-scan base-package="com.chaol.controller"></context:component-scan>
<!-- 配置注解 映射处理器 、 控制器 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
自定义控制层程序:
像下面的注解配置,如果类上是value="/hello",方法上是value="/hello.action",则前台的访问路径是 /hello/hello.action
package com.chaol.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
@Controller
@RequestMapping(value="/") //指定类的访问路径
public class HelloController extends AbstractController {
@RequestMapping(value="/hello.action") //指定方法的访问路径
// 像这样配置,用户的请求如果是/hello.action,则映射到了这个controller ,当然,这里的 ‘/’是指项目的根目录
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
ModelAndView mav = new ModelAndView("login/login");
return mav;
}
}
映射处理器的入门学习就到此,下面贴一下项目结构: