Java面试--Spring技术要点--Spring MVC

来源:互联网 发布:淘宝退货时间规定 编辑:程序博客网 时间:2024/05/21 04:25

41  Spring MVC原理

 

Spring工作流程描述

1、用户向服务器发送请求,请求被Spring前端控制DispatcherServlet捕获;

2、DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;

3、DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)

4、提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。

数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。

数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。

数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。

5、Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象;

6、根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet;

7、ViewResolver结合Model和View,来渲染视图。

8、将渲染结果返回给客户端。

http://blog.csdn.net/xtu_xiaoxin/article/details/8796499

42  Spring MVC的DispatcherServlet

Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:

1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;

2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);

3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);

4、通过ViewResolver解析逻辑视图名到具体视图实现;

5、本地化解析

6、渲染具体的视图等;

7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

http://jinnianshilongnian.iteye.com/blog/1602617

http://blog.csdn.net/hzzhoushaoyu/article/details/6853730

43  Spring MVC WebApplicationContext

WebApplicationContext继承了ApplicationContext并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext,因为它能处理主题,并找到被关联的servlet。

44  Spring中DispatcherServlet、WebApplicationContext、ServletContext之间的关系

1、首先,对于一个Web应用来说,Web容器提供一个全局的上下文环境(servletContext),为后面的SpringIOC容器作为宿主环境。

2、然后,在web.xml中会有提供ContextLoaderListener。在web容器启动的过程当中,会监听到servletContext的变化,其contextInitialized方法会被调用。在这个方法中,Spring会启动一个跟上下文(WebApplicationContext/XmlWebApplicationContext)。这个就是SpringIOC容器,对应的Bean定义的配置由web.xml中的context-param标签指定。在这个IoC容器初始化完毕后,spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,将其存储到ServletContext中,便于获取;

3、最后,contextLoaderListener监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这个servlet可以配置多个,以最常见的DispatcherServlet为例,这个servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个servlet请求。DispatcherServlet上下文在初始化的时候会建立自己的IoC上下文,用以持有springmvc相关的bean。在建立DispatcherServlet自己的IoC上下文时,会利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先从ServletContext中获取之前的根上下文(即WebApplicationContext)作为自己上下文的parent上下文。有了这个parent上下文之后,再初始化自己持有的上下文。这个DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,大概的工作就是初始化处理器映射、视图解析等。这个servlet自己持有的上下文默认实现类也是XmlWebApplicationContext。初始化完毕后,spring以与servlet的名字相关(此处不是简单的以servlet名为Key,而是通过一些转换,具体可自行查看源码)的属性为属性Key,也将其存到ServletContext中,以便后续使用。这样每个servlet就持有自己的上下文,即拥有自己独立的bean空间,同时各个servlet共享相同的bean,即根上下文(第2步中初始化的上下文)定义的那些bean。

http://segmentfault.com/q/1010000000210417

