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配置文件。

 

  1. <servlet>
  2.     <servlet-name>springmvc</servlet-name>
  3.     <servlet-class>
  4.              org.springframework.web.servlet.DispatcherServlet
  5.     </servlet-class>
  6.     <init-param>
  7.         <param-name>contextConfigLocation</param-name>
  8.         <param-value>classpath:spring-mvc.xml</param-value>
  9.     </init-param>
  10. <load-on-startup>1</load-on-startup>

11.</servlet>

12.<servlet-mapping>

  1. <servlet-name>springmvc</servlet-name>
  2. <url-pattern>*.form</url-pattern>

15.</servlet-mapping>

 

4.配置HandlerMapping组件, 通过HandlerMapping组件,DispatcherServlet控制器可以将客户HTTP请求映射到Controller组件上。

使用如下配置可以实现 当客户发出hello.form请求时,会调用HelloController组件进行处理。具体的代码如下:

  1. <bean   class="org.springframework.web.servlet.handler.
  2.    SimpleUrlHandlerMapping">
  3.          <property name="mappings">
  4.               <props>
  5.                    <prop key="/hello.form“>helloController</prop>
  6.               </props>
  7.          </property>
  8.  </bean>

 

5.编写Controller组件,它负责执行具体的业务处理,可调用DAO等组件,编写时需要实现Controller接口及约定方法

  1. public class HelloController implements Controller {
  2.     public ModelAndView handleRequest(
  3.             HttpServletRequest request,
  4.             HttpServletResponse response) throws Exception {
  5.         System.out.println("接受到请求");
  6.         return new ModelAndView("hello");
  7.     }
  8. }

 

Controller组件约定的handleRequest方法执行后返回一个ModelAndView对象,该对象可封装模型数据和视图名响应信息。

并且将HelloController配置到spring-mvc.xml, 代码如下:

  1. <bean id="helloController"
  2.             class="org.tarena.web.HelloController"/>

6. 配置视图解析器ViewResolver。所有Controller组件都返回一个ModelAndView实例,封装了视图名。 Spring中的视图以名字为标识,视图解析器ViewResolver通过名字来解析视图。 InternalResourceViewResolver使用示例代码如下:

  1. <bean id="jspViewResolver"
  2.             class="org.springframework.web.servlet.view.
  3. InternalResourceViewResolver">
  4.     <property name="prefix" value="/WEB-INF/jsp/"/>
  5.     <property name="suffix" value=".jsp"/>
  6. </bean>

 

 

 

  1. 导包:

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配置。配置代码如下:

  1.     <!-- 定义请求处理映射HandlerMapping -->
  2.  
  3.     <bean id="handlerMapping"
  4.  
  5.         class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  6.  
  7.         <!-- 指定请求和Controller对应关系 -->    
  8.  
  9.         <property name="mappings" ref="urlMappings"/>
  10. </bean>
  11. <!-- 定义请求映射表 map -->
  12. <util:properties id="urlMappings">
  13.   <prop key="/hello.form">helloController</prop>
  14.       <prop key="/***">***Controller</prop>
  15. </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用于视图的显示结果处理。代码如下所示:

 

  1.     <!-- 定义视图解析器ViewResolver -->
  2.     <bean id="viewResolver"
  3.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  4.         <property name="prefix" value="/WEB-INF/jsp/"/>
  5.         <property name="suffix" value=".jsp"/>
  6.     </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类的完整代码

  1. package com.tarena.controller;
  2.  
  3.  
  4.  
  5. import javax.servlet.http.HttpServletRequest;
  6.  
  7. import javax.servlet.http.HttpServletResponse;
  8.  
  9.  

11.import org.springframework.web.servlet.ModelAndView;

13.import org.springframework.web.servlet.mvc.Controller;

17.public class HelloController implements Controller{

  1. public ModelAndView handleRequest(
  2. HttpServletRequest req,
  3. HttpServletResponse res) throws Exception {
  4. System.out.println("处理hello.form请求");
  5. ModelAndView mv = new ModelAndView("hello");
  6. return mv;//调用hello.jsp
  7. }

35.}

