`
dynamo2
  • 浏览: 6005 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Re: 在SimpleFormController中用“SessionForm”概念构建修改信息页面

    博客分类:
  • Java
阅读更多
是的,覆写formBackingObject方法就是利用Session Form。使用Session Form还必须将Form设置为Session Form。如下代码末端用红色序号标注的地方表示了通过formBackingObject在“GET"修改页面时将Command Object加入到Session的过程。用绿色序号标注的代码表示了如何在”POST“请求后从Session中取出Command对象。

此段代码拷贝自Spring的AbstractFormController类。


java 代码
 
  1. protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)  
  2.         throws Exception {  
  3.     // Form submission or new form to show?  
  4.     if (isFormSubmission(request)) {  
  5.         // Fetch form object from HTTP session, bind, validate, process submission.  
  6.         try {  
  7.             Object command = getCommand(request);  1
  8.             ...  
  9.         }  
  10.         catch (HttpSessionRequiredException ex) {  
  11.             ...  
  12.         }  
  13.     }  
  14.   
  15.     else {  
  16.         // New form to show: render form view.  
  17.         return showNewForm(request, response);
  18.     }  
  19. }  
  20.   
  21. protected final ModelAndView showNewForm(HttpServletRequest request, HttpServletResponse response)  
  22.         throws Exception {  
  23.   
  24.     logger.debug("Displaying new form");  
  25.     return showForm(request, response, getErrorsForNewForm(request)); 2 
  26. }  
  27.   
  28. protected final BindException getErrorsForNewForm(HttpServletRequest request) throws Exception {  
  29.         // Create form-backing object for new form.  
  30.     Object command = formBackingObject(request); 3 
  31.     if (command == null) {  
  32.         throw new ServletException("Form object returned by formBackingObject() must not be null");  
  33.     }  
  34.     if (!checkCommand(command)) {  
  35.         throw new ServletException("Form object returned by formBackingObject() must match commandClass");  
  36.     }  
  37.   
  38.     // Bind without validation, to allow for prepopulating a form, and for  
  39.     // convenient error evaluation in views (on both first attempt and resubmit).  
  40.     ServletRequestDataBinder binder = createBinder(request, command);  
  41.     BindException errors = new BindException(binder.getBindingResult());  
  42.     if (isBindOnNewForm()) {  
  43.         logger.debug("Binding to new form");  
  44.         binder.bind(request);  
  45.         onBindOnNewForm(request, command, errors);  
  46.     }  
  47.   
  48.     // Return BindException object that resulted from binding.  
  49.     return errors;  
  50. }  
  51.   
  52. protected final Object getCommand(HttpServletRequest request) throws Exception {  
  53.     // If not in session-form mode, create a new form-backing object.  
  54.     if (!isSessionForm()) {  2
  55.         return formBackingObject(request);  
  56.     }  
  57.   
  58.     // Session-form mode: retrieve form object from HTTP session attribute.  
  59.     HttpSession session = request.getSession(false);  
  60.     if (session == null) {  
  61.         throw new HttpSessionRequiredException("Must have session when trying to bind (in session-form mode)");  
  62.     }  
  63.   
  64.     String formAttrName = getFormSessionAttributeName(request);  
  65.     Object sessionFormObject = session.getAttribute(formAttrName);  3
  66.     if (sessionFormObject == null) {  
  67.         throw new HttpSessionRequiredException("Form object not found in session (in session-form mode)");  
  68.     }  
  69.   
  70.     // Remove form object from HTTP session: we might finish the form workflow  
  71.     // in this request. If it turns out that we need to show the form view again,  
  72.     // we'll re-bind the form object to the HTTP session.  
  73.     if (logger.isDebugEnabled()) {  
  74.         logger.debug("Removing form session attribute [" + formAttrName + "]");  
  75.     }  
  76.     session.removeAttribute(formAttrName);  
  77.   
  78.     return currentFormObject(request, sessionFormObject);  
  79. }  
  80.   
  81. protected final ModelAndView showForm(  
  82.     HttpServletRequest request, BindException errors, String viewName, Map controlModel)  
  83.     throws Exception {  
  84.   
  85.     // In session form mode, re-expose form object as HTTP session attribute.  
  86.     // Re-binding is necessary for proper state handling in a cluster,  
  87.     // to notify other nodes of changes in the form object.  
  88.     if (isSessionForm()) { 5 
  89.         String formAttrName = getFormSessionAttributeName(request);  
  90.         if (logger.isDebugEnabled()) {  
  91.             logger.debug("Setting form session attribute [" + formAttrName + "] to: " + errors.getTarget());  
  92.         }  
  93.         request.getSession().setAttribute(formAttrName, errors.getTarget());  6
  94.     }  
  95.   
  96.     ...  
  97. }  
  98.   
  99. protected Object formBackingObject(HttpServletRequest request) throws Exception {  
  100.     return createCommand(); 4 
  101. }  

如此看来覆写formBackingObject方法才是使用Session Form的正道。不过就是好像必须在form初始化时手动设置为Session Form。
现在还没有看出来Session中的Command对象是什么时候被修改的,这还是个问题。
分享到:
评论

相关推荐

    一个最简单的SimpleFormController使用

    在Spring MVC框架中,`SimpleFormController`是一个基础的控制器类,它简化了处理表单提交和模型数据绑定的过程。这个控制器是Spring MVC早期版本中的一个组件,现在已经被`@Controller`注解的类所取代,尽管如此,...

    Spring MVC控制器之SimpleFormController使用

    在Java Web开发中,Spring MVC框架是一个非常流行的MVC(模型-视图-控制器)架构模式实现,它为开发者提供了构建高效、灵活且可维护的Web应用的强大工具。本篇文章将详细探讨`Spring MVC`中的`SimpleFormController`...

    springMVC3学习(六)--SimpleFormController(源码)

    springMVC3学习(六)--SimpleFormController(源码) 文章地址:http://blog.csdn.net/itmyhome1990/article/details/25988733

    在一个form表单里同时上传多个文件和文本信息的解决方案

    在一个Web应用中,经常需要实现用户能够在一个表单中上传多个文件及文本信息的功能。本文将详细介绍如何在基于Tomcat5.0.30与Spring Framework的环境下实现这一功能。 ### 一、背景介绍 在实际开发过程中,很多...

    SPRING信息

    Spring框架是Java开发中广泛使用的轻量级框架,尤其在Web应用中,Spring MVC作为其Web层的核心组件,提供了强大的模型-视图-控制器(MVC)架构支持...了解这些核心概念有助于构建更高效、更健壮的Spring MVC应用程序。

    Spring MVC 例子

    Spring MVC 是一个强大的Java Web开发框架,用于构建可维护、模块化且松散耦合的Web应用程序。在Spring MVC中,控制器是处理用户请求并协调应用程序逻辑的关键组件。本示例将深入探讨`SimpleFormController`和`...

    spring mvc 文档

    在此示例中,我们创建了一个简单的表单,用户可以通过该表单提交信息。`User`类是表单绑定的对象,用于接收表单中的数据。 #### 四、Spring控制器与标签 Spring MVC提供了丰富的控制器类和自定义标签,使得Web开发...

    Spring培训资料

    - **Session管理**:Spring MVC支持多种Session管理方式,确保会话数据的安全和有效性。 #### 五、PAFA业务层 **5.1 业务层介绍** 业务层是PAFA中负责处理业务逻辑的部分,主要包括以下几个方面: - **业务层...

    Spring入门

    - **定义**:用于在所有bean被实例化之前修改bean定义的接口。 - **作用**:可用于修改配置元数据,如改变某个bean的属性值。 - **示例**:定义一个实现`BeanFactoryPostProcessor`接口的类,用于更改某个bean的属性...

    Spring-WebFlow入门中文文档

    Spring Web Flow 是一个用于构建复杂 Web 应用程序页面流程管理的框架,它是 Spring Framework 的一个独立模块。Spring Web Flow 的目标是为了解决在 Web 应用中管理和重用页面流程的问题,尤其是在需要多步骤导航...

    springmvc简单登陆例子

    `SimpleFormController`在Spring 3.0之后已被淘汰,但在这个示例中,它仍然被用来展示基本概念。 `User`类是我们的数据实体,包含用户名、密码和确认密码属性。这些属性用于存储用户的登录信息,并且提供了getter和...

    SpringMVC教程及实现原理

    - **org.springframework.context-3.0.5.RELEASE.jar**:构建在beans包基础之上,增强了对资源文件和国际化方面的支持。 - **org.springframework.core-3.0.5.RELEASE.jar**:Spring的核心包,包含了框架的基础组件...

    java学习文档

    - **实现方法**:修改`biz-context`的xsd文件,并在其中增加支持Annotation的相关标签。 - **新版EJBPafaAC** - **改进目的**:兼容Pafa3的同时,支持直接调用Services,支持新型多态的Action(ESA)。 - **实现...

    SPRING WEB-FLOW入门教程

    Spring Web Flow (SWF) 是一个专门为管理Web应用程序复杂页面流程设计的框架,它是Spring Framework的...无论是在构建大型的多步骤表单还是需要精细控制用户导航的应用中,Spring Web Flow都是一个值得考虑的优秀选择。

    Spring MVC与JAX-RS比较与分析

    去几年,REST逐渐成为影响Web框架、Web协议与Web应用设计的重要概念。如果你还不了解REST,那这个简短的介绍将有助你快速掌握REST,此外还可以点击这里了解关于REST的更多信息。 相关厂商内容 高速下载:Adobe ...

    Spring Web MVC framework中英文对照.pdf

    也就是说,在不修改现有代码的基础上,可以扩展软件的功能。 - **应用**:在Spring Web MVC框架中,这一原则得到了很好的体现。框架中的一些核心类的方法被标记为`final`,这意味着这些方法不能被子类覆盖。这种设计...

    计算机外文翻译-Spring的web-MVC-构架模式.pdf

    【Spring的Web MVC构架模式】是Spring框架中的核心组件,用于构建Web应用程序。Spring MVC设计的核心是一个称为DispatcherServlet的前端控制器,它负责接收HTTP请求并分发到相应的处理器。这种架构模式允许开发者将...

Global site tag (gtag.js) - Google Analytics