45  Spring MVC的注解

  @Controller:该注解表明该类扮演控制器的角色,Spring不需要你继承任何其他控制器基类或引用ServletAPI。

  @RequestMapping:该注解是用来映射一个URL到一个类或一个特定的方处理法上。

  @RequestParam:绑定HttpServletRequest请求参数到控制器方法参数。(默认在方法入参中按参数名绑定

  @RequestHeader:注解绑定HttpServletRequest头信息到Controller方法参数。

  @CookieValue:绑定cookie的值到Controller方法参数。

http://haohaoxuexi.iteye.com/blog/1753271

46  @RequestMapping注解支持的方法参数和返回类型

  支持的方法参数类型

(1)HttpServlet对象,主要包括HttpServletRequest、HttpServletResponse和HttpSession对象。这些参数Spring在调用处理器方法的时候会自动给它们赋值,所以当在处理器方法中需要使用到这些对象的时候,可以直接在方法上给定一个方法参数的申明,然后在方法体里面直接用就可以了。但是有一点需要注意的是在使用HttpSession对象的时候,如果此时HttpSession对象还没有建立起来的话就会有问题。

(2)Spring自己的WebRequest对象。使用该对象可以访问到存放在HttpServletRequest和HttpSession中的属性值。

(3)InputStreamOutputStreamReaderWriter。InputStream和Reader是针对HttpServletRequest 而言的,可以从里面取数据;OutputStream和Writer 是针对HttpServletResponse而言的,可以往里面写数据。

(4)使用@PathVariable@RequestParam@CookieValue@RequestHeader标记的参数。

(5)使用@ModelAttribute标记的参数。

(6)java.util.MapSpring封装的ModelModelMap。这些都可以用来封装模型数据,用来给视图做展示。

(7)实体类。可以用来接收上传的参数。

(8)Spring封装的MultipartFile用来接收上传文件的。

(9)Spring封装的ErrorsBindingResult对象。这两个对象参数必须紧接在需要验证的实体对象参数之后,它里面包含了实体对象的验证结果。

  支持的返回类型

(1)一个包含模型和视图的ModelAndView对象。

(2)一个模型对象,这主要包括Spring封装好的ModelModelMap,以及java.util.Map,当没有视图返回的时候视图名称将由RequestToViewNameTranslator来决定。

(3)一个View对象。这个时候如果在渲染视图的过程中模型的话就可以给处理器方法定义一个模型参数,然后在方法体里面往模型中添加值。

(4)一个String字符串。这往往代表的是一个视图名称。这个时候如果需要在渲染视图的过程中需要模型的话就可以给处理器方法一个模型参数,然后在方法体里面往模型中添加值就可以了。

(5)返回值是void这种情况一般是我们直接把返回结果写到HttpServletResponse中了,如果没有写的话,那么Spring将会利用RequestToViewNameTranslator来返回一个对应的视图名称。如果视图中需要模型的话,处理方法与返回字符串的情况相同。

(6)如果处理器方法被注解@ResponseBody标记的话,那么处理器方法的任何返回类型都会通过HttpMessageConverters转换之后写到HttpServletResponse中,而不会像上面的那些情况一样当做视图或者模型来处理。

(7)除以上几种情况之外的其他任何返回类型都会被当做模型中的一个属性来处理,而返回的视图还是由RequestToViewNameTranslator来决定,添加到模型中的属性名称可以在该方法上用@ModelAttribute(“attributeName”)来定义,否则将使用返回类型的类名称的首字母小写形式来表示。使用@ModelAttribute标记的方法会在@RequestMapping 标记的方法执行之前执行。

47  @ModelAttribute和@SessionAttributes传递和保存数据

SpringMVC支持使用@ModelAttribute和@SessionAttributes在不同的模型和控制器之间共享数据。

  @ModelAttribute:一种是标注在方法上,另一种是标注在Controller方法参数上

当@ModelAttribute标记单独使用时,被标注的方法将在处理器方法执行之前执行,然后把返回的对象存放在模型属性中,传给标注在方法入参上的变量。

  @SessionAttributes用于标记需要在Session中使用到的数据,包括从Session中取数据和存数据。@SessionAttributes一般是标记在Controller类上的,可以通过名称、类型或者名称加类型的形式来指定哪些属性是需要存放在session中的。

当使用@SessionAttributes时,如没有@ModelAttribute标注的方法,则去session中寻找。当controller类中的方法的变量,能匹配到@SessionAttributes中的名称或类型时,在方法返回后会将变量存放在Session中。

http://haohaoxuexi.iteye.com/blog/1753271

http://blog.csdn.net/xuke6677/article/details/9769899

48  Spring MVC 自定义数据类型转换

Spring 3.0以后,可以继承org.springframework.core.convert.converter接口,实现对应的转换器,然后,

1、通过XMLSchema注册到ConversionService。

2、通过ConfigurableWebBindingInitializer注册ConversionService。

3、注册ConfigurableWebBindingInitializer到RequestMappingHandlerAdapter。

http://sishuok.com/forum/blogPost/list/6989.html

1 0
原创粉丝点击