Spring mvc
1. 创建Web工程,导入Spring Web MVC相关开发包。
- Spring API、web、webmvc等开发包。
2. 在src下添加Spring Web MVC的XML配置文件。
- 名称可以自定义,例如spring-mvc.xml。
3. 在web.xml中配置DispatcherServlet前端控制器组件。
- DispatcherServlet组件在spring mvc中已提供,只需要配置即可。
- 配置DispatcherServlet时,同时指定XML配置文件。
- <servlet>
- <servlet-name>springmvc</servlet-name>
- <servlet-class>
- org.springframework.web.servlet.DispatcherServlet
- </servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring-mvc.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
11.</servlet>
12.<servlet-mapping>
- <servlet-name>springmvc</servlet-name>
- <url-pattern>*.form</url-pattern>
15.</servlet-mapping>
4.配置HandlerMapping组件, 通过HandlerMapping组件,DispatcherServlet控制器可以将客户HTTP请求映射到Controller组件上。
使用如下配置可以实现 当客户发出hello.form请求时,会调用HelloController组件进行处理。具体的代码如下:
- <bean class="org.springframework.web.servlet.handler.
- SimpleUrlHandlerMapping">
- <property name="mappings">
- <props>
- <prop key="/hello.form“>helloController</prop>
- </props>
- </property>
- </bean>
5.编写Controller组件,它负责执行具体的业务处理,可调用DAO等组件,编写时需要实现Controller接口及约定方法
- public class HelloController implements Controller {
- public ModelAndView handleRequest(
- HttpServletRequest request,
- HttpServletResponse response) throws Exception {
- System.out.println("接受到请求");
- return new ModelAndView("hello");
- }
- }
Controller组件约定的handleRequest方法执行后返回一个ModelAndView对象,该对象可封装模型数据和视图名响应信息。
并且将HelloController配置到spring-mvc.xml, 代码如下:
- <bean id="helloController"
- class="org.tarena.web.HelloController"/>
6. 配置视图解析器ViewResolver。所有Controller组件都返回一个ModelAndView实例,封装了视图名。 Spring中的视图以名字为标识,视图解析器ViewResolver通过名字来解析视图。 InternalResourceViewResolver使用示例代码如下:
- <bean id="jspViewResolver"
- class="org.springframework.web.servlet.view.
- InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/jsp/"/>
- <property name="suffix" value=".jsp"/>
- </bean>
- 导包:
spring基础包
Spring-core-3.2.8.RELEASE.jar
Spring-context-3.2.8.RELEASE.jar
Spring-bean-3.2.8.RELEASE.jar
Commons-logging.jar
Spring-expression-3.2.8.RELEASE.jar
spring mvc基础包
Spring-web-3.2.8.RELEASE.jar
Spring-webmvc-3.2.8.RELEASE.jar
步骤二:配置Spring HandlerMapping 组件
1. Spring HandlerMapping用于分发Web请求到Controller的映射,这个类来自Spring MVC API, 只需要配置到Spring中即可。修改spring-mvc.xml添加HandlerMapping配置。配置代码如下:
- <!-- 定义请求处理映射HandlerMapping -->
- <bean id="handlerMapping"
- class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <!-- 指定请求和Controller对应关系 -->
- <property name="mappings" ref="urlMappings"/>
- </bean>
- <!-- 定义请求映射表 map -->
- <util:properties id="urlMappings">
- <prop key="/hello.form">helloController</prop>
- <prop key="/***">***Controller</prop>
- </util:properties>
<!-- 定义请求处理映射HandlerMapping -->
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- 指定请求和Controller对应关系 -->
<property name="mappings" ref="urlMappings"/>
</bean>
<!-- 定义请求映射表 map -->
<util:properties id="urlMappings">
<prop key="/hello.form">helloController</prop>
</util:properties>
其中HandlerMapping实现类是Spring提供的SimpleUrlHandlerMapping。SimpleUrlHandlerMapping的mappings属性引用了id为urlMappings的Properties集合。
步骤四:添加ViewResolver组件配置
1. 在spring-mvc.xml文件中增加ViewResolver组件的配置,ViewResolver用于视图的显示结果处理。代码如下所示:
- <!-- 定义视图解析器ViewResolver -->
- <bean id="viewResolver"
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/jsp/"/>
- <property name="suffix" value=".jsp"/>
- </bean>
由图-7可以说明Spring MVC HelloWorld开发部署测试成功,请求执行流程是:
1. 浏览器向Tomcat6服务器发起Web请求“hello.form”。
2. Tomcat6 会根据web.xml的配置将 “hello.form”请求交给Spring核心控制器DispatcherServlet处理。
3. DispatcherServlet根据HandlerMapping中的urlMappings将"/hello.form"请求转给helloController处理。
4. helloController执行handlerRequest()方法,处理请求,并且返回ModelAndView对象代表处理结果, ModelAndView对象中包含了目标视图“hello”。
5. Spring核心控制器收到ModelAndView中包含的视图“hello”。
6. Spring核心控制器利用ViewResolver中的前后缀应用“hello”到/WEB-INF/jsp/hello.jsp文件。
7. 执行hello.jsp 作为响应结果发送到浏览器。
8. 浏览器收到hello.jsp的执行结果: 欢迎进入Spring Web MVC世界!
HelloController类的完整代码
- package com.tarena.controller;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
11.import org.springframework.web.servlet.ModelAndView;
13.import org.springframework.web.servlet.mvc.Controller;
17.public class HelloController implements Controller{
- public ModelAndView handleRequest(
- HttpServletRequest req,
- HttpServletResponse res) throws Exception {
- System.out.println("处理hello.form请求");
- ModelAndView mv = new ModelAndView("hello");
- return mv;//调用hello.jsp
- }
35.}
TestCase累的完整代码
- package com.tarena.test;
- import java.util.Properties;
- import org.junit.Test;
11.import org.springframework.context.ApplicationContext;
13.import org.springframework.context.support.ClassPathXmlApplicationContext;
15.import org.springframework.web.servlet.HandlerMapping;
17.import org.springframework.web.servlet.ViewResolver;
19.import org.springframework.web.servlet.mvc.Controller;
23.public class TestCase {
- /** HandlerMapping 映射测试 */
- @Test
- public void testHandlerMapping(){
- String cfg = "spring-mvc.xml";
- ApplicationContext ac = new ClassPathXmlApplicationContext(cfg);
- HandlerMapping obj = ac.getBean("handlerMapping", HandlerMapping.class);
- Properties map = ac.getBean("urlMappings", Properties.class);
- System.out.println(obj);
- System.out.println(map);
- }
- /** 控制器测试 */
- @Test
- public void testHelloController(){
- String cfg = "spring-mvc.xml";
- ApplicationContext ac = new ClassPathXmlApplicationContext(cfg);
- Controller obj = ac.getBean("helloController", Controller.class);
- System.out.println(obj);
- }
- /** 测试ViewResolver配置 */
- @Test
- public void testViewResolver(){
- String cfg = "spring-mvc.xml";
- ApplicationContext ac = new ClassPathXmlApplicationContext(cfg);
- ViewResolver obj = ac.getBean("viewResolver", ViewResolver.class);
- System.out.println("OK"+obj);
- }
74.}
Spring-mvc.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jdbc="http://www.springframework.org/schema/jdbc"
- xmlns:jee="http://www.springframework.org/schema/jee"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xmlns:util="http://www.springframework.org/schema/util"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
- http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
- http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
- http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
- http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd" >
- <!-- 定义请求处理映射HandlerMapping -->
- <bean id="handlerMapping"
- class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <!-- 指定请求和Controller对应关系 -->
- <property name="mappings" ref="urlMappings" />
- </bean>
- <!-- 定义url请求映射表 map -->
- <util:properties id="urlMappings">
- <prop key="/hello.form">helloController</prop>
- </util:properties>
- <!-- 控制器bean配置 -->
- <bean id="helloController"
- class="com.tarena.controller.HelloController" />
- <!-- 定义视图解析器ViewResolver -->
- <bean id="viewResolver"
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/jsp/"/>
- <property name="suffix" value=".jsp"/>
- </bean>
74.</beans>
Hello.jsp
- <%@page pageEncoding="utf-8" contentType="text/html;charset=utf-8"%>
- <!DOCTYPE html>
- <html>
- <head>
- <title>Spring Hello World!</title>
- </head>
- <body>
- 欢迎进入Spring Web MVC世界!
- </body>
13.</html>
Web.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <servlet>
- <servlet-name>springmvc</servlet-name>
- <servlet-class>
- org.springframework.web.servlet.DispatcherServlet
- </servlet-class>
- <!-- 指定Spring的配置文件 -->
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring-mvc.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>springmvc</servlet-name>
- <url-pattern>*.form</url-pattern>
- </servlet-mapping>
<welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
36.</web-app>
2 重构helloworld应用案例
2.1 问题
使用注解的方式重构helloworld应用案例。
2.2 方案
1. @RequestMapping注解应用
@RequestMapping可以用在类定义和方法定义上,它标明这个类或方法与哪一个客户请求对应。实例代码如下:
1. @RequestMapping("/day01")
2. public class HelloController{
3. @RequestMapping("/hello.form")
4. public String execute() throws Exception {
5. return "hello";
6. }
7. }
@RequestMapping("/day01")
public class HelloController{
@RequestMapping("/hello.form")
public String execute() throws Exception {
return "hello";
}
}
2. 开启@RequestMapping注解映射,需要在Spring的XML配置文件进行配置,配置代码如下:
1. <mvc:annotation-driven/>
3. @Controller注解应用
推荐使用@Controller注解声明Controller组件,这样可以使得Controller定义更加灵活,可以不用实现Controller接口,请求处理的方法也可以灵活定义。代码如下:
- @Controller
- @RequestMapping("/day01")
- public class HelloController{
- @RequestMapping("/hello.form")
- public String execute() throws Exception {
- return "hello";
- }
- }
#cold_bold@Controller
@RequestMapping("/day01")
public class HelloController{
@RequestMapping("/hello.form")
public String execute() throws Exception {
return "hello";
}
}
4. 为了使@Controller注解生效,需要在Spring的XML配置文件中开启组件扫描定义,并指定Controller组件所在包,配置代码如下:
- <context:component-scan base-package="com.tarena.controller"/>
2.4 完整代码
HelloController类的完整代码如下所示:
1. package com.tarena.controller;
2. import org.springframework.stereotype.Controller;
3. import org.springframework.web.bind.annotation.RequestMapping;
4. @Controller
5. @RequestMapping("/day01")
6. public class HelloController{
7. @RequestMapping("/hello.form")
8. public String execute() throws Exception {
9. return "hello";
10. }
11.}
spring-mvc.xml文件的完整代码如下所示:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
- xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
- http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
- http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
- http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
- http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
- <context:component-scan base-package="com.tarena.controller"/>
- <mvc:annotation-driven/>
31.<!--
- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
37. -->
- <bean id="viewResolver"
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/jsp/">
- </property>
- <property name="suffix" value=".jsp">
- </property>
- </bean>
53.</beans>