《跟开涛学SpringMVC》学习笔记

一 背景:
    原来用spring那会,还是低版本没有注解,配置一堆bean。后来一直没怎么用过,也就疏忽了,现在整理项目的时候,给前端app提供rest接口,就是用springMVC实现的,接触整理下有关知识点。开涛大神的blog原文地址如下:
http://jinnianshilongnian.iteye.com/blog/1752171
他在写blog的时候比较早,一些新版本特性还没用,我自己开发也是用的老版本3.2.
  第1章:springMVC背景:之前笔记也整理过servlet,用来做web开发容易业务跟展示混在一起。
二 springmvc框架结构介绍:
《跟开涛学SpringMVC》学习笔记_第1张图片

在此我们可以看出具体的核心开发步骤:

1、  DispatcherServlet在web.xml中的部署描述,从而拦截请求到Spring Web MVC

2、  HandlerMapping的配置,从而将请求映射到处理器

3、  HandlerAdapter的配置,从而支持多种类型的处理器

4、  ViewResolver的配置,从而将逻辑视图名解析为具体视图技术

5、处理器(页面控制器)的配置,从而进行功能处理

*****************************************************************************************

 SpringMVC入口Servlet -> DispatcherServlet:

3.1 DispatcherServlet作用

DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。 具体请参考上图。 上我们可以看出DispatcherServlet主要负责流程的控制(而且在流程中的每个关键点都是很容易扩展的)

3.2 DispatcherServlet配置

实际在3.2版本开发过程中,结合maven。新建maven的web工程,对应的pom.xml配置依赖的包。

修改web.xml,配置。根据业务需求主要有几个要配置:

context-param 配置上下文,配置web环境通用配置文件(spring有关的配置文件可以在这里面单独配置)

listener,filter,DispatcherServlet对应的参数:contextConfigLocation

至此,大概前三章的内容就差不多了,当然作者还从源码讲解DispatcherServlet的父类FrameworkServlet以及FrameworkServlet的父类HttpServletBean的作用

四controller

4.1 controller接口

其实从DispatcherServlet到controller还有一些细节,就是DispatcherServlet通过handlerMapping获得HandlerExecutionChain那些。DispatcherServlet doService()--->doDispatch()--->handlerAdapter的handle()方法。该方法调用controller接口。

第四章就是介绍Controller接口

public interface Controller {
       ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
这是控制器接口,此处只有一个方法handleRequest,用于进行请求的功能处理,处理完请求后返回ModelAndView(Model模型数据部分 和 View视图部分)给DispatcherServlet去渲染renderController接口的抽象实现类为:AbstractController,它的handleRequest包含handleRequestInternal()为抽象方法,它的直接子类有:AbstractUrlViewControllerMultiActionControllerParameterizableViewControllerServletForwardingControllerServletWrappingController
 其实这块开涛大神讲的比较多,看多就晕了实际开发中不实用,应该就是第6章的注解方式。
4.2controller注解配置相关
其中controller相关注解

@Controller:用于标识是处理器类;

@RequestMapping:请求到处理器功能方法的映射规则;

其中:请求方法有RequestMethod.GET, RequestMethod.POST

@RequestParam(将请求参数绑定到方法参数) 

