SpringMVC
# 1 什么是SpringMVC?
SpringMVC是一个轻量级的web框架。
SpringMVC把web应用分成几个清晰的模块,分别是model、view、controller。
SpringMVC可以使用各种视图技术,不仅仅局限于jsp。
# 2 SpringMVC的执行流程
1.客户端发送请求到前端控制器DispatcheServlet。
2.DispatcheServlet通过处理器映射器HandlerMapping获取处理器Handler。(处理器映射器返回处理器执行链,包含处理器Handler和拦截器HandlerInterceptor)。
3.DispatcheServlet通过处理器适配器HandlerAdapter执行Handler。(Handler也就是controller)
4.Handler执行完后返回ModelAndView给到DispatcheServlet。
5.DispatcheServlet将ModelAndView传给ViewResolver(视图解析器)做解析。
6.ViewResolver(视图解析器)解析完返回View视图对象给到DispatcherServlet。
7.DispatcherServlet把Model数据填充到View试图对象中。
8.响应用户。
# 3 过滤器和拦截器
# 3.1 过滤器和拦截器对比
两者都是AOP编程思想的实现,都能够实现权限控制和日志记录等问题的处理,但是两者粒度不同拦截对象不一样。
适用范围不同:Filter是servlet的规范,只能用于web程序,但是拦截器可以用于application等程序。
规范不同:Filter是servlet的规范。但是Interceptor是spring容器支撑,有spring框架支持。
使用资源不一样:spring的拦截器由于依赖spring,也是spring的一个组件,因此能够在拦截器中使用spring的任何资源和对象。例如service对象,数据源,事务管理等,通过ioc注入拦截器即可,而filter不能。
粒度不同:Filter只能在servlet的前后起作用,而拦截器能在方法前后异常前后执行,更加灵活,粒度更小,spring框架程序优先使用拦截器。
# 3.2 执行流程
# 4 SpringMVC常见问题
# 4.1 SpringMVC怎么样设定重定向和转发的?
(1)转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4"
(2)重定向:在返回值前面加"redirect:",譬如"redirect:http://www.baidu.com"
# 4.2 SpringMVC常用的注解
@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
# 4.3 SpingMVC中控制器的注解
一般用@Controller注解,也可以使用@RestController。
@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替。
# 4.3 POST及GET请求中文乱码问题
(1)解决post请求乱码问题:
在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8。
(2)get请求中文参数出现乱码解决方法有两个:
① 修改tomcat配置文件添加编码与工程编码一致,如下:
② 另外一种方法对参数进行重新编码:
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。
# 4.4 SpringMVC控制器是不是单例?有什么问题?
1.是单例模式。
2.在多线程访问的时候有线程安全问题。
3.解决方案是在控制器里面不能写可变状态量,如果需要这些可变状态,可以使用ThreadLocal机制解决,为每个线程单独生成一份变量副本,独立操作,互不影响。
# 4.5 拦截请求中,怎么拦截get方式提交的方法?
可以在@RequestMapping注解里面加上method=RequestMethod.GET。
# 4.6 怎样在方法里面得到Request,或者Session?
直接在方法的形参中声明request,SpringMvc就自动把request对象传入。