Spring基础知识(11)- Spring MVC (一) | JavaWeb 设计模式、Spring MVC 简介和配置

 

注:开始阅读 Spring MVC 系列文章之前,读者应该已经掌握了 Java 基础知识、Web 基础知识和 Spring 框架。另外,本系列文章中的所有实例都是使用 IntelliJ IDEA + Apache Maven 配置和编译的,所以还需要对 IntelliJ IDEA 和 Apache Maven 有基本的了解。

 

1. JavaWeb 设计模式

    1)JSP + JavaBean

        JSP + JavaBean 中 JSP 用于处理用户请求,JavaBean 用于封装和处理数据。该模式只有视图和模型,一般把控制器的功能交给视图来实现,适合业务流程比较简单的 Web 程序。

        通过上图可以发现 JSP 从 HTTP Request(请求)中获得所需的数据,并进行业务逻辑的处理,然后将结果通过 HTTP Response(响应)返回给浏览器。从中可见,JSP+JavaBean 模式在一定程度上实现了 MVC,即 JSP 将控制层和视图合二为一,JavaBean 为模型层。

        JSP + JavaBean 模式中 JSP 身兼数职,既要负责视图层的数据显示,又要负责业务流程的控制,结构较为混乱,并且也不是我们所希望的松耦合架构模式,所以当业务流程复杂的时候并不推荐使用。

    2) Servlet + JSP + JavaBean

        Servlet + JSP + JavaBean 中 Servlet 用于处理用户请求,JSP 用于数据显示,JavaBean 用于数据封装,适合复杂的 Web 程序。

        相比 JSP + JavaBean 模式来说,Servlet + JSP + JavaBean 模式将控制层单独划分出来负责业务流程的控制,接收请求,创建所需的 JavaBean 实例,并将处理后的数据返回视图层(JSP)进行界面数据展示。

        Servlet + JSP +J avaBean 模式的结构清晰,是一个松耦合架构模式,JavaBean 相当于 Model,Servlet 相当于 Controller,JSP 相当于 View,遵循了 MVC 设计模式。

    3) MVC 设计模式

        MVC 设计模式一般指 MVC 框架,M(Model)指数据模型层,V(View)指视图层,C(Controller)指控制层。使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。其中,View 的定义比较清晰,就是用户界面。

        在 Web 项目的开发中,能够及时、正确地响应用户的请求是非常重要的。用户在网页上单击一个 URL 路径,这对 Web 服务器来说,相当于用户发送了一个请求。而获取请求后如何解析用户的输入,并执行相关处理逻辑,最终跳转至正确的页面显示反馈结果,这些工作往往是控制层(Controller)来完成的。

        在请求的过程中,用户的信息被封装在 User 实体类中,该实体类在 Web 项目中属于数据模型层(Model)。

        在请求显示阶段,跳转的结果网页就属于视图层(View)。

        控制层负责前台与后台的交互,数据模型层封装用户的输入/输出数据,视图层选择恰当的视图来显示最终的执行结果,这样的层次分明的软件开发和处理流程被称为 MVC 模式。

        总结如下:

            (1) 视图层(View):负责格式化数据并把它们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能。
            (2) 控制层(Controller):负责接收并转发请求,对请求进行处理后,指定视图并将响应结果发送给客户端。
            (3) 数据模型层(Model):模型对象拥有最多的处理任务,是应用程序的主体部分,它负责数据逻辑(业务规则)的处理和实现数据操作(即在数据库中存取数据)。

        优点:

            (1) 多视图共享一个模型,大大提高了代码的可重用性;
            (2) MVC 三个模块相互独立,松耦合架构;
            (3) 控制器提高了应用程序的灵活性和可配置性;
            (4) 有利于软件工程化管理;

            通过 MVC 设计模式最终可以打造出一个松耦合 + 高可重用性 + 高可适用性的架构。

        缺点

            (1) 原理复杂;
            (2) 增加了系统结构和实现的复杂性;
            (3) 视图对模型数据的低效率访问;

        MVC 并不适合小型甚至中型规模的项目,花费大量时间将 MVC 应用到规模并不是很大的应用程序,通常得不偿失,所以对于 MVC 设计模式的使用要根据具体的应用场景来决定。

 

