- spring 将请求在调度 servlet,处理器映射,控制器及视图解析器之间移动
- 请求由 DispatcherServlet 分配给 Controller(根据处理器映射来确定),控制器处理后分发给一个视图
- spring mvc 所有请求都会通过一个前段控制器 servlet(DispatcherServlet)
- 处理器映射会根据请求所携带的 url 信息来进行决策
- 良好的控制器本身只处理很少甚至不处理工作,而是将业务委托个一个或多个对象
- 控制器完成逻辑处理,通常会产生一些信息(返回的数据),并在浏览器上显示,这些信息被称为模型
- 控制器最后要做的是模型数据打包,并且标识出用于渲染输出的视图名城,接下来将请求,模型,视图发送会 DispatcherServlet
- <servlet-name>restful</servlet-name> ----> 会默认尝试从 restful-servlet.xml 的文件中加载应用上下文
- 声明 DispatcherServlet 处理哪些 url,可使用 *.htm,/*,/app, 书里推荐使用只使用 /,即 <url-pattern>/</url-pattern>,会默认处理所有的请求,包括静态资源的请求
- 可以使用 <mvc:resources mapping="/resources/**" location="/resources/" /> 来处理静态资源,静态资源处理器
- 配置注解驱动的控制器 Controller
- spring mvc 注解驱动特性:mvc:annotation-driven/
- @Controller 声明为控制器,可被 <context:component-scan base-package="XXX"> 查找到并注册为 Bean
- @Inject 注入对象,jsr330 规定,常与 @Named 一起使用,@Autowired,spring 提供的注解,包含 required 属性,当设置为 false 时,没有找到 bean,系统不会报错,@Autowired 与 @Inject 可互换;@Resource,jsr250 规定,一般会指定 name 属性
- @RequestMapping 两个作用:一是表明这个方法是一个请求处理方法(方法中定义参数作为控制器和视图之间传递的数据模型),即处理某个路径的请求;二是返回一个 String 类型值指定渲染的视图
- 注意使用 Mockito 提供的 mock 进行测试
- 视图技术:JSP,Velocity,或 FreeMarker
- 使用 InternalResourceViewResolver 作为视图解析器(spring 便有 12 种,这只是其中之一),如下配置了一个 bean,它本身是一个视图解析器,内部同时根据具体内容委托给不同的视图解析器
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="html" value="text/html"/>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
//如果jsp使用了jstl标签,需配置以下viewClass,使用jstl的国际化支持
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
//截取前缀和后缀,使页面命名的名字匹配@RequestMapping所返回的值,使之一致
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="prefixJson" value="true"/>
</bean>
</list>
</property>
</bean>
- Apache Tiles 页面布局模板框架,通过 views.xml 定义通用的布局和 home tile
- 如果方法上 @RequestMapping 注解没有绑定路径,默认处理类上 @RequestMapping 路径下请求,注意是 post 还是 get 请求
- @Valid 注解校验表单数据的传递,防止不合法的数据通过表单进行提交,是 javaBean 校验规范一部分
- @PathVariable String username,请求路径 “/{username}”,请求路径中的该位置的值将作为 username 的值传递进去
- @Pattern 注解可以定义 regexp 属性指定要匹配的正则表达式
- spring 注册 multipart 解析器
Appendix: spring in action 3