[关闭]
@MrXiao 2018-03-05T06:25:12.000000Z 字数 11271 阅读 961

Spring MVC(1)——入门

Spring SpringMVC


原文地址
Spring MVC全称是Spring Web MVC,是spring框架中的一部分,与struts一样是一个表现层框架。

Spring MVC是当前最优秀的MVC框架,自从Spring2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高。Spring3.0更加完善,实现了对Struts2的超越。现在越来越多的开发团队选择了Spring MVC。
<--more-->
此处输入图片的描述

1、Spring MVC与Struts2对比!

  1. 加载机制:SpringMVC入口是servlet,Struts2入口是filter;servlet与filter区别
  2. 性能:SpringMVC优于Struts2
    Struts2基于类设计,每次请求实例化一个action对象,对应一个request上下文;
    SpringMVC基于方法设计,每次请求实例化一个方法对象,每个方法独享request上下文。
  3. 参数传递:
    Struts2使用类变量接收参数,多个方法共享;
    SpringMVC使用请求参数获取,方法独享
  4. 框架继承:spring MVC和Spring是无缝(无缝:无须数据格式转换,直接访问来自数据源数据格式)的。从这个项目的管理和安全上也比Struts2高。
  5. 拦截机制:spring mvc用的是独立的AOP方式实现,而struts2有自己的interceptor机制,这样导致了struts2的配置文件量又比spring mvc大。
  6. Restful架构实现:
    spring mvc用的是独立的AOP方式实现,而struts2有自己的interceptor机制,这样导致了struts2的配置文件量又比spring mvc大;
    spring mvc用的是独立的AOP方式实现,而struts2有自己的interceptor机制,这样导致了struts2的配置文件量又比spring mvc大。

2、SpringMVC运行流程

此处输入图片的描述

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器查找Handler。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
  5. HandlerAdapter调用处理器Handler
  6. Handler执行完成返回ModelAndView
  7. HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器,ViewReslover根据逻辑视图名解析View
  9. ViewReslover返回View
  10. DispatcherServlet对View进行渲染视图(即将模型数据填充至request域)。
  11. DispatcherServlet响应用户

