SpringMVC常见面试题
1.什么是SpringMVC?简单介绍下你对SpringMVC的理解
SpringMVC是一个基于Java实现的MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
2.SpringMVC核心组件
- 前端控制器DispatcherServlet
作用:接收请求、相应结果,相当于转发器,有了DIspatcherServlet就减少了其他组件之间的耦合度。
- 处理器映射器HandlerMapping
作用:根据请求的URL来查找Handler
- 处理器适配器HandlerAdapter
- 处理器Handler
- 视图解析器
进行视图解析,根据视图逻辑名解析成真正的视图
- view
View是一个接口,他的实现类支持不同的视图类型
3.什么是DispatcherServlet
Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的Http请求和相应。
4.SpringMVC的工作原理
请描述SpringMVC的工作流程?描述一下DispatcherServlet的工作流程?
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handler。
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象以及处理器拦截器,一并返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter处理器适配器;
- HandlerAdapter经过适配调用具体处理器(Handler,也叫做后端处理器);
- Handler执行完成返回ModelAndView;
- HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
- DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
- ViewResolver解析后返回具体View
- DispatcherServlet对View进行渲染视图
- DispatcherServlet相应用户。
5.MVC框架,MVC是什么,MVC设计模式的好处有哪些
mvc是一种设计模式。模型,视图,控制器,三层架构的设计模式,用于实现前端页面的展现和后端业务数据处理的分离
mvc设计模式的好处
- 分层设计,实现了业务系统各个组件之间的解耦,有利于业务系统的可扩展性,可维护性
- 有利于系统的并行开发,提升开发效率。
6.SpringMVC怎么设定重定向和请求转发
重定向与请求转发的区别:
- 请求转发在服务器端完成的;重定向是在客户端完成的。
- 请求转发的速度快,重定向速度慢。
- 请求转发的是同一次请求;重定向是两次不同的请求。
- 请求转发不会执行转发后的代码,重定向会执行重定向之后的代码。
- 请求转发地址栏没有变化;重定向地址栏有变化
- 请求转发必须是在同一台服务器下完成,重定向可以在不同的服务器下完成
7.当一个方法向AJAX返回特殊对象,例如Object,List等,需要做什么处理?
- 在方法上加
@ResponseBody
注解,表示该方法的返回值不管是什么类型,都会返回JSON格式的数据。 - 把原来Controller类上的@Controller注解替换为@RestController注解。@RestController = @Controller + @ResponseBody,表明该Controller类所有的方法都返回JSON格式的数据(没有加@RequestMapping注解的方法除外)。
8.如何解决POST请求中文乱码问题,GET的又是如何处理呢?
JavaWeb乱码问题一般是客户端与服务器端字符集不一致产生的,如果两者字符集一致就不会产生乱码问题。
解决post请求乱码
SpringMVC默认提供一个解决post请求乱码的过滤器,在web.xml中配置即可。
<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>
解决get请求乱码
<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");
9.SpringMVC的控制器是不是单例模式,如果是,有什么问题,怎么解决
- Controller是单例模式,在多线程访问的时候可能产生线程安全问题,不要使用同步,会影响程序性能。
- 解决方案是在控制器里面不能编写成员属性。
10.SpringMVC常用的注解
@Controller
@Controller
用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象,处理器适配器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping
注解。
@Controller
只是定义了一个控制器类,而使用@RequestMappint
注解的方法才是真正处理请求的处理器。
@RequestMappint
@RequestMappint
是一个用来处理请求地址映射的注解,可用于类或方法张,用于类上,表示类中所有相应请求的方法都是以该地址作为父路径。返回值会通过视图解析器解析为实际的物理视图,对于InternalResourceViewResolver
视图解析器,通过prefix+returnValue+suffix这样的方式得到实际的物理视图,然后做转发操作。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
@RequestMappint
有如下6个属性
- value:指定请求的实际地址
- method:指定请求的method类型,GET,POST,PUT,DELETE等。
- consumes:指定处理请求的提交内容类型(Content-Type),例如application/json,text/html
- produces:指定返回的内容类型,仅当request请求头中的Accept类型中包含该指定类型才返回
- params:指定request中必须包含某些参数值,才让该方法处理。
- headers:指定request中必须包含某些指定的header值,才能让方法处理请求。
@ResponseBody
@ResponseBody
把Java对象转化为json对象,这种方式用于Ajax异步请求,返回的不是一个页面而是JSON格式的数据。
@PathVariable
@PathVariable
用于接收uri地址传过来的参数,Url中可以通过一个或多个占位符映射,通过@PathVariable可以绑定占位符参数到方法参数中,在RestFul接口风格中经常使用。- 例如:请求URL:http://localhost/user/21/张三/query
@RequestMapping("/user/{userId}/{userName}/query")
public User query(@PathVariable("userId") Long userId, @PathVariable("userName") String userName){
}
@RequestParam
@RequestParam
用于将请求参数映射到控制器方法的形参,有如下三个属性
- value:参数名。
- required:是否必须,默认为true,表示请求参数中必须包含该参数,如果不包含排除异常。
- defaultValue:默认参数值,如果设置了该值自动将required设置为false,如果参数没有包含在参数则使用默认值。
11.怎样在控制器方法里面得到request或者session?
直接在控制器方法的形参中声明request,session,SpringMVC就会自动把他们注入。
12.SpringMVC用什么对象从后台向前台传递数据的
1.使用Map,Model和ModelMap的方式,这种方式存储的数据是在request域中
@RequestMappint("/getUser")
public String getUser(Map<String,Object> map,Model,model,ModelMap modelMap){
map.put("name","xq");
model.addAttribute("habbit","Play");
modelMap.addAttribute("city","gd");
modelMap.put("gender","male");
return "userDetail";
}
2.使用request的方式
@RequestMappint("/getUser")
public String getUser(Map<String,Object> map,Model model,ModelMap modelMap,HttpServletRequest request){
request.setAttribute("user",userService.getUser());
return "userDetail";
}
3.使用ModelAndView
@RequestMappint("/getUser")
public ModelAndView getUser(ModelAndView modelAndView){
mav.addObject("user",userService.getUser());
mav.setViewName("userDetail");
return modelAndView;
}
13.怎么样把ModelMap里面的数据放入session里面?
在类上添加@SessionAttributes
注解将指定的Model数据存储到session中。
@SessionAttributes
- 默认情况下SpringMVC将模型中的数据存储到request域中,当一个请求结束后,数据就失效了,如果要跨页面使用,那么需要使用session。而
@SessionAttributes
注解就可以使得模型中的数据存储一份到session域中。
@SessionAttributes参数
- names:这是一个字符串数组,里面应写需要存储到session中数据的名称。
- types:根据指定参数的类型,将模型中对应类型的参数存储到session中。
@SessionAttributes(value={"names"},types={Integer.class})
@Controller
public class session{
@RequestMapping("/session")
public String session(Model model){
model.addAttributes("names", Arrays.asList("caoyc","zhh","cjx"));
model.addAttributes("age", 22);
return "/session";
}
}
在上面代码中,在类上添加@SessionAttributes注解,并指定将names名称的Model数据存储到session域中,以及将Integer类型的Model数据存储到session域中。
14.SpringMVC中有个类把视图和数据都合并在一起的,叫什么?
ModelAndView
- 使用ModelAndView类存储处理完后的结果数据,以及显式该数据的视图。从名字上看ModelAndView中的Model代表模型,View代表视图,从名字看就很好的解释了该类的作用。Controller处理器调用模型层处理完用户请求后,把结果数据存储在该类的model属性中,把要返回的视图信息存储在该类的view属性中,然后把ModelAndView返回给前端控制器,前端控制器通过调用配置文件中定义的视图解析器,对该对象进行解析,最后把结果数据显示在指定页面上。
- 返回指定页面
- 返回所需数值