一、处理请求过程
DispatcherServlet 处理请求过程
1 、绑定上下文对象于 DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE 请求属性
2 、绑定 locale resolver, 解析本地化信息(没有忽略该过程)
3 、绑定 theme resolver ,确定使用主题( 没有忽略该过程)
4 、判断是否为 multipart, 如果是就解析封装
5 、查找处理器、执行对应的拦截器,获取视图模型
6 、根据 view resolver 选择相对应的视图
1 - 6 过程中如有异常,可以被 handlerexception resolver 捕获
表单处理过程:
1、判断是否是提交表单请求,
2、如果不是,调用 showNewForm(request, response, errors) 方法,
2.1 、 如果子类重写方法调用 formBackingObject 方法
2.2 、 如果有重写 referenceData 方法,
2.3 、 如果属性 bindOnNewForm=true ,系统将 request 对应参数值绑定到对应的对象中
2.4 、 最后根据属性 formView 跳转到相对应的表单录入页面
3 、如果是表单提交请求
3.1 如果不是会话表单或会话中有对应表单对象,
3.1.1 、 系统从会话中获取或者调用调用 formBackingObject 方法创建数据绑定对象, 根据页面输入值绑定数据对象,中间可能会产生绑定异常
3.1.2 、 如子类重写了 onBind 方法,会回调对应的方法,对应绑定异常会一直传递下去
3.1.3 、 如果子类有相对应的效验类,并且需要在绑定时效验,就回调对应的效验类的效验方法,对应绑定异常会一直传递下去
3.1.4 、 如果子类重写了 onBindAndValidate 方法,系统会回调对应的绑定效验方法
3.1.5 、 如果有异常,调用 showForm(request, response, errors) ,不是会话表单,重新获取辅助数据,执行方法 referenceData 返回表单编辑页面。
3.1.6 、 如果无异常调用 onSubmit(request, response, command, errors), 返回成功提交后的页面
3 . 2 如果是会话表单并且会话中没有该表单对象,会根据 formBackingObject 初始化值对象 , 然后处理过程和 3.1.1 执行过程一致。
说明:
步骤 3.1.1 会回调一次 formBackingObject 方法,然后再绑定页面数据,为何回调该方法的原因是因为我们在页面中有些属性不需要显示,如果只通过页面封装数据,哪些不需要显示的就无法封装数据。因此在使用该方法的时候特别要注意性能问题,避免在该方法中调用数据库查询等等影响性能的方法(我还是使用 hidden 控件,虽然安全性低了一点)
个人认为步骤 2.3 位置应该 2.1 在前,因为往往我们在实际使用中是先根据页面传递的值来再构造对应的值对象的。并且这样的话 页面传递的变量会覆盖 formBackingObject 值
个人建议尽可能的不要使用会话表单
三、开发注意事项、心得
1、自定义拦截器只需实现 org.springframework.web.servlet.HandlerInterceptor 接口
2、上传多个文件时注意事项:建议采用重写
protected ModelAndView onSubmit(HttpServletRequest request,HttpServletResponse response, Object command, BindException errors)
throws Exception
方法,直接通过 MultiHttpServletRequest getFileMap() 方法,对应 map 存储对象为 MultipartFile 接口实现类,建议通过接口访问,这样如果通过其他方式处理上传的,只需要修改配置文件,通过对应的 transferTo 方法处理上传的文件。
3、在 web 环境中如何获取应用上下文对象
ApplicationContext acx=(ApplicationContext)req.getAttribute(
DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE);
4、在配置 multipart 解析器 配置时 id="multipartResolver"
<bean id="multipartResolver" class="
org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize"><value>10485760</value>
</property>
</bean>
messageSource
<bean id="messageSource" class="
org.springframework.context.support.ResourceBundleMessageSource">
6、
如果视图要采用
redirect
方式,配置类似如下
<property name="successView">
<value>redirect:/viewpro.action</value>
</property>
7
、
如果要实现一个简单的页面数据绑定功能
只需要继承
BaseCommandController
类,重写
handleRequestInternal(
HttpServletRequest request, HttpServletResponse response)
throws Exception
方法
在该方法中只要创建数据绑定对象,调用绑定方法,然后封装在对应的视图中
8 、标签库的使用,请参考如下文章:
http://www-128.ibm.com/developerworks/cn/java/j-jstl0211/index.html