Java Web的发展史与SpringMVC入门学习(SpringMVC框架入门案例)

目录

[第一章:Java Web的发展历史](#第一章:Java Web的发展历史)

[1.1 Model I和Model II](#1.1 Model I和Model II)

[1.2 MVC模式](#1.2 MVC模式)

第二章:SpringMVC的入门案例

[2.1 搭建SpringMVC的入门程序](#2.1 搭建SpringMVC的入门程序)

[2.2 小结](#2.2 小结)

第三章:SpringMVC原理

[3.1 SpringMVC中心控制器](#3.1 SpringMVC中心控制器)

3.2入门案例的执行流程

[3.2 组件分析](#3.2 组件分析)


前言

在这篇文章中,我们将探讨Java Web的演变历史、经典开发模式(如Model I与Model II),以及SpringMVC框架的入门案例。通过这些内容,你将能够理解Web应用的设计理念及其演变过程,并掌握一个简单的SpringMVC项目的搭建过程。

第一章:Java Web的发展历史

1.1 Model I和Model II

1.1.1 Model I开发模式

在早期的Java Web开发中,Model I开发模式占据主导地位。Model I的核心是JSP(JavaServer Pages)页面,它负责渲染页面、控制业务逻辑以及与JavaBean(业务逻辑)进行交互。在这种模式下,JSP页面不仅处理页面展示,还包含业务控制逻辑,这导致了系统耦合度过高,维护起来非常困难。

Model1开发模式:JSP+JavaBean的模式,它的基本流程如下:

Model I的缺点:
  • 高度耦合:JSP页面既负责展示也负责处理业务逻辑,导致代码难以维护。
  • 难以扩展:随着项目需求的增长,JSP文件会变得越来越复杂。

1.1.2 Model II开发模式

为了解决Model I 的缺点,出现了Model II开发模式。在Model II中,开发者将业务逻辑、页面展示和控制流程分开,使得代码更易维护和扩展。具体组件分工如下:

  • JSP:负责展示数据的视图。
  • Servlet:负责处理请求,控制流程(流程控制器)。
  • JavaBean:负责封装业务逻辑和数据。

它的基本流程如下:

Model II的优点:
  • 分层设计:通过明确的职责分工,程序结构更加清晰,易于扩展。
  • 适合大型项目开发:由于业务逻辑和展示逻辑分开,代码易于维护。

然而,随着技术的发展,Model II的设计模式也逐渐显得过时,特别是对于更复杂的应用,新的框架和架构设计应运而生。


1.2 MVC模式

1.2.1 什么是MVC?

MVC(Model-View-Controller)是一种常见的软件架构模式,用于开发用户界面。MVC模式将应用程序分为三个主要部分:

  • Model(模型):处理数据和业务逻辑。
  • View(视图):负责数据的展示,用户界面部分。
  • Controller(控制器):接收用户输入并调用Model和View进行交互。

MVC的核心思想是通过将应用程序的不同责任分离,减少代码的耦合度,从而提高可维护性、可扩展性和复用性。

1.2.2 什么是Spring MVC?

而Spring mvc是Spring框架的一个模块,专门做web开发,可以理解为是Servlet的升级

在Spring MVC框架中,Controller替代了传统Servlet的角色,负责接受请求并做出响应。Spring MVC提供了更加灵活和可扩展的架构,使得开发者可以更方便地处理Web请求。

Spring MVC的组成:

M:Model:模型层,指工程当中的Java Bean,作用是处理数据。

Java Bean分两类:

  • 一类是实体类Bean:专门存储业务数据的
  • 一类为业务处理Bean:指Servlet或Dao对象,专门处理业务逻辑和数据

**V:View,**视图层指项目当中的 HTML 或 jsp 等页面,作用是与用户进程交互,展示数据。

**C:Contoller,**控制层,通常是一个Servlet类,作用是接受请求和响应数据。

MVC思想不是那个语言所特有的设计模式,也不是web应用所特有的思想,而是一种规范。MVC思想将一个应用分成三个基本部分:Model(模型)、View(视图)和Controller(控制器),这三个部分以最少的耦合协同工作,从而提高了应用的可扩展性和可维护性。他们三者的关系如下图所示:


第二章:SpringMVC的入门案例

2.1 搭建SpringMVC的入门程序

以下是搭建SpringMVC项目的步骤,包括创建Web工程、配置相关依赖、以及实现一个简单的HelloWorld功能。

2.1.1 创建WEB工程并引入依赖

首先,创建一个Maven Web项目,并在pom.xml中引入必要的Spring MVC依赖。

XML 复制代码
<!--版本锁定-->
<properties>
  <spring.version>5.0.2.RELEASE</spring.version>
</properties>

<dependencies>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.0</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.9.0</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.9.0</version>
</dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <!--SpringMVC-->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <!--servlet API-->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
  </dependency>

  <dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
  </dependency>

  <!--日志-->
  <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
  </dependency>

  <dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring4</artifactId>
    <version>3.0.9.RELEASE</version>
  </dependency>

</dependencies>
2.1.2 配置web.xml

(1)首先需要将原本的web.xml配置文档做出如下更改:

XML 复制代码
<web-app version="3.0" 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_3_0.xsd">
   
 </web-app>

(2)配置DispatcheServlet

  • Spring MVC是基于原生的servlet,通过强大的前端控制器DispatcheServlet,对请求和响应进行统一处理。
  • Spring MVC的本质就是一个servlet,是对原生的servlet进行了封装。
    在以前我们浏览器的每一次请求都需要我们写一个对应的servlet,现在我们只需要将浏览器的请求和响应交给DispatcheServlet进行统一的处理。

在web.xml配置文件中,配置前端控制器DispatcherServlet,以及其他必要配置:

XML 复制代码
<!--在web.xml中配置Spring提供的过滤器类 -->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <async-supported>true</async-supported>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<!--不拦截所有是html的页面请求-->
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

<!--配置前端控制器,对浏览器发送的请求进行统一处理-->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--加载springmvc.xml配置文件的位置和名称,配置的是Spring配置-->
    <init-param>
        <!--contextConfigLocation:上下文配置路径,固定值-->
        <param-name>contextConfigLocation</param-name>
        <!--classpath:类路径,值得是Java和resources文件夹-->
        <!--springmvc.xml:指的是配置文件的名称:需要配置springmvc.xml,在下面-->
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!--配置启动加载-->
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>   
</servlet-mapping>

<!--开启项目时打开的页面-->
<welcome-file-list>
    <welcome-file>/index.html</welcome-file>
</welcome-file-list>
2.1.3 配置SpringMVC的springmvc.xml

springmvc.xml中配置组件扫描、视图解析器、处理器适配器等。

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:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--配置spring创建容器时要扫描的包-->
    <context:component-scan base-package="com.qcby"></context:component-scan>

    <!--处理映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

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

    <!--配置视图解析器-->
    <bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine" ref="templateEngine"/>
    </bean>
    <!-- templateEngine -->
    <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
        <property name="templateResolver" ref="templateResolver"/>
    </bean>
    <bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
        <property name="prefix" value="/html/" />
        <property name="suffix" value=".html" />
        <property name="templateMode" value="HTML5"/>
    </bean>
    <!-- JSON View -->
    <bean
        class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
    </bean>
    <!-- 配置spring开启注解mvc的支持  默认就是开启的 ,要想让其他组件(不包含映射器、适配器、处理器)生效就必须需要配置了-->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>
2.1.4 创建Controller类

我们创建一个简单的HelloController,它负责处理请求并返回视图。

java 复制代码
//把当前类交给IOC容器进行管理
@Controller
public class HelloController {
    /**
     * 处理超链接发送出来的请求
     * @param model
     * @return
     */
    @RequestMapping(path = "/hello.do")
    public String sayHello(Model model){

        System.out.println("入门方法执行了2...");
        // 向模型中添加属性msg与值,可以在html页面中取出并渲染
        model.addAttribute("msg","hello,SpringMVC");
        // 配置了视图解析器后,写法
        return "suc";

    }
}
2.1.5 创建视图页面
  • index.html:入口页面,包含一个超链接。
html 复制代码
<html>
<head>
    <meta charset="utf-8">
    <title>SpringMVC 入门程序</title>
</head>
<body>
    <h3>SpringMVC 入门程序</h3>
    <a href="/hello">点击这里</a>
</body>
</html>
  • suc.html :成功页面,显示msg内容。
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>成功</title>
</head>
<body>
    <h1>Hello <b>${msg}</b></h1>
</body>
</html>
2.1.6 启动项目

启动Tomcat服务器,访问index.html,点击链接后,你将看到显示Hello, SpringMVC!的页面。

2.2 小结

在这部分,我们成功搭建了一个简单的SpringMVC项目,学习了如何配置web.xmlspringmvc.xml,以及如何创建Controller、视图页面。这个例子帮助我们理解了SpringMVC的基本结构和工作原理。


第三章:SpringMVC原理

3.1 SpringMVC中心控制器

SpringMVC的核心是DispatcherServlet,它作为前端控制器,负责接受所有请求并分发给适当的处理器。请求的处理流程如下:

  1. 请求到达DispatcherServlet :首先请求会到达DispatcherServlet,它根据请求路径和配置的HandlerMapping找到合适的控制器。
  2. 执行Controller方法DispatcherServlet调用相应的Controller方法来处理请求。
  3. 视图解析 :根据返回的视图名称,DispatcherServlet通过ViewResolver解析出具体的视图。
  4. 渲染视图并返回给客户端:最终,返回的视图被渲染并返回给客户端。

3.2入门案例的执行流程

我们再从刚刚写的入门案例去分析SpringMVC原理它的执行流程:

  1. 1当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,就会加载springmvc.xml配置文件
  2. 2开启了注解扫描,那么HelloController对象就会被创建
  3. 3从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解找到
  4. 执行的具体方法
  5. 4根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件
  6. 5Tomcat服务器渲染页面,做出响应

SpringMVC官方提供流程图:

3.2 组件分析

SpringMVC的组件包括:

  • 前端控制器(DispatcherServlet)
  • 处理器映射器(HandlerMapping)
  • 处理器(Handler)
  • 处理器适配器(HandlerAdapter)
  • 视图解析器(ViewResolver)
  • 视图(View)

1.前端控制器 DispatcherServlet

DispatcherServlet本质上是一个Servlet,相当于一个中转站,所有的访问都会走到这个Servlet中,再根据配置进行中转到相应的Handler中进行处理,获取到数据和视图后,在使用相应视图做出响应。

2.处理器映射器 HandlerMapping

HandlerMapping本质上就是一段映射关系,将访问路径和对应的Handler存储为映射关系,在需要时供前端控制器查阅。

3.处理器适配器 HandlerAdapter

本质上是一个适配器,可以根据要求找到对应的Handler来运行。

由于 Handler 涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发 Handler。

4.视图解析器(ViewResolver)

本质上也是一种映射关系,可以将视图名称映射到真正的视图地址。前端控制器调用处理器适配完成后得到model和view,将view信息传给视图解析器得到真正的view。

5.视图渲染(View)

View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)。

本质上就是将handler处理器中返回的model数据嵌入到视图解析器解析后得到的页面中,向客户端做出响应。

SpringMVC5大组件关系

  • DispatcherServlet 控制器入口 负责分发请求
  • HandlerMapping 负责根据请求 找到对应的控制器
  • Controller 真正处理请求的控制器
  • ModelAndView 封装数据信息和视图信息的
  • ViewResolver 视图处理器 通过处理找到对应的页面

这些组件协作工作,共同完成请求的处理和响应的生成。通过这种结构,SpringMVC使得Web应用的开发变得更加灵活、清晰和可维护。


参考文章:

https://zhuanlan.zhihu.com/p/616608493

相关推荐
码哥DFS4 分钟前
Flex布局原理
前端·css·css3
超级小忍19 分钟前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
小样还想跑20 分钟前
axios无感刷新token
前端·javascript·vue.js
程序无bug23 分钟前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享26 分钟前
Java Lombok 入门
java
程序无bug26 分钟前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队27 分钟前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端
Java水解29 分钟前
一文了解Blob文件格式,前端必备技能之一
前端
苦学编程的谢41 分钟前
Maven
java·maven·intellij-idea
考虑考虑44 分钟前
Maven 依赖范围(Scope)
java·后端·maven