Spring MVC ControllerClassNameHandlerMapping示例
ControllerClassNameHandlerMapping 使用约定将请求的URL映射到Controller。这将需要的控制器名称,并把它们转换成 小写了领先的“/”
上一个例子中,我们了解了BeanNameUrlHandlerMapping的工作方式。 现在,让我们看一下ControllerClassHandlerMapping, 这种类型的HandlerMapping使用约定将请求的URL映射到Controller。这将需要的控制器名称,并把它们转换成“/”开头小写了的名字。
Using BeanNameUrlHandlerMapping
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <bean name="/helloWorld.htm" class="com.github.yujiaao.HelloWorldController" /> <bean name="/hello*.htm" class="com.github.yujiaao.HelloWorldController" /> Using ControllerClassNameHandlerMapping <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" /> <bean class="com.github.yujiaao.HelloWorldController"></bean> <bean class="com.github.yujiaao.WelcomeController"></bean>
使用ControllerClassNameHandlerMapping时,不需要 bean名称
- 文件夹结构:创建一个动态Web项目 “SpringMVCHandlerMappingTutorial”, 并为我们的src文件“ com.github.yujiaao ”创建一个包;
- 将Spring 3 jar文件放在WEB-INF/lib下
commons-logging-1.1.1.jarlog4j-1.2.16.jarslf4j-api-1.7.5.jarslf4j-log4j12-1.7.5.jarspring-aspects-3.2.4.RELEASE.jarspring-beans-3.2.4.RELEASE.jarspring-context-3.2.4.RELEASE.jarspring-core-3.2.4.RELEASE.jarspring-expression-3.2.4.RELEASE.jarspring-web-3.2.4.RELEASE.jarspring-webmvc-3.2.4.RELEASE.jar
- 在com.github.yujiaao 文件夹下 创建Java类HelloWorldController.java和WelcomeController.java。
- 将 SpringConfig-servlet.xml和web.xml 放在 WEB-INF目录下
- 视图模板文件 helloWorld.jsp 和 welcome.jsp 放在WEB-INF/jsp下的子目录下
HelloWorldController.java
我们的HelloWorldController类扩展了AbstractController类,并覆盖了“ handleRequestInternal()”方法。在方法内部,我们将创建一个ModelAndView对象,该对象具有重定向页面(helloWorld),并且传递一个将在视图页面使用的String msg。
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; public class HelloWorldController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("Inside HelloWorldController"); ModelAndView model = new ModelAndView("helloWorld"); model.addObject("msg", "HandlerMappingDemo"); return model; } }
WelcomeController.java
WelcomeController与HelloWorldController几乎相同,除了重定向页面和传递的String。
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractController; public class WelcomeController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("Inside WelcomeController"); ModelAndView model = new ModelAndView("welcome"); model.addObject("msg", "HandlerMappingDemo"); return model; } }
helloWorld.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h2>Hello World ${msg}</h2> </body> </html>
welcome.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h2> Welcome to ${msg}</h2> </body> </html>
web.xml
web.xml包含服务器需要了解的有关应用程序的所有内容,这些内容位于WEB-INF目录下。<servlet-name> 包含SpringConfiguration的名称,初始化DispatcherServlet 时,框架将尝试在WEB-INF目录下加载配置文件“ [servlet-name]-servlet.xml” 。
<?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_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>SpringMVCFormHandling</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>SpringConfig</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SpringConfig</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
SpringConfig-servlet.xml
- 该SpringConfig-servlet.xml中也被放置在WEB-INF目录下。
- 在这里,我们已将BeanNameUrlHandlerMapping配置为HandlerMapping
- 每个请求也都映射到一个控制器
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/Jsp/"/> <property name="suffix" value=".jsp"/> </bean> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" /> <bean class="com.github.yujiaao.HelloWorldController"></bean> <bean class="com.github.yujiaao.WelcomeController"></bean> </beans>
在上面的例子中
- 请求helloworld时,DispatcherServlet将其重定向到HelloWorldController。
- 请求helloworld123时 ,DispatcherServlet将其重定向到HelloWorldController。
- 请求welcome时,DispatcherServlet将其重定向到WelcomeController。
- 请求welcome123,DispatcherServlet将其重定向到WelcomeController。
- 请求helloWorld ,您将收到404 错误,因为“ W”大写
HelloWorldController调用时的输出
Hello World HandlerMappingDemo
当WelcomeController调用时
Welcome to HandlerMappingDemo