如何使用struts2对集合参数进行验证

上一节介绍了struts2可以支持批量表单参数提交,那么提交到后台时如何利用strust2的validation框架对这个集合做验证?

struts2提供了一个vistor校验器,可以实现这个需求

还是采用上一节中批量添加书籍的例子

1.jsp文件

<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
  <head>
  </head>
  <body>
  	<s:set id="currentDate" value="new java.util.Date()"></s:set>
  	<s:property value="#currentDate" />
  	<s:fielderror></s:fielderror>
  	<s:actionerror/>
  	<s:form action="addBook" method="post">
  		<s:iterator value="new int[3]" var="book" status="status">
  			<label>Name:</label>
  			<s:textfield name="%{'books['+#status.index+'].name'}" theme="simple"></s:textfield>
  			<label>Price:</label>
  			<s:textfield name="%{'books['+#status.index+'].price'}" theme="simple"></s:textfield>
  			<br/>
  		</s:iterator>
  		<s:submit value="Add"></s:submit>
  	</s:form>
  </body>
</html>
2.后台Action类

package com.crazycoder2010.struts2.action;

import java.util.ArrayList;
import java.util.List;

import com.crazycoder2010.struts2.bean.Book;
import com.opensymphony.xwork2.ActionSupport;

public class AddBookAction extends ActionSupport {
	private static final long serialVersionUID = 8136233165580827673L;
	private List<Book> books = new ArrayList<Book>();
	
	public List<Book> getBooks() {
		return books;
	}

	public void setBooks(List<Book> books) {
		this.books = books;
	}

	@Override
	public String execute() throws Exception {
		for(Book book : books){
			System.out.println(book.getName()+":"+book.getPrice());
		}
		return SUCCESS;
	}
}
3.在Book类所在的包下建立一个Book-bookContext-validation.xml文件,该文件配置的是对Book对象的校验规则

<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
    <field name="name">
        <field-validator type="requiredstring">
            <message>Name is required.</message>
        </field-validator>
        <field-validator type="stringlength">
        	<param name="minLength">2</param>
        	<param name="maxLength">10</param>
        	<param name="trim">true</param>
            <message>Name must be ${minLength}-${maxLength}.</message>
        </field-validator>
    </field>
    <field name="price">
    	<field-validator type="int">
            <message>Price must be int.</message>
        </field-validator>
    </field>
</validators>
name和price分别是Book类的两个属性

4.在AddBookAction.java同目录下建立AddBookAction-validation.xml文件,用来对该action验证

<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
    <field name="books">
        <field-validator type="visitor">
        	<param name="context">bookContext</param>   
        	<param name="appendPrefix">true</param>
            <message>Some ERROR:</message>
        </field-validator>
    </field>
</validators>
这个时候我们的field的name为books,和后台的private List<Book> books;相对应-也与页面上的book[0].name,books[1].price等元素保持一致,引用校验器遵循一下规则

${model类名}-${context}-validation.xml,特别注意的是这个xml文件必须是和你的model类放在统一个目录下,visitor有个<mesaage>Some ERROR:</message>表示验证出错后每个错误前都会先显示这段文字

5.整体看一下各个类的关系



6.运行一下,看看效果

小结:

      优势:

           1.visitor提供了一种校验规则复用的原则,一组规则可以被多个地方引用(Book-bookContext-validation.xml)
           2.可以对集合属性进行校验

      不足:

           1.校验文件过于分散,如Book-bookContext-validaiton.xml文件必须放置在model包里,而我们的引用却在action层下--不够直观

            2.出错信息不能精确定位到元素上--因为所有的元素都是同样的名字--这个不知道有没有办法解决

posted @ 2011-09-22 23:39  java简单例子  阅读(273)  评论(0编辑  收藏  举报