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

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

通过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 {

	@Override
	public 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进行映射 -->
	<bean
		class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

	<bean name="/testMappingByBeanName.do" class="com.controller.HelloWorldController" />
 
	<!-- 配置视图解析器 -->
	<bean
		class="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/ 

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

    原文作者:Spring MVC
    原文地址: https://blog.csdn.net/pc_amoon/article/details/51719921
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