2. Spring MVC 简介

    Spring MVC(模型-视图-控制)框架是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。Spring MVC 围绕 DispatcherServlet 设计的,DispatcherServlet 用来处理所有的 HTTP 请求和响应。

    Spring MVC 是结构最清晰的 Servlet + JSP + JavaBean 的实现,是一个典型的教科书式的 MVC 构架,不像 Struts 等其它框架都是变种或者不是完全基于 MVC 系统的框架。 Spring MVC 采用松耦合可插拔的组件结构,具有高度可配置性,比起其它 MVC 框架更具有扩展性和灵活性。

    在 Spring MVC 框架中,Controller 替换 Servlet 来担负控制器的职责,用于接收请求,调用相应的 Model 进行处理,处理器完成业务处理后返回处理结果。Controller 调用相应的 View 并对处理结果进行视图渲染,最终客户端得到响应信息。

    Spring MVC 本身就是 Spring 框架的一部分,所以可以说与 Spring 框架是无缝集成,性能方面具有先天的优越性,对于开发者来说,开发效率也高于其它的 Web 框架,在企业中的应用越来越广泛,成为主流的 MVC 框架。

    一个好的框架要减轻开发者处理复杂问题的负担,内部有良好的扩展,并且有一个支持它的强大用户群体,恰恰 Spring MVC 都做到了。


3. 创建 Maven Webapp 项目

    本文将在 Windows 下使用 IntelliJ IDEA 和 Apache Maven 创建一个简单的 Maven Webapp 程序。在开始之前,确保已经正确搭建了 Spring 开发环境,参考 “Spring基础知识(1)- Spring简介、Spring体系结构和开发环境配置”。

    Windows版本 : Windows 10 Home (20H2)   
    IntelliJ IDEA:Community Edition for Windows 2020.1.4
    Apache Maven:3.8.1


    1) 在 IDEA上创建 Maven Webapp 项目

        (1) 运行 IDEA
    
            点击菜单 New 创建 Project:
            
            New Project -> Project Type: Maven -> Project SDK: 1.8 -> Check "Create from archtype" -> select "org.apache.maven.archtypes:maven-archtype-webapp" -> Next

                Name: SpringmvcBasic
                GroupId: com.example
                ArtifactId: SpringmvcBasic

            -> Finish

        (2) 生成的项目目录结构和文件

            |-- src
            |    |-- main
            |         |-- webapp
            |               |-- WEB-INF
            |               |     |-- web.xml
            |               |-- index.jsp
            |   
            |-- pom.xml

        (3) index.jsp 代码

            <html>
            <body>
            <h2>Hello World!</h2>
            </body>
            </html>

        (4) web.xml 代码

            <!DOCTYPE web-app PUBLIC
                "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                "http://java.sun.com/dtd/web-app_2_3.dtd" >

            <web-app>
                <display-name>Archetype Created Web Application</display-name>
            </web-app>

        (5) pom.xml 代码

 1             <?xml version="1.0" encoding="UTF-8"?>
 2             <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4             <modelVersion>4.0.0</modelVersion>
 5 
 6             <groupId>com.example</groupId>
 7             <artifactId>SpringmvcBasic</artifactId>
 8             <version>1.0-SNAPSHOT</version>
 9             <packaging>war</packaging>
10 
11             <name>SpringmvcBasic Maven Webapp</name>
12             <!-- FIXME change it to the project's website -->
13             <url>http://www.example.com</url>
14 
15             <properties>
16                 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
17                 <maven.compiler.source>1.8</maven.compiler.source>
18                 <maven.compiler.target>1.8</maven.compiler.target>
19             </properties>
20 
21             <dependencies>
22                 <dependency>
23                 <groupId>junit</groupId>
24                 <artifactId>junit</artifactId>
25                 <version>4.11</version>
26                 <scope>test</scope>
27                 </dependency>
28             </dependencies>
29 
30             <build>
31                 <finalName>SpringmvcBasic</finalName>
32                 <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
33                     <plugins>
34                         
35                         ...
36 
37                     </plugins>
38                 </pluginManagement>
39             </build>
40             </project>

 

    2) 使用 tomcat7-maven-plugin, 将 tomcat 内嵌运行

        (1) 修改 pom.xml

 1             <project ... >
 2                 <build>
 3                     <plugins>
 4                         <plugin>
 5                             <groupId>org.apache.tomcat.maven</groupId>
 6                             <artifactId>tomcat7-maven-plugin</artifactId>
 7                             <version>2.2</version>
 8                             <configuration>                
 9                                 <path>/</path>
