Spring MVC之简单入门

今天药忘吃喽~ 2022-10-01 00:40 268阅读 0赞

一、Spring MVC简介:
1、什么是MVC
模型-视图-控制器(MVC)是一个众所周知的以设计界面应用程序为基础的设计模式。它主要通过分离模型(Model)、视图(View)及控制器(Control)在应用程序中的角色,从而将业务逻辑从界面中解耦。通常,模型负责封装应用程序数据在视图层展示。视图仅仅只是展示这些数据,不包含任何业务逻辑。控制器负责接收来自用户的请求,并调用后台服务(manager或者dao)来处理业务逻辑。处理后,后台业务层可能会返回了一些数据在视图层展示。控制器收集这些数据及准备模型在视图层展示。MVC模式的核心思想是将业务逻辑从界面中分离出来,允许它们单独改变而不会相互影响。
2、Spring MVC
Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高。Spring 3.0更加完善,实现了对Struts 2的超越。现在越来越多的开发团队选择了Spring MVC。
Spring MVC也是服务到工作者模式的实现,但进行可优化。前端控制器是DispatcherServlet;应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)的实现(也可以是任何的POJO类);支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。
Struts2也是非常优秀的MVC构架,优点非常多比如良好的结构,拦截器的思想,丰富的功能。但这里想说的是缺点,Struts2由于采用了值栈、OGNL表达式、struts2标签库等,会导致应用的性能下降,应避免使用这些功能。而Struts2的多层拦截器、多实例action性能都很好。
Spring MVC的优点:
-—Spring MVC使用简单,学习成本低。学习难度小于Struts2,Struts2用不上的多余功能太多。
-—Spring MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分)
-—Spring MVC的灵活是你无法想像的,Spring框架的扩展性有口皆碑,Spring MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制。

二、Spring MVC的处理请求的基本流程

一个基本的流程图如下:

20170323212208384

