目录
[第一章:Java Web的发展历史](#第一章:Java Web的发展历史)
[1.1 Model I和Model II](#1.1 Model I和Model II)
[1.2 MVC模式](#1.2 MVC模式)
[2.1 搭建SpringMVC的入门程序](#2.1 搭建SpringMVC的入门程序)
[2.2 小结](#2.2 小结)
[3.1 SpringMVC中心控制器](#3.1 SpringMVC中心控制器)
[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.xml
、springmvc.xml
,以及如何创建Controller、视图页面。这个例子帮助我们理解了SpringMVC的基本结构和工作原理。
第三章:SpringMVC原理
3.1 SpringMVC中心控制器
SpringMVC的核心是DispatcherServlet
,它作为前端控制器,负责接受所有请求并分发给适当的处理器。请求的处理流程如下:
- 请求到达DispatcherServlet :首先请求会到达
DispatcherServlet
,它根据请求路径和配置的HandlerMapping
找到合适的控制器。 - 执行Controller方法 :
DispatcherServlet
调用相应的Controller方法来处理请求。 - 视图解析 :根据返回的视图名称,
DispatcherServlet
通过ViewResolver
解析出具体的视图。 - 渲染视图并返回给客户端:最终,返回的视图被渲染并返回给客户端。
3.2入门案例的执行流程
我们再从刚刚写的入门案例去分析SpringMVC原理它的执行流程:
- 1当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,就会加载springmvc.xml配置文件
- 2开启了注解扫描,那么HelloController对象就会被创建
- 3从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解找到
- 执行的具体方法
- 4根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件
- 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应用的开发变得更加灵活、清晰和可维护。
参考文章: