共计 3739 个字符,预计需要花费 10 分钟才能阅读完成。
前言:SpringMVC 申请解决流程,外围组件,次要注解等常识是面试中常常被问到的问题,简略看了下之前看的视频的笔记,并联合本人的了解写下了这篇博客,心愿能加深本人的印象以及帮忙的诸位小伙伴儿们爛爛
如果有什么须要改良的中央还请大佬斧正
文章目录
SpringMVC 的申请解决流程
SpringMVC 通过前端控制器(DispatcherServlet)拦挡并解决用户申请
1. 前端发送申请被前端控制器 DispatcherServlet 拦挡
2. 前端控制器调用处理器映射器 HandlerMapping 对申请的 URL 进行解析,解析之后返回调用给前端控制器
3. 前端控制器调用处理器适配器解决调用链
4. 处理器适配器 HandlerAdapter 基于反射通过适配器设计模式实现处理器 (控制器 Handler) 的调用解决用户申请
5. 处理器适配器 HandlerAdapter 将控制器返回的视图和数据信息封装成 ModelAndView 响应给前端控制器
6. 前端控制器调 DispatcherServlet 调用视图解析器 ViewResolver 对 ModelAndView 进行解析,将解析后果(视图资源和数据)响应给前端控制器
7. 前端控制器调用视图 view 组件将数据进行渲染,将渲染后果(动态视图)响应给前端控制器
8. 前端控制器响应用户申请
SpringMVC 的外围组件
-
DispatcherServlet
前端控制器、总控制器- 作用:接管申请,调用其余组件解决用户的申请,协同各组件工作、响应申请
-
HandlerMapping
处理器映射器- 作用:负责依据用户申请的 URL 找到对应的处理器 Handler,在 SpringMVC 中会有很多申请,每个申请都须要一个 Handler 解决,具体接管到一个申请之后应用哪个 Handler 进行解决须要处理器映射器来匹配
- 可配置 SpringMVC 提供多个处理器映射的实现,能够依据须要进行配置
-
HandlerAdapter
处理器适配器- 作用:依照处理器映射器解析的用户申请的调用链,通过适配器模式实现 Handler 的调用
-
Handler
处理器 / 控制器- 由工程师依据业务的需要进行开发
- 作用:解决申请
-
ModelAndView
视图模型- 作用:用于封装处理器返回的数据以及相应的视图
- ModelAndView = Model + View
-
ViewResolver
视图解析器- 作用:对 ModelAndView 进行解析
- 可配置 SpringMVC 提供多个视图解析器的实现,能够依据须要进行配置
-
View
视图- 作用:实现数据渲染
处理器映射器
不同的处理器映射器对 URL 解决的形式也不雷同,应用对应的处理器映射器之后咱们的前端申请规定也须要产生相应的变动
SpringMVC 提供的处理器映射器:
- BeanNameUrlHandlerMapping 依据控制器的 ID 拜访控制器
- SimpleUrlHandlerMapping 依据控制器配置的 URL 拜访(默认)
配置处理器映射器:
- 在 SpringMVC 的配置文件中通过 bean 标签申明处理器映射器
-
配置 BeanNameUrlHandlerMapping
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
-
配置 SimpleUrlHandlerMapping
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/aaa">bookController</prop> <prop key="/bbb">studentController</prop> </props> </property> </bean>
视图解析器
Spring 提供了多个视图解析器:
- UrlBasedViewResolver
- InternalResourceViewResolver
-
UrlBasedViewResolver 须要依赖 jstl
-
增加 JSTL 的依赖
<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
-
配置视图解析器
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean>
-
-
InternalResourceViewResolver
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean>
SpringMVC 的注解
@RequestMapping:用于解决申请 url 映射的注解,可用于类或办法上。用于类上,则示意类中的所有响应申请的办法都是以该地址作为父门路,用在办法上示意父类门路前面的内容。
@Controller
@RequestMapping("book")
public class BookController {
/* 接管申请行数据 */
@RequestMapping("/add") // 申请门路:/boot/add
public String addBook(String name, String author, double price,HttpServletRequest request){System.out.println("---book add");
request.setAttribute("key1","value1");
request.setAttribute("book",new Book(1,"Java","老张",2.22));
return "tips";
}
@RequestMapping("/add2") // 申请门路:/boot/add2
public ModelAndView addBook2(String name, String author, double price){ModelAndView modelAndView = new ModelAndView("/tips.jsp");
modelAndView.addObject("key2","value2");
modelAndView.addObject("book",new Book(1,"C++","老张",2.22));
return modelAndView;
}
}
@RequestBody:注解实现接管 http 申请的 json 数据,次要用来接管前端传递给后端的 json 字符串中的数据的 (申请体中的数据),如果参数时放在申请体中,application/json 传入后盾的话,那么后盾要用 @RequestBody 能力接管到, 行将 json 转换为 java 对象。
@ResponseBody:@ResponseBody 是作用在办法上的,@ResponseBody 注解的作用是将 controller 的办法返回的对象通过适当的转换器转换为指定的格局之后,写入到 response 对象的 body 区,通常用来返回 JSON 数据或者是 XML 数据,即注解实现将 conreoller 办法返回对象转化为 json 对象响应给客户。
@Resource 和 @Autowired:主动拆卸,@Resource 和 @Autowired 都是做 bean 的注入时应用,@Autowired 是 Spring 的注解,能够标注在属性上、办法上和结构器上,来实现主动拆卸。默认是依据类型,spring 主动将匹配到的属性值进行注入,而@Resource 并不是 Spring 的注解,它的包是 javax.annotation.Resource,须要导入,然而 Spring 反对该注解的注入,并且 @Resource 默认是名称查找。
@PathVariable 用于将申请 URL 中的模板变量映射到性能解决办法的参数上,即取出 uri 模板中的变量作为参数
@RequestMapping("/user/{id}")
public String deleteById(@PathVariable("id") String id){System.out.println("通过 id 删除用户,id 为:" +id);// 拜访的时候只须要拜访 /user/ 所要删除的 id 即可,如.../user/1。return "success";
}