SpringMVC
概述
-
SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品,已经融合爱Spring Web Flow中
-
拥有一套完善的注解机制
-
支持RSSTful风格的请求
-
开发步骤
-
依赖
-
配置Servlet(前端控制器) DispathcerServlet
-
编写Controller和视图页面
-
注解配置Controller映射地址
-
将Controller使用注解配置到Spring容器中(@Controller)
-
配置spring-mvc.xml(配置组件扫描)、
-
执行访问测试
-
依赖 Artifacts注意导入lib
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.11.RELEASE</version>
</dependency>
-
web.xml
-
controller
package com.cyz.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
-
webapp/success.jsp
<%
-
spring-mvc.xml
-
web.xml 配置文件位置
<!-- 配置SpringMVC的前端控制器
默认访问时创建对象
load-on-startup : 启动时创建
-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置文件位置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.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>
知识要点
-
SpringMVC的开发步骤
-
依赖
-
SpringMVC核心控制器DispatcherServlet
-
创建Controller类和视图页面
-
使用注解配置Controller类中的业务方法的业务地址
-
将Controller交由Spring容器管理
-
配置SpringMVC核心文件spring-mvc.xml(扫描组件)
-
客户端访问测试
-
SpringMVC组件解析
SpringMVC的执行流程
-
客户端发起请求
-
请求前端控制器DispatchServlet
-
DispatchServlet收到请求调用查询Handler(处理器映射器 HandlerMapping)
-
HandlerMapping找具体的处理器(通过xml配置或注解配置进行查找) 生成处理器对象和处理器拦截器(有就生成)
-
返回处理器执行链 HandlerExecutionChain(包括我们要找的映射)给前端控制器
-
前端控制器拿到执行链后 请求Handler (处理器适配器 HandlerAdaptor)
-
HandlerAdaptor 请求适配 我们要找的处理器Handler(Controller后端处理器)
-
Controller返回响应ModelAndView HandlerAdaptor将返回ModelAndView对象给前端控制器
-
前端控制器将ModelAndView前端视图器 传给视图解析器(ViewResolver)
-
ViewResolver解析后返回具体的View
-
DispatchServlet根据View进行渲染视图(模型数据填充至视图中)
-
DispatchServlet响应返回客户端
SpringMVC注解解析
@RequestMapping
-
作用
-
用于建立请求URL和处理请求方法之间的关系
-
-
位置
-
类上:请求URL第一级访问目录,默认为根目录
-
方法上:请求URL的第二级目录,与类上的使用@RequestMapping标注的一级目录一起组成访问虚拟路径
-
-
参数
-
value:用于请求的URL,它和path属性的作用一样的
-
method:用于指定请求的方式
-
params:用于指定限制请求参数的条件,它支持简单的表达式,要求请求参数的key和value必须和配置的一模一样
-
params = {"accountName"}
表示请求参数必须有accountName -
params = {"money!100"}
表示请求参数中money不能是100
-
-
package com.cyz.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
Spring-mvc.xml
-
查看 webmvc依赖包下:DispatcherServlet.properties 默认配置
package com.cyz.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
知识要点
-
SpringMVC的相关组件
-
前端控制器:DispatcherServlet
-
处理器映射器:HandlerMapping
-
处理器是配置器:HandlerAdapter
-
处理器:Handler
-
视图解析器:ViewResolver
-
视图:View
-
-
SpringMVC注解和配置
-
请求映射注解:@RequestMapping
-
视图解析器配置:
-
REDIRECT_URL_PREFIX = "redirect:";
-
FORWARD_URL_PREFIX = "forward:";
-
private String prefix = "";
-
private String suffix = "";
-
-
SpingMVC数据响应
方式
-
页面跳转
-
直接返回字符串
-
通过ModelAndView对象返回
-
-
回写数据
-
直接返回字符串
-
返回对象或集合
-
页面跳转
-
返回字符串形式
-
直接返回字符串:将返回字符串与视图解析器的前后缀拼接后跳转
<property name="prefix" value="/WEB-INF/user/"/>
<property name="suffix" value=".jsp"/>转发资源地址:/WEB-INF/user/index.jsp
重定向:/user/index.jsp -
-
返回ModelAndView对象 三种方式
回写数据
-
直接返回字符串
-
web阶段使用 response.getWriter().print("hello world")
-
通过SpringMVC框架注入的response对象,使用response.getWriter().print("hello world"),此时不需要跳转页面,方法放回void
-
将需要回写的字符串直接返回,但此时需要通过@ResponseBody注解告诉SpringMVC框架,方法返回的字符串不是跳转是直接在http响应体返回
-
-
json格式的字符串
package com.cyz;
public class User {
private String username;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
-
依赖并导入lib
<!-- json转换需要-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.3</version>
</dependency>
<!-- json转换需要-->
-
接口
-
返回对象和集合
-
接口
-
配置 spring-mvc.xml
<!-- 配置处理器映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<!-- 配置json转换器-->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</list>
</property>
</bean>-
mvc注解代替以上方式
<mvc:annotation-driven/>
在SpringMVC的各个组件中,处理器映射器,处理器适配器,视图解析器成为SpringMVC的三大组件。
使用<mvc:annotation-driven/>自动加载RequestMappingHandlerMapping(处理器映射器)和 自动加载RequestMappingHandlerAdapter(处理器适配器),可在Spring-mvc.xml配置中使用<mvc:annotation-driven/>替代注解处理器和适配器的配置
同时使用<mvc:annotation-driven/>默认底层就会集成jackson进行对象或集合的json格式字符串的转换 -
知识要点
-
SpirngMVC的数据响应方式
-
页面跳转
-
直接返回字符串
-
通过ModelAndView对象返回
-
-
回写数据
-
直接返回字符串
-
返回对象或集合
-
-
Spring获取请求数据
-
客户端请求参数的格式是:
name=value&name=value...
-
服务端要获取请求的参数,有时需要进行数据的封装,SpringMVC可以接收如下类型的参数
-
基本类型参数
-
POJO类型参数
-
数组类型参数
-
集合类型参数
-
获取基本类型参数
-
Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配
获取POJO的类型参数
-
Controller中的业务方法的POJO参数的属性名称于请求参数的name一致,参数会自动映射
获取数组类型的参数
-
Controller中的业务方法数组名称与参数的name一致,参数会自动映射
-
http://localhost:8080/user/quick13?strs=aaa&strs=bbb&strs=ccc
获取集合类型参数
-
获取集合参数是,要将集合参数包装到一个POJO中才可以
package com.cyz.domain;
import java.util.List;
public class Vo {
private List<User> userList;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
-
webapp下form.jsp
<%
-
提交数据
-
当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接受集合数据而无需使用POJO进行包装
-
webapp/js下引入jquery-3.6.0.min.js
-
配置静态资源访问权限 spring-mvc.xml
<!--开放资源访问
mapping 访问地址
location 存放路径
-->
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/img/**" location="/img/"/>
<!--开放资源访问
mapping 访问地址
location 存放路径
-->
<!-- <mvc:resources mapping="/js/**" location="/js/"/>-->
<!-- <mvc:resources mapping="/img/**" location="/img/"/>-->
<!--
先让mvc去找 找不到 交由原始容器 tomcat
tomcat寻找资源
-->
<mvc:default-servlet-handler/>
-
webapp下ajax.jsp
<%
请求数据乱码问题
-
当Post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤
-
web.xml配置全局过滤器filter
<!-- 配置全局过滤器filter-->
<filter>
<filter-name>CharacterEncodingFilter</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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-
配置idea编码utf-8
-
配置tomcat运行VM options 参数
-Dfile.encoding=UTF-8
参数绑定注解@RequestParam
-
当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示绑定
-
@RequestParam参数
-
value:请求参数名称
-
required:true/false 参数是否必须 默认为true
-
defaultVale:没有提供参数时的默认值
-
获取Restfui风格的参数
-
url+请求方式
-
请求方式
-
GET:用于获取资源
-
POST:用于新建资源
-
PUT:用于修改资源
-
DELETE:用于删除资源
-
-
风格
-
/user/1 GET 得到 id = 1 的user
-
/user/1 DELETE 删除 id = 1 的user
-
/user/1 PUT 修改 id = 1 的user
-
/user POST 新增 user
-
-
占位符
{}
+@PathVariable
自定义类型转换器
-
springMVC默认已经提供了一些常用的类型转换器,例如客户端字符串转为int
-
但是不是所有的数据类型都提供类转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器
-
步骤
-
定义转换器类实现Converter接口
-
在配置文件中声明转换器
-
在
<annotation-driven>
中引用转换器
-
package com.cyz.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<String, Date> {
<!-- mvc注解驱动-->
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 声明转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.cyz.converter.DateConverter"/>
</list>
</property>
</bean>
获取Servlet相关API
获取请求头
-
@RequestHeader
-
用于获取请求头信息
-
-
属性
-
value:请求头名称
-
required:是否必须携带此请求头
-
获取Cookie
@CookieValue
-
用户获取指定的Cookie值
-
属性
-
value:cookie名称
-
required:是否必须携带此cookie
-
文件上传
-
文件上传客户端三要素
-
表单项
type="file"
-
表单提交方式是
post
-
表单的enctype属性是多部分表单形式,及
enctype=“multipart/form-data”
-
<%
-
文件上传原理
-
当form表单修改为多部分表单时,request.getParameter()失效
-
enctype="application/x-www-form-urlencoded"
时,form表单的正文内容格式是:-
key=value&key=value
-
-
当form表单的enctype取值为
multipart/form-data
时,请求正文内容就变为多部分表单形式
-
单文件上传步骤
-
依赖
-
配置文件上传解析器
-
编写上传代码
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
-
spring-mvc.xml
<!-- 配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 编码类型-->
<property name="defaultEncoding" value="UTF-8"/>
<!-- 文件总大小-->
<property name="maxUploadSize" value="5242800"/>
<!-- 单个文件的大小-->
<property name="maxUploadSizePerFile" value="5242800"/>
</bean>
-
上传代码
多文件上传
<form action="${pageContext.request.contextPath}/user/quick23" method="post" enctype="multipart/form-data">
名称<input type="text" name="username"/><br/>
文件<input type="file" name="uploadFile"/><br/>
文件2<input type="file" name="uploadFile"/><br/>
<input type="submit" value="提交"/>
</form>
拦截器
-
拦截器(interceptor)的作用
-
类似于Servlet的过滤器Filter,用于对处理器进行预处理和后处理
-
-
将拦截器按照一定顺序联结成一条链,这条链称为拦截器链(interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用,拦截器也是AOP思想的具体实现
-
拦截器和过滤器区别
区别 | 过滤器 | 拦截器 |
---|---|---|
使用范围 | 是servlet规范中的一部分,任何Java Web工程都可以使用 | 是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用 |
拦截范围 | 在url-pattern中配置了/*之后,可以对所有要访问的资源拦截 | 只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或者就不会进行拦截的 |
-
快速入门
-
创建拦截器类实现HanderInterceptor接口
-
配置拦截器
-
测试拦截器的拦截效果
-
-
搭建环境
-
spring_interceptor 配置web环境
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.11.RELEASE</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.11.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</