SpringMVC面试题及答案(11道必考题解析)

SpringMVC面试题及答案(11道必考题解析)-mikechen

SpringMVC面试也是Spring面试Java面试必考的内容,今天给大家重点分享SpringMVC面试题及答案@mikechen

1、什么是 Spring MVC?

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

 

2、什么是 MVC 模型?

可以用如下的图形来表示MVC三者之间的关系:
SpringMVC面试题及答案(11道必考题解析)-mikechen

1.模型(Model)

模型封装了数据及对数据的操作,可以直接对数据库进行访问,不依赖视图和控制器,也就是说模型并不关注数据如何展示,只负责提供数据。GUI 程序模型中数据的变化一般会通过观察者模式通知视图,而在 web 中则不会这样。

2.视图(View)

视图从模型中拉取数据,只负责展示,没有具体的程序逻辑。

3.控制器(Controller)

控制器用于控制程序的流程,将模型中的数据展示到视图中。

 

3、SpringMVC执行流程是什么?

SpringMVC面试题及答案(11道必考题解析)-mikechen

(1)用户发送请求发送给前端控制器

(2)前端控制器收到请求调用处理器映射器

(3)处理器映射器找到具体得处理器,生成处理器对象以及处理器拦截器并返回给前端控制器

(4)前端控制器调用处理器适配器

(5)处理器适配器经过适配调用具体得处理器

(6)处理器执行完成并返回结果给前端控制器

(7)前端控制器接受到结果,并讲结果传给视图解析器

(8)视图解析器解析后返回具体得view

(9)前端根据view进行渲染视图,并且响应用户

 

4、SpringMVC主要组件?

SpringMVC面试题及答案(11道必考题解析)-mikechen

1)前端控制器(DispatcherServlet)

用户请求到达前端控制器,它就相当于 mvc 模式中的 c,DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。

 

2)处理器映射器(HandlerMapping)

HandlerMapping 负责根据用户请求找到 Handler 即处理器,springmvc 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

 

3)处理器(Handler)

Handler 是继 DispatcherServlet 前端控制器的后端控制器,在 DispatcherServlet 的控制下 Handler 对具体的用户请求进行处理。

由于 Handler 涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发 Handler。

 

4)处理器适配器(HandlAdapter)

通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

 

5)视图解析器(ViewResolver)

ViewResolver 负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

 

6)视图(View)

SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView 等。

 

在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 springmvc 的三大组件。

 

5、Spring MVC 的优缺点?

优点:

  • 可以支持各种视图技术,而不仅仅局限于 JSP
  • 与 Spring 框架集成(如 IoC 容器、AOP 等)
  • 清晰的角色分配:前端控制器(dispatcherServlet),请求到处理器映射(handlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver)
  • 支持各种请求资源的映射策略

缺点:

  • Spring与MVC 的Servlet API 耦合,难以脱离容器独立运行;
  • 太过于细分,开发效率低;
  • 过度追求完美,有过度设计的危险。

 

6、springMVC和struts2的区别有哪些?

1)springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。

2)springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。

3)Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

7、SpringMVC怎样转发和重定向得?

(1)转发:再发回结果加forword

(2)重定向:在返回结果加redirect

 

8、SpringMVC常见注解有哪些?

1)@Controller

用于标识此类的实例是一个控制器。

2)@RequestMapping

映射Web请求(访问路径和参数)。

3)@ResponseBody

注解返回数据而不是返回页面

4)@RequestBody

注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。

5)@PathVariable

获得URL中路径变量中的值

6)@RestController

组合了@Controller和@ResponseBody的注解

 

9、Spring MVC 怎么前后台传递数据?

1)使用Map、Model 和 ModelMap 的方式:

@RequestMapping("/getUser")
public String getUser(Map<String,Object> map,Model model,ModelMap modelMap){
    //1.放在map里  
    map.put("name", "xq");
    //2.放在model里,一般是使用这个
    model.addAttribute("habbit", "Play");
    //3.放在modelMap中 
    modelMap.addAttribute("city", "gd");
    modelMap.put("gender", "male");
    return "userDetail";
}

2)使用request的方式:

@RequestMapping("/getUser")
public String getUser(Map<String,Object> map,Model model,
ModelMap modelMap,HttpServletRequest request){
    //放在request里  
    request.setAttribute("user", userService.getUser());
    return "userDetail";
}

3)使用ModelAndView方式:

@RequestMapping("/getUser")  
public ModelAndView getUser(ModelAndView modelAndView) {
    mav.addObject("user", userService.getUser());  
    mav.setViewName("mikechen");  
    return modelAndView;  
}

 

10、SpringMvc里面拦截器是怎么写?

有两种写法,一种是实现HandlerInterceptor接口,另外一种是继承适配器类,接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可:

<!-- 配置SpringMvc的拦截器 -->
<mvc:interceptors>
    <!-- 配置一个拦截器的Bean就可以了 默认是对所有请求都拦截 -->
    <bean id="myInterceptor" class="com.zwp.action.MyHandlerInterceptor"></bean>
 
    <!-- 只针对部分请求拦截 -->
    <mvc:interceptor>
       <mvc:mapping path="/modelMap.do" />
       <bean class="com.zwp.action.MyHandlerInterceptorAdapter" />
    </mvc:interceptor>
</mvc:interceptors>

 

11、拦截器与过滤器的区别?

过滤器

  • servlet规范中的一部分,任何java web工程都可以使用
  • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

  • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
  • 拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的
  • 拦截器是AOP思想的具体应用

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法