67. 说说你是如何解决 get 和 post 乱码问题?
(1)解决post请求乱码问题:在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf8;
</filter>
<filter‐name>CharacterEncodingFilter</filter‐name>
<filter‐class>org.springframework.web.filter.CharacterEncodingFilter</filter‐class>
<init‐param>
<param‐name>encoding</param‐name>
<param‐value>utf‐8</param‐value>
</init‐param>
</filter>
<filter‐mapping>
<filter‐name>CharacterEncodingFilter</filter‐name>
<url‐pattern>/*</url‐pattern>
</filter‐mapping>
(2)get请求中文参数出现乱码解决方法有两个:
①修改tomcat配置文件添加编码与工程编码一致,如下:
<ConnectorURIEncoding=“utf‐8” connectionTimeout=“20000” port=“8080” protocol=“HTTP/1.1” redirectPort=“8443”/>
②另外一种方法对参数进行重新编码:
String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859‐1”),“utf‐8”)
ISO88591是tomcat默认编码,需要将tomcat编码后的内容按utf8编码。
(3)确保前端请求的数据不是乱码,确保开发工具和文件本身的编码为utf-8
68. Spring MVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?
1、控制器也是一个bean,默认是单例。
2、单例的Bean如果有状态则线程不安全,如果无状态则线程安全(有状态指有成员变量声明在类中)
- 将成员变量声明在方法中
- 设置为多例,借助ThreadLocal存储成员变量
- 加同步锁,性能极差
69.请描述Spring MVC的工作流程?描述一下 DispatcherServlet 的工作流程?
(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成映射器执行链)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析(因为需要通过视图解析器加上前缀和后缀);
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)成静态的html;
(11)DispatcherServlet响应用户。
70.SpringMVC怎么和AJAX相互调用的?
(1)加入Jackson.jar(如果是fastJson的jar包,就需要配置)
(2)在配置文件中配置json的消息转换器.(jackson不需要该配置HttpMessageConverter)
<!‐‐它就帮我们配置了默认json映射‐‐>
<mvc:annotation‐driven conversion‐service="conversionService" >
</mvc:annotation‐driven>
(3)在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。(那么就不用考虑视图解析和渲染过程了)
75.SpringMVC的拦截器和过滤器有什么区别?执行顺序?
拦截器不依赖于servlet容器,过滤器依赖与servlet容器。
拦截器只能对action请求(DispatcherServlet 映射的请求)起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问容器中的Bean(DI),而过滤器不能访问(基于spring注册的过滤器也可以访问容器中bean)。