SpringMVC全面学习
1.SpringMVC初步认识
1.1介绍
Spring MVC是Spring Framework提供的Web组件,全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架,提供前端路由映射、视图解析等功能
Java Web开发者必须要掌握的技术框架
1.2MVC是什么
MVC是一种软件架构思想,把软件按照模型,视图,控制器来划分
Model:模型层,指工程中的JavaBean,用来处理数据
JavaBean分成两类:
- 一类称为实体类Bean:专门用来存储业务数据,比如Student,User
- 一类称为业务处理Bean:指Servlet或Dao对象,专门用来处理业务逻辑和数据访问
- View:视图层,指工程中的html,jsp等页面,作用是和用户进行交互,展示数据
- Controler:控制层,指工程中的Servlet,作用是接收请求和响应浏览器
1.3工作流程
流程:
- 客户端发送请求至前端控制器DispatcherServlet。
- DispatcherServlet收到请求调用HandlerMapping处理器映射器根据请求的URL找到对应的处理器(Controller)。
- Controller调用业务逻辑后,将ModelAndView对象(封装视图和模型信息)返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
- ViewReslover视图解析器解析后返回具体的View给DispatcherServlet
- DispatcherServlet根据View和Model渲染视图响应给客户端
2.SpringMVC环境搭建
3.RequestMapping注解
Spring MVC通过@RequestMapping注解把URL请求和业务方法进行映射,在控制器的类定义处以及方法定义处都可以添加@RequestMapping,在类定义处添加相当于多了一层访问路径
value:指定URL请求的实际地址,是@RequestMapping的默认值
method:指定请求的method类型,包括GET、POST、PUT、DELETE等
params:指定request请求中必须包含的参数值,如果不包含的话,就无法调用该方法
4.参数绑定
4.1URL风格参数绑定
1.在业务方法定义时声明参数列表(在RequestMapping里添加param属性赋值)
2.给参数列表添加@RequestParam注解进行绑定(在方法参数前添加@RequestParam注解)
4.2RESTful风格的URL参数获取
- 传统的URL:localhost:8080/hello/index?id=1&name=tom
- RESTful URL:localhost:8080/hello/index/1/tom
@PathVariable和@RequestParam的区别:
@PathVariable用于获取URL中的路径参数,通常用于RESTful风格的接口,例如,如果URL为/users/{id}
,那么可以使用@PathVariable注解来获取id的值。
@RequestParam注解用于从请求参数中获取参数值,可以获取URL中的查询参数或表单提交的参数。
4.3映射Cookie
4.4使用POJO绑定参数
Spring MVC会根据请求参数名和POJO属性名进行匹配,自动为该对象填充属性值,并且支持属性级联
为了避免出现乱码问题,应该在web.xml中配置过滤器
<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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
主体对象可以没有无参构造器,但是级联对象必须要有无参构造器
级联就是一个实体类里面的一个属性为另一个实体类
4.5JSP页面的转发和重定向
Spring MVC默认是通过转发的形式响应JSP,可以手动进行修改
转发顾名思义就是通过了中间人,将信息转达给另一个人处理再返回结果。就拿客户端和服务器端来说,客户不知道这个信息转发了,只知道返回来的结果(不改变url)
重定向则是重新选择方向,就是重新给了一个地址去访问,处理一些请求(改变url)
五、Spring MVC数据绑定
数据绑定就是直接获取前端HTTP请求中的参数,HTTP请求参数都是String类型的,但是Spring MVC的HandlerAdapter组件会在执行Handler业务方法之前,完成参数的绑定
@Reponsebody注解
5.1基本数据类型
如果id为空会报500,如果id类型不符合会报400
5.2包装类
在请求中不传参不会报错,但是如果添加了@PathVariable(require=“true”),仍然没有传参数,则会报400,还有就是传参类型不同会报404
5.3POJO(java对象)
public class User {
private Integer id;
private String name;
private Address address;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", address=" + address +
'}';
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5.4List
Spring MVC不支持List类型的直接转换,需要包装成Object
注意:User类一定要有无参构造,否则抛出异常
5.5JSON
以ajax实现登录案例为例
ajax是一种异步数据传输技术,页面无需刷新的情况下,能够更新部分网页内容
AJAX是使用JavaScript技术来实现的
JSON是一种轻量级的数据交换格式,JSON有对象结构和数组结构两种数据结构
1.在WebContent下新建“statics/scripts”文件夹,加入JQuery框架脚本“jquery-3.6.0.min.js”
2.修改“login.jsp”页面,发送Ajax请求登录
页面中引入JQuery框架脚本,并为“提交”按钮增加“onclick”事件,在事件中发送Ajax请求
3.编写函数ajaxLogin
function ajaxLogin(){
var name=$("#username").val();//使用了 jQuery 的选择器 $("#username") 来选取页面中 id 为 "username" 的元素,然后使用 .val() 方法获取该元素的值,将其赋给变量 name
var pass=$("#password").val();
//发送ajax请求
$.ajax({
//定义请求地址
url:"${pageContext.request.contextPath}/doAjaxLogin",
//定义请求类型
type:"post",
//将js对象转换成JSON格式字符串发送给后台
data:JSON.stringify({username:name,password:pass}),
//定义发送请求的数据格式为JSON字符串
contentType:"application/json;charset=UTF-8",
//定义回调响应的数据格式为JSON字符串
dataType:"json",
success:function(data){//这个data是controller返回出来的result,也就是自定义的实体类MsgResult
alert(data.msg);
}
});
}
4.写controller
@RequestBody将前端传过来的json字符串转换为java对象
@ReponseBody将返回的java对象通过转换器转换为JSON字符串,放入response中响应给前端
自定义通用结果类
package entity;
public class MsgResult {
private int flag;//1代表成功 0代表失败
private String msg;//返回的消息
private Object content;//返回的数据内容
public int getFlag() {
return flag;
}
public void setFlag(int flag) {
this.flag = flag;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getContent() {
return content;
}
public void setContent(Object content) {
this.content = content;
}
@Override
public String toString() {
return "MsgResult{" +
"flag=" + flag +
", msg='" + msg + '\'' +
", content=" + content +
'}';
}
}
5.需要修改“spring-mvc.xml”配置文件,解决找不到“jquery-3.4.1.min.js”(静态资源访问)的问题
有三种方式
这里就只说明毕竟好用的一种
还有两种解决方案的链接:https://blog.csdn.net/ssy052085156/article/details/101036963
拦截器
1.创建一个名为Interceptor的包
2.创建一个名为LoginInterceptor的类implements HandlerInterceptor的方法
3.在preHandle里写详细逻辑
4.在配置文件里配置拦截器