Spring MVC处理一个用户的请求的基本流程如下:
1、首先用户发送请求——>web服务器,此时web服务器已经根据web.xml的配置信息完成了相关初始化;
2、web服务器——>总控制器DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
3、DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为 HandlerExecutionChain 对象(包含一 个 Handler 处理器(页面控制器)对象、多个 HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新 的映射策略;
4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处 理方法,完成功能处理;并返回一个 ModelAndView 对象(包含模型数据、逻辑视图名);
5、ModelAndView 的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的 View,通过这种策略模式,很容易更换其他视图技术;
6、View——>渲染,View 会根据传进来的 Model 模型数据进行渲染,此处的 Model 实际是一个 Map 数据结构,因此 很容易支持其他视图技术;
7、返回控制权给 DispatcherServlet,由 DispatcherServlet 返回响应给用户,到此一个流程结束。
我们需要关心的核心开发步骤:
-—DispatcherServlet 需要在 web.xml 中的部署描述,从而拦截请求到 Spring MVC。
-—HandlerMapping 的配置,从而将请求映射到处理器。
-—HandlerAdapter 的配置,从而支持多种类型的处理器
-—ViewResolver 的配置,从而将逻辑视图名解析为具体视图技术
-—处理器(页面控制器)的配置,从而进行功能处理

三、实例演示
这里利用Spring MVC来实现一个查询员工信息的程序。
1、首先建立一个maven web工程,编辑pom.xml导入依赖。
pom.xml

  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/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.kang</groupId>
  5. <artifactId>SpringmvcTest</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>war</packaging>
  8. <dependencies>
  9. <dependency>
  10. <groupId>junit</groupId>
  11. <artifactId>junit</artifactId>
  12. <version>4.12</version>
  13. <scope>test</scope>
  14. </dependency>
  15. <!-- Spring MVC support -->
  16. <dependency>
  17. <groupId>org.springframework</groupId>
  18. <artifactId>spring-webmvc</artifactId>
  19. <version>4.1.4.RELEASE</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework</groupId>
  23. <artifactId>spring-web</artifactId>
  24. <version>4.1.4.RELEASE</version>
  25. </dependency>
  26. <!-- Tag libs support for view layer -->
  27. <dependency>
  28. <groupId>javax.servlet</groupId>
  29. <artifactId>jstl</artifactId>
  30. <version>1.2</version>
  31. <scope>runtime</scope>
  32. </dependency>
  33. <dependency>
  34. <groupId>taglibs</groupId>
  35. <artifactId>standard</artifactId>
  36. <version>1.1.2</version>
  37. <scope>runtime</scope>
  38. </dependency>
  39. </dependencies>
  40. </project>

2、配置web.xml
配置 DispatcherServlet :DispatcherServlet 默认加载 /WEB-INF/-servlet.xml 的 Spring 配置文件, 启动 WEB 层的 Spring 容器。可以通过 contextConfigLocation 初始化参数自定义配置文件的位置和名称。
web.xml

  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="taotao" version="2.5">
  6. <display-name>SpringmvcTest</display-name>
  7. <!-- 配置 DispatcherServlet -->
  8. <servlet>
  9. <!--
  10. 这个Servlet的名字是spring,可以有多个DispatcherServlet,是通过名字来区分的。
  11. 每一个DispatcherServlet有自己的WebApplicationContext上下文对象。
  12. 同时保存在ServletContext中和Request对象中
  13. -->
  14. <servlet-name>spring</servlet-name>
  15. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  16. <!-- load-on-startup标示的是启动顺序,让这个Servlet随Servlet容器一起启动 -->
  17. <load-on-startup>1</load-on-startup>
  18. <!--
  19. 配置 DispatcherServlet 的一个初始化参数: 配置 SpringMVC 配置文件的位置和名称
  20. <init-param>
  21. <param-name>contextConfigLocation</param-name>
  22. <param-value>classpath:springmvc.xml</param-value>
  23. </init-param>
  24. -->
  25. <!-- 这里采用默认配置, SpringMVC会在WEB-INF目录下寻找spring-servlet.xml
  26. (因为这里定义的servlet-name是spring)来完成初始化-->
  27. </servlet>
  28. <!-- 定义拦截哪些请求 -->
  29. <servlet-mapping>
  30. <!-- 与上面定义的servlet-name保持一致 -->
  31. <servlet-name>spring</servlet-name>
  32. <!--
  33. url-pattern:表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。
  34. 也可以如“*.html”表示拦截所有以html为扩展名的请求。
  35. -->
  36. <url-pattern>/</url-pattern>
  37. </servlet-mapping>
  38. </web-app>

3、配置spring的配置文件
上面配置好web.xml后,请求已交给Spring MVC框架处理,因此我们需要配置Spring的配置文件。我们需要在Spring配置文件中配置HandlerMapping、HandlerAdapter。注意此配置文件必须在WEB-INF目录下,且名为spring-servlet.xml。
spring-servlet.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:aop="http://www.springframework.org/schema/aop"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
  9. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
  10. <!-- 配置自定扫描的包 -->
  11. <context:component-scan base-package="com.kang"></context:component-scan>
  12. <!--
  13. Spring MVC 提供主要的 HanderMapping 有 DefaultAnnotationHandlerMapping,
  14. SimpleUrlHandlerMapping 和 BeanNameUrlHandlerMapping。
  15. -->
  16. <bean
  17. class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
  18. <bean
  19. class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
  20. <!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 -->
  21. <bean
  22. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  23. <property name="prefix" value="/WEB-INF/views/" />
  24. <property name="suffix" value=".jsp" />
  25. </bean>
  26. </beans>

配置视图解析器中
InternalResourceViewResolver:用于支持Servlet、JSP视图解析;
prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀),比如传进来的逻辑视图名为hello,则该该jsp视图页面应该存放在“WEB-INF/views/hello.jsp”;

4、编写实现代码

-—建立员工模型信息:这个类作为MVC模式的模型。
EmployeeVO.java

  1. package com.kang.model;
  2. import java.io.Serializable;
  3. public class EmployeeVO implements Serializable {
  4. private static final long serialVersionUID = 1L;
  5. private Integer id;
  6. private String firstName;
  7. private String lastName;
  8. public Integer getId() {
  9. return id;
  10. }
  11. public void setId(Integer id) {
  12. this.id = id;
  13. }
  14. public String getFirstName() {
  15. return firstName;
  16. }
  17. public void setFirstName(String firstName) {
  18. this.firstName = firstName;
  19. }
  20. public String getLastName() {
  21. return lastName;
  22. }
  23. public void setLastName(String lastName) {
  24. this.lastName = lastName;
  25. }
  26. @Override
  27. public String toString() {
  28. return "EmployeeVO [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]";
  29. }
  30. }

-—编写模拟与数据库交互的DAO代码:这个类位于三层架构中的第三层,负责与底层的数据库存储进行交互。
EmployeeDAO.java

  1. package com.kang.dao;
  2. import java.util.List;
  3. import com.kang.model.EmployeeVO;
  4. public interface EmployeeDAO {
  5. public List<EmployeeVO> getAllEmployees();
  6. }