从以上流程可以看出几个主要的部件:

  1. 前端控制器DispatcherServlet(SpringMVC提供)
    作用:接收请求,相应结果
    有了前端控制器减少各各组件之间的耦合性,前端控制器相关于中央调度器
  2. 处理器映射器HandlerMapping(SpringMVC提供)
    作用:根据url查找Handler,比如:根据xml配置、注解方式查找Handler
  3. 处理器适配器HandlerAdapter(SpringMVC提供)
    作用:执行Handler
    不同类型的Handler有不同的HandlerAdapter,好处可以通过扩展HandlerAdapter支持更多类型的Handler。
  4. 处理器Handler(由程序员开发
    作用:业务处理
    实现开发中又称为controller即后端控制器
    Handler的开发按照HandlerAdapter的接口规则去开发。
    Handler处理后的结果是ModelAndView,是springmvc的底层对象,包括Model和view两个部分。view中只包括一个逻辑视图名(为了方便开发起一个简单的视图名称)。
  5. ViewReslover视图解析(springmvc框架提供)
    作用:根据逻辑视图名创建一个View对象(包括真实视图物理地址)
    针对不同类型的view有不同类型的ViewReslover,常用的有jsp视图解析器即jstlView
  6. View视图(由程序员开发
    作用:将模型数据填充进来(将model数据填充到request域)显示给用户
    view是一个接口,实现类包括:jstlView、freemarkerView,pdfView

3、案例搭建

使用maven构建基本工程结构

3.1 创建web项目

3.2 设置jdk版本及servlet环境

细节参见Maven学习与基本使用

3.3 导入jar包,设置pom

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.topvision.maven</groupId>
  5. <artifactId>ssm</artifactId>
  6. <packaging>war</packaging>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>ssm Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10. <!-- 属性 -->
  11. <properties>
  12. <spring.version>4.3.12.RELEASE</spring.version>
  13. <mybatis.version>3.4.5</mybatis.version>
  14. </properties>
  15. <!-- 锁定版本 -->
  16. <dependencyManagement>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework</groupId>
  20. <artifactId>spring-context</artifactId>
  21. <version>${spring.version}</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework</groupId>
  25. <artifactId>spring-aspects</artifactId>
  26. <version>${spring.version}</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework</groupId>
  30. <artifactId>spring-orm</artifactId>
  31. <version>${spring.version}</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework</groupId>
  35. <artifactId>spring-test</artifactId>
  36. <version>${spring.version}</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.springframework</groupId>
  40. <artifactId>spring-web</artifactId>
  41. <version>${spring.version}</version>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework</groupId>
  45. <artifactId>spring-webmvc</artifactId>
  46. <version>${spring.version}</version>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.mybatis</groupId>
  50. <artifactId>mybatis</artifactId>
  51. <version>${mybatis.version}</version>
  52. </dependency>
  53. </dependencies>
  54. </dependencyManagement>
  55. <dependencies>
  56. <!-- Spring -->
  57. <dependency>
  58. <groupId>org.springframework</groupId>
  59. <artifactId>spring-test</artifactId>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.springframework</groupId>
  63. <artifactId>spring-context</artifactId>
  64. </dependency>
  65. <dependency>
  66. <groupId>org.springframework</groupId>
  67. <artifactId>spring-aspects</artifactId>
  68. </dependency>
  69. <dependency>
  70. <groupId>org.springframework</groupId>
  71. <artifactId>spring-orm</artifactId>
  72. </dependency>
  73. <dependency>
  74. <groupId>org.springframework</groupId>
  75. <artifactId>spring-web</artifactId>
  76. </dependency>
  77. <dependency>
  78. <groupId>org.springframework</groupId>
  79. <artifactId>spring-webmvc</artifactId>
  80. </dependency>
  81. <dependency>
  82. <groupId>junit</groupId>
  83. <artifactId>junit</artifactId>
  84. <version>3.8.1</version>
  85. <scope>test</scope>
  86. </dependency>
  87. <!-- mybatis -->
  88. <dependency>
  89. <groupId>org.mybatis</groupId>
  90. <artifactId>mybatis</artifactId>
  91. </dependency>
  92. <dependency>
  93. <groupId>org.mybatis</groupId>
  94. <artifactId>mybatis-spring</artifactId>
  95. <version>1.3.1</version>
  96. </dependency>
  97. <!-- mysql驱动 -->
  98. <dependency>
  99. <groupId>mysql</groupId>
  100. <artifactId>mysql-connector-java</artifactId>
  101. <version>5.1.6</version>
  102. <scope>runtime</scope>
  103. </dependency>
  104. <!-- c3p0 -->
  105. <dependency>
  106. <groupId>c3p0</groupId>
  107. <artifactId>c3p0</artifactId>
  108. <version>0.9.1.2</version>
  109. </dependency>
  110. <!-- slf4j -->
  111. <dependency>
  112. <groupId>org.slf4j</groupId>
  113. <artifactId>slf4j-log4j12</artifactId>
  114. <version>1.7.2</version>
  115. </dependency>
  116. <!-- junit -->
  117. <dependency>
  118. <groupId>junit</groupId>
  119. <artifactId>junit</artifactId>
  120. <version>4.9</version>
  121. <scope>test</scope>
  122. </dependency>
  123. <!-- jstl -->
  124. <dependency>
  125. <groupId>javax.servlet</groupId>
  126. <artifactId>jstl</artifactId>
  127. <version>1.2</version>
  128. </dependency>
  129. <!-- servlet jsp -->
  130. <dependency>
  131. <groupId>javax.servlet</groupId>
  132. <artifactId>servlet-api</artifactId>
  133. <version>2.5</version>
  134. <scope>provided</scope>
  135. </dependency>
  136. <dependency>
  137. <groupId>javax.servlet</groupId>
  138. <artifactId>jsp-api</artifactId>
  139. <version>2.0</version>
  140. <scope>provided</scope>
  141. </dependency>
  142. </dependencies>
  143. <build>
  144. <plugins>
  145. <plugin>
  146. <groupId>org.apache.maven.plugins</groupId>
  147. <artifactId>maven-compiler-plugin</artifactId>
  148. <configuration>
  149. <source>1.8</source>
  150. <target>1.8</target>
  151. <encoding>UTF-8</encoding>
  152. </configuration>
  153. </plugin>
  154. </plugins>
  155. <finalName>ssm</finalName>
  156. </build>
  157. </project>

3.4 配置前端控制器

关键:在web.xml配置springmvc的前端控制器

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. id="WebApp_ID" version="2.5">
  6. <servlet>
  7. <servlet-name>springDispatcherServlet</servlet-name>
  8. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  9. <init-param>
  10. <!--若不配置此项,默认加载/WEB-INF/[servlet的名字]-servlet.xml-->
  11. <param-name>contextConfigLocation</param-name>
  12. <param-value>classpath:springmvc.xml</param-value>
  13. </init-param>
  14. <load-on-startup>1</load-on-startup>
  15. </servlet>
  16. <servlet-mapping>
  17. <servlet-name>springDispatcherServlet</servlet-name>
  18. <!--
  19. *.action或*.do等等,以其结尾的url由springmvc来解析
  20. / 所有请求都由springmvc解析,单静态资源的请求(html,css,js)由其解析是不对的
  21. /* 此种配置方式不对,当转到jsp页面,springmvc会去解析jsp页面路径地址,无法解析成功
  22. -->
  23. <url-pattern>*.action</url-pattern>
  24. </servlet-mapping>
  25. </web-app>

3.5 配置处理器映射器

在3.4设置的地址下新建对应的xml文件,一般在classpath下新建springmvc.xml

在springmvc.xml中配置处理器映射器。(有多种)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  8. http://www.springframework.org/schema/mvc
  9. http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  12. http://www.springframework.org/schema/aop
  13. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  14. http://www.springframework.org/schema/tx
  15. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
  16. <!-- 处理器映射器,选择其中之一即可-->
  17. <!--根据handel的名字来匹配url-->
  18. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
  19. <!--升级版-->
  20. <!--根据handel的id来匹配url-->
  21. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  22. <property name="mappings">
  23. <props>
  24. <prop key="/ItemsList2.action">itemsController</prop>
  25. <prop key="/ItemsList3.action">itemsController</prop>
  26. </props>
  27. </property>
  28. </bean>
  29. </beans>

3.6 配置处理器适配器

开发Handel必须按照处理器适配器接口规则去开发,先要确定使用哪个处理器适配器。
此处使用SimpleControllerHandlerAdapter。

  1. <!-- 处理器适配器 -->
  2. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

通过源码分析得出:

  1. public boolean supports(Object handler) {
  2. return (handler instanceof Controller);
  3. }

只要实现了Controller接口的bean,SimpleControllerHandlerAdapter都可以去执行。

还有一个非注解适配器HttpRequestHandlerAdapter,只要实现HttpRequestHandler接口即可。

3.7 开发及配置Handel

  1. public class ItemsController1 implements Controller {
  2. @Override
  3. public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  4. // 调用service查询商品信息
  5. // 这里不调用service使用静态数据模拟
  6. List<Items> itemsList = new ArrayList<Items>();
  7. Items items_2 = new Items();
  8. items_2.setName("苹果手机");
  9. items_2.setPrice(9688f);
  10. items_2.setDetail("iphoneX苹果手机!");
  11. itemsList.add(items_1);
  12. itemsList.add(items_2);
  13. ModelAndView modelAndView = new ModelAndView();
  14. //此方法相当于request.setAttribute(arg0, arg1)
  15. modelAndView.addObject(itemsList);
  16. //指定视图地址
  17. modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");
  18. return modelAndView;
  19. }
  20. }

3.8 配置视图解析器

使用jsp视图解析器,在springmvc.xml中配置如下:

  1. <!-- ViewResolver -->
  2. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  3. <!--设置统一的前后缀-->
  4. <property name="prefix" value="/WEB-INF/jsp/"/>
  5. <property name="suffix" value=".jsp"/>
  6. </bean>

更改Handle代码,使用逻辑视图名:

  1. //指定视图地址
  2. //modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");
  3. modelAndView.setViewName("itemList");

3.9 配置jsp视图

在web-inf/jsp下,创建itemList.jsp

4、注解开发

4.1 注解的处理器映射器和适配器

注解的处理器映射器:
spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

注解的处理器适配器:
spring3.1之前使用
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
3.1之后使用
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

在springmvc.xml中配置:

  1. <!-- 注解的处理器映射器和适配器 -->
  2. <!--
  3. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
  4. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
  5. -->
  6. <!-- 简写 -->
  7. <mvc:annotation-driven/>

4.2 注解开发Handle

注解处理器映射器和注解处理器适配器要配对使用,对标记@controller注解类中的标记有@RequestMapping方法进行映射和执行。
@controller标记此类是一个控制器
@RequestMapping:对url和Handler中的方法进行映射。

  1. @Controller
  2. public class ItemsController2 {
  3. @RequestMapping("/itemsList4")
  4. public ModelAndView itemList4() {
  5. // 调用service查询商品信息
  6. // 这里不调用service使用静态数据模拟
  7. List<Items> itemsList = new ArrayList<Items>();
  8. Items items_1 = new Items();
  9. items_1.setName("联想笔记本");
  10. items_1.setPrice(6000f);
  11. items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
  12. Items items_2 = new Items();
  13. items_2.setName("苹果手机");
  14. items_2.setPrice(5000f);
  15. items_2.setDetail("iphone6苹果手机!");
  16. itemsList.add(items_1);
  17. itemsList.add(items_2);
  18. ModelAndView modelAndView = new ModelAndView();
  19. // 此方法相当于request.setAttribute(arg0, arg1)
  20. modelAndView.addObject(itemsList);
  21. // 指定视图地址
  22. // modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");
  23. modelAndView.setViewName("itemsList");
  24. return modelAndView;
  25. }
  26. }

4.3 在spring容器中配置Handle

为方便配置,采用注解扫描的方式。

  1. <!-- 可以扫描标记有@controller、@service、@repository、@component的bean -->
  2. <context:component-scan base-package="com.topvision.ssm"></context:component-scan>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注