【问题标题】:form validation when displaying multiple forms on a single view在单个视图上显示多个表单时的表单验证
【发布时间】:2012-09-12 18:33:01
【问题描述】:

我有这个由 BalusC 提供的抽象表单类,用于设置验证消息

 public abstract class Form {

// Properties 
private Map messages = new LinkedHashMap();
private List formFeedback = new ArrayList();
private List errorMessages = new ArrayList();
private boolean hasError;

然后我有一堆扩展表单的类

public class ParentForm extends Form { 
public class SubForm1 extends Form {
public class SubForm2 extends Form {
public class SubForm3 extends Form {

在 parentForm 中,我调用了每个子表单,但我不知道如何将验证消息从子表单传递给父表单。

public class ParentForm extends Form { 

  public Object update(HttpServletRequest request) {

    pseudo code
     //if subform1 is being edited
     SubForm1 subForm1 = new SubForm1 (authenticatedUser);
     subFormBean1 sfb1 = new subFormBean1 ();
     sfb1 = subForm1.update(request);

     //if subform2 is being edited
     SubForm2 subForm2 = new SubForm2 (authenticatedUser);
     subFormBean2 sfb2 = new subFormBean2 ();
     sfb2 = subForm2.update(request);

Form 服务在 servlet 中使用 Struts 样式的 Action 执行

类更新操作

public class UpdateAction implements ControllerAction {

private Form form;
private Object obj;
private HashMap modelMap;

    public UpdateAction(HashMap modelMap, Form form, Object obj) {
    this.form = form;
    this.obj = obj;
    this.modelMap = modelMap;
}

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    obj = form.update(request);
            request.setAttribute("obj", obj);
            request.setAttribute("form", form);

在我的jsps中我会放

<span class="formError"><c:out value="${form.messages.whatever}" /> 但这只是从父表单中获取消息,而不是从任何子表单中获取消息

我想知道是否有类似的东西 `form[subForm].messages.whatever 会起作用吗?像

 if (!sfb1.notSuccess) {
 parentForm.setSubFormMessages(sfb1.getMessages());
 }

我的项目有点长,但基本上我希望 HTML 页面上的部分(组件??)是 HTML 表单,仅在特定条件下处于活动状态(它是我们用来路由清单的工作流程应用程序手工办公)想知道是否最好将其吸收并移植到 JSF 或修改 Form 类。

编辑 我正在尝试实现抽象子表单,但现在子表单上的类似内容仍会更新 Dao,即使说我的条目验证(processEntry)失败

  processEntry(request, ad);
  processEdit_date(request, ad);
  if (isSucces()) {
    dao.update(ad, authenticatedUser);
  }

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    在构建子表单的过程中基本上应该传递ParentForm

    SubForm1 subForm1 = new SubForm1(this, authenticatedUser);
    

    public SubForm1(Form parent, User authenticatedUser) {
        this.parent = parent;
        this.authenticatedUser = authenticatedUser;
    }
    

    然后在SubForm1 中将消息委托给它

    public addMessage(field, message) {
        parent.addMessage(field, message);
    }
    

    要保持 SubForm1SubForm2 等 DRY,您可以按照包装模式创建另一个抽象类:

    public abstract class SubForm extends Form {
    
        private Form parent;
    
        public SubForm(Form parent) {
            this.parent = parent;
        }
    
        public addMessage(field, message) {
            parent.addMessage(field, message);
        }
    
        // ...
    }
    

    然后设计SubForm1SubForm2等如下:

    public class SubForm1 extends SubForm {
    
        public SubForm1(Form parent, User authenticatedUser) {
            super(parent);
            this.authenticatedUser = authenticatedUser;
        }
    
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多