spring mvc----第四章:Controller

Controller主要负责功能处理:
1、收集、验证请求参数并绑定到命令对象;
2、将命令对象交给业务对象,由业务对象处理并返回模型数据;
3、返回 ModelAndView(Model 部分是业务对象返回的模型数据,视图部分为逻辑视图名)。

DispatcherServlet负责控制流程的调度:
1、负责将请求委托给控制器进行处理;
2、根据控制器返回的逻辑视图名选择具体的视图进行渲染(并把模型数据传入)。

Controller接口:
package org.springframework.web.servlet.mvc; public interface Controller {  ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception; }

WebContentGenerator:
用于提供如浏览器缓存控制、是否必须有 session 开启、支持的请求方法类型(GET、POST 等)。
该 抽 象 类 默 认 被 AbstractController 和 WebContentInterceptor 继承

AbstractController:
该抽象类实现了 Controller,并继承了 WebContentGenerator
boolean synchronizeOnSession = false:表示该控制器是否在执行时同步 session,从而保证该会话的用户串行访问该控 制器
boolean synchronizeOnSession = false:表示该控制器是否在执行时同步 session,从而保证该会话的用户串行访问该控 制器

<!— 在chapter4-servlet.xml配置处理器 --> <bean name="/helloWithPOST" class="cn.javass.chapter4.web.controller.HelloWorldController">        <property name="supportedMethods" value="POST"></property> </bean>



1、对于一般的页面跳转(如超链接点击跳转、通过 js 调用 window.open 打开新页面都是会使用浏览器缓存的,在 未过期情况下会直接使用浏览器缓存的副本,在未过期情况下一次请求也不发送);    
2、对于刷新页面(如按 F5 键刷新),会再次发送一次请求到服务器的;

客户端缓存控制:
1、 缓存 5 秒,cacheSeconds=5
2、 不缓存,cacheSeconds=0
3、cacheSeconds<0,将不添加任何数据
4、Last-Modified 缓存机制
Spring 判断是否过期,通过如下代码,即请求的“If-Modified-Since” 大于等于当前的 getLastModified 方法的时间 戳,则认为没有修改: this.notModified = (ifModifiedSince >= (lastModifiedTimestamp / 1000 * 1000));



ServletForwardingController:
org.springframework.web.servlet.mvc.ServletForwardingController将请求转给servlet


BaseCommandController:
命令控制器通用基类。
1、数据绑定:请求参数绑定到一个 command object(命令对象,非 GoF 里的命令设计模式), 这 里的命令对象是指绑 定请求参数的任何 POJO 对象;    commandClass:表示命令对象实现类,如 UserModel;    commandName:表示放入请求的命令对象名字(默认 command),request.setAttribute(commandName, commandObject); 
2、验证功能:提供 Validator 注册功能,注册的验证器会验证命令对象属性数据是否合法;    validators:通过该属性注入验证器,验证器用来验证命令对象属性是否合法;
该抽象类没有没有提供流程功能,只是提供了一些公共的功能,实际使用时需要使用它的子类。

AbstractCommandController:
命令控制器之一,可以实现该控制器来创建命令控制器,该控制器能把自动封装请求参数到一个命令对象,而且提供 了验证功能。


AbstractFormController:
用于支持带步骤的表单提交的命令控制器基类,使用该控制器可以完成:
1、定义表单处理(表单的渲染), 并 从 控制器获取命令对象构建表单;
2、提交表单处理,当用户提交表单内容后,AbstractFormController 可以将用户请求的数据绑定到命令对象,并可以验 证表单内容、对命令对象进行处理。
bindOnNewForm:是否在进行表单展示时绑定请求参数到表单对象,默认 false,不绑定;     sessionForm:session 表单模式,如果开启(true)则会将表单对象放置到 session 中,从而可以跨越多次请求保证 数据不丢失(多步骤表单常使用该方式,详解 AbstractWizardFormController), 默 认 false; 
    Object formBackingObject(HttpServletRequest request) :提供给表单展示时使用的表单对象(form object 表单要 展示的默认数据), 默 认通过 commandName 暴露到请求给展示表单;     Map referenceData(HttpServletRequest request, Object command, Errors errors):展示表单时需要的一些引用数 据(比如用户注册,可能需要选择工作地点,这些数据可以通过该方法提供)



SimpleFormController:
1、准备要展示的数据,并到表单展示页面;
2、提交数据数据进行处理
setCommandClass 和 setCommandName:分别设置了命令对象的实现类和名字; formBackingObject 和 referenceData:提供了表单展示需要的视图; doSubmitAction:用于执行表单提交动作,由 onSubmit 方法调用,如果不需要请求/响应对象或进行数据验证,可以直 接使用 doSubmitAction 方法进行功能处理


CancellableFormController:
一个可取消的表单控制器,继承 SimpleFormController,额外提供取消表单功能。 
1、表单展示:和 SimpleFormController 一样;
2、表单取消:和 SimpleFormController 一样;
3、表单成功提交:取消功能处理方法为:onCancel(Object command),而且默认返回 cancelView 属性指定的逻辑视图 名。
那如何判断是取消呢?如果请求中有参数名为“_cancel”的参数,则表示表单取消。也可以通过 cancelParamKey 来修改参数名(如“_cancel.x”等)
onCancel:在该功能方法内实现取消逻辑,父类的 onCancel 方法默认返回 cancelView 属性指定的逻辑视图名


