发表于: 2017-05-09 23:01:10
1 1326
Task2的第一天
今日计划
- 学习Spring MVC。
- 碎碎念:总算答辩完了,后续还有些杂事,毕个业真难。
Spring MVC处理请求的方式
请求到达的第一站是Spring的
DispatcherServlet
。Spring MVC的所有请求都会通过一个起前端控制器作用的Servlet(front controller Servlet)。这是个单实例的Servlet,它会把请求委托给应用程序的其他组件来执行处理。在Spring MVC中DispatcherServlet
就是这个前端控制器。DispatcherServlet
的任务就是把请求转发给MVC的控制器(Controller)。转发的目标是通过URL决定的。找到合适的控制器后,
DispatcherServlet
将请求传入,并等待控制器处理完成。(一个设计两个的控制器只会做很少的处理甚至不做处理,它会将业务逻辑委托给一个或多个Service对象进行处理。)控制器完成逻辑处理后,一般会产生一些信息,这些信息需要返回给客户端。这些信息被称为模型(Model)。Model一般不会直接返回给客户端,通常要进行格式化(渲染)。所以,Model会被发送给一个视图(View),这个视图通常会是JSP(不清楚JSON会不会也是JSP)。
所以,控制器做的最后一件事就是将模型数据打包,标出用于渲染输出的视图名。接下来,Controller会将Request连同Model和View的名字发送回
DispatcherServlet
。(这样,控制器就不会与特定的视图耦合,传递出去的视图名并不直接表示某个特定的JSP,这个名字将会用于查找真正的视图。)DispatcherServlet
将会使用视图解析器(ViewResolver)查找与视图名匹配的视图实现。DispatcherServlet
找到具体的视图实现后,将Model交付给View,视图会使用模型数据渲染输出,这个输出会通过响应对象传递给客户端。
请求的处理流程如下图,图中标号只是为了说明顺序。
关于处理器映射、控制器和视图解析器
关于处理器映射
BeanNameUrlHandlerMapping
:根据控制器Bean的名字将控制器映射到Url。
DefaultAnnotationHandlerMapping
:将请求映射给使用@RequestMapping
注解的控制器和控制器方法。
在Spring的配置中,如果没有找到处理器映射Bean,DispatcherServlet
将创建并使用BeanNameUrlHandlerMapping
和DefaultAnnotationHandlerMapping
。正是因为这个原因,才可以在不配置处理器映射的情况下,使用注解完成映射。
但是,在映射时我们还需要将请求参数绑定到控制器的方法参数上进行校验以及信息转换,所以,光使用DefaultAnnotationHandlerMapping
还不行。
所以应该在DispatcherServlet
的配置文件中添加<mvc :annotation-driven/>
。当然,我们使用注解就不能忘了在配置文件中配置<context : componentscan>
。
说说视图解析器
下面列举几个我感觉比较主要的:
BeanNamcViewResolver
:查找<bean>
的ID与逻辑视图名称相同View的实现。ContentNegotiatinqViewResolver
:委托给一个或多个视图解析器,根据请求内容类型选择合适的视图解析器。使用REST时,经常使用。InternalResourceviewResolver
:在Web应用程序的WAR包中查找视图模板,视图模板的路径根据加完前缀和后缀的逻辑视图名称来确定。使用JSP时经常使用。TilesviewResolver
:查找通过Tiles模板定义的视图,模板名字与逻辑视图名称相同。
Spring对REST的支持
Spring 3.0开始,Spring MVC对REST提供了良好的支持。
在4.0版本中,支持以下方式创建REST资源:
- 控制器可以处理所以HTTP方法,包含四个主要的方法:GET、PUT、DELETE、POST。Spring3.2以上版本还支持PATCH方法。
- 使用@PathVariable注解,控制器能够处理参数化的URL
- 借助Spring的视图和视图解析器,资源能够以多种方式进行表述,能将模型数据渲染为XML、JSON、Atom、RSS的View实现。
- 可以使用ContentNegotiatingViewResolver(内容协商 视图解析器)来选择合适的客户端的表述方式(数据渲染格式)。
- 使用@ResponseBody注解和各种HttpMethodConverter(转换器)实现,能够替换基于视图的渲染方式。
- 使用@RequestBody注解及HttpMethodConverter实现,可以将传入的HTTP数据转化为 传入控制器处理方法的Java对象。(斜体不理解,猜测是处理方法的参数,通过转换器能够将HTTP数据,按照一定规则填充进这个参数对象)
- 使用RestTemplate,Spring应用能够方便地使用REST资源。
总结:
- Spring对REST的支持,首先完成了对GET、POST之外的HTTP方法的支持。(原来的不支持其他方法,即使可以进入相应的处理函数,也无法获得参数)。
- 对路径变量的支持。
- 添加了对模型数据渲染方式的选择。(猜测:可以通过判断请求头部的Accept,或者url的后缀名,来确定渲染的方式)
- 添加了转换器,目前不太清楚具体作用。
- 使用RestTemplate,目的暂时也不太清楚。
今日完成
新建工程
- 1. 新建
Maven
工程,archetype
选择org.apache.maven.archetypes:maven-archetype-webapp
。 2. 修改Junit依赖版本
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--<scope>test</scope>-->
</dependency>3. 初始化Git,建议使用外部Git。在工程目录下
git init
。4. 添加
.gitignore
,忽略无关或者敏感文件。配置如下:#git ignore config
.gitignore
#IDEA配置
.idea/
*.iml
#生成的目标文件
target/
#生成的日志
logs/
#忽略敏感信息
jdbc.properties5. 使用
git status
查看当前版本状态,使用git add
添加为加入版本控制的文件。使用git commit -am "描述"
完成第一次提交。6. 推送到github
git remote add origin git@github.com:HsiangCheng/jnshu_task2.git
git push -u origin master7. 把之前工程的文件有选择的复制过来
明日计划
继续学习Spring MVC,搞清楚Spring MVC REST,还有搞清楚JsonTagLib在工程里的定位。
问题总结
今天主要是看书,总结,理清Spring MVC,Spring MVC如何实现REST,JsonTagLib在Spring MVC RESTful中的定位。Spring MVC和REST渐渐清楚了,JsonTagLib的定位还不清晰。
总之,还在学习中,问题暂无。
评论