【问题标题】:Ajax validation with Spring Webflow 2使用 Spring Webflow 2 进行 Ajax 验证
【发布时间】:2012-08-16 00:48:48
【问题描述】:

我想知道是否有人可以提供帮助。我正在组装一个 Spring Webflow 应用程序,并试图弄清楚如何进行验证。

根据http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch04s10.html 的文档,我创建了一个符合 ${model}Validator 名称模式和符合 validate${state} 的方法名称的验证器类

// validation method for About You
public void validateAboutYou(QB2MotorQuote p_quote, ValidationContext p_ctx) {
    MessageContext messages = p_ctx.getMessageContext();

    // mandatory checks ...
    mandatoryChecks_AboutYou(p_quote, messages);

    // field format/content validation checks ...
    formatChecks_AboutYou(p_quote, messages);

}

如上面的代码所示,我调用了 2 个方法来执行强制检查,然后是格式检查。

这很好 - 当页面被提交时,SWF 调用验证类 - 非常好:)

我现在想做的是通过 ajax 调用 formatChecks_AboutYou(p_quote, messages) 方法。当用户模糊每个字段时,我想触发一个 ajax 请求来验证该字段,从而将我的所有验证代码和规则都放在服务器端。

我找不到任何关于如何使用 SWF 的文章。我用标准的 Spring MVC 应用程序做了一些非常相似的事情,我的控制器上有一个请求映射,专门用于 ajax 验证。这样做的好处是控制器已经有了对验证器的引用,并且数据已经绑定到表单支持对象。

但我不确定如何使用 SWF 来解决这个问题。我暂时尝试了编写一个用于 ajax 验证的控制器的想法:

@Controller
public class AjaxController {

@Autowired
private QuoteValidator m_validator;

@RequestMapping(value="/AjaxValidate", method=RequestMethod.GET)
public String ajaxValidate(HttpServletRequest p_req, Model p_model) {

    // controller has access to validate via autowired m_validate
    // but the method signature I want to call is:
    //   formatChecks_AboutYou(QB2MotorQuote p_quote, MessageContext p_messages)
    // Don't know where to get a MessageContext from

    return "ajaValidate";
}
}

我可以从客户端调用它没问题,但我怀疑数据会绑定到命令对象,我不确定从哪里获取 MessageContext 对象。

如果有人能提供帮助,我将不胜感激; 干杯

内森

【问题讨论】:

    标签: ajax validation spring-webflow spring-webflow-2


    【解决方案1】:

    首先你需要定义不过渡到任何地方的全局过渡并渲染一个片段

    <transition on="forgotPassword">
       <evaluate expression="mybean.forgotPassword(flowRequestContext)" />
       <render fragments="forgotPassword"/>
    </transition>
    

    当你转换到这个时,验证方法将运行

    private void validateForgotPassword(ValidationContext context) {
       String event = context.getUserEvent();
       Object formObject = null;
       String formName = null;
       GenericFormValidator formValidator = new GenericFormValidator(validator);
       if (StringUtils.equalsIgnoreCase(event, "forgotPassword")) {
          formObject = this.getForgotPasswordForm();
          formName = "forgotPasswordForm";
          formValidator.perform(context, formObject, formName, ForgotPasswordForm.DefaultValidationGroup.class);
       }
    }
    

    你需要在瓷砖上定义你的块

    <definition name="pages.guest.info" extends="master-layout">
        <put-attribute name="bodyId" value="guest-info" />
        <put-attribute name="body" value="/WEB-INF/jsp/pages/guest-info.jsp"/>
    
        <!-- specified for ajax reloading by webflow-->
        <put-attribute name="forgotUsernamePassword" value="/WEB-INF/jsp/pages/guest/chunks/request-login.jsp"/>
        <put-attribute name="forgotPassword" value="/WEB-INF/jsp/pages/guest/chunks/forget-password.jsp"/>
    
        <put-attribute name="jsPageBundle" value="/bundles/guest.js" />
    
        <put-list-attribute name="css" inherit="true">
            <add-attribute value="/bundles/module.guest.css" /> 
        </put-list-attribute>
    
        <put-list-attribute name="js" inherit="true">
            <add-attribute value="/js/pages/guest-flow.js" />
      </put-list-attribute>
    
    </definition>
    

    希望这是一个起点。

    【讨论】:

      猜你喜欢
      • 2012-08-24
      • 2017-04-15
      • 2015-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      相关资源
      最近更新 更多