1、什么是 Spring MVC?简略介绍下你对 springMVC 的了解?
Spring MVC 是一个基于 Java 的实现了 MVC 设计模式的申请驱动类型的轻量级 Web 框架,通过把 Model,View,Controller 拆散,将 web 层进行职责解耦,把简单的 web 利用分成逻辑清晰的几局部,简化开发,缩小出错,不便组内开发人员之间的配合。
2、SpringMVC 的流程?
- (1)用户发送申请至前端控制器 DispatcherServlet;
- (2)DispatcherServlet 收到申请后,调用 HandlerMapping 处理器映射器,申请获取 Handler;
- (3)处理器映射器依据申请 url 找到具体的处理器 Handler,生成处理器对象及处理器拦截器 (如果有则生成),一并返回给 DispatcherServlet;
- (4)DispatcherServlet 调用 HandlerAdapter 处理器适配器,申请执行 Handler;
- (5)HandlerAdapter 通过适配调用 具体处理器进行解决业务逻辑;
- (6)Handler 执行实现返回 ModelAndView;
- (7)HandlerAdapter 将 Handler 执行后果 ModelAndView 返回给 DispatcherServlet;
- (8)DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器进行解析;
- (9)ViewResolver 解析后返回具体 View;
- (10)DispatcherServlet 对 View 进行渲染视图(行将模型数据填充至视图中)
- (11)DispatcherServlet 响应用户。
- 前端控制器 DispatcherServlet:接管申请、响应后果,相当于转发器,有了 DispatcherServlet 就缩小了其它组件之间的耦合度。
- 处理器映射器 HandlerMapping:依据申请的 URL 来查找 Handler
- 处理器适配器 HandlerAdapter:负责执行 Handler
- 处理器 Handler:处理器,须要程序员开发
- 视图解析器 ViewResolver:进行视图的解析,依据视图逻辑名将 ModelAndView 解析成真正的视图(view)
- 视图 View:View 是一个接口,它的实现类反对不同的视图类型,如 jsp,freemarker,pdf 等等
3、Springmvc 的长处:
(1)能够反对各种视图技术,而不仅仅局限于 JSP;
(2)与 Spring 框架集成(如 IoC 容器、AOP 等);
(3)清晰的角色调配:前端控制器 (dispatcherServlet),申请到处理器映射(handlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver)。
(4)反对各种申请资源的映射策略。
4、SpringMVC 怎么样设定重定向和转发的?
(1)转发:在返回值后面加 ”forward:”,譬如 ”forward:user.do?name=method4″
(2)重定向:在返回值后面加 ”redirect:”,譬如 ”redirect:http://www.baidu.com”
5、SpringMVC 罕用的注解有哪些?
@RequestMapping:用于解决申请 url 映射的注解,可用于类或办法上。用于类上,则示意类中的所有响应申请的办法都是以该地址作为父门路。
@RequestBody:注解实现接管 http 申请的 json 数据,将 json 转换为 java 对象。
@ResponseBody:注解实现将 conreoller 办法返回对象转化为 json 对象响应给客户。
6、SpingMvc 中的控制器的注解个别用哪个?有没有别的注解能够代替?
答:个别用 @Controller 注解,也能够应用 @RestController,@RestController 注解相当于 @ResponseBody + @Controller,示意是体现层,除此之外,个别不必别的注解代替。
7、springMVC 和 struts2 的区别有哪些?
(1)springmvc 的入口是一个 servlet 即前端控制器(DispatchServlet),而 struts2 入口是一个 filter 过虑器(StrutsPrepareAndExecuteFilter)。
(2)springmvc 是基于办法开发 (一个 url 对应一个办法),申请参数传递到办法的形参,能够设计为单例或多例 (倡议单例),struts2 是基于类开发,传递参数是通过类的属性,只能设计为多例。
(3)Struts 采纳值栈存储申请和响应的数据,通过 OGNL 存取数据,springmvc 通过参数解析器是将 request 申请内容解析,并给办法形参赋值,将数据和视图封装成 ModelAndView 对象,最初又将 ModelAndView 中的模型数据通过 reques 域传输到页面。Jsp 视图解析器默认应用 jstl。
8、如何解决 POST 申请中文乱码问题,GET 的又如何解决呢?
(1)解决 post 申请乱码问题:在 web.xml 中配置一个 CharacterEncodingFilter 过滤器,设置成 utf-8;
1. <filter>
2. <filter-name>CharacterEncodingFilter</filter-name>
3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
4. <init-param>
5. <param-name>encoding</param-name>
6. <param-value>utf-8</param-value>
7. </init-param>
8. </filter>
10. <filter-mapping>
11. <filter-name>CharacterEncodingFilter</filter-name>
12. <url-pattern>/*</url-pattern>
13. </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")
ISO8859- 1 是 tomcat 默认编码,须要将 tomcat 编码后的内容按 utf- 8 编码。
9、SpringMvc 外面拦截器是怎么写的:
有两种写法,一种是实现 HandlerInterceptor 接口,另外一种是继承适配器类,接着在接口办法当中,实现解决逻辑;而后在 SpringMvc 的配置文件中配置拦截器即可:
1. <!-- 配置 SpringMvc 的拦截器 -->
2. <mvc:interceptors>
3. <!-- 配置一个拦截器的 Bean 就能够了 默认是对所有申请都拦挡 -->
4. <bean id="myInterceptor" class="com.zwp.action.MyHandlerInterceptor"></bean>
6. <!-- 只针对局部申请拦挡 -->
7. <mvc:interceptor>
8. <mvc:mapping path="/modelMap.do" />
9. <bean class="com.zwp.action.MyHandlerInterceptorAdapter" />
10. </mvc:interceptor>
11. </mvc:interceptors>
10、注解原理:
注解实质是一个继承了 Annotation 的非凡接口,其具体实现类是 JDK 动静代理生成的代理类。咱们通过反射获取注解时,返回的也是 Java 运行时生成的动静代理对象。通过代理对象调用自定义注解的办法,会最终调用 AnnotationInvocationHandler 的 invoke 办法,该办法会从 memberValues 这个 Map 中查问出对应的值,而 memberValues 的起源是 Java 常量池。
11、SpringMvc 怎么和 AJAX 互相调用的?
通过 Jackson 框架就能够把 Java 外面的对象间接转化成 Js 能够辨认的 Json 对象。具体步骤如下:
(1)退出 Jackson.jar
(2)在配置文件中配置 json 的映射
(3)在承受 Ajax 办法外面能够间接返回 Object、List 等,但办法后面要加上 @ResponseBody 注解。
12、Spring MVC 的异样解决?
答:能够将异样抛给 Spring 框架,由 Spring 框架来解决;咱们只须要配置简略的异样处理器,在异样处理器中添视图页面即可。
13、SpringMvc 的控制器是不是单例模式?如果是,有什么问题?怎么解决?
答:是单例模式,在多线程拜访的时候有线程平安问题,解决方案是在控制器外面不能写可变状态量,如果须要应用这些可变状态,能够应用 ThreadLocal 机制解决,为每个线程独自生成一份变量正本,独立操作,互不影响。
14、如果在拦挡申请中,我想拦挡 get 形式提交的办法,怎么配置?
答:能够在 @RequestMapping 注解外面加上 method=RequestMethod.GET。
16、怎么在办法外面失去 Request,或者 Session?
答:间接在办法的形参中申明 request,SpringMvc 就主动把 request 对象传入。
16、如果想在拦挡的办法外面失去从前台传入的参数,怎么失去?
答:间接在形参外面申明这个参数就能够,但必须名字和传过来的参数一样。
17、如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样疾速失去这个对象?
答:间接在办法中申明这个对象,SpringMvc 就主动会把属性赋值到这个对象外面。
18、SpringMvc 中函数的返回值是什么?
答:返回值能够有很多类型,有 String,ModelAndView。ModelAndView 类把视图和数据都合并的一起的,但个别用 String 比拟好。
19、SpringMvc 用什么对象从后盾向前台传递数据的?
答:通过 ModelMap 对象,能够在这个对象外面调用 put 办法,把对象加到外面,前端就能够通过 el 表达式拿到。
20、怎么样把 ModelMap 外面的数据放入 Session 外面?
答:能够在类下面加上 @SessionAttributes 注解,外面蕴含的字符串就是要放入 session 外面的 key。