跟着学院视频学习的,不过还是遇到些问题。
通过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/
是个不错的教程,保留下来以后好好学习!