关于spring-mvc:SpringMVC常见面试题

2次阅读

共计 5258 个字符,预计需要花费 14 分钟才能阅读完成。

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;

<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>
</filter>
 
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</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 的配置文件中配置拦截器即可:

<!-- 配置 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>

10、注解原理:

(1) 什么是注解

Java 注解就是代码中的一些非凡标记(元信息),用于在编译、类加载、运行时进行解析和应用,并执行相应的解决。它实质是继承了 Annotation 的非凡接口,其具体实现类是 JDK 动静代理生成的代理类,通过反射获取注解时,返回的也是 Java 运行时生成的动静代理对象 $Proxy1。通过代理对象调用自定义注解的办法,会最终调用 AnnotationInvocationHandler 的 invoke 办法,该办法会从 memberValues 这个 Map 中查问出对应的值,而 memberValues 的起源是 Java 常量池。

注解在理论开发中十分常见,比方 Java 原生的 @Overried、@Deprecated 等,Spring 的 @Controller、@Service 等,Lombok 工具类也有大量的注解,不过在原生 Java 中,还提供了元 Annotation(元注解),他次要是用来润饰注解的,比方 @Target、@Retention、@Document、@Inherited 等。

@Target:标识注解能够润饰哪些地方,比方办法、成员变量、包等,具体取值有以下几种:ElementType.TYPE/FIELD/METHOD/PARAMETER/CONSTRUCTOR/LOCAL_VARIABLE/ANNOTATION_TYPE/PACKAGE/TYPE_PARAMETER/TYPE_USE
@Retention:什么时候应用注解:SOURCE(编译阶段就抛弃) / CLASS(类加载时抛弃) / RUNTIME(始终不会抛弃),一般来说,咱们自定义的注解都是 RUNTIME 级别的,因为大多数状况咱们是依据运行时环境去做一些解决,个别须要配合反射来应用,因为反射是 Java 获取运行是的信息的重要伎俩
@Document:注解是否会蕴含在 javadoc 中;
@Inherited:定义该注解与子类的关系,子类是否能应用。

(2) 如何自定义注解?

① 创立一个自定义注解:与创立接口相似,但自定义注解须要应用 @interface

② 增加元注解信息,比方 @Target、@Retention、@Document、@Inherited 等

③ 创立注解办法,但注解办法不能带有参数

④ 注解办法返回值为根本类型、String、Enums、Annotation 或其数组

⑤ 注解能够有默认值;

@Target(FIELD)
@Retention(RUNTIME)
@Documented
public @interface CarName {String value() default "";
}

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。

15、怎么在办法外面失去 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。

原文链接:https://blog.csdn.net/a745233…

正文完
 0