SpringMVC超详细⾯试题(附答案)
1、什么是Spring MVC?简单介绍下你对springMVC的理解?
Spring MVC是⼀个基于Java的实现了MVC设计模式的轻量级Web框架,通过把Model,View,Controller分离,将web层进⾏职责解耦,把复杂的web应⽤分成逻辑清晰的⼏部分,简化开发,减少出错,⽅便组内开发⼈员之间的配合。
2、什么是MVC?
MVC主要的⽤途就是对组件之间进⾏隔离分层。
M:业务逻辑/数据模型
V:视图
C:控制器
3、SpringMVC执⾏的⼤体流程是什么?
核⼼组件 DispatcherServlet 处理整体的流程,处理所有HTTP请求和响应。
(1)浏览器端发起⼀个请求,先发送到DispatcherServlet。
(2)接收到⽤户的请求,会查询HandLerMapping到具体要调⽤的是谁,然后跳转到指定的控制器。
(3)Controller调⽤服务⽅法,Controller⽅法将业务模型返回的数据和⽬标视图存放在ModelAndView对象中。
(4)再把ModelAndView对象传给DispatcherServlet,DispatcherServlet会从 ViewResolver中获取请求的定义视图,最后DispatcherServlet将模型数据传递到最终的视图并在浏览器上呈现。
4、SpringMVC执⾏的详细流程是什么? 答案⼀
SpringMVC流程
1、 ⽤户发送请求⾄前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调⽤HandlerMapping处理器映射器。
3、 处理器映射器到具体的处理器(可以根据xml配置、注解进⾏查),⽣成处理器对象及处理器(如果有则⽣成)⼀并返回给DispatcherServlet。
4、 DispatcherServlet调⽤HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调⽤具体的处理器(Controller,也叫后端控制器)。
6、 Controller执⾏完成返回ModelAndView。
7、 HandlerAdapter将controller执⾏结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、 DispatcherServlet根据View进⾏渲染视图(即将模型数据填充⾄视图中)。
11、 DispatcherServlet响应⽤户。
5、请解释SpringMVC各常⽤组件的功能?
常⽤组件的解释:
1、前端控制器DispatcherServlet(不需要⼯程师开发),由框架提供
作⽤:接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。
⽤户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中⼼,由它调⽤其它组件处理⽤户的请
求,dispatcherServlet的存在降低了组件之间的耦合性。
作为前端控制器,整个流程控制的中⼼,控制其它组件执⾏,统⼀调度,降低组件之间的耦合性,提⾼每个组件的扩展性。
2、处理器映射器HandlerMapping(不需要⼯程师开发),由框架提供
作⽤:根据请求的url查Handler
HandlerMapping负责根据⽤户请求到Handler即处理器,springmvc提供了不同的映射器实现不同的映射⽅式,例如:配置⽂件⽅式,实现接⼝⽅式,注解⽅式等。
通过扩展处理器映射器实现不同的映射⽅式,例如:配置⽂件⽅式,实现接⼝⽅式,注解⽅式等。
3、处理器适配器HandlerAdapter
作⽤:按照特定规则(HandlerAdapter要求的规则)去执⾏Handler
通过HandlerAdapter对处理器进⾏执⾏,这是适配器模式的应⽤,通过扩展适配器可以对更多类型的处理器进⾏执⾏。
通过扩展处理器适配器,⽀持更多类型的处理器。
4、处理器Handler(需要⼯程师开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执⾏Handler
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的⽤户请求进⾏处理。
由于Handler涉及到具体的⽤户业务请求,所以⼀般情况需要⼯程师根据业务需求开发Handler。
5、视图解析器View resolver(不需要⼯程师开发),由框架提供
作⽤:进⾏视图解析,根据逻辑视图名解析成真正的视图(view)
View Resolver负责将处理结果⽣成View视图,View Resolver⾸先根据逻辑视图名解析成物理视图名
即具体的页⾯地址,再⽣成View视
View Resolver负责将处理结果⽣成View视图,View Resolver⾸先根据逻辑视图名解析成物理视图名即具体的页⾯地址,再⽣成View视图对象,最后对View进⾏渲染将处理结果通过页⾯展⽰给⽤户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
⼀般情况下需要通过页⾯标签或页⾯模版技术将模型数据通过页⾯展⽰给⽤户,需要由⼯程师根据业务需求开发具体的页⾯。
通过扩展视图解析器,⽀持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。
6、视图View(需要⼯程师开发jsp…)
View是⼀个接⼝,实现类⽀持不同的View类型(jsp、freemarker、pdf…)
6、SpringMVC执⾏的详细流程是什么?答案⼆
核⼼架构的具体流程步骤如下:
1、⾸先⽤户发送请求——>DispatcherServlet,前端控制器收到请求后⾃⼰不进⾏处理,⽽是委托给其他的解析器进⾏处理,作为统⼀访问点,进⾏全局的流程控制;
2、DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含⼀个Handler 处理器(页⾯控制器)对象、多个HandlerInterceptor )对象,通过这种策略模式,很容易添加新的映射策略;
3、DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从⽽⽀持多种类型的处理器,即适配器设计模式的应⽤,从⽽很容易⽀持很多类型的处理器;
4、HandlerAdapter——>处理器功能处理⽅法的调⽤,HandlerAdapter 将会根据适配的结果调⽤真正的处理器的功能处理⽅法,完成功能处理;并返回⼀个ModelAndView 对象(包含模型数据、逻辑视图名);
5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、View——>渲染,View会根据传进来的Model模型数据进⾏渲染,此处的Model实际是⼀个Map数据结构,因此很容易⽀持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给⽤户,到此⼀个流程结束。
7、SpringMVC执⾏的详细流程是什么?答案三
现在我们来看⼀下这个图的步骤:(可以对⽐MVC的原理图进⾏理解)
第⼀步:⽤户发起请求到前端控制器(DispatcherServlet)
第⼆步:前端控制器请求处理器映射器(HandlerMappering)去查处理器(Handle):通过xml配置或者注解进⾏查
第三步:到以后处理器映射器(HandlerMappering)像前端控制器返回执⾏链(HandlerExecutionChain)
第四步:前端控制器(DispatcherServlet)调⽤处理器适配器(HandlerAdapter)去执⾏处理器(Handler)
第五步:处理器适配器去执⾏Handler
第六步:Handler执⾏完给处理器适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
第⼋步:前端控制器请求视图解析器(ViewResolver)去进⾏视图解析
第九步:视图解析器像前端控制器返回View
第⼗步:前端控制器对视图进⾏渲染
第⼗⼀步:前端控制器向⽤户响应结果
8、解释SpringMVC常⽤注解的作⽤?
(1)@Controller注解:⽤于指⽰Spring类的实例是⼀个控制器,使⽤@Controller注解的类不需要继承特定的⽗类或者实现特定的接⼝,相对之前的版本实现Controller接⼝变的更加简单。⽽Controller接⼝的实现类只能处理⼀个单⼀的请求动作,⽽@Controller注解注解的控制器可以同时⽀持处理多个请求动作,使程序开发变的更加灵活。使⽤@Controller注解标记的⼀个类就是⼀个Spring MVC Controller对象,即:⼀个控制器类。
(2)@RequestMapping注解:Spring使⽤扫描机制查应⽤程序中所有基于@Controller注解的控制器类,分发处理器会扫描使⽤了该注解类中的⽅法,并检测该⽅法是否使⽤了@RequestMapping注解,使⽤@RequestMapping注解的⽅法才是真正处理请求的处理器。(3)@RequestParam注解:根据url中的参数名获得参数值。
(4)@RequestBody注解:常⽤在获得requestbody体中的json字符串转成实体类
(5)@PathVaribale注解:获得URL中路径变量中的值
(6)@RequestHeader注解:获得请求头中属性对应的值
(7)@CookieValue注解:获得cookie值
(8)@SessionAttributes注解:向session中存放数据
(9)@MoelAttribute注解:可以从session中取得数据
9、SpringMVC控制层类中为什么不能定义实例变量?
因为Controller默认单例模式的,⾼并发下实例变量会出现线程安全问题,值被其它请求所覆盖。
10、SpringMVC中的和Servlet中的Filter有什么区别?
两者拦截的侧重点是不同的。
SpringMVC中的是依赖JDK的反射实现的,SpringMVC的主要是进⾏拦截请求,通过对Handler进⾏处理的时候进⾏拦截,先声明的中的preHandle⽅法会先执⾏,然⽽它的postHandle⽅法(他是介于处理完业务之后和返回结果之前)和afterCompletion⽅法却会后执⾏,并
且Spring的是按照配置的先后顺序进⾏拦截的。
⽽Servlet的Filter是基于函数回调实现的过滤器,Filter主要是针对URL地址做⼀个编码的事情、过滤掉没⽤的参数、安全校验(⽐较泛的,⽐如登录不登录之类)。
SpringMVC中的侧重于处理SpringMVC框架本⾝的处理,⽽Filter过滤器侧重于request和response相关的处理。
11、SpringMVC的优点
(1)可以⽀持各种视图技术,⽐如FreeMarker,Thymeleaf,⽽不仅仅局限于JSP;
(2)与Spring框架集成(如IoC容器、AOP等);
(3)清晰的⾓⾊分配:前端控制器(dispatcherServlet) , 请求到处理器映射(handlerMapping), 处理器适配器(HandlerAdapter), 视图解析器(ViewResolver)。
(4) ⽀持各种请求资源的映射策略。
(5)它是基于组件技术的,⽆论控制器和视图,还是业务对象之类的都是 java 组件.并且和 Spring 提供的其他基础结构紧密集成.
(6)不依赖于 Servlet API(⽬标虽是如此,但是在实现的时候确实是依赖于 Servlet 的)
12、SpringMVC和Struts2的区别有哪些?
(1)SpringMVC的⼊⼝是⼀个Servlet,即前端控制器(DispatchServlet),⽽Struts2⼊⼝是⼀个Filter过虑器(StrutsPrepareAndExecuteFilter)。
(2)SpringMVC是基于⽅法开发(⼀个url对应⼀个⽅法),请求参数传递到⽅法的形参,可以设计为单例或多例(建议单例)。Struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
(3)Struts2将传递到View层中的数据默认封装进ValueStack对象中,然后在JSP中从ValueStack中取出数据并显⽰,⽽SpringMVC 把值默认存放在request中,在JSP中从request中取出数据并显⽰。
13、SpringMVC怎么样设定重定向和转发的?
(1)转发:return listUserinfo.jsp
(2)重定向:return redirect:listUserinfoController"
14、SpringMVC怎么和AJAX相互调⽤的?
前端代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="/jquery/jquery-1.11.2.min.js"></script>
<script type="text/javascript">
function login(){
/**
* 提交⽅式⼀:整个表单的数据提交⽅式
*/
//serialize():表单序列化
var params = $("#loginForm").serialize();
//post请求,params:请求参数,将数据传到后端,function(result){}:回调函数,接收后端返回的数据,参数名(result)可随便取
     $.post("/Jquery/login",params,function(result){
//因为SpringMVC框架和Jquery框架的联合作⽤,使得传回来的result保留了原有数据类型
if(result){//登录成功
window.location.href="www.baidu";
}else{
//完全等于  ElementById("erSpan").innerHTML = result+":"+"登录失败!";
$("#erSpan").html(result+":"+"登录失败!");
}
})
}
}
function login2(){
/**
*提交⽅式⼆:⼀个个数据上传的⽅式
*/
//以下两句相当于 ElementById("userName").value;
var userName = $("#userName").val();
var pwd = $("#pwd").val();
/
/写法⼀:key值必须要加"";
//var params = {"userName":userName,"pwd":pwd};
//写法⼆:
var params ="userName="+userName+"&pwd="+pwd;
//发送请求到后台
//如果要传参,直接在第⼆个参数中传就可以了
$.post("/Jquery/login",params,function(result){
//因为SpringMVC框架和Jquery框架的联合作⽤,使得传回来的result保留了原有数据类型if(result){
window.location.href="www.baidu"
}else{
//完全等于ElementById("erSpan").innerHTML = result+":"+"登录失败!";                $("#erSpan").html(result+":"+"登录失败!");
}
})
}
</script>
</head>
<body>
<span id="erSpan"></span>
<form id="loginForm" action="/Jquery/login" method="post">
⽤户名:<input type="text" name="userName" id="userName"/><br />
密码<input type="text" name="pwd" id="pwd"/><br />
<input type="button" value="ajax表单提交" onclick="login()"/>
<input type="button" value="ajax单独提交" onclick="login2()"/>jquery框架原理
</form>
</body>
</html>
后台代码:
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/Jquery")
public class JqueryController {
/*
* 注意:如果在浏览器上访问login.html的路径为:IP:端⼝号/login.html,⽽这⾥访问login⽅法的路径直接为:
/login,前⾯没有任何路径,如@RequestMapping("/Jquery"),则会出现406错误
*/
@RequestMapping("/login")
@ResponseBody//加上这个注解,return 就不会再跳转页⾯,只是返回数据(json)
public Boolean login(String userName,String pwd){
System.out.println(userName+":"+pwd);
if("流星".equals(userName)&&"456".equals(pwd)){
return true;
}
return false;
}
}
15、如何解决POST请求中⽂乱码问题,GET的⼜如何处理呢?
(1)解决post请求乱码问题:
在l中配置⼀个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配置⽂件添加编码与⼯程编码⼀致,如下:
建议使⽤如下办法,因为Tomcat中的配置有的时候没有权限更改。
②另外⼀种⽅法对参数进⾏重新编码:
String userName =
new Paramter(“userName”).getBytes(“ISO8859-1”),“utf-8”)
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。
16、Spring MVC的异常处理 ?
可以将异常抛给Spring框架,由Spring框架来处理;只需要使⽤@ExceptionHandler配置异常处理器,在异常处理器中添加视图页⾯及在视图上显⽰什么信息即可。
3个⽰例代码:
(1)案例1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。