spring mvc 入门系列之四--关于handlerMapping

来源:互联网 发布:安藤忠雄中山邸数据 编辑:程序博客网 时间:2024/05/22 16:39

跟着学院视频学习的,不过还是遇到些问题。

通过handlerMapping的设置,可以找到对应的Controller,因为是入门,所以这里只有比较简单的几种方式:

1、默认的BeanNameUrlHandlerMapping

2、url映射--SimpleUrlHandlerMapping

3、类名映射--ControllerClassNameHandlerMapping

4、注解(见前面的例子,略)


实验过程:

1、创建项目springmvc004,创建 web.xml,内容与之前的几个项目相同。测试时需根据不同的配置文件修改一下 web.xml 中servlet-name的名称。

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">  <display-name>springmvc004</display-name>  <servlet>    <servlet-name><span style="color:#ff6666;">myspring3</span></servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>myspring3</servlet-name>    <url-pattern>*.do</url-pattern>  </servlet-mapping></web-app>


2、创建HelloWorldController类

package com.controller;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 HelloWorldController implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse arg1) throws Exception {System.out.println("进入控制器!");//处理请求,向指定的view传递model信息ModelAndView mv=new ModelAndView();mv.addObject("message", "Hello,controller!");mv.setViewName("out");return mv;}}

3、WebRoot\pages 目录下创建页面 hello.jsp和out.jsp

hello.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <base href="<%=basePath%>">        <title>My JSP 'hello.jsp' starting page</title>  </head>    <body>  <a href="testMappingByBeanName.do">根据beanname进行映射</a>  <a href="testMappingByUrl.do">根据url进行映射</a>  <a href="helloworldController.do">根据类名进行映射</a>   <a href="helloworldMe.do">根据类名进行映射</a>  </body></html>

注意此页面中第3、4个链接中的大小写。


输出页面 out.jsp:

<body>    ${message}  </body>>


为了避免干扰,把以上3种映射方式分别写在了不同的-servlet.xml中,测试时需要先修改web.xml中的spring servlet 名称,下面只列出主要配置。


一、方式一 BeanNameUrlHandlerMapping,这种方式是默认的,配置文件:myspring1-servlet.xml:

<!-- 配置控制器 方式1:根据BeanName进行映射 --><beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /><bean name="/testMappingByBeanName.do" class="com.controller.HelloWorldController" /> <!-- 配置视图解析器 --><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass"value="org.springframework.web.servlet.view.JstlView" /><property name="prefix" value="/pages/" /><property name="suffix" value=".jsp" /></bean>

二、方式二 url映射--SimpleUrlHandlerMapping,配置文件名:myspring2-servlet.xml

       <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props><prop key="/testMappingByUrl.do">helloController</prop></props></property></bean><bean id="helloController" class="com.controller.HelloWorldController" />

视图解析器部分同第一种方式,略去。


三、根据类名自动映射,ControllerClassNameHandlerMapping,配置文件名:myspring3-servlet.xml


<!-- 配置控制器 方式3:根据Controller类名自动进行映射 -->    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">      <!--property name="caseSensitive" value="true" /-->     </bean>    <bean class="com.controller.HelloWorldController" />

这个出了些问题,找了好久才发现原因:
默认情况下,按类名来自动匹配Controller时,将自动去除类名中的"Controller"这个后缀,同时把前面的内容全部视为小写来匹配。
例如:这里的Controller类名为HelloWorldController,那么可以匹配的是helloworld*.do 这类请求,而不是像教学视频中介绍的只要把首字母变小写就行的,测试页面hello.jsp中

<a href="helloworldController.do">根据类名进行映射</a>
   <a href="helloworldMe.do">根据类名进行映射</a>


这两个都是OK的。


若要保持原来的驼峰式命名,只是首字母改小写,那么此时要加上上面注释掉的配置:

<property name="caseSensitive" value="true" />

这时要访问控制器HelloWorldController时,可以匹配的url是形如 helloWorld*.do 这种格式的。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

后面这部分问题的解决参考了:http://www.mkyong.com/spring-mvc/spring-mvc-controllerclassnamehandlermapping-example/ 

是个不错的教程,保留下来以后好好学习!


0 0