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

相关推荐
wl851118 分钟前
Vue 入门到实战 七
前端·javascript·vue.js
2501_9032386532 分钟前
自定义登录页面的Spring Security实践
java·后端·spring·个人开发
Enti7c1 小时前
用 HTML、CSS 和 JavaScript 实现抽奖转盘效果
前端·css
LCG元1 小时前
Vue.js组件开发-使用Vue3如何实现上传word作为打印模版
前端·vue.js·word
飞翔的佩奇1 小时前
Java项目: 基于SpringBoot+mybatis+maven+mysql实现的图书管理系统(含源码+数据库+答辩PPT+毕业论文)
java·数据库·spring boot·mysql·spring·毕业设计·图书管理
dal118网工任子仪1 小时前
94,【2】buuctf web [安洵杯 2019]easy_serialize_php
android·前端·php
大模型铲屎官2 小时前
HTML5 技术深度解读:本地存储与地理定位的最佳实践
前端·html·html5·本地存储·localstorage·地理定位·geolocation api
字节全栈_kYu2 小时前
微信小程序视频点播在线视频学习系统 毕业设计 课程设计(1)首页_微信小程序视频功能设计流程图
学习·微信小程序·课程设计
想拿高薪的韭菜2 小时前
人工智能第2章-知识点与学习笔记
人工智能·笔记·学习
一 乐2 小时前
基于vue船运物流管理系统设计与实现(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端·船运系统