Spring MVC
2023-12-26 18:56:21 32 举报
AI智能生成
Spring MVC
作者其他创作
大纲/内容
<b>请求转发/重定向</b>
转发
在返回值前面加"forward:",譬如"forward:user.do?name=method4"
重定向
在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"
<b>重要组件</b>
前端控制器(DispartcherServlet)<br>
不需要程序员开发,用户接受请求,响应结构,相当于请求装发器,减少了其他组件之间的耦合<br>
处理器映射器(HandlerMapping)<br>
不需程序员开发,根据请求的Url找到对应的Handler;
<font color="#c41230"><b>完成客户请求到Controller之间的映射</b></font>
处理器适配器(HandlerAdapter)<br>
在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler。
处理器(Handler)
需要程序员开发的部分
视图解析器(ViewResolver)<br>
不需要程序员开发,解析视图,根据视图逻辑解析成真正的视图(view)<br>
视图(view)
需要程序员开发,View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)<br>
<b>过滤器与拦截器</b>
过滤器
依赖servlet容器<br>
实现上,基于函数回调,它可以对几乎所有请求进行过滤
一个过滤器实例只能在容器初始化时调用一次
目的
做一些过滤操作,获取我们想要获取的数据
业务场景
修改字符编码(CharacterEncodingFilter)
修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等
拦截器
依赖于web框架
实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用
一个拦截器实例在一个controller生命周期之内可以多次调用
只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
<b>中文乱码问题</b>
post
在web.xml中配置一个CharacterEncodingFilter过滤器
get
1.修改tomcat配置文件添加编码与工程编码一致
2.对参数进行重新编码
<b>常用注解</b>
@RequestMapping
value
method
consumes
指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces
指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params
headers
指定request中必须包含某些指定的header值,才能让该方法处理请求。
@RequestBody<br>
@ResponseBody
@Controller
<i><font color="#5c5c5c">@SessionAttribute</font></i><br>
希望在多个请求之间共用数据,则可以在控制器类上标注一个 @SessionAttributes,配置需要在session中存放的数据范围,Spring MVC将存放在model中对应的数据暂存到HttpSession 中
只能使用在类定义上。
@SessionAttributes 除了可以通过属性名指定需要放到会 话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
参数<br>
names:这是一个字符串数组。里面应写需要存储到session中数据的名称
types:根据指定参数的类型,将模型中对应类型的参数存储到session中
value:其实和names是一样的
<b>优势</b><br>
支持多种视图解析技术,不仅限于JSP<br>
与spring框架集成<br>
支持各种资源的映射策略<br>
<b>工作流程</b>
1.用户发送请求到前段控制器(DispatcherServlet)
2.前端控制器拿到请求之后,调用处理器映射器(HandlerMapping)请求获取Handler<br>
根据用户请求的url找到Handler即处理器;(xml配置、注解查找)
3.处理器映射器根据url找到具体的处理器(Handler),生成处理器对象及处理器<b><font color="#c41230">拦截器</font></b>(如果存在)返回<font color="#c41230">执行链(HandlerExecutionChain)</font>给前端控制器<br>
4.前端控制器调用处理器适配器(HandlerAdapter)<br>
5.处理器适配器经过适配调用具体的处理器(Handler)<br>
参数封装,数据格式转换,数据验证等操作
6.处理器执行完(Handler)返回ModeAndView<br>
逻辑视图名
模型对象<br>
7.处理器适配器将处理器(Handler)执行的结果返给前端控制器
8.前端控制器将ModeAndView传递给视图解析器(ViewResoler)解析<br>
<font color="#c41230">如果加上@responsebody注解,则返回值不通过viewResolver,而是直接返回object</font>
9.视图解析器解析后返回View<br>
根据<b><font color="#c41230">逻辑视图名</font></b>解析成真正的<b><font color="#c41230">视图对象</font></b>
JSP 视图、一个基于 FreeMarker、Velocity 模板技术的视图,还可能是 PDF、Excel、XML、JSON 等各种形式的视图<br>
10.前端控制器对View进行渲染(及将模型数据填充进视图)<br>
<font color="#c41230">数据填充:</font>将模型(ModelAndView对象中)填充到request域
11.前端控制器响应给用户<br>
<b>mvc优势</b>
实现前端页面的展示与后端数据处理的分离
清晰的角色分配,对web层进行指责解耦,简化开发,减少错误,方便组内人员开发配合<br>
分层设计,实现了业务系统各个组件之间的解耦,有利于业务系统的可扩展性,可维护性。
有利于系统的并行开发,提升开发效率。
<b>控制器采用单例模式</b>
在进行多线程访问的时候有线程安全问题<br>
不建议使用同步方法,会有性能问题<br>
在控制器里面不写成员变量即可<br>
原因<br>
性能,不能每次请求都创建一个对象<br>
不需要多例,不需要在控制器中定义成员变量<br>
0 条评论
下一页
为你推荐
查看更多