Java学习笔记(十七)

什么是 SpringMvc?

SpringMvc 是 spring 的一个模块,基于 MVC 的一个框架,无需中间整合层来整合。

SpringMVC 工作原理

客户端发送请求到 DispatcherServlet

DispatcherServlet 查询 handlerMapping 找到处理请求的 Controlle

Controller 调用业务逻辑后,返回 ModelAndView

DispatcherServlet 查询 ModelAndView,找到指定视图

视图将结果返回到客户端

SpringMVC 流程?

用户发送请求至前端控制器 DispatcherServlet。

DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。

处理器映射器找到具体的处理器,生成处理器对象 及处理器拦截器一并返回给 DispatcherServlet。

DispatcherServlet 调用 HandlerAdapter 处理器适配器。

HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器)。

Controller 执行完成返回 ModelAndView

HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet。

DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。

ViewReslover 解析后返回具体 View

DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中)。

DispatcherServlet 响应用户。

SpringMvc 的控制器是不是单例模式,如果是,有什么问题,怎么解决?

是单例模式,所以在多线程访问的时候有线程安全问题

不要用同步,会影响性能的,解决方案是在控制器里面不能写成员变量。 或者设置为多例模式

如果在拦截请求中,我想拦截 get 方式提交的方法,怎么配置?

​ 可以在@RequestMapping 注解里面加上 method=RequestMethod.GET

怎么样在方法里面得到 Request,或者 Session?

​ 直接在方法的形参中声明 request,SpringMvc 就自动把 request 对象传入

SpringMvc 用什么对象从后台向前台传递数据的?

​ 通过 ModelMap 对象,可以在这个对象里面用 put 方法,把对象加到里面,前台就可以通 过 el 表达式拿到。

SpringMvc 里面拦截器是怎么写的?

​ 有两种写法,一种是实现接口,另外一种是继承适配器类,然后在 SpringMvc 的配置文件中 配置拦截器即可

<!-- 配置 SpringMvc 的拦截器 -->
<mvc:interceptors>
 <!-- 配置一个拦截器的 Bean 就可以了 默认是对所有请求都拦截 -->
 <bean id="myInterceptor" class="com.et.action.MyHandlerInterceptor"></bean>
 <!-- 只针对部分请求拦截 -->
 <mvc:interceptor>
 <mvc:mapping path="/modelMap.do" />
 <bean class="com.et.action.MyHandlerInterceptorAdapter" />
 </mvc:interceptor>
</mvc:interceptors>

 SpringMvc 的执行流程

​ 系统启动的时候根据配置文件创建 spring 的容器, 首先是发送 http 请求到核心控制器 disPatherServlet,spring 容器通过映射器去寻找业务控制器,使用适配器找到相应的业务 类,在进业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用 ModelAndView 进行视图转发,数据放在 ModelMap 中传递数据,进行页面显示。

session与cookie

1.cookie在客户端,session在服务端,cookie的产生是在服务端产生的。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。 当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

2.每个用户访问服务器都会建立一个session,用户与服务器建立连接的同时,服务器会自动为其分配一个SessionId。每次请求 cookie都把SessionId 自动附加在HTTP头信息中,带到服务器,当服务器处理完后,将结果返回给SessionId所对应的用户

3.session和cookie的存储都存在时效性,这是很有必要的

4.单个cookie保存的数据不能超过4kb,很多浏览器都限制了一个站点最多保存20个cookie

5.不管是cookie还是session,都是建立在安全性的大前提下,session中不仅仅有cookie的信息,同时会有该用户的相关重要且安全的信息存储,所以session是在服务器的,而cookie只是服务器将一些不重要的信息拿出来丢给客户的存在,以备以后快速匹配校验用。

拦截器与过滤器

Filter需要在web.xml中配置,依赖于Servlet;

Interceptor需要在SpringMVC中配置,依赖于 SpringMVC 框架;

Filter的执行顺序在Interceptor之前

两者的本质区别:拦截器(Interceptor)是基于Java的反射机制(动态代理),而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验,太细的话,还是建议用interceptor;

拦截器不依赖servlet容器,过滤器需要依赖于servlet容器。

在action生命周期中,拦截器可以调用多次,过滤器只在容器初始化的时候调用一次。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值