EmployeeDAOImpl.java

  1. package com.kang.dao;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.springframework.stereotype.Repository;
  5. import com.kang.model.EmployeeVO;
  6. @Repository
  7. public class EmployeeDAOImpl implements EmployeeDAO {
  8. public List<EmployeeVO> getAllEmployees() {
  9. List<EmployeeVO> employees = new ArrayList<EmployeeVO>();
  10. EmployeeVO vo1 = new EmployeeVO();
  11. vo1.setId(1);
  12. vo1.setFirstName("xiaokang");
  13. vo1.setLastName("chen");
  14. employees.add(vo1);
  15. EmployeeVO vo2 = new EmployeeVO();
  16. vo2.setId(2);
  17. vo2.setFirstName("lei");
  18. vo2.setLastName("wang");
  19. employees.add(vo2);
  20. return employees;
  21. }
  22. }

-—编写DAO交互服务代码:这个类处于三层架构中的第二层,负责与DAO层交互。
EmployeeManager.java

  1. package com.kang.service;
  2. import java.util.List;
  3. import com.kang.model.EmployeeVO;
  4. public interface EmployeeManager {
  5. public List<EmployeeVO> getAllEmployees();
  6. }

EmployeeManagerImpl.java

  1. package com.kang.service;
  2. import java.util.List;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5. import com.kang.dao.EmployeeDAO;
  6. import com.kang.model.EmployeeVO;
  7. @Service
  8. public class EmployeeManagerImpl implements EmployeeManager {
  9. @Autowired
  10. EmployeeDAO dao;
  11. public List<EmployeeVO> getAllEmployees() {
  12. return dao.getAllEmployees();
  13. }
  14. }

-—编写控制代码:注解@RequestMapping在类级别和方法级别层面确定将被调用方法的URL。
EmployeeController.java

  1. package com.kang.controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.ui.Model;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7. import com.kang.service.EmployeeManager;
  8. @Controller
  9. @RequestMapping("/employee-module")
  10. public class EmployeeController {
  11. @Autowired
  12. EmployeeManager manager;
  13. @RequestMapping(value = "/getAllEmployees", method = RequestMethod.GET)
  14. public String getAllEmployees(Model model) {
  15. model.addAttribute("employees", manager.getAllEmployees());
  16. return "employeesListDisplay";
  17. //对应在WEB-INF/views的目录下应该有一个employeesListDisplay.jsp。
  18. }
  19. }

5、编写jsp页面
首先写一个index.jsp页面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Spring MVC Test</title>
  8. </head>
  9. <body>
  10. <a href="employee-module/getAllEmployees">获取员工信息</a>
  11. <!-- 以get的方式发送一个请求,名为employee-module/getAllEmployees -->
  12. </body>
  13. </html>

然后再正确的位置编写一个jsp页面来显示结果。其位置和名称都由之前的相关配置决定。
spring-servlet.xml中一下两句指明了视图的目录为/WEB-INF/views/,后缀名为.jsp。


EmployeeController.java中以下语句指定了这个视图的名为employeesListDisplay
return “employeesListDisplay”;
综上,应该在/WEB-INF/views/目录下定义一个employeesListDisplay.jsp的文件。
employeesListDisplay.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
  5. <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
  6. <html>
  7. <head>
  8. <title>Spring MVC Hello World</title>
  9. </head>
  10. <body>
  11. <h2>All Employees in System</h2>
  12. <table border="1">
  13. <tr>
  14. <th>Employee Id</th>
  15. <th>First Name</th>
  16. <th>Last Name</th>
  17. </tr>
  18. <c:forEach items="${employees}" var="employee">
  19. <tr>
  20. <td>${employee.id}</td>
  21. <td>${employee.firstName}</td>
  22. <td>${employee.lastName}</td>
  23. </tr>
  24. </c:forEach>
  25. </table>
  26. </body>
  27. </html>

至此,整个项目构建完毕,完整目录结构如下:

20170323212706043

6、测试
将项目部署到tomcat上,访问index.jsp,点击超链接,结果如下:

20170323212145806

20170323212730293

发表评论

表情:
评论列表 (有 0 条评论,268人围观)

还没有评论,来说两句吧...

相关阅读

    相关 简单了解Spring MVC

    Spring MVC从一开始就定位于一个较为松散的组合,展示给用户的视图(View)、控制器返回的数据模型(Model)、定位视图的视图解析器(ViewResolver)和处理

    相关 spring MVC入门

    2.1、Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架