Java Struts 2验证不使用动态表单字段

Java Struts 2验证不使用动态表单字段,java,validation,jsp,struts2,visitor-pattern,Java,Validation,Jsp,Struts2,Visitor Pattern,我正在开发一个用户可以输入多个地址的应用程序。我使用的是Struts2 XML验证,对于那些字段[地址(国家、城市、街道)],我使用了visitor validator,但它不起作用。 其余字段的验证工作正常 有人能提出可能的问题吗 EmployeeForm.jsp 添加员工 函数addRow(tableID){ var table=document.getElementById(tableID); var rowCount=table.rows.length; var row=table.i

我正在开发一个用户可以输入多个地址的应用程序。我使用的是Struts2 XML验证,对于那些字段[地址(国家、城市、街道)],我使用了visitor validator,但它不起作用。 其余字段的验证工作正常

有人能提出可能的问题吗

EmployeeForm.jsp


添加员工
函数addRow(tableID){
var table=document.getElementById(tableID);
var rowCount=table.rows.length;
var row=table.insertRow(rowCount);
变量计数=行计数-1;
var cell1=行插入单元格(0);
var street=document.createElement(“输入”);
street.type=“text”;
street.name=“employeeModel.addresses[“+counts+”].street”;
细胞1.附子(houseNum);
var cell2=行插入单元格(1);
var city=document.createElement(“输入”);
city.type=“text”;
city.name=“employeeModel.addresses[“+counts+”].city”;
第二单元儿童(城市);
var cell3=行插入单元格(2);
var country=document.createElement(“输入”);
country.type=“text”;
country.name=“employeeModel.addresses[“+counts+”].country”;
第3单元:儿童(国家);
}
街头
城市
国家
EmployeeAction Validation.xml


真的
名称是必需的。
EmployeeModel Validation.xml


EmployeeAction.java

 package com.action;

import com.model.EmployeeModel;
import com.opensymphony.xwork2.ActionSupport;

public class EmployeeAction extends ActionSupport{

    private static final long serialVersionUID = 1L;
    private EmployeeModel employeeModel;

    public String execute() {
        return SUCCESS;
    }


    public EmployeeModel getEmployeeModel() {
        return employeeModel;
    }

    public void setEmployeeModel(EmployeeModel employeeModel) {
        this.employeeModel = employeeModel;
    }
}
 package com.model;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class EmployeeModel implements Serializable{

    private static final long serialVersionUID = -484846216250373240L;
    private String employeeName;
    private List<AddressModel> addresses;

    public String getEmployeeName() {
        return employeeName;
    }
    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }

    public List<AddressModel> getAddresses() {
        return addresses;
    }
    public void setAddresses(List<AddressModel> addresses) {
        this.addresses = addresses;
    }
}
 package com.model;

import java.io.Serializable;

public class AddressModel implements Serializable{

    private static final long serialVersionUID = 6965346469594926268L;
    private String country;
    private String city;
    private String street;

    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }   
}
EmployeeModel.java

 package com.action;

import com.model.EmployeeModel;
import com.opensymphony.xwork2.ActionSupport;

public class EmployeeAction extends ActionSupport{

    private static final long serialVersionUID = 1L;
    private EmployeeModel employeeModel;

    public String execute() {
        return SUCCESS;
    }


    public EmployeeModel getEmployeeModel() {
        return employeeModel;
    }

    public void setEmployeeModel(EmployeeModel employeeModel) {
        this.employeeModel = employeeModel;
    }
}
 package com.model;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

public class EmployeeModel implements Serializable{

    private static final long serialVersionUID = -484846216250373240L;
    private String employeeName;
    private List<AddressModel> addresses;

    public String getEmployeeName() {
        return employeeName;
    }
    public void setEmployeeName(String employeeName) {
        this.employeeName = employeeName;
    }

    public List<AddressModel> getAddresses() {
        return addresses;
    }
    public void setAddresses(List<AddressModel> addresses) {
        this.addresses = addresses;
    }
}
 package com.model;

import java.io.Serializable;

public class AddressModel implements Serializable{

    private static final long serialVersionUID = 6965346469594926268L;
    private String country;
    private String city;
    private String street;

    public String getCountry() {
        return country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }   
}
struts.xml


/Result.jsp
/EmployeeForm.jsp

您有一个
对象,该对象有多个
对象

这意味着在操作验证文件中,需要对
EmployeeModel
属性使用simple验证,对
AddressModel
对象使用visitor验证

您正确地说,
AddressModel
必须通过访客验证进行验证:


但是,您尝试使用的不是
AddressModel
的验证文件,而是
EmployeeModel
的验证文件

而不是

EmployeeModel Validation.xml

你需要使用

AddressModel Validation.xml

在它里面,您需要验证简单属性,而不在它们前面显示任何
employeeModel
(因为此验证可由许多不同的验证文件使用,不同的操作和模型包含
AddressModel
,而不关心其父对象):


真的
国家是必需的。
编辑: 您还忘记了命名
AddressModel
对象的属性;添加它们:



并在javascript代码中执行同样的操作。

您是否确实有访客验证程序的验证文件?“Visitor”表示“对于这个特定字段,您将在另一个XML文件中找到验证规则,该文件位于model文件夹中,而不是action文件夹中”。请通过添加访问者验证程序文件名、包和代码以及AddressModel代码来更新您的问题,以便我能够以我编辑过的更完整的方式回答您的问题。请查收。EmployeeModel-Validation.xml与model类一起保存,EmployeeAction-Validation.xml与Action类一起保存在单独的包中。我也关注了你的博客。先生,我已经更新了字段名,但仍然没有成功:(现在可能是什么问题?我很确定它是模型驱动的…你甚至没有在你的页面中使用:)只需删除它,它只会带来麻烦,并增加不必要的复杂性。另外,将地址的定义和设置器从ArrayList更改为接口ListNo,HTML字段非常好。我看到XML验证文件中大写的V是错误的,它应该是小写的(但我不知道它是否会阻止验证工作)。也就是说,你有没有在你的VOs中包含参数的构造函数,你还没有发布在这里?如果是,也添加一个no args构造函数。然后在这里发布您的struts.xml配置(拦截器堆栈和操作配置)一定发生了一些非常奇怪的事情:|如果您确认文件
AddressModel validation.xml
com.model
包中。请注意,您必须在所有VO(EmployeeModel和AddressModel)上实现Serializable,但如果这是罪魁祸首,我会感到惊讶。执行最后一次更新,如果它不起作用,则将修改后的代码转储到原始代码上(除了作为问答主题的XML验证文件,应该添加到您的问题中,以避免替换原始文件)。它们不会显示,因为您使用的是html标记,而不是struts标记(页面加载时只有第一行可用)。在表单顶部放置一个标记,它们将被绘制。