前言:当今,Web应用程序开发已成为软件开发的核心领域之一。为了简化和加速Web应用程序的开发过程,Spring MVC应运而生。Spring MVC是Spring Framework中的一个模块,旨在使用MVC(Model-View-Controller)设计模式来构建基于浏览器的Web应用程序。Spring MVC框架基于Servlet技术,是一个灵活且高度可定制的框架。它提供了一种结构良好的方式来组织和处理请求、响应和业务逻辑,并将其分离成不同的组件。这种分离使得应用程序更容易测试、维护和扩展。
- SpringMVC概述
1.MVC设计模式:
MVC设计模式是一种经典的软件设计模式,将应用程序的逻辑分为三个组件:
Model(模型):负责处理应用程序的业务逻辑和数据。
View(视图):负责呈现模型的数据,并与用户进行交互。
Controller(控制器):接收用户的请求,处理并将适当的模型数据传递给视图。
2.核心概念:
Spring MVC依赖于以下核心概念:
DispatcherServlet:这是Spring MVC框架的中央控制器,接收所有的请求并将其分派给相应的处理程序。
HandlerMapping:根据请求的URL映射到相应的处理程序。
Controller:处理请求并生成适当的响应。它可以是一个类,也可以是一个基于注解的控制器。
ViewResolver:将逻辑视图名称解析为实际的视图模板。
View:负责呈现响应数据给用户。常见的视图技术包括JSP、Thymeleaf、Freemarker等。
1、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为 HandlerExecutionChain 对象(包含一个 Handler 处理器(页面控制器)对象、多个 HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个 ModelAndView 对象(包含模型数据、逻辑视图名);
5、 ModelAndView 的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的 View,通过这种策略模式,很容易更换其他视图技术;
6、 View——>渲染,View 会根据传进来的 Model 模型数据进行渲染,此处的 Model 实际是一个 Map 数据结构,因此很容易支持其他视图技术;
7、返回控制权给 DispatcherServlet,由 DispatcherServlet 返回响应给用户,到此一个流程结束。
二、搭建一个简单的SpringMVC项目
1.在eclipse中新建【Dynamic Web Project】项目,项目命名为springmvc_demo,项目结构如下图
- 加入SpringMVC的jar包,最少加入以下几个:
在web.xml中配置“DispatcherServlet”SpringMVC是基于Servlet的框架,DispatcherServlet是整个SpringMVC框架的核心DispatcherServlet主要职责是接收所有用户请求,并将其分派给相应的Controller来处理
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置DispatcherServlet接受所有URL请求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
注意:servlet-mapping用于配置servlet接受哪些URL请求,<url-pattern>/</url-pattern>表示接受所有请求,注意,千万不要写成<url-pattern>/*</url-pattern>
4.在 web.xml添加 SpringMVC的一个过滤器,用于将请求和响应进行编码,以免中文乱码
<!-- 编码过滤器,解决中文乱码问题 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5.创建Spring MVC的配置文件“spring-mvc.xml”在项目工程下新建资源文件夹【Source Folder】,命名为“resources”,在“resources”下创建配置文件“spring-mvc.xml”
编辑“spring-mvc.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">
<!-- 这里添加其他配置 -->
</beans>
修改“web.xml”,配置在tomcat启动的时候自动加载“spring-mvc.xml”配置
7.在项目中,新建“hello.jsp”页面
在“WEB-INF”文件夹下,新建views文件夹,用来统一管理所有的jsp页面
在views文件夹下新建“hello.jsp”页面
8.创建控制器Controller
在“src”下新建包“controller”,包下新建控制器类“HelloController”
@Controller
public class HelloController {
//通过"/hello"来访问hello.jsp页面
@RequestMapping("/hello")
public String hello(){
return "/WEB-INF/views/hello.jsp";
}
}
通过“http://localhost:8080/springmvc_demo/hello” 来访问hello.jsp页面
9.修改“spring-mvc.xml”配置文件,通过扫描将controller配置到Spring容器中
<!-- 将控制器扫描到容器中 -->
<context:component-scan base-package="controller"/>
<!-- 开启SpringMVC框架的注解驱动 -->
<mvc:annotation-driven/>
10.将该项目添加至tomcat运行,在浏览器中输入url进行验证,如下:
http://localhost:8080/springmvc_demo/hello
优化控制器返回的视图地址
在“spring-mvc.xml”配置文件中加入视图解析器配置:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
视图解析器会帮助我们在控制器中返回视图的时候自动加上前缀和后缀
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
- SpringMVC Controller
1.在Spring MVC 中使用 org.springframework.stereotype.Controller注解类型声明某类的实例是控制器
为控制器类加注解@Controller
扫描控制器所在的包<context:component-scan/>
在Spring MVC 中使用 @RequestMapping 将请求与处理方法一一对应
@RequestMapping负责将不同请求映射到对应的控制器方法中
@RequestMapping不仅仅可以定义在方法处,还可以定义在类上
也可以使用组合注解来限制方法接收请求的类型。
三、前后端数据交互
以登录为例:
<form method=”post” action=”${pageContext.request.contextPath}/doLogin”>
<h1>用户登录</h1>
用户名:<input type="text" name="username" id="username"> <br>
密 码:<input type="password" id="password" name="password"><br><br>
<input type="submit" value="提 交">
<input type="reset" value="重 置">
</form>
(1)第一种方式:使用HttpServletRequest接收请求参数
使用HttpServletRequest 作为Action的参数来接收用户请求,从用户请求中获取参数值.
//接收登录表单请求
@RequestMapping ("/doLogin")
public String doLogin (HttpservletRequest request) {
String username = request.getParameter ( "username" ) ;
String password = request.getParameter ( "password");//通过getParameter//方法获取参数
boolean success = loginService.isSuccess (username,password);
if ( success) {
return "/login/login_succ" ;
}else {
return "/login/login_fail";
}
(2)使用简单数据类型接收请求参数
这种方式要保证方法形参名要和用户请求参数名保持一致
- 使用实体类对象接收请求参数
在Action中使用“LoginParam”对象作为参数来接收表单数据
控制器获取到数据后,需要将数据渲染到视图中
介绍三种方式
(1)通过HttpServletRequest传递数据
视图端通过EL表达式${键名}来获取数据
(2)可以使用SpringMVC提供的Model对象来完成控制器和视图之间数据的传递
Model是一个Map的数据结构,也可以使用Map/ModelMap作为入参
(3)使用ModelAndView传递数据【推荐】
三、数据交互
1.绑定数组
在实际开发中,可能会遇到前端请求需要传递到后台一个或多个相同名称参数的情况(如批量删除),此时,可以使用绑定数组的方式完成实际需求。
新建一个“User”实体类,用于封装每个用户的数据
public class User{
private String username;
private int sex;
private int age;
//get/set方法
}
新建一个“UserList”包装类,封装用户集合属性
public class UserList{
private List<User> users;
public List<User> getUsers(){
return users;
}
public void setUsers(List<User> users){
this.users = users;
}
}
在控制器类“UserController”中,编写接收批量新增用户的方法,在方法中使用类型“UserList”来绑定请求参数值。
@Controller
@RequestMapping("/user")
public class UserController{
@RequestMapping("/addList")
@ResponseBody
public String addList(UserList param){
for (User user:param.getUsers()){
System.out.println("新增用户:" + user.toString());
}
return "success";
}
批量新增用户表单修改如下:
2. @ModelAttribute注解
(1)标注在方法的形参上
(2)标注在方法上
3.@SessionAttributes注解
(1)使用“HttpSession”对象
(2)使用“@SessionAttributes”注解
(4)JSON数据交互
AJAX 是一种异步数据传输技术,可以在无需重新加载整个网页的情况下,能够更新部分网页内容 AJAX是使用JavaScript技术来实现的 ,JQuery简化了AJAX技术的使用
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。 JSON有对象结构和数组结构两种数据结构
SpringMVC默认提供了MappingJackson2HttpMessageConverter实现类默认处理JSON格式请求响应 该实现类利用Jackson开源包读写JSON数据,可以将Java对象转化为JSON,也可以将JSON转化为Java对象
a.引入上面这三个包
b.使用JQuery框架发送AJAX请求
c.在“login.jsp”页面,发送Ajax请求登录 页面中引入JQuery框架脚本,并为“提交”按钮增加“onclick”事件,在事件中发送Ajax请求
d.编写函数ajaxLogin,发送AJAX请求
e.在“LoginController”中,新增Action用于处理Ajax异步请求
f.需要修改“spring-mvc.xml”配置文件,解决找不到“jquery-3.4.1.min.js”(静态资源访问)的问题
四、拦截器
Spring MVC的拦截器(Interceptor)与Java Servlet的过滤器(Filter)类似,主要用于拦截用户的请求并做相应的处理。 通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
1.HandlerInterceptor接口里面有三个方法
preHandle方法:该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回true表示继续向下执行,返回false表示中断后续操作,可以进行编码、安全控制、权限校验等处理。
postHandle方法:该方法在控制器的处理请求方法调用之后,解析视图之前执行,可以通过此方法对模型和视图做进一步的修改。
afterCompletion方法:该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志等工作。
2.让自定义的拦截器生效还需要在SpringMVC的配置文件中进行配置:
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 配置一个全局拦截器,拦截所有请求 -->
<bean class="interceptor.TestInterceptor"></bean>
<!-- 定义指定路径的拦截器 -->
<mvc:interceptor>
<!-- 配置拦截器执行拦截的路径 , /**表示拦截所有请i去 -->
<mvc:mapping path="/**"/>
<!-- 配置不需要拦截的路径 -->
<mvc:exclude-mapping path="/login"/>
<!-- 定义在 mvc:interceptor中,表示匹配指定路径的请求才被拦截-->
<bean class="interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<mvc:interceptors>元素用于配置一组拦截器,其子元素<bean>定义的是全局拦截器,即拦截所有请求
<mvc:interceptor>元素定义指定路径的拦截器,其子元素<mvc:mapping>用于配置拦截器作用的路径,该路径在path中定义
<mvc:exclude-mapping>用于配置不需要拦截的路径
例:在项目中实现用户请求追踪的功能,通过定义拦截器将所有用户请求的URI,请求的参数,请求耗时以及请求过程中的异常记录到日志文件中。
定义拦截器“RequestTraceLogInterceptor”
在preHandle方法记录日志:请求URI、请求参数
在afterCompletion方法记录日志:请求耗时、请求过程中的异常
总结:Spring MVC是一个灵活且功能强大的Web应用程序开发框架,它采用经典的MVC架构模式,可以帮助开发人员构建可扩展、可维护的Web应用程序。核心组件包括DispatcherServlet、处理器映射器和处理器适配器,通过注解和配置文件实现URL到处理器的映射,提供灵活的请求处理和视图渲染机制。Spring MVC还提供了丰富的验证器、数据绑定和国际化支持等功能,能够满足各种Web开发需求。