侧边栏壁纸
  • 累计撰写 781 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

SpringMVC

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 100 阅读 / 4,244 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
官方文档

先得到handle,handle是怎么的决定于路径匹配,每一个handler都有一个map存储着自己能处理的路径, 双重循环遍历可处理路径一个一个匹配的,estate项目有205个接口路径,一个一个比对,匹配到了,就是这个handler,匹配不到就比对下一个handler,最后比对完没有handler就404

静态资源
线程安全 : 不要定义类成员变量,函数里的变量是线程安全的
接收参数的三种方式
1.
@RequestBody
2.
@RequestParam
3.
@PathVariable
@PostMapping("/macroTemplate/table")
public Result getMacroTemplateTable(@RequestBody String json)

@RequestMapping("/editor/get/value/")
public Result getEditorValue(@RequestParam("id") String id, @RequestParam(value = "key") String key, @PathVariable(value = "type", required = false) String type)



@RestController注解相当于@ResponseBody + @Controller合在一起的作用


一个请求匹配前端控制器 DispatcherServlet 的请求映射路径(在 web.xml中指定), WEB 容器将该请求转交给 DispatcherServlet 处理
DispatcherServlet 接收到请求后, 将根据 请求信息 交给 处理器映射器 (HandlerMapping
HandlerMapping 根据用户的url请求 查找匹配该url的 Handler,并返回一个执行链
DispatcherServlet 再请求 处理器适配器(HandlerAdapter) 调用相应的 Handler 进行处理并返回 ModelAndView 给 DispatcherServlet
DispatcherServlet 将 ModelAndView 请求 ViewReslover(视图解析器)解析,返回具体 View
DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)
DispatcherServlet 将页面响应给用户

组件说明:
DispatcherServlet:前端控制器(就是在web.xml里配置的那个指定拦截什么路径交给谁处理的那个)
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,
由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
https://www.cnblogs.com/tengyunhao/p/7518481.html
DispatcherServlet 处理流程
在整个 Spring MVC 框架中,DispatcherServlet 处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应工作。在看 DispatcherServlet 类之前,我们先来看一下请求处理的大致流程:
4.
Tomcat 启动,对 DispatcherServlet 进行实例化,然后调用它的 init() 方法进行初始化,在这个初始化过程中完成了:
5.
客户端发出请求,由 Tomcat 接收到这个请求,如果匹配 DispatcherServlet 在 web.xml 中配置的映射路径,Tomcat 就将请求转交给 DispatcherServlet 处理;
6.
DispatcherServlet 从容器中取出所有 HandlerMapping 实例(每个实例对应一个 HandlerMapping 接口的实现类)并遍历,每个 HandlerMapping 会根据请求信息,通过自己实现类中的方式去找到处理该请求的 Handler (执行程序,如Controller中的方法),并且将这个 Handler 与一堆 HandlerInterceptor (拦截器) 封装成一个 HandlerExecutionChain 对象,一旦有一个 HandlerMapping 可以找到 Handler 则退出循环;(详情可以看 [Java]SpringMVC工作原理之二:HandlerMapping和HandlerAdpater 这篇文章)
7.
DispatcherServlet 取出 HandlerAdapter 组件,根据已经找到的 Handler,再从所有 HandlerAdapter 中找到可以处理该 Handler 的 HandlerAdapter 对象;
8.
执行 HandlerExecutionChain 中所有拦截器的 preHandler() 方法,然后再利用 HandlerAdapter 执行 Handler ,执行完成得到 ModelAndView,再依次调用拦截器的 postHandler() 方法;
9.
利用 ViewResolver 将 ModelAndView 或是 Exception(可解析成 ModelAndView)解析成 View,然后 View 会调用 render() 方法再根据 ModelAndView 中的数据渲染出页面;
10.
最后再依次调用拦截器的 afterCompletion() 方法,这一次请求就结束了。
HandlerMapping:处理器映射器
 HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,
例如:配置文件方式,实现接口方式,注解方式等。
Handler:处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
HandlAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
ViewResolver:视图解析器
View:视图
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

妙用
@GetMapping(value = "/{apiName}/list")

开发Handler(controller层里自己写的东西的原型)
需要实现 controller接口,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter适配器执行。

public class ItemsController1 implements Controller {

@Override
public ModelAndView handleRequest(HttpServletRequest request,
		HttpServletResponse response) throws Exception {
			
			//调用service查找 数据库,查询商品列表,这里使用静态数据模拟
			List<Items> itemsList = new ArrayList<Items>();
			//向list中填充静态数据
			
			Items items_1 = new Items();
			items_1.setName("联想笔记本");
			items_1.setPrice(6000f);
			items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
			
			Items items_2 = new Items();
			items_2.setName("苹果手机");
			items_2.setPrice(5000f);
			items_2.setDetail("iphone6苹果手机!");
			
			itemsList.add(items_1);
			itemsList.add(items_2);
	
			//返回ModelAndView
			ModelAndView modelAndView =  new ModelAndView();
			//相当 于request的setAttribut,在jsp页面中通过itemsList取数据
			modelAndView.addObject("itemsList", itemsList);
			
			//指定视图
			modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
	
			return modelAndView;
}

}







springMVC是根据 路径和请求方式和请求参数区分方法的
@RequestMapping(value="/a",method = RequestMethod.GET,params ="s")
public bean clearCart(HttpServletRequest request){
	return 对象
}

@RequestMapping(value="/a",method = RequestMethod.GET)
public String clearCart(HttpServletRequest request){
return 页面
}


'/'表示该项目的所有请求路径;'/*'表示只能有一级子路径,它匹配'/a.jsp'但是不匹配'/jsp/a.jsp'。

0

评论区