SpringMVC
三层架构
用Java语言基本上都是开发B/S架构的程序,B/S架构又分成了三层架构
- 表现层: Controller 用来和客户端进行数据交互的。表现层一般会采用MVC的设计模型
- 业务层: Service 处理具体的业务逻辑
- 持久层: Respository 操作数据库
MVC模型
Model View Controller 模型视图控制器,每个部分各司其职
Model:数据模型 ,JavaBean的类,用来进行数据封装。
View:指JSP、HTML用来展示数据给用户,thymeleaf
Controller:用来接收用户的请求,整个流程控制器。用来进行数据校验等。
SpringMVC的概述
是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB框架。
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供 了构建 Web 应用程序的全功能 MVC 模块。
SpringMVC在三层架构中的位置 ,表现层框架
案例的执行过程分析
-
1.当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象, 就会加载springmvc.xml配置文件
-
2.开启了注解扫描,那么HelloController对象就会被创建
-
3从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解找到执行的具体方法
-
4.根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件
-
5.Tomcat服务器渲染页面,做出响应
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uZBpOdbT-1606131392746)(https://cdn.jsdelivr.net/gh/lijin1998/image/03.bmp)]
六个组件分析
前端控制器 DispatcherServlet 指挥中心,控制其他五个组件工作,接收请求和发回响应
处理映射器 HandlerMapping 接收请求,映射相应的HandlerAdapter
处理器适配器 HandlerAdapter 接收请求,找到合适的Handler
处理器 Handler(Controller)接收请求,返回视图ModelAndView真正工作的组件,其他只是为他服务
视图解析器 View Resolver 将接收到视图进行解析,返回视图View
视图 View 接收视图,渲染,将数据填充到视图中,最后DispatcherServlet给浏览器response
Controller常用注解
@RequestMapping
建立请求URL和处理方法之间的对应关系,可以作用在方法和类上
属性
path:指定请求路径的url
value:value属性和path属性是一样的
mathod:请求方式 get @GetMapping ,post @PostMapping
params:指定限制请求参数的条件
headers:发送请求中必须包含的请求头
@RequestParam
把请求中的指定名称的参数传递给控制器中的形参赋值
属性
value:请求参数的名称
required:请求参数中是否必须提供此参数,默认值是true,必须提供
@RequestBody
用于获取请求体的内容,一般是json
属性
required
@PathVariable
有绑定url中的占位符,与RequestParam唯一区别是占位符delete/{id}
属性
value:指定url中的占位符名称
Restful风格的URL
请求参数的绑定
绑定的机制
- 表单提交的数据都是k=v格式的 username=haha&password=123
- SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
- 要求:提交表单的name和参数的名称是相同的
支持的数据类型
- 基本数据类型和字符串类型
- 实体类型(JavaBean)
- 集合数据类型(List、map集合等)
- 视图模型对象model
响应数据和结果视图
字符串
Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。
无返回值void
如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找页面没有找到。
可以使用请求转发或者重定向跳转到指定的页面
转发 forward
重定向 sendRedirect
ModelAndView对象
ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图
SpringMVC框架提供的转发和重定向
- forward请求转发 返回String类型 ,return “forward:/user/findAll”
- redirect 重定向返回String类型,return “redirect:/admin/blogs”;
请求转发是在服务器内的,一次请求一次响应,在请求转发目录可以将请求转发到WEB-INF目录下的资源
重定向是在浏览器和服务器之间,2次请求,获取2次请求,浏览器地址栏发生变化
SpringMVC框架中的拦截器
拦截器也是AOP思想的一种实现方式
拦截器是SpringMVC框架独有的
过滤器配置了/*,可以拦截任何资源
拦截器只会对控制器中的方法进行拦截
ControllerExceptionHandler
package com.lj.handler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
/**
* @author lj
* @date 2020-10-01 17:13
* @QQ 851477108
*/
//拦截有Controller注解的控制器
@ControllerAdvice
public class ControllerExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 定义异常处理
* @param request
* @param e
* @return
* @throws Exception
*/
@ExceptionHandler(Exception.class)
public ModelAndView exceptionHander(HttpServletRequest request, Exception e) throws Exception {
logger.error("Requst URL : {},Exception : {}", request.getRequestURL(),e);
// 当标识了状态码的时候就不拦截
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
throw e;
}
ModelAndView mv = new ModelAndView();
mv.addObject("url",request.getRequestURL());
mv.addObject("exception", e);
mv.setViewName("error/error");
return mv;
}
}