SpringMVC面试题
1.什么是springmvc?简单介绍下你对springmvc的理解?
springmvc是一个基于java的实现了mvc设计模式的请求驱动类型的轻量级web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
2.springmvc的优点
- 可以支持各种视图技术,而不仅仅局限于jsp
- 与spring框架集成
- 清晰的角色分配:前端控制器(DispatcherServlet),处理器映射器(HanlderMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver)
- 支持各种请求资源的映射策略
3.springmvc的执行原理
- 发起请求到前端控制器DispatcherServler
- 前端控制器调用处理器映射器HandlerMapping查找Handler
- 处理器映射器向前端控制器返回找到的Handler
- 前端控制器调用处理器适配器HandlerAdapter执行Handler
- 处理器适配器去执行Handler
- Handler执行完成给处理器适配器返回ModelAndView
- 处理器适配器向前端控制器返回ModelAndView
- 前端控制器请求视图解析器ViewResolver去进行视图解析
- 视图解析器向前端控制器返回视图view
- 前端控制器进行视图渲染向用户响应结果
总结:DispatcherServlet(前端控制器)接收来自客户端的URL的请求。请求分发器借助处理器映射器(HandlerMapping)来查找对应的处理器映射器Handler(控制器),分发本次请求。请求分发器利用处理器映射器(HandlerApater)来执行对应的处理器(控制器)。处理器调用方法处理本次请求,返回模型视图对象(MOdelAndView)。请求分发器借助视图解析器(ViewResolver)解析模型视图,得到对应的视图(view)。请求分发器调用视图中的方法,同时将数据模型交给视图对象,完成给客户端的应答。
4.核心组件
- 前端控制器DispatcherServlet:接收请求,响应结果,相当于转发器,有了DispatcherServlet就减少了其它组件之间的耦合度
- 处理器映射器HandlerMapping:本质上就是一段映射关系,将访问路径和对应的Handler存储为映射关系,在需要时供前端控制器查阅
- 处理器适配器HandlerAdapter:本质上是一个是适配器,可以根据要求找到对应的Handler来运行
5.springmvc控制器是不是单例模式?如果是,有什么问题,怎么解决?
是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写可变状态量,如果需要使用这些可变状态量,可以使用ThreadLocal机制解决,为每个线程单独生成一份变量副本,独立操作,互不影响。
6.mvc是什么?mvc设计模式的好处有哪些?
mvc是一种设计模式(设计模式就是日常开发中编写代码的一种好的方法和经验的总结).模型(model)-视图(view)-控制器(controller),三层架构的设计模式。用于实现前端页面的展现与后端业务数据的分离。
- 分层设计,实现了业务系统各个组件之间的耦合,有利于业务系统的可扩展性,可维护性。
- 有利于系统的并行开发,提升开发效率。
7.注解的原理
注解的本质是一个继承Annotation的特殊接口,其具体的实现类是java运行时生成的动态代理类。我们通过反射获取注解时,返回的是java运行时生成的动态代理对象。通过代理对象调用自定义注解的方法,会最终调用AnnoationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是java常量池
8.springmvc常用的注解有哪些?
- @RequestMapping:用于处理请求url映射的注解,可用于类或者方法上。
- @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
- @ResponseBody:注解实现将Controller方法放回对象转换为json对象响应给客户。
9.springmvc中的控制器的注解一般用哪个,有没有别的注解可以替代?
一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@Controller+@ResponseBody
@ReuqestMapping注解的作用
是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
10.@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
11.@PathVariable
请求路径上有个变量值我们可以通过@PathVariable获取。
12.@RequestParam
对传入的参数指定参数名
13.springmvc是怎么设定重定向和转发的
默认是转发,在返回值前面加forward:或redirect:
14.如何解决post请求中文乱码,get的又如何处理呢?
解决post乱码:在web.xml中配置CharacterEncodingFilter过滤器,设置成utf-8
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
解决get乱码:get方式,请求的参数存放在请求地址中,即存放在url中
-
方式一:先打散再重组,即使用String的getBytes("ISO-8859-1")方法,先转换为byte[],再创建一个String。
String newName = new String(name.getBytes("ISO-8859-1"), "UTF-8"); -
方式二:修改tomcat的server.xml文件,添加URIEncoding="UTF-8"
<Connector port="8080" URIEncoding="UTF-8" redirectPort="8443" connectionTimeout="20000" protocol="HTTP/1.1"/>
15.springmvc的异常处理
可以将异常抛给spring框架,由spring框架来进行处理;我们只需要配置简单的异常处理器,在异常处理器中添加视图页面即可。
16.如果在拦截请求中,我想拦截get方式提交的方式,怎么配置?
可以在@ReaquestMapping里面加上method=RequestMethod.GET
17.怎么把ModelMap里面的数据放入Session里面
可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key