AbstractWizardFormController:
多步表单支持类
page 页码:是根据请求中以“_target”开头的参数名来确定的,如“_target0”,则页码为 0; referenceData:提供每一页需要的表单支持对象,如完善学校信息需要学校类型,page 页码从 0 开始(而且根据请求 参数中以“_target”开头的参数来确定当前页码,如_target1,则 page=1) ; validatePage:验证当前页的命令对象数据,验证应根据 page 页码来分步骤验证; postProcessPage:验证成功后的后处理; processFinish:成功时执行的方法,此处直接重定向到/success 控制器(详见 CancelController); processCancel:取消时执行的方法,此处直接重定向到/cancel 控制器(详见 SuccessController); 
其他需要了解: allowDirtyBack和 allowDirtyForward:决定在当前页面验证失败时,是否允许向导前移和后退,默认 false 不允许; onBindAndValidate(HttpServletRequest request, Object command, BindException errors, int page):允许覆盖默认的绑 定参数到命令对象和验证流程。



ParameterizableViewController:
参数化视图控制器,不进行功能处理(即静态视图), 根 据 参 数 的 逻辑视图名直接选择需要展示的视图。



AbstractUrlViewController:
提供根据请求 URL 路径直接转化为逻辑视图名的支持基类,即不需要功能处理,直接根据 URL 计算出逻辑视图名, 并选择具体视图进行展示: urlDecode:是否进行 url 解码,不指定则默认使用服务器编码进行解码(如 Tomcat 默认 ISO-8859-1) ; urlPathHelper:用于解析请求路径的工具类,默认为 org.springframework.web.util.UrlPathHelper
UrlFilenameViewController 是它的一个实现者,因此我们应该使用 UrlFilenameViewController



UrlFilenameViewController:
/index1/*:可以匹配/index1/demo,但不匹配/index1/demo/demo,如/index1/demo 逻辑视图名为 demo; /index2/**: 可以匹配/index2 路径下的所有子路径,如匹配/index2/demo,或/index2/demo/demo, “/index2/demo”的逻辑视图名为 demo,而“/index2/demo/demo”逻辑视图名为 demo/demo; /*.html:可以匹配如/abc.html,逻辑视图名为 abc,后缀会被删除(不仅仅可以是 html); /index3/*.html:可以匹配/index3/abc.html,逻辑视图名也是 abc;
prefix:生成逻辑视图名的前缀;
suffix:生成逻辑视图名的后缀;



MultiActionController:
,继承了AbstractController, 并实现了 LastModified 接口,默认返回-1
delegate:功能处理的委托对象,即我们要调用请求处理方法所在的对象,默认是 this; methodNameResolver:功能处理方法名解析器,即根据请求信息来解析需要执行的 delegate 的功能处理方法的方法名。


MethodNameResolver:
InternalPathMethodNameResolver::MultiActionController 的默认实现,提供从请求 URL 路径解析功能方 法的方法名,从请求的最后一个路径(/)开始,并忽略扩展名;
ParameterMethodNameResolver:提供从请求参数解析功能处理方法的方法名,并按照如下顺序进行解析:
(1、 methodParamNames:根据请求的参数名解析功能方法名(功能方法名和参数名同名
(2、paramName:根据请求参数名的值解析功能方法名,默认的参数名是 action,即请求的参数中含有 “action=query”,则功能处理方法名为 query;
(3、logicalMappings:逻辑功能方法名到真实功能方法名映射,如下所示:
(4、defaultMethodName:默认的方法名,当以上策略失败时默认调用的方法名。
PropertiesMethodNameResolver:提供自定义的从请求 URL 解析功能方法的方法名,使用一组用户自定义的 模式到功能方法名的映射,映射使用 Properties 对象存放





RequestToViewNameTranslator
用于直接将请求转换为逻辑视图名。默认实现为DefaultRequestToViewNameTranslator
http://localhost:9080/web 上下文/list -------> 逻辑视图名为 list   http://localhost:9080/web 上下文/list.html -------> 逻辑视图名为 list(默认删除扩展名)   http://localhost:9080/web 上下文/user/list.html -------> 逻辑视图名为 user/list



数据类型转换和数据验证:
流程:
1、首先创建数据绑定器,在此此会创建 ServletRequestDataBinder 类的对象,并设置 messageCodesResolver(错误码解 析器);
2、提供第一个扩展点,初始化数据绑定器,在此处我们可以覆盖该方法注册自定义的 PropertyEditor(请求参数——> 命令对象属性的转换) ;
3、进行数据绑定,即请求参数——>命令对象的绑定;
4、提供第二个扩展点,数据绑定完成后的扩展点,此处可以实现一些自定义的绑定动作; 5、验证器对象的验证,验证器通过 validators 注入,如 果 验证失败,需要把错误信息放入 Errors(此处使用 BindException 实现) ;
6、提供第三个扩展点,此处可以实现自定义的绑定/验证逻辑;
7、将 errors 传入功能处理方法进行处理,功能方法应该判断该错误对象是否有错误进行相应的处理。

用 AbstractCommandController,因为它继承了 BaseCommandController,拥有绑定流程。

猜你喜欢

转载自java-fsc.iteye.com/blog/2313926