如何使用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;}@Overridepublic 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.出错信息不能精确定位到元素上--因为所有的元素都是同样的名字--这个不知道有没有办法解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于__attribute__ ((packed))

#include <iostream>using namespace std;typedef struct {unsigned char ver;unsigned char cmd;unsigned short id;unsigned short retcode; }__attribute__ ((packed)) ACKPACK_CMD;struct my {char ch; int a; }__attribute__ ((packed)); // 取消结构在编译过程中…

[react] React中验证props的目的是什么?

[react] React中验证props的目的是什么&#xff1f; 对属性进行强检验&#xff0c;避免运行时报错 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

[Axure教程]0001.新手入门基础

Axure RP是一个专业的快速原型设计工具。Axure&#xff08;发音&#xff1a;Ack-sure&#xff09;&#xff0c;代表美国Axure公司&#xff1b;RP则是Rapid Prototyping&#xff08;快速原型&#xff09;的缩写。Axure RP已被一些大公司采用。Axure RP的使用者主要包括商业分析师…

typedef和#define的作用域问题

#include <iostream>using namespace std;class A { #define MAX 5 // 宏定义是全局的&#xff0c;因为在预编译时就替换掉了public:typedef unsigned long ULONG; // 作用域局限在这个类中, 且有修饰符private:int _n;ULONG _age;public:A(int n, ULONG age);void …

【评论】GNU/Linux下有多少是GNU的?

导读&#xff1a;一个葡萄牙的学生写了一篇文章 《How much GNU is there in GNU/Linux?》由酷壳网的陈皓整理编译为《GNU/Linux下有多少是GNU的》。这篇文章主要分布了今年4月份的Ubuntu Natty的Linux分发包。其主要是用代码行来做的分析&#xff0c;用两个饼图对比分析。内容…

[react] 在React中怎么使用字体图标?

[react] 在React中怎么使用字体图标&#xff1f; 1、npm install --save react-fontawesome 2、npm install font-awesome 3、import ‘font-awesome/less/font-awesome.less’; 4、import ‘react-fontawesome’; 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知…

Linux下scp命令的用法

scp 对拷文件夹 和 文件夹下的所有文件 对拷文件并重命名 对拷文件夹 (包括文件夹本身) scp -r /home/wwwroot/www/charts/util root192.168.1.65:/home/wwwroot/limesurvey_back/scp 对拷文件夹下所有文件 (不包括文件夹本身) scp /home/wwwroot/www/charts/util/* root19…

研究者展示黑客通过GPU绕过防毒软件查杀的方法

Slashdot网站近日刊登了一篇研究文章称黑客可以通过特殊手段利用电脑中的GPU来躲避杀毒软件的清查。在这份PDF文档中&#xff0c;研究者展示了黑 客如何 利用GPU来躲避杀毒软件查杀的方法&#xff0c;作者还表示类似的技巧还有可能会发展升级为更加复杂的攻击手段&#xff0c;如…

关于sprintf和snprintf的比较

#include <stdio.h> #include <string.h>typedef unsigned char uchar;#define BUF_SIZE 10 // 缓冲区大小 #define CLEAR_SIZE (BUF_SIZE2) // 操作的缓冲区大小, 需要全部重置void printRuler(int len) {putchar(\n);for(int i 1; i < len; i){printf…

[react] React的isMounted有什么作用?

[react] React的isMounted有什么作用&#xff1f; (页面执行异步请求&#xff0c;切换页面 &#xff0c;组件卸载 增加isMounted 作为判断) 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 …

鸽巢原理入门

鸽巢原理又叫抽屉原理&#xff0c;百度百科的定义是&#xff1a;桌上有十个苹果&#xff0c;要把这十个苹果放到九个抽屉里&#xff0c;无论怎样放&#xff0c;我们会发现至少会有一个抽屉里面至少放两个苹果。这一现象就是我们所说的“抽屉原理”。 下面有两个入门题目&#x…

javascript笔记:javascript的前世,至于今生嘛地球人都知道了哈

&#xff08;引子&#xff1a;javascript其实是个私生子&#xff09;我在上一篇博文最后说道&#xff0c;想写一篇关于javascript基础语法的文章&#xff0c;原因是我在读很多优秀的javascript源码时候常常被javascript诡异的语法搞的精疲力尽&#xff0c;所以时不时的加固java…

gcc -E 产生预编译后的文件

利用gcc -E选项&#xff0c;可以得到预编译后的文件。这可以得到宏展开后的文件。 先来看看几个相关联的文件吧! #ifndef __DEFS_H__ #define __DEFS_H__#ifdef WIN32#define snprintf _snprintf #endif// Join two variables #define MACRO_JOIN( X, Y ) MACRO_DO_JOIN( X, Y…

[react] 在React中我们怎么做静态类型检测?都有哪些方法可以做到?

[react] 在React中我们怎么做静态类型检测&#xff1f;都有哪些方法可以做到&#xff1f; flow 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

STM32F4 使用STLink 和 EventRecoder 调试运行时间

最近使用STM32F407的DSP库&#xff0c;测试了一下浮点数1024个点的FFT计算时间&#xff0c;采用EventRecoder计时间&#xff0c;记录如下。 1、在Compiler中添加EventRecorder 组件&#xff0c;CMSIS的版本5.4。 2、main.C增加头文件&#xff1a;#include "EventRecorder…

道德经经典解读

老子说&#xff1a;上善若水。水善利万物而不争。 原著实录 《道德经》第8章&#xff1a;上善若水。水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道。居善地&#xff0c;心善渊&#xff0c;与善仁&#xff0c;言善信&#xff0c;政善治&#xff0c;事善能&…

_attribute_((packed))

From: http://blog.csdn.net/wesleyluo/article/details/7565165 _attribute_((packed)) 1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐&#xff0c;是GCC特有的语法。这个功能是跟操作系统没关系&#xff0…