10                                 <port>9090</port>
11                                 <uriEncoding>UTF-8</uriEncoding>
12                             </configuration>
13                         </plugin>
14                     </plugins>
15                 </build>
16             </project>

 

            *注: path 是项目访问路径, 如果配置为/aa,则访问路径为 http://localhost:9090/aa 。

        (2) 配置运行

            Run -> Edit configurations -> Click "+" -> Select "Maven"

                Command line: clean tomcat7:run
                Name: SpringmvcBasic [clean,tomcat7:run]

                Before Launch:
                    Click "+", select "Launch Web Browser"
                    Browser: default
                    Url: http://localhost:9090

            -> OK

            Run -> Run "SpringmvcBasic [clean,tomcat7:run]"

        (3) 打包 War 后运行

            Run -> Edit configurations -> Click "+" -> Select "Maven"

                Command line: clean tomcat7:run-war
                Name: SpringmvcBasic [clean,tomcat7:run-war]

                Before Launch:
                    Click "+", select "Launch Web Browser"
                    Browser: default
                    Url: http://localhost:9090

            -> OK

            Run -> Run "SpringmvcBasic [clean,tomcat7:run-war]"

            在 target 目录下会生成 SpringmvcBasic.war

        (4) 打包 War (方式二)

            View -> Tool Windows -> Maven -> SpringmvcBasic -> Lifecycle -> Clean | Package

            在 target 目录下会生成 SpringmvcBasic.war


4. 配置 Spring MVC

    1) 导入 servlet-api, springmvc 相关依赖包

        访问 http://www.mvnrepository.com/,查询 servlet-api, springmvc 。

    修改 pom.xml:

 1             <project ... >
 2                 ...
 3 
 4                 <dependencies>
 5 
 6                     ...
 7 
 8                     <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
 9                     <dependency>
10                       <groupId>javax.servlet</groupId>
11                       <artifactId>javax.servlet-api</artifactId>
12                       <version>4.0.1</version>
13                       <scope>provided</scope>
14                     </dependency>
15 
16                     <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
17                     <dependency>
18                       <groupId>org.springframework</groupId>
19                       <artifactId>spring-web</artifactId>
20                       <version>4.3.9.RELEASE</version>
21                     </dependency>
22                     <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
23                     <dependency>
24                       <groupId>org.springframework</groupId>
25                       <artifactId>spring-webmvc</artifactId>
26                       <version>4.3.9.RELEASE</version>
27                     </dependency>
28                     <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
29                     <dependency>
30                       <groupId>org.springframework</groupId>
31                       <artifactId>spring-jdbc</artifactId>
32                       <version>4.3.9.RELEASE</version>
33                     </dependency>
34                     <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
35                     <dependency>
36                         <groupId>org.springframework</groupId>
37                         <artifactId>spring-orm</artifactId>
38                         <version>4.3.9.RELEASE</version>
39                     </dependency>
40 
41                     ...
42 
43                 </dependencies>
44             
45                 ...    
46 
47             </project>


        在IDE中项目列表 -> SrpingmvcBasic -> 点击鼠标右键 -> Maven -> Reload Project

        本文选择了 springmvc 4.3.9.RELEASE 相关依赖包,servlet-api、spring-web 和 spring-webmvc 是必选项,spring-jdbc 和 spring-orm 是可选项,后期数据库操作时需要。

    2) 创建 springmvc-beans.xml

        在 src/main/resources (需要手动创建该目录,下同)目录下,创建 springmvc-beans.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"
 4             xmlns:mvc="http://www.springframework.org/schema/mvc"
 5             xmlns:context="http://www.springframework.org/schema/context"
 6             xsi:schemaLocation="http://www.springframework.org/schema/beans
 7                                 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
 8                                 http://www.springframework.org/schema/mvc
 9                                 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd    
10                                 http://www.springframework.org/schema/context
11                                 http://www.springframework.org/schema/context/spring-context-4.0.xsd">
12 
13         </beans>

         springmvc-beans.xml 文件就是一种 spring 配置文件,它的标签含义可以参考 “Spring基础知识(3)- Spring IoC” 的 “4. Spring 配置文件”。这里新增了 mvc 命名空间:

    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"

  注:spring-xxx-4.0.xsd 都选择了 4.0 版本,springmvc 是 4.3.9.RELEASE 向下兼容 4.0 的命名空间,如果需要使用 4.3 版本特有的命名空间,可以把 xsd 改成  http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 。

    3) 修改 web.xml

 1         <!DOCTYPE web-app PUBLIC
 2             "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 3             "http://java.sun.com/dtd/web-app_2_3.dtd" >
 4 
 5         <web-app id="WebApp_ID" version="2.4"
 6                  xmlns="http://java.sun.com/xml/ns/j2ee"
 7                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 8                  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 9                                      http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