TestCase累的完整代码

  1. package com.tarena.test;
  2.  
  3.  
  4.  
  5. import java.util.Properties;
  6.  
  7.  
  8.  
  9. 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 {

  1. /** HandlerMapping 映射测试 */
  2. @Test
  3. public void testHandlerMapping(){
  4. String cfg = "spring-mvc.xml";
  5. ApplicationContext ac = new ClassPathXmlApplicationContext(cfg);
  6. HandlerMapping obj = ac.getBean("handlerMapping", HandlerMapping.class);
  7. Properties map = ac.getBean("urlMappings", Properties.class);
  8. System.out.println(obj);
  9. System.out.println(map);
  10. }
  11. /** 控制器测试 */
  12. @Test
  13. public void testHelloController(){
  14. String cfg = "spring-mvc.xml";
  15. ApplicationContext ac = new ClassPathXmlApplicationContext(cfg);
  16. Controller obj = ac.getBean("helloController", Controller.class);
  17. System.out.println(obj);
  18. /** 测试ViewResolver配置 */
  19. @Test
  20. public void testViewResolver(){
  21. String cfg = "spring-mvc.xml";
  22. ApplicationContext ac = new ClassPathXmlApplicationContext(cfg);
  23. ViewResolver obj = ac.getBean("viewResolver", ViewResolver.class);
  24. System.out.println("OK"+obj);
  25. }

74.}

 

Spring-mvc.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <beans xmlns="http://www.springframework.org/schema/beans"
  4.  
  5.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6.  
  7.     xmlns:context="http://www.springframework.org/schema/context"
  8.  
  9.     xmlns:jdbc="http://www.springframework.org/schema/jdbc"
  10. xmlns:jee="http://www.springframework.org/schema/jee"
  11. xmlns:tx="http://www.springframework.org/schema/tx"
  12. xmlns:jpa="http://www.springframework.org/schema/data/jpa"
  13. xmlns:util="http://www.springframework.org/schema/util"
  14. xsi:schemaLocation="
  15. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  16. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
  17. http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
  18. http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
  19. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
  20. http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
  21. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd" >
  22. <!-- 定义请求处理映射HandlerMapping -->
  23. <bean id="handlerMapping"
  24. class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  25. <!-- 指定请求和Controller对应关系 -->
  26. <property name="mappings" ref="urlMappings" />
  27. </bean>
  28. <!-- 定义url请求映射表 map -->
  29. <util:properties id="urlMappings">
  30. <prop key="/hello.form">helloController</prop>
  31. </util:properties>
  32. <!-- 控制器bean配置 -->
  33. <bean id="helloController"
  34. class="com.tarena.controller.HelloController" />
  35. <!-- 定义视图解析器ViewResolver -->
  36. <bean id="viewResolver"
  37. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  38. <property name="prefix" value="/WEB-INF/jsp/"/>
  39. <property name="suffix" value=".jsp"/>
  40. </bean>

74.</beans>

 

 

Hello.jsp

  1. <%@page pageEncoding="utf-8" contentType="text/html;charset=utf-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4.     <head>
  5.  
  6.         <title>Spring Hello World!</title>
  7.  
  8.     </head>
  9.  
  10. <body>
  11. 欢迎进入Spring Web MVC世界!
  12. </body>

13.</html>

 

 

Web.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  4.  
  5.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6.  
  7.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  8.  
  9.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  10. <servlet>
  11. <servlet-name>springmvc</servlet-name>
  12. <servlet-class>
  13. org.springframework.web.servlet.DispatcherServlet
  14. </servlet-class>
  15. <!-- 指定Spring的配置文件 -->
  16. <init-param>
  17. <param-name>contextConfigLocation</param-name>
  18. <param-value>classpath:spring-mvc.xml</param-value>
  19. </init-param>
  20. <load-on-startup>1</load-on-startup>
  21. </servlet>
  22. <servlet-mapping>
  23. <servlet-name>springmvc</servlet-name>
  24. <url-pattern>*.form</url-pattern>
  25. </servlet-mapping>

    <welcome-file-list>

  1. <welcome-file>index.jsp</welcome-file>
  2. </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接口,请求处理的方法也可以灵活定义。代码如下:

  1. @Controller
  2. @RequestMapping("/day01")
  3. public class HelloController{
  4.     @RequestMapping("/hello.form")
  5.     public String execute() throws Exception {
  6.         return "hello";
  7.     }
  8. }

#cold_bold@Controller

@RequestMapping("/day01")

public class HelloController{

@RequestMapping("/hello.form")

public String execute() throws Exception {

  return "hello";

}

}

4. 为了使@Controller注解生效,需要在Spring的XML配置文件中开启组件扫描定义,并指定Controller组件所在包,配置代码如下:

  1. <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文件的完整代码如下所示:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.  
  5.     xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
  6.  
  7.     xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
  8.  
  9.     xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mvc="http://www.springframework.org/schema/mvc"
  10. xsi:schemaLocation="
  11. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  12. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
  13. http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
  14. http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
  15. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
  16. http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
  17. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
  18. <context:component-scan base-package="com.tarena.controller"/>
  19. <mvc:annotation-driven/>

31.<!--

  1. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
  2. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

37. -->

  1. <bean id="viewResolver"
  2. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  3. <property name="prefix" value="/WEB-INF/jsp/">
  4. </property>
  5. <property name="suffix" value=".jsp">
  6. </property>
  7. </bean>

53.</beans>