SpringMVC面试题

111 阅读5分钟

SpringMVC面试题

1.什么是springmvc?简单介绍下你对springmvc的理解?

springmvc是一个基于java的实现了mvc设计模式的请求驱动类型的轻量级web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

2.springmvc的优点

  1. 可以支持各种视图技术,而不仅仅局限于jsp
  2. 与spring框架集成
  3. 清晰的角色分配:前端控制器(DispatcherServlet),处理器映射器(HanlderMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver)
  4. 支持各种请求资源的映射策略

3.springmvc的执行原理

微信截图_20230523144732.png

  1. 发起请求到前端控制器DispatcherServler
  2. 前端控制器调用处理器映射器HandlerMapping查找Handler
  3. 处理器映射器向前端控制器返回找到的Handler
  4. 前端控制器调用处理器适配器HandlerAdapter执行Handler
  5. 处理器适配器去执行Handler
  6. Handler执行完成给处理器适配器返回ModelAndView
  7. 处理器适配器向前端控制器返回ModelAndView
  8. 前端控制器请求视图解析器ViewResolver去进行视图解析
  9. 视图解析器向前端控制器返回视图view
  10. 前端控制器进行视图渲染向用户响应结果

总结:DispatcherServlet(前端控制器)接收来自客户端的URL的请求。请求分发器借助处理器映射器(HandlerMapping)来查找对应的处理器映射器Handler(控制器),分发本次请求。请求分发器利用处理器映射器(HandlerApater)来执行对应的处理器(控制器)。处理器调用方法处理本次请求,返回模型视图对象(MOdelAndView)。请求分发器借助视图解析器(ViewResolver)解析模型视图,得到对应的视图(view)。请求分发器调用视图中的方法,同时将数据模型交给视图对象,完成给客户端的应答。

4.核心组件

  1. 前端控制器DispatcherServlet:接收请求,响应结果,相当于转发器,有了DispatcherServlet就减少了其它组件之间的耦合度
  2. 处理器映射器HandlerMapping:本质上就是一段映射关系,将访问路径和对应的Handler存储为映射关系,在需要时供前端控制器查阅
  3. 处理器适配器HandlerAdapter:本质上是一个是适配器,可以根据要求找到对应的Handler来运行

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

是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写可变状态量,如果需要使用这些可变状态量,可以使用ThreadLocal机制解决,为每个线程单独生成一份变量副本,独立操作,互不影响。

6.mvc是什么?mvc设计模式的好处有哪些?

mvc是一种设计模式(设计模式就是日常开发中编写代码的一种好的方法和经验的总结).模型(model)-视图(view)-控制器(controller),三层架构的设计模式。用于实现前端页面的展现与后端业务数据的分离。

  1. 分层设计,实现了业务系统各个组件之间的耦合,有利于业务系统的可扩展性,可维护性。
  2. 有利于系统的并行开发,提升开发效率。

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