js 拼成 json 或者 String 通过ajax 或者servlet 传后台 

解决方案 »

  1.   

    原来程序都是username[]传进去的,改js的话,action也得改,动作太大了
      

  2.   

    例如:对一个Action中的一个数组字段userNames校验:public class TestArrayValidateAction {
    private String[] userNames; public String[] getUserNames() {
    return userNames;
    } public void setUserNames(String[] userNames) {
    this.userNames = userNames;
    }

    public String execute() {
    return "success";
    }
    }
    分三步:
    第一步:
    定义自定义校验器:
    java代码:import com.opensymphony.xwork2.validator.ValidationException;
    import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;public class MyValidator extends FieldValidatorSupport{ public void validate(Object object) throws ValidationException {
    String fieldName = getFieldName();
    String[] userNames = (String[]) getFieldValue(fieldName, object);
    validateArray(object, fieldName, userNames);
    }

    private void validateArray(Object object, String fieldName, String[] userNames) {
                    //下面可以换成自己需要的代码。
    if(userNames == null)
    addFieldError(fieldName, object);
    for(int i=0;i<userNames.length;i++) {
    System.out.println("正在对userNames第"+i+"个进行校验");
    }
    }

    public int getIndex(){
    return 0;
    }
    }
    第二步:注册自定义校验器,在classpath下定义validators.xml:<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE validators PUBLIC
            "-//Apache Struts//XWork Validator Definition 1.0//EN"
            "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
    <validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
        <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
        <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
        <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
        <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
        <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
        <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
        <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
        <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
        <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
        <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
        <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
        <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
        <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
        <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
        <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
    <validator name="MyValidator" class="zzg.study.struts2.validators.MyValidator"/>
    </validators>这一步要注意,要把struts中default-package的校验器都声明一遍,否则原来的校验器不起作用了。
    第三步:
    在actionName的包中定义校验配置文件TestArrayValidateAction-validation.xml:<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
            "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
    <validators>
    <field name="userNames">
    <field-validator type="MyValidator">
    <message>The index:${index} has error!</message>
    </field-validator>
    </field>
    </validators>
    写一个jsp文件测试:<%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Custom validate</title>
    </head>
    <body>
    <s:form action="TestArrayValidate">
    <s:textfield name="userNames"/>
    <s:textfield name="userNames"/>
    <s:textfield name="userNames"/>
    <s:submit/>
    </s:form>
    </body>
    </html>随便输入几个字符串,提交,控制台将会输出:
    正在对userNames第0个进行校验
    正在对userNames第1个进行校验
    正在对userNames第2个进行校验
    校验器起作用了。
      

  3.   

    如果能够修改action里的方法的话,在action里实现public void validate(){...}方法,对userNames字段进行校验比较简单。
      

  4.   

    这个验证如果没有什么重用性,那就在action中,用得写validateXxx的方法去验证吧。你说的是后台的验证吧。
      

  5.   

    使用Struts2的xml验证框架就可以解决了参考:
    http://blog.csdn.net/cuihaiyang/article/details/6295763
      

  6.   

    示例:登录验证LoginAction
    public class LoginAction extends ActionSupport { private IUserService userService;
    //登录的用户名
    private String username;
    //登录的密码
    private String password;
    //处理登录后的提示信息
    private String tip;

    //-----------------------
        //依赖注入
        //-----------------------
    public String getUsername() {
    return username;
    }
    public IUserService getUserService() {
    return userService;
    }
    public void setUserService(IUserService userService) {
    this.userService = userService;
    }
    public void setUsername(String username) {
    this.username = username;
    }
    public String getPassword() {
    return password;
    }
    public void setPassword(String password) {
    this.password = password;
    }
    public String getTip() {
    return tip;
    }
    public void setTip(String tip) {
    this.tip = tip;
    }

    @SuppressWarnings("unused")
    private boolean isInvalid(String value) {     
        return (value == null || value.length() == 0);     


    //处理用户请求
    @Override
    public String execute() throws Exception {
    // TODO Auto-generated method stub
    //创建ActionContext实例
    ActionContext ctx = ActionContext.getContext();
    //调用业务逻辑方法来处理登录请求
    int loginResult = userService.Login(getUsername(), getPassword());
    if(loginResult == userService.LOGIN_SUCCESS) {
    ctx.getSession().put(Constants.USER, username);
    setTip("您已经成功登陆系统");
    // 设置session
    Map map = ActionContext.getContext().getSession();
    map.put("username", getUsername());
    return SUCCESS;
    } else { //用户名和密码不匹配
    setTip("用户名/密码不匹配");
    return Constants.LOGIN_FAIL;
    }
    }

    }LoginAction-validation.xml:
    <?xml version="1.0" encoding="GBK"?>
    <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
    "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"><validators>
    <field name="username">
    <field-validator type="requiredstring">
    <message>用户名必填!</message>
    </field-validator>
    <field-validator type="regex">
    <param name="expression"><![CDATA[(\w{4,25})]]></param>
    <message>您输入的用户名只能是字母和数组,且长度必须在4到25之间</message>
    </field-validator>
    </field>
    <field name="password">
    <field-validator type="requiredstring">
    <message>密码必填!</message>
    </field-validator>
    <field-validator type="regex">
    <param name="expression"><![CDATA[(\w{4,25})]]></param>
    <message>您输入的密码只能是字母和数组,且长度必须在4到25之间</message>
    </field-validator>
    </field>
    </validators>