Java最新面试宝典 SpringMVC面试题
- 前言
- 1、什么是SpringMVC?
- 2、SpringMVC 的优点?
- 3、Spring MVC配置步骤?
- 4、SpringMVC工作原理了解吗?
- 5、Spring MVC 核心组件的功能?
- 6、B/S 系统标准的三层架构是什么?
- 7、@Controller 注解有什么用?
- 8、@RequestMapping 注解有什么用?
- 9、@RestController 和 @Controller 有什么区别?
- 10、@RequestMapping 和 @GetMapping 注解的不同之处在哪里?
- 11、@RequestParam 和 @PathVariable 两个注解的区别?
- 12、返回 JSON 格式使用什么注解?
- 13、SpringMVC 拦截器与过滤器的区别?
- 14、怎么控制过滤器和拦截器的执行顺序?
- 15、SpringMVC 中如何解决请求中⽂乱码问题?
- 16、怎么把ModelMap⾥⾯的数据放⼊Session⾥⾯
- 17、SpringMVC 和 Struts2 的异同?
- 18、SpringMVC 怎么样重定向和转发的?
- 19、SpringMvc里面拦截器是怎么写的?
- 20、HandlerInterceptor接口是什么?
- 总结
前言
最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等,会持续更新。
如果对老铁有帮助,帮忙免费点个赞,谢谢你的发财手!
1、什么是SpringMVC?
Spring MVC是一个基于Java的实现了MVC设计模式的轻量级Web框架,通过把Model,View,Controller分离,把复杂的web层分成逻辑清晰的3部分,减少了出错,方便开发人员之间的配合。
2、SpringMVC 的优点?
(1)可以支持各种视图技术,包括Jsp、Thymeleaf、Freemarker等;
(2)与Spring框架集成(包括IOC容器、AOP等);
(3)有清晰的角色分配:前端控制器,处理器映射器,处理器适配器,视图解析器。
(4)支持各种请求资源的映射策略。
3、Spring MVC配置步骤?
1)、搭建Spring MVC 环境需要使用的jar包;
2)、web.xml配置前端控制器以及SpringMVC.xml的路径:
< !--前端控制器配置(DispatcherServlet)-->
<servlet>
<servlet-name>SpringMVC </servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC .xml</param-value>
</init-param>
<!--自动动配置要放在<init-param>配置后,否则会报错-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--配置控制器访问,配置的值为/ ,表示所有访问都会进入此前端控制器(.jsp访问地址除外)-->
<servlet-mapping>
<servlet-name>SpringMVC </servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3)、在SpringMVC.xml的配置文件中:
<!-- 配置spring注解扫描-->
<context:component-scan base-package="Controller"></context:component-scan>
<!-- 配置SpringMVC 注解驱动-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--配置视图解析器: -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀配置-->
<property name="prefix" value="/"></property>
<!--后缀配置-->
<property name="suffix" value=".jsp"></property>
</bean>
<!--配置静态资源:配置需要放行的静态资源地址,不需要解析该请求地址-->
<!-- mapping="":配置静态资源的请求路径
location="":配置静态资源所在的路径,使用*通配符,一个*表示该路径下的资源,两个**表示该路径下的所有资源文件(包含子文件中的资源文件)
-->
<mvc:resources mapping="/js/" location="/js/**"></mvc:resources>
<mvc:resources mapping="/css/" location="/css/**"></mvc:resources>
<mvc:resources mapping="/images/" location="/images/**"></mvc:resources>
4、SpringMVC工作原理了解吗?
原理如下图所示:
1)、客户端(浏览器)发送请求,直接请求到 DispatcherServlet;
2)、前端控制器调用处理器映射器HandlerMapping,处理器映射器根据请求URL信息解析返回一个处理器执行链,包含处理器(handler)和拦截器(interceptors);
3)、前端控制器调用处理器适配器HandlerAdapter,处理器适配器根据Handler来调用真正的处理器Controller,并处理相应的业务逻辑;
4)、处理完业务逻辑后,会返回一个ModelAndView对象(Model是封装的数据对象);
6)、然后前端控制器调用视图解析器ViewResolver,视图解析器根据View名称查找到具体的页面地址,并返回一个View 视图对象;
7)、然后前端控制器对视图进行渲染,最后通过页面展示给客户端。
5、Spring MVC 核心组件的功能?
- 前端控制器DispatcherServlet :
DispatcherServlet 是 Spring MVC 的入口函数。负责接收客户端请求,响应结果给客户端,相当于转发器。有了 DispatcherServlet ,可以大大减少其它组件之间的耦合度。
DispatcherServlet 是整个流程控制的中心,由它来调用其它组件处理用户的请求。 - 处理器映射器HandlerMapping :
HandlerMapping 负责根据用户请求(URL),找到合适的 HandlerExecutionChain 处理器执行链,包含处理器(handler)和拦截器们(interceptors) - 处理器适配器HandlerAdapter:
按照特定规则(HandlerAdapter 要求的规则)去执行 Handler,通过 HandlerAdapter 对处理器进行执行。因为处理器 handler 的类型是 Object 类型,需要有一个调用者来实现 handler 是怎么被执行。所以这里需要一个处理器适配器,由它去执行处理器。 - 处理器 Handler:(需要工程师开发)
Handler 是在 DispatcherServlet 的控制下,Handler 对具体的用户请求进行处理。由于 Handler 涉及到具体的用户业务请求,所以一般情况下需要工程师根据业务需求来开发 Handler。 - 视图解析器 View Resolver:
进行视图解析,首先,根据逻辑视图名解析成物理视图名(即具体的页面地址),再生成 View 视图对象。 - MultipartResolver 内容类型( Content-Type )为 multipart/* 的请求的解析器,⽤于上传请求,通过将普通的请求包装成 MultipartHttpServletRequest 来实现。
MultipartHttpServletRequest 可以通过 getFile() ⽅法 直接获得⽂件。
如果上传多个⽂件,还可以调⽤ getFileMap()⽅法得到Map<FileName,File>这样的结构,MultipartResolver 的作⽤就是封装普通的请求,使其拥有⽂件上传的功能。
6、B/S 系统标准的三层架构是什么?
B/S系统标准的三层架构分别是:表现层、业务层、持久层。
-
- 表现层 :
常说的web 层:它负责接收客户端请求,响应结果给客户端。
MVC 是表现层的设计模型,和其他层没有关系。
- 表现层 :
- 2.业务层 :
常说的 service 层:它负责业务逻辑处理,如果要对数据持久化需要保证事务⼀致性。(也就是我们说的,事务应该放到业务层来控制) - 3.持久层 :
常说的 DAO层:负责数据持久化,就是和数据库交互,对数据库表进⾏增删改查的。
7、@Controller 注解有什么用?
@Controller 注解标记一个类为 Spring的控制器,Spring会扫描到该注解的类,然后扫描这个类下面带有 @RequestMapping 注解的方法,根据注解信息,为这个方法生成一个对应的处理器对象。
等价于实现了 Spring MVC提供的 Controller 或者 HttpRequestHandler 接口
8、@RequestMapping 注解有什么用?
@RequestMapping 注解,配置HTTP 请求方法,URL等信息,这样才能将请求和方法进行映射。这个注解可以作用于类上面,也可以作用于方法上面,在类上面一般是配置这个控制器的 URL前缀。
9、@RestController 和 @Controller 有什么区别?
@RestController 注解,在 @Controller 基础上,增加了 @ResponseBody 注解,更加适合目前前后端分离的架构下,提供 Restful API ,返回例如 JSON 数据格式。当然,返回什么样的数据格式,根据客户端的 ACCEPT 请求头来决定。
10、@RequestMapping 和 @GetMapping 注解的不同之处在哪里?
1、@RequestMapping:可用在类和方法上;@GetMapping 仅可用在方法上
2、@RequestMapping:可支持 GET、POST、PUT、DELETE 等请求方法;
@GetMapping 只支持GET 请求方法,目的是为了提高清晰度。
11、@RequestParam 和 @PathVariable 两个注解的区别?
区别在于一个是用?,一个是用/
@RequestParam 是从request里面获取参数值(user?id=123);
而 @PathVariable 是从URI后缀获取参数(user/123)。
12、返回 JSON 格式使用什么注解?
可以使用 @ResponseBody 注解,或者使用包含 @ResponseBody 注解的 @RestController 注解。
13、SpringMVC 拦截器与过滤器的区别?
①拦截器是基于java的反射机制的,比如动态代理,过滤器是依赖于servlet容器,基于函数回调;
②拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用;
③拦截器可以获取IOC容器中的各个bean,过滤器就不行。
触发时机:
1.过滤器是在请求进入容器后,但请求进入servlet之前进行处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
2. 拦截器的配置⼀般在的SpringMVC配置⽂件中,使⽤Interceptor标签
总结:过滤器Filter包裹住servlet,servlet包裹住拦截器Interceptor
14、怎么控制过滤器和拦截器的执行顺序?
过滤器Filter用@Order注解控制执行顺序,通过@Order控制过滤器的级别,值越小级别越高越先执行。
拦截器Interceptor默认的执行顺序,就是它的注册顺序,也可以通过@Order注解控制,值越小越先执行。
15、SpringMVC 中如何解决请求中⽂乱码问题?
解决post请求乱码问题:
- 1、在doPost方法首行添加request.setCharacterEncoding(“utf-8”);
- 2、在web.xml中配置⼀个CharacterEncodingFilter过滤器,并设置编码为utf-8;
解决get请求乱码问题:
在Tomcat中的server.xml文件指定URIEncoding=”UTF-8”。
(< Connector port=“8080” protocol=“HTTP/1.1” redirectPort=“8443” connectionTimeout=“20000” URIEncoding=“UTF-8”/>)
16、怎么把ModelMap⾥⾯的数据放⼊Session⾥⾯
默认情况下SpringMVC将模型中的数据存储到request域中,当⼀个请求结束后,数据就失效了。如果要跨页⾯使⽤。那么需要使⽤到session。
可以在类上⾯加上@SessionAttributes注解,⾥⾯包含的字符串就是要放⼊session⾥⾯的key。
@SessionAttributes(value = { “key” })
17、SpringMVC 和 Struts2 的异同?
- 1)、入口不同
Spring MVC 的入门是一个 Servlet 控制器。
Struts2 入门是一个 Filter 过滤器。 - 2)、安全问题
Spring MVC默认为单例,是非线程安全的。
Struts2 是多例,是线程安全的。
18、SpringMVC 怎么样重定向和转发的?
- 转发:在返回值前面加"forward:“,如"forward:user.do?name=hello”
- 重定向:在返回值前面加"redirect:“,如"redirect:http://www.baidu.com”。
19、SpringMvc里面拦截器是怎么写的?
有两种写法,一种是实现HandlerInterceptor接口,另外一种是继承适配器类,接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可。
20、HandlerInterceptor接口是什么?
我们可以配置多个拦截器,每个拦截器中都有三个方法。下面将总结多个拦截器中的方法执行规律。
1、preHandle:Controller方法处理请求前执行,根据拦截器定义的顺序,正向执行。
2、postHandle:Controller方法处理请求后执行,根据拦截器定义的顺序,逆向执行。需要所有的preHandle方法都返回true时才会调用。
3、afterCompletion:View视图渲染后处理方法:根据拦截器定义的顺序,逆向执行。preHandle返回true就会调用。
总结
都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!