一 背景:

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

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

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去渲染render。Controller接口的抽象实现类为:AbstractController,它的handleRequest包含handleRequestInternal()为抽象方法,它的直接子类有:AbstractUrlViewController, MultiActionController, ParameterizableViewController, ServletForwardingController, ServletWrappingController

其实这块开涛大神讲的比较多,看多就晕了实际开发中不实用,应该就是第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 />
相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。即解决了@Controller注解的使用前提配置。

<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》学习笔记相关推荐

  1. 第二行代码学习笔记——第六章:数据储存全方案——详解持久化技术

    本章要点 任何一个应用程序,总是不停的和数据打交道. 瞬时数据:指储存在内存当中,有可能因为程序关闭或其他原因导致内存被回收而丢失的数据. 数据持久化技术,为了解决关键性数据的丢失. 6.1 持久化技 ...

  2. 第一行代码学习笔记第二章——探究活动

    知识点目录 2.1 活动是什么 2.2 活动的基本用法 2.2.1 手动创建活动 2.2.2 创建和加载布局 2.2.3 在AndroidManifest文件中注册 2.2.4 在活动中使用Toast ...

  3. 第一行代码学习笔记第八章——运用手机多媒体

    知识点目录 8.1 将程序运行到手机上 8.2 使用通知 * 8.2.1 通知的基本使用 * 8.2.2 通知的进阶技巧 * 8.2.3 通知的高级功能 8.3 调用摄像头和相册 * 8.3.1 调用 ...

  4. 第一行代码学习笔记第六章——详解持久化技术

    知识点目录 6.1 持久化技术简介 6.2 文件存储 * 6.2.1 将数据存储到文件中 * 6.2.2 从文件中读取数据 6.3 SharedPreferences存储 * 6.3.1 将数据存储到 ...

  5. 第一行代码学习笔记第三章——UI开发的点点滴滴

    知识点目录 3.1 如何编写程序界面 3.2 常用控件的使用方法 * 3.2.1 TextView * 3.2.2 Button * 3.2.3 EditText * 3.2.4 ImageView ...

  6. 第一行代码学习笔记第十章——探究服务

    知识点目录 10.1 服务是什么 10.2 Android多线程编程 * 10.2.1 线程的基本用法 * 10.2.2 在子线程中更新UI * 10.2.3 解析异步消息处理机制 * 10.2.4 ...

  7. 第一行代码学习笔记第七章——探究内容提供器

    知识点目录 7.1 内容提供器简介 7.2 运行权限 * 7.2.1 Android权限机制详解 * 7.2.2 在程序运行时申请权限 7.3 访问其他程序中的数据 * 7.3.1 ContentRe ...

  8. 第一行代码学习笔记第五章——详解广播机制

    知识点目录 5.1 广播机制 5.2 接收系统广播 * 5.2.1 动态注册监听网络变化 * 5.2.2 静态注册实现开机广播 5.3 发送自定义广播 * 5.3.1 发送标准广播 * 5.3.2 发 ...

  9. 第一行代码学习笔记第九章——使用网络技术

    知识点目录 9.1 WebView的用法 9.2 使用HTTP协议访问网络 * 9.2.1 使用HttpURLConnection * 9.2.2 使用OkHttp 9.3 解析XML格式数据 * 9 ...

  10. 安卓教程----第一行代码学习笔记

    安卓概述 系统架构 Linux内核层,还包括各种底层驱动,如相机驱动.电源驱动等 系统运行库层,包含一些c/c++的库,如浏览器内核webkit.SQLlite.3D绘图openGL.用于java运行 ...

最新文章

  1. 为 UITextField 增加键盘偏移的模板化写法
  2. 图片上两点之间的距离和两组图片之间的差异的关系
  3. source, ~/.bashrc, ~/.bash_profile详解
  4. Delphi - SEH研究
  5. objective-c 逐帧动画
  6. QT5 动态链接库的创建和使用
  7. mysql11导入数据_MySQL专题11之MySQL导出数据、MySQL导入数据
  8. java操作sql数据库_java-JDBC连接数据库并进行SQL操作
  9. 手把手教你玩转网络编程模型之完成例程(Completion Routine)篇(下)-转
  10. Linux 实现人脸识别
  11. 计算机应用基础考试质量分析,基于SPSS软件的试卷分析与应用
  12. Echarts Map地图下钻至县级
  13. XSS Filter Evasion Cheat Sheet 中文版
  14. 怎么用计算机画外观设计图片,以实例教你如何绘制外观设计专利3D线条图
  15. matlab的containers.Map类型介绍
  16. Python爬取页游火线精英全区挑战排行榜
  17. 最好的我们 经典语录
  18. Python中list、tupe、dic、set的使用小记
  19. 从苏宁电器到卡巴斯基(第二部)第03篇:我在卡巴的日子 III
  20. Parallel Algorithm

热门文章

  1. 电子设计教程30:温度滞回控制系统
  2. [北航软工教学] 教学计划大纲
  3. web前端面试中常问的问题
  4. 对路径“C:\Inetpub\wwwroot\UploadFile\AssertTemple1.xls”的访问被拒绝。
  5. 云端服务器部署前端工程
  6. vue表单校验,根据某选项追加或去掉校验
  7. Java实现 LeetCode 37 解数独
  8. IEEEE trans模板中怎么使用algorithm2e
  9. oracle12c 环境需求,Oracle12C之环境准备工作
  10. Java 方法重写与重载的区别 示例 重载多数相加求和 重写toString()和equals()