处理器映射HandlerMapping

来源:互联网 发布:中日高铁竞争知乎 编辑:程序博客网 时间:2024/05/22 15:34

配置DispatcherServlet

web.xml中配置DispatcherServlet

需要在web.xml文件中对DispatcherServlet的名称、随着容器启动而启动、拦截模式等内容进行配置,默认的DispatcherServlet配置xml文件路径为:/WEB-INF/[DispatcherServlet名称]-servlet.xml。

<servlet>    <servlet-name>action</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <load-on-startup>1</load-on-startup></servlet><servlet-mapping>    <servlet-name>action</servlet-name>    <url-pattern>*.action</url-pattern></servlet-mapping>

action-servlet.xml中对DispatcherServlet进行具体的配置

<!-- 默认使用的控制器映射就是BeanNameUrlHandlerMapping --><bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!-- 配置Controller --><bean name="/home.action" class="study.springmvc.controller.HomeController"/><!-- 配置视图解析器 --><bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">    <property name="prefix" value="/WEB-INF/jsp/"/>    <property name="suffix" value=".jsp"/></bean>

编写HomeController

public class HomeController extends AbstractController {    @Override    protected ModelAndView handleRequestInternal(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws Exception {        System.out.println("HomeController Handling:" + request.getRequestURI());        return new ModelAndView("index");    }}

添加Java EE依赖:

<dependency>    <groupId>javax</groupId>    <artifactId>javaee-api</artifactId>    <version>${javax.version}</version></dependency>

运行结果

运行结果

常用HandlerMapping

常用的HandlerMapping有3种,对HandlerMapping的配置在action-servlet.xml中进行配置,配置方式上文有例子,下文也会针对不同的HandlerMapping的配置进行讲解。

BeanNameUrlHandlerMapping

这是默认使用的HandlerMapping,也就是需要在Controller Bean的name属性中对url进行配置,同时使用class属性配置Controller类。上文已经有例子,此处不展开。

SimpleUrlHandlerMapping

<!-- 配置HandlerMapping --><bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">    <property name="mappings">        <props>            <prop key="/index.action">homeController</prop>            <prop key="/home.action">homeController</prop>        </props>    </property></bean><!-- 配置Controller --><bean id="homeController" class="study.springmvc.controller.HomeController"/><!-- 配置视图解析器 --><bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">    <property name="prefix" value="/WEB-INF/jsp/"/>    <property name="suffix" value=".jsp"/></bean>

这种HandlerMapping需要根据url的不同指定对应Controller的id,此处为了方便,全部使用homeController,故上述两个地址应该都会到达首页。

home.action

index.action

注意:当有 BeanNameUrlHandlerMapping 方式和 SimpleUrlHandlerMapping 方式声明冲突时,也就是有同名的URL,这时 Spring MVC 框架如何处理?

  • 首先,配置重名不会引起冲突
  • 其次,出现同名时,按配置文件的顺序执行,当发现有一个URL满足,就跳出
  • 最后,Spring MVC 框架支持用户自定义顺序,增加 order 属性即可(在property标签中配置)

ControllerClassNameHandlerMapping

<!-- 配置HandlerMapping --><bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/><!-- 配置Controller --><bean id="homeController" class="study.springmvc.controller.HomeController"/><bean id="helloController" class="study.springmvc.controller.HelloController"/><!-- 配置视图解析器 --><bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">    <property name="prefix" value="/WEB-INF/jsp/"/>    <property name="suffix" value=".jsp"/></bean>
public class HelloController extends AbstractController {    @Override    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {        System.out.println("HelloController Handling:" + request.getRequestURI());        return new ModelAndView("hello");    }}

这种情况下,会使用类名与访问url匹配的Controller,下面运行结果可以验证:

运行结果

注意:这种HandlerMapping现在已经不推荐使用了。

好了,HandlerMapping就学到这了,接下来学习Controller。。。

0 0
原创粉丝点击