SpringMVC常见⾯试题
1、什么是SpringMVC ?
Spring MVC 是spring框架的⼀部分(⼦框架), 是实现对Servlet技术进⾏封装。
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器 (controller)的缩写,它是⼀种软件设计典范,是⼀种软件架构设计分层模式。
Model(模型)是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。
View(视图)是应⽤程序中处理数据显⽰的部分。
Controller(控制器)是应⽤程序中处理⽤户交互的部分。
最典型的MVC就是JSP + servlet + javabean的模式。
对SpringMVC的理解?
Spring MVC是⼀个基于MVC架构的⽤来简化web应⽤程序开发的应⽤开发框架,它是Spring的⼀个模块,⽆需中间整合层来整合 ,它和Struts2⼀样都属于表现层的框架。在web模型中,MVC是⼀种很流⾏
的框架,通过把Model,View,Controller分离,把较为复杂的web应⽤分成逻辑清晰的⼏部分,简化开发,减少出错,⽅便组内开发⼈员之间的配合。
2、SpringMVC 的执⾏流程?
1. ⽤户发送请求⾄前端控制器DispatcherServlet;
2. DispatcherServlet收到请求后,调⽤处理器映射器HandlerMapping,请求获取Handle;
3. 处理器映射器根据请求url到具体的处理器,⽣成处理器对象及处理器(如果有则⽣成)⼀并返回给前端控制器
DispatcherServlet;
4. DispatcherServlet通过处理器适配器HandlerAdapte调⽤处理器Handle;
5. 执⾏处理器(Handler,也叫后端控制器,需要程序员做处理);
6. 处理器Handler执⾏完成返回ModelAndView;
7. 处理器适配器HandlerAdapter将Handler执⾏结果ModelAndView返回给DispatcherServlet;
8. DispatcherServlet将ModelAndView传给视图解析器ViewReslover进⾏解析;
9. 视图解析器ViewReslover解析后返回具体View;
10. DispatcherServlet对View进⾏渲染视图(即将模型数据填充⾄视图中)
11. DispatcherServlet响应⽤户。
3、Spring MVC 的优点?
SpringMVC本⾝是与Spring框架结合⽽成的,它同时拥有Spring的优点(例如依赖注⼊DI和切⾯编程AOP等)。
SpringMVc提供强⼤的约定⼤于配置的契约式编程⽀持,即提供⼀种软件设计范式,减少软件开发⼈员做决定的次数,开发⼈员仅需规定应⽤中不符合约定的部分。
⽀持灵活的URL到页⾯控制器的映射。
可以⽅便地与其他视图技术(JSP、FreeMarker等)进⾏整合。由于SpringMVC的模型数据往往是放置在Map数据结构中的,因此其可以很⽅便地被其他框架引⽤。
拥有⼗分简洁的异常处理机制。
可以⼗分灵活地实现数据验证、格式化和数据绑定机制,可以使⽤任意对象进⾏数据绑定操作。
⽀持RestFul风格。
4、 Spring MVC的主要组件?
前端控制器 DispatcherServlet(不需要程序员开发)
作⽤:接收请求、响应结果 相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
处理器映射器HandlerMapping(不需要程序员开发)
作⽤:根据请求的URL来查Handler
处理器适配器HandlerAdapter
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执⾏Handler。
处理器Handler(需要程序员开发)
视图解析器 ViewResolver(不需要程序员开发)
作⽤:进⾏视图的解析 根据视图逻辑名解析成真正的视图(view)
视图View(需要程序员开发 jsp )
View是⼀个接⼝, 它的实现类⽀持不同的视图类型(jsp,freemarker,pdf等等)
5、SpringMVC怎么样设定重定向和转发的?
1. 在返回值前⾯加"forward:"就可以让结果转发,譬如"forward:user.do?name=method4"
2. 在返回值前⾯加"redirect:"就可以让返回值重定向,譬如"redirect:"
6、SpringMvc怎么和AJAX相互调⽤的?
通过Jackson框架就可以把Java⾥⾯的对象直接转化成Js可以识别的Json对象。具体步骤如下 :
1. 加⼊Jackson.jar
2. 在配置⽂件中配置json的映射springmvc常用标签
3. 在接受Ajax⽅法⾥⾯可以直接返回Object,List等,但⽅法前⾯要加上@ResponseBody注解。
7、Spring MVC 的常⽤注解有哪些?
@requestMapping:⽤于请求 url 映射。
@RequestBody: 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
@ResponseBody :注解实现将 controller ⽅法返回对象转化为 json 响应给客户。
@Conntroller:控制器的注解,表⽰是表现层,不能⽤⽤别的注解代替
@Autowire 和 @Resource 的区别?
@Autowire是Spring开发的,⽽@Resource是jdk开发的
@Autowire是按照类型type来注解的,⽽@Resource是按照名称来的,如果名称不到,那么就按照类型type
注意:@Resource 是先按照name来注⼊的,如果不到就按照类型注⼊,不过如果在controller使⽤的时候,指定了name的值,那么只能按照name来注⼊,如果不到name就会报错,如果想要实现先按照name,不到再按照type,就不要指定name的值。
8、如何解决 get 和 post 乱码问题?
解决 post 请求乱码:在 l ⾥边配置⼀个 CharacterEncodingFilter 过滤器并设置编码为 utf-8即可。
1、解决 post 请求乱码:
在 l ⾥边配置⼀个 CharacterEncodingFilter 过滤器并设置 编码为 utf-8即可。
2、解决 get 请求乱码:
1. 修改 tomcat 配置⽂件添加编码与⼯程编码⼀致。
2. 对参数进⾏重新编码
String userName = New Parameter(“userName”).getBytes(“ISO8859-1”), “utf-8”);
--ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。
9、Spring MVC ⽤什么对象从后台向前台传递数据的?
使⽤Map、Model 和 ModelMap 的⽅式,这种⽅式存储的数据是在request域中
@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";
}
使⽤request的⽅式
@RequestMapping("/getUser")
public String getUser(Map<String,Object> map,Model model,
ModelMap modelMap,HttpServletRequest request){
//放在request⾥
request.setAttribute("user", User());
return "userDetail";
}
使⽤ModelAndView
@RequestMapping("/getUser")
public ModelAndView getUser(ModelAndView modelAndView) {
mav.addObject("user", User());
mav.setViewName("userDetail");
return modelAndView;
}
10、怎么样把ModelMap⾥⾯的数据放⼊session⾥⾯?
在类上添加@SessionAttributes注解将指定的Model数据存储到session中。
@SessionAttributes
1. 默认情况下Spring MVC将模型中的数据存储到request域中。当⼀个请求结束后,数据就失效了。如果要跨页⾯使⽤。那么需要使⽤
到session。⽽@SessionAttributes注解就可以使得模型中的数据存储⼀份到session域中。
2. @SessionAttributes只能定义在Class,interface enum上,作⽤是将指定的Model中的键值对添加⾄session中,⽅便在⼀个会话
中使⽤。
@SessionAttributes参数
1. names:这是⼀个字符串数组。⾥⾯应写需要存储到session中数据的名称。
2. types:根据指定参数的类型,将模型中对应类型的参数存储到session中。
3. value:其实和上⾯的names是⼀样的。
@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域中。
11、与过滤器的区别?
的配置⼀般在的 SpringMVC 配置⽂件中,使⽤Interceptors标签,具体配置如下:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.scorpios.atcrowdfunding.web.LoginInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.scorpios.atcrowdfunding.web.AuthInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
(Interceptor):它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于⾯向切⾯编程(AOP)的⼀种运⽤,就是在service或者⼀个⽅法前,调⽤⼀个⽅法,或者在⽅法后,调⽤⼀个⽅法,⽐如动态代理就是的简单实现,在调⽤⽅法前打印出字符串(或者做其它业务逻辑的操作),也可以在调⽤⽅法后打印出字符串,甚⾄在抛出异常的时候做业务逻辑的操作。由于是基于web框架的调⽤,因此可以使⽤Spring的依赖注⼊(DI)进⾏⼀些业务操作,同时⼀个实例在⼀个controller⽣命周期之内可以多次调⽤。可以对静态资源的请求进⾏拦截处理。
过滤器(Filter):它依赖于servlet容器。它可以对⼏乎所有请求进⾏过滤,但是缺点是⼀个过滤器实例只能在容器初始化时调⽤⼀次。使⽤过滤器的⽬的,是⽤来做⼀些过滤操作,获取我们想要获取的数据,⽐如:在Javaweb中,对传⼊的request、response提前过滤掉⼀些信息,或者提前设置⼀些参数,然后再传⼊servlet或者Controller进⾏业务逻辑操作。通常⽤的场景是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的⼀些参数(XSSFilter(⾃定义过滤器)),如:过滤低俗⽂字、危险字符等。
12、动态代理的两种⽅式和区别?
JDK动态代理:利⽤反射机制⽣成⼀个实现代理接⼝的匿名类,在调⽤具体⽅法前调⽤InvokeHandler来处理。
CGlib动态代理:利⽤ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class⽂件加载进来,通过修改其字节码⽣成⼦类来处理。
区别:JDK代理只能对实现接⼝的类⽣成代理;CGlib是针对类实现代理,对指定的类⽣成⼀个⼦类,并覆盖其中的⽅法,这种通过继承类的实现⽅式,不能代理final修饰的类。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论