10                              
11             <display-name>Springmvc Basic</display-name>
12 
13             <!-- Springmvc -->
14             <servlet>
15                 <servlet-name>springMVC</servlet-name>
16                 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
17                 <init-param>
18                     <param-name>contextConfigLocation</param-name>
19                     <param-value>classpath:springmvc-beans.xml</param-value>
20                 </init-param>
21                 <load-on-startup>1</load-on-startup>
22             </servlet>
23             <servlet-mapping>
24                 <servlet-name>springMVC</servlet-name>
25                 <url-pattern>/</url-pattern>
26             </servlet-mapping>
27         </web-app>

 

        IDEA 创建的 org.apache.maven.archtypes:maven-archtype-webapp 项目,默认使用 JSP 1.2 规范,EL (Expression Language) 是关闭的,必须手动在 JSP 文件里加入 <%@page isELIgnored="false" %> 才能使用 EL 表达式。

        这里在 <web-app> 引入 JSP 2.x 相关的命名空间,就不需要在每个 JSP 文件里手动加入 isELIgnored="false" 语句,因为 JSP 2.x 下 EL 默认是打开的。

        也可以在 <web-app> 引入 Servlet/JSP 3.x 的命名空间,格式如下:
        
            <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
                    version="3.1">

      ...

    </web-app>

 

    4) 创建 View

        View 是指 JSP 文件,JSP文件一般都在 webapp 目录或子目录下,这里配置的路径是 src/main/webapp/WEB-INF/jsp/,中间路径如果不存在,自行创建(下同)。

        创建 src/main/webapp/WEB-INF/jsp/demo.jsp 文件,代码如下:

 1             <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
 2             <html>
 3             <head>
 4                 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 5                 <title>Demo</title>
 6             </head>
 7             <body>
 8                 <h3>Demo Page</h3>
 9                 <p>&nbsp;</p>
10                 <p>Message: ${message} </p>
11             </body>
12             </html>

 

    5) 创建 Controller

        Controller 是指 Controller 类文件,这里的路径是 src/main/java/com/example/controller,中间路径如果不存在,自行创建(下同)。

        (1) 创建 src/main/java/com/example/controller/TestController.java 文件,代码如下:

 1             package com.example.controller;
 2 
 3             import javax.servlet.http.HttpServletRequest;
 4             import javax.servlet.http.HttpServletResponse;
 5             import org.springframework.ui.ModelMap;
 6             import org.springframework.web.servlet.ModelAndView;
 7             import org.springframework.web.servlet.mvc.Controller;
 8 
 9             public class TestController implements Controller {
10                 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
11                     ModelMap modelMap = new ModelMap();
12                     modelMap.addAttribute("message", "Spring MVC Demo Page");
13                     return new ModelAndView("/WEB-INF/jsp/demo.jsp", modelMap);
14                 }
15             }

 

    这里的 Controller 接口仅仅定义了一个方法 handleRequest() 用于负责处理客户请求,并返回适当的模型和视图,即一个 action 对应于一个 Controller。

    Spring 有一个多 action 控制器 MultiActionController,可以将多个 action 聚合在同一个控制器之内,实现功能集成,放在后期的文章里讲解。

 

         (2) 把 Controller 配置到 springmvc-beans.xml

            修改 src/main/resources/springmvc-beans.xml

1             <beans ...>
2                 ...
3 
4                 <!-- TestController 类映射到 "/demo" -->
5                 <bean name="/demo" class="com.example.controller.TestController"/>
6 
7                 ...
8             </beans>

 

    6) 运行

        跳转到第 2 步的 “使用 tomcat7-maven-plugin, 将 tomcat 内嵌运行”,运行程序。

        访问 http://localhost:9090/demo ,页面输出:

            Demo Page
    
            Message: Spring MVC Demo Page

 

本系列文章资料参考来源:

1. http://c.biancheng.net/spring_mvc/

2. https://docs.spring.io/spring-framework/docs/4.3.9.RELEASE/spring-framework-reference/html/mvc.html#mvc-introduction

 

posted @ 2022-03-22 16:16  垄山小站  阅读(158)  评论(0编辑  收藏  举报