SpringMVC概述
SpringMVC是一个基于MVC(Model View Controller)的WEB框架,也是Spring框架的一个模块,所以SpringMVC与Spring框架可以无缝对接
Spring入门
1.前端控制器(DispatcherServlet)
用来集中处理请求,负责接收所有的请求,在将对应的请求转发到其他程序处理.然后再接收处理后的结果在浏览器上渲染展示
SpringMVC执行流程(重点/难度)
1.前端控制器
主要用于组件之间的调度,相当于CPU(中央处理器) ===>解耦
spring作用???
IOC(控制反转) ===>解耦,降低模块与模块之间的耦合度
2.处理器(Handler) ===>Controller
主要用于完成具体的业务逻辑的
3.处理器映射器(HandlerMapping)
前端控制器通过他将请求映射到不同的Handler
4.处理器拦截器
一些拦截处理的操作
5.处理器执行链(处理器+拦截器组合)
6.处理器适配器(HandlerAdapter)
完成一些预处理的操作 Eg:数据类型转换,封装
7.ModelAndView(模型视图)
模型数据,视图信息
8.视图解析器(ViewResolver)
将逻辑视图转换为物理视图(浏览器上能看到的东西)
处理静态资源的处理方式
在springMVC配置设置静态资源的处理方式,有两种处理方式
方式一:
<!--处理静态资源的解决方式1-->
<mvc:default-servlet-handler/>
<!--解决静态方式之后404的处理-->
<mvc:annotation-driven /> <!--使用JSON注解时也使用这条命令-->
方式二:
<!--处理静态资源的解决方式2(此种方式相对灵活)-->
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/img/**" location="/img/" />
SpringMVC的数据交互
SpringMVC框架Controller里的重定向 “redirect:/list”;
SpringMVC框架Controller里的转发 “forward:/list”;
Controller类中方法的返回类型
-
String类型
-
ModelAndView对象类型(视图对象)
ModelAndView的常用方法
方法名 作用 addObject 向视图传递内容 setViewName 指定返回的视图名称 -
void类型(无返回值)
因为没有返回值,在方法里进行重定向或转发操作(HttpServletRequest,HttpServletResponse)
注意:使用原始的转发方式做页面跳转,必须给定jsp页面完整的路径
重定向写法:response.sendRedirect("/login"); 重定向到返回视图页面的login方法
Controller类中的参数绑定
返回值为String类型,向页面传递内容可以使用Model对象
Model与ModelMap一样其本质都是使用HttpServletRequest对象向页面传递内容
Model参数对象:
方法: addAttribute ---- 传递内容参数
1.基本数据类型(自动绑定)
Controller类的方法中的形参名称和请求携带的参数名称一致时,参数值会自动绑定不需再用request.getParameter获取参数值
Controller类的方法中的形参名称和请求携带的参数名称不一致时 使用**@RequestParam注解或@RathVariable**注解创建别名
//http://127.0.0.1:8080/book/deleteById?ids=910&booName="SpringMVC";
@RequestMapping(value = "/login")
public String login(@RequestRaram(value = "ids" , required = true , defaultValue = "3") Integer id) {
//@RequestRaram(value = "ids") ids是请求携带的参数名
//required = true 必须存在
//defaultValue = "3" 默认值
System.out.println(id);
}
//http:/127.0.0.1:8080/book/deleteById/{ids}/{booName}; =======RESTFul风格
@RequestMapping(value = "/login/{id}") //{id}和方法参数里的id直接绑定
public String login(@RathVariable Integer id) {
System.out.println(id);
}
@RequestParam与@RathVariable的区别?
1.@RequestParam用于处理简单数据类型的绑定操作(int,String,double,boolean…)
2.@RequestParam参数可传可不传,@RathVarble必须传参数
3.@RequestParam用来获取静态URL中传入的参数;@RathVariable用来获取动态URL中的参数
4.@RequestParam参数可传可不传,@RathVariable表示参数必须要传
2.POJO对象类型绑定
注意:对象绑定时form表单中的input里的name属性里的值一定要和pojo中的属性名称一致
在SpringMVC中就能进行对象的映射
<form action="/book/saveBook" method="post">
<input type="text" name="name" />
<input type="text" name="author" />
<input type="text" name="price" />
<input type="submit" value="提交" />
</form>
@RequestMapping(value = "/saveBook")
public String addBook(Book book){
System.out.println(book);
return ""
}
3.数组类型的绑定操作
当页面传递数组时如**"checkbox"属性,需要在controller**方法的参数里定义数组类型,名称必须相同
在SpringMVC里是不能直接操作集合的,必须把一个集合写在一个Bean里面
SpringMVC3.2以后推出泛型集合,使用的是JSON格式数据交互
SpringMVC中JSON格式数据交互
不管是前端进行请求还是后端进行数据的响应,其都是进行JSON格式的传输
@RequestBody ====>前端数据解析----将JSON格式的字符串,转换成java对象
@ResponseBody ====>后端数据响应----将java对象转换为JSON字符串输出
在SpringMVC中使用JSON格式,必须配置JSON转换器
在SpringMVC中使用jackson进行数据交互是,必须要配置转换器,在SpringMVC中有2种方式配置
1.传统配置文件配置(不可取)
2.基于注解的方式:<mvc:annotation-driven />
JSON格式语法:
Eg:
{“name”,“value”}
操作:
h5页面里的代码:
<script type="text/javascript" src="js/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
var dataJson = {
"username":"管理",
"password":"123",
// "phone":"18325861235",
"gender":"男",
"age":"20"
}
function requestJson(){
$.ajax({
type:"post",
url:"${pageContext.request.contextPath}/user/requestJson",
contentType:"application/json;charset=UTF-8",
dataType:"json",
data:JSON.stringify(dataJson),//将JSON格式的数据转换为JSON字符串格式
success:function (data) {
console.log(data.username);
}
})
}
</script>
<button onclick="requestJson()" value="JSON数据格式的请求操作">请求JSON,返回JSON</button>
controller层的代码
//JSON格式的数据请求与响应操作
//method = RequestMethod.POST与前端页面的method使用的get&post对应
@RequestMapping(value = "/requestJson" ,method = RequestMethod.POST)
@ResponseBody
public User requestJson(@RequestBody User user){
System.out.println(user);
return user; //将user对象转换为JSON格式
}
Eg:记得导jackson的依赖包
SpringMVC上传
需要注意的几点:
- input标签的type设置为file
- form表单的method设置为post
- form表单的enctype设置为"Multipart/form-data"
代码实现
<h2>上传操作</h2>
<form action="/user/uploadFile" method="post" enctype="multipart/form-data">
<input type="file" name="imgs">
<input type="submit" value="上传">
</form>
//上传操作时处理表单的数据,需要借助MultipartFile,一般用于接收前台传递过来的文件,上传文件的信息保存在这个类中
@RequestMapping(value = "/uploadFile")
public String uploadFile(MultipartFile imgs,HttpServletRequest request) throws IOException {
if (imgs.getSize() > 0){
//获取文件上传的目录
String path = request.getSession().getServletContext().getRealPath("/upload");
//获取上传文件的原始名称
String fileName = imgs.getOriginalFilename();
//重命名操作
String newFileName = UUID.randomUUID()+fileName.substring(fileName.lastIndexOf((".")));
File file = new File(path,newFileName);
if (!file.exists()){
//创建存储图片的目录
file.getParentFile().mkdirs();
}
//上传
imgs.transferTo(file);
}
return "redirect:/book/booklist";
}
多个图片上传把MultipartFile imgs 改成MultipartFile[] imgs,然后判断MultipartFile[]数组是否为空,在单个遍历即可
SpringMVC拦截器
SpringMVC中的拦截器与servlet中过滤器功能差不多,用于对处理器进行预处理和后处理操作
拦截器是基于java反射不依赖于容器,过滤器依赖于容器
拦截器需要实现HandlerInterceptor类
HandlerIntercepor里有三个方法
方法 | 使用场景 | 说明返回值说明 | |
---|---|---|---|
preHandle | 登录拦截、权限拦截 | 该方法执行时机是在Controller类方法执行之前,也就是说在执行Handler之前执行 | true:表示放行,不拦截,正常执行Controller类中的方法 false:表示拦截,Handler不能正常执行 |
postHandle | 设置页面的一些共享信息 | 该方法执行的时机是在Handler执行之后,在返回ModerAndView之前 | |
afterCompletion | Handler出现的异常,日志的记录、类似AOP里的后置通知 | 该方法执行的时机是在Handler执行之后,在返回ModerAndView之后,注意:只要拦截器放行该方法一定会执行 |
配置拦截器,在SpringMVC配置里配置
<!--配置springMVC拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--path:表示路径-->
<!--拦截所有的URL请求-->
<mvc:mapping path="/**"/>
<!--表示不拦截的请求-->
<mvc:exclude-mapping path="/user/login"/>
<mvc:exclude-mapping path="/user/myLogin"/>
<!--指定请求的类-->
<bean class="com.gtl.config.MyHandlerInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
代码演示:
package com.gtl.config;
import cn.hutool.core.util.StrUtil;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyHandlerInterceptor implements HandlerInterceptor {
//该方法执行时机是在Controller类方法执行之前,也就是说在执行Handler之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登录拦截业务逻辑处理
String username =(String) request.getSession().getAttribute("username");
System.out.println("=================>"+username);
if (StrUtil.isNotEmpty(username)){
return true;
}else {
response.sendRedirect("/user/login");
return false;
}
}
//该方法执行的时机是在Handler执行之后,在返回ModerAndView之前
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
//该方法执行的时机是在Handler执行之后,在返回ModerAndView之后,注意:只要拦截器放行该方法一定会执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}