SpringMVC常见面试题

SpringMVC常见面试题

1.什么是SpringMVC?简单介绍下你对SpringMVC的理解

SpringMVC是一个基于Java实现的MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

2.SpringMVC核心组件

  1. 前端控制器DispatcherServlet

作用:接收请求、相应结果,相当于转发器,有了DIspatcherServlet就减少了其他组件之间的耦合度。

  1. 处理器映射器HandlerMapping

作用:根据请求的URL来查找Handler

  1. 处理器适配器HandlerAdapter
  2. 处理器Handler
  3. 视图解析器

进行视图解析,根据视图逻辑名解析成真正的视图

  1. view

View是一个接口,他的实现类支持不同的视图类型

3.什么是DispatcherServlet

Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的Http请求和相应。

4.SpringMVC的工作原理

请描述SpringMVC的工作流程?描述一下DispatcherServlet的工作流程?

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handler。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象以及处理器拦截器,一并返回给DispatcherServlet。
  4. DispatcherServlet调用HandlerAdapter处理器适配器;
  5. HandlerAdapter经过适配调用具体处理器(Handler,也叫做后端处理器);
  6. Handler执行完成返回ModelAndView;
  7. HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
  8. DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
  9. ViewResolver解析后返回具体View
  10. DispatcherServlet对View进行渲染视图
  11. DispatcherServlet相应用户。

5.MVC框架,MVC是什么,MVC设计模式的好处有哪些

mvc是一种设计模式。模型,视图,控制器,三层架构的设计模式,用于实现前端页面的展现和后端业务数据处理的分离

mvc设计模式的好处

  1. 分层设计,实现了业务系统各个组件之间的解耦,有利于业务系统的可扩展性,可维护性
  2. 有利于系统的并行开发,提升开发效率。

6.SpringMVC怎么设定重定向和请求转发

重定向与请求转发的区别:

  1. 请求转发在服务器端完成的;重定向是在客户端完成的。
  2. 请求转发的速度快,重定向速度慢。
  3. 请求转发的是同一次请求;重定向是两次不同的请求。
  4. 请求转发不会执行转发后的代码,重定向会执行重定向之后的代码。
  5. 请求转发地址栏没有变化;重定向地址栏有变化
  6. 请求转发必须是在同一台服务器下完成,重定向可以在不同的服务器下完成

7.当一个方法向AJAX返回特殊对象,例如Object,List等,需要做什么处理?

  1. 在方法上加@ResponseBody注解,表示该方法的返回值不管是什么类型,都会返回JSON格式的数据。
  2. 把原来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的控制器是不是单例模式,如果是,有什么问题,怎么解决

  1. Controller是单例模式,在多线程访问的时候可能产生线程安全问题,不要使用同步,会影响程序性能。
  2. 解决方案是在控制器里面不能编写成员属性。

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个属性

  1. value:指定请求的实际地址
  2. method:指定请求的method类型,GET,POST,PUT,DELETE等。
  3. consumes:指定处理请求的提交内容类型(Content-Type),例如application/json,text/html
  4. produces:指定返回的内容类型,仅当request请求头中的Accept类型中包含该指定类型才返回
  5. params:指定request中必须包含某些参数值,才让该方法处理。
  6. headers:指定request中必须包含某些指定的header值,才能让方法处理请求。

@ResponseBody

@ResponseBody把Java对象转化为json对象,这种方式用于Ajax异步请求,返回的不是一个页面而是JSON格式的数据。

@PathVariable

  1. @PathVariable用于接收uri地址传过来的参数,Url中可以通过一个或多个占位符映射,通过@PathVariable可以绑定占位符参数到方法参数中,在RestFul接口风格中经常使用。
  2. 例如:请求URL:http://localhost/user/21/张三/query
@RequestMapping("/user/{userId}/{userName}/query")
public User query(@PathVariable("userId") Long userId, @PathVariable("userName") String userName){
}

@RequestParam

@RequestParam用于将请求参数映射到控制器方法的形参,有如下三个属性

  1. value:参数名。
  2. required:是否必须,默认为true,表示请求参数中必须包含该参数,如果不包含排除异常。
  3. 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

  1. 默认情况下SpringMVC将模型中的数据存储到request域中,当一个请求结束后,数据就失效了,如果要跨页面使用,那么需要使用session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中。

@SessionAttributes参数

  1. names:这是一个字符串数组,里面应写需要存储到session中数据的名称。
  2. 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

  1. 使用ModelAndView类存储处理完后的结果数据,以及显式该数据的视图。从名字上看ModelAndView中的Model代表模型,View代表视图,从名字看就很好的解释了该类的作用。Controller处理器调用模型层处理完用户请求后,把结果数据存储在该类的model属性中,把要返回的视图信息存储在该类的view属性中,然后把ModelAndView返回给前端控制器,前端控制器通过调用配置文件中定义的视图解析器,对该对象进行解析,最后把结果数据显示在指定页面上。
  2. 返回指定页面
  3. 返回所需数值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值