  1. @RequestMapping("/test2")  
  2.   public String test2(@RequestParam("userId"int id){。。。}

 @PathVariable(将 url template 里的参数绑定到方法参数) 

  1.  * @PathVariable 和 @RequestParam 的区别在于: 
  2.    *   @PathVariable 的 url:/my//user/zhangsan/18 
  3.    *   @RequestParam 的 url:/my//user?nickname=zhangsan&age=18 
  4.    */  
  5.   @RequestMapping("/user/{nickname}/{age}");  
  6.   public String getUserInfo(@PathVariable("nickname") String name, @PathVariable int age) {...}  

请求阶段:客户端是生产者【生产Content-Type媒体类型的请求内容区数据】,服务器是消费者【消费客户端生产的Content-Type媒体类型的请求内容区数据】;

响应阶段:服务器是生产者【生产客户端请求头参数Accept指定的响应体数据】,客户端是消费者【消费服务器根据Accept请求头生产的响应体数据】。

@RequestBody(将请求正文绑定到方法参数) 

将 HTTP 请求正文插入方法中,使用适合的HttpMessageConverter将请求体写入某个对象。

  1. * 正如上所述,HttpMessageConverter 用于从请求正文绑定到对象和把对象序列化成 String 予客户端响应。 
  2.   * @RequestBody,那这部分我们只讲   converting from the HTTP request message to an object。 
  3.    *  
  4.    * 在定义 HttpMessageConverters 时,我们可以为其指定 supportedMediaTypes。 
  5.    * 如果所有的 HttpMessageConverters 中定义的 supportedMediaTypes 均不能匹配上 Content-Type 请 
  6.    * 求头中的类型,那么就会收到 415 Unsupported Media Type 响应。 
  7.    */  
  8.   @RequestMapping("/user/body");  
  9.   public String getBody(@RequestBody String body) {    
  10.     // 这里的 body 的内容就是 hello  
  11.     System.out.println(body);  
  12.     return null;  
  13.   }  

@ResponseBody(将处理完请求后返回的对象绑定到响应正文) 

将内容或对象作为 HTTP 响应正文返回,使用  @ResponseBody将会跳过视图处理部分  ,而是调用合适HttpMessageConverter,将返回值写入输出流。
  1. @RequestMapping("/user")  
  2.   public @ResponseBody User getUser() {  
  3.     return new User(18"Jack""计算机");  
  4.   }  

● @SessionAttributes 

  1. @SessionAttributes 和 @ModelAttribute 类似,只不过 @SessionAttributes 是将数据存放于 session  
  2.  * 中或从 session 中取数据。 


 引用的服务使用@Autowired

还有一些数据绑定的注解

实际开发配置:

<mvc:annotation-driven />
相当于注册了DefaultAnnotationHandlerMap ping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。即解决了@Con troller注解的使用前提配置。
<context:annotation-config />
隐式地向Spring容器中注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 及 equiredAnnotationBeanPostProcessor 这 4 个 BeanPostProcessor。
在配置文件中使用<context:annotationconfig/>之前,必须在 <beans> 元素中声明 context 命名空间
主要是为了方便使用常用的注解的方式 例如:@Autowired
<context:component-scan base-package="cn.javass.chapter6" />
配置项不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能,同时还启用了注释驱动自动注入的功能。非必须项,主要是为了简化配置。 默认扫描的注解类型是 @Component,不过,在 @Component 语义基础上细化后的 @Repository, @Service 和 @Controller 

  1. <!--Spring3.1开始的注解 HandlerMapping -->  
  2. <bean   
  3. class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>  
  4. <!--Spring3.1开始的注解 HandlerAdapter -->  
  5. <bean  
  6. class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> 

按理说有了开始的注解,能找到对应的controller,可以不配置上面这两条,但是为了避免不必要的错误,还是老实配置上吧。

上面是介绍常用的基本配置,当然如果需要配置数据源,一般是引入properties,配置文件配置
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">及对应参数
结合项目的实际情况:
使用ResponseBody根据head的Accept不同对同一地址请求分别来呈现一个实体的json与xml结果

<property name="messageConverters">

<list>

<ref bean="stringHttpMessageConverter" />

<ref bean="jsonHttpMessageConverter" />

<ref bean="marshallingHttpMessageConverter" />

</list>

</property>

</bean>

<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter" />

<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />

<bean id="marshallingHttpMessageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">

<constructor-arg ref="jaxbMarshaller" />

<property name="supportedMediaTypes" value="application/xml"></property>

</bean>



****************************总结***********************
关于springMVC功能较多, 作为开发来讲:熟悉spring背后的框架流程,实际开发中尤其是熟悉注解的参数,跟其它系统扩展比如:mybatis,dubbo等,编写业务代码有关。当然能去深入研究源码,学习其中的设计思路,是另外更高的层次。


你可能感兴趣的:(《跟开涛学SpringMVC》学习笔记)