在单个视图上显示多个表单时进行表单验证

时间:2012-09-12 18:33:02

标签: java servlets

我有这个抽象的Form Class,由BalusC设置验证信息

 public abstract class Form {

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

然后我有一堆扩展Form

的类
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);

使用Struts样式Action

在servlet中执行父Form服务

类UpdateAction

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类。

修改 我正在尝试实现抽象的subForm,但现在在subForm上这样的东西仍会更新Dao,即使我的条目验证(processEntry)失败

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

1 个答案:

答案 0 :(得分: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;
    }

    // ...
}