struts2验证框架
Struts2 极速表单验证框架 说明书
![Struts2 极速表单验证框架 说明书](https://img.taocdn.com/s3/m/11cf43687e21af45b307a88c.png)
1 Struts2极速表单验证框架使用说明书struts ‐plusStruts enhancement, includes quick form validation, permission mgmt. Struts 框架增强, 包括极速表单验证, 权限管理等.子模块之Struts 2 极速表单验证框架作者: 刘长炯(beansoft@)日期: 2010‐01‐20版本: 0.1修订历史2010‐01‐20 初始版1 Struts2极速表单验证框架使用说明书..................................................................................1 2 Struts 2 极速表单验证框架简介...........................................................................................2 3 项目许可...................................................................................................................................3 4 下载本项目...............................................................................................................................3 5 演示应用...................................................................................................................................4 6 整合步骤step by step...............................................................................................................8 7 验证规则表达式详解.............................................................................................................12 8 和RapidValidation 配合实现前后台一致验证.......................................................................13 9 如何扩展验证规则.................................................................................................................14 10 下一版本开发计划 (17)2 Struts 2 极速表单验证框架简介Struts Plus, Struts + 项目, 计划包含极速表单验证框架, 权限管理等子模块. 目前主要关注于 Struts 2 方面的生产力提高项目, 主要基于注解方式进行增强, 并提供抽象层, 使项目仅仅依赖于 Struts 本身, 而不需要强制您使用某种业务层和数据层框架. 项目的许可采用MIT协议, 您可自由的使用本项目, 但需遵循MIT协议保留本人版权签名及MIT协议本身.本文主要讲述子模块Struts 2 极速表单验证框架(Struts 2 QuickFormValidation).本验证机制基于表达式和注解(Annotation), 验证规则的扩展通过实现验证接口进行.诞生历史:2009年12月18日晚提出框架原理, 并于2009年12月19日晨提出实现思路, 最终框架核心初步完成于2009年12月20日(周日), 2010‐01‐20日整理发布.在项目的开发中, 表单验证需要用去开发者大量的时间, 尤其是为了保证前后台的验证规则一致时, 更是需要大量的人力物力. 虽然Struts 2本身的验证框架可以保证前后台一致, 但在使用和整合方式上, 需要编写大量的Validation XML文件, 费力费时容易出错, 尤其是实际开发中需要反复调整各种验证规则及其组合, 这时就更加困难; 扩展Struts 2的验证框架更是需要比较繁琐的步骤. 针对这些挑战, 笔者试图提供一种简便易用的方式来进行表单验证, 即基于Java注解和验证规则表达式.如下面的代码即可实现如下的验证要求: 1) 用户名不能为空, 最小长度5, 最大长度10, 只能输入英文字母; 2) 年龄字段只能输入数字, 最小值为18, 最大值为100; 验证失败时, 转向input页面并显示出错信息: ${validationErrors}.@FormValidator(input="form_tag", value=",用户名,required min-length-5 max-length-10 validate-alpha;" +"age,年龄,validate-digits min-value-18 max-value-100;") public String form_tag() throws Exception {return SUCCESS;}•最快速的后台表单验证框架•简洁,快速的验证语法•无需编写验证提示信息•错误消息在指定地方显示•支持组合验证•易于扩展•基于标准的Java Annotation添加验证,易于和现有项目的无缝集成•特殊应用场景支持,如:密码确认,结束日期必须大于开始日期•支持前后台一致的验证规则本框架主要是为了和前台基于JavaScript的开源验证框架RapidValidation(/p/rapid‐validation/ )使用统一的验证规则, 最大限度的减少重复的后台验证代码, 使用方式简便, 扩展方便.本框架依赖于:z Struts 2z Java 5或者更高版本3项目许可The MIT LicenseCopyright (c) 2010 刘长炯(beansoft@)Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE.4下载本项目您可访问/p/struts‐plus/downloads/list 来获取最新源代码包文件名说明大小struts2-quickvalidation-plugin-1.0-src.jar Struts 2 QuickFormValidation 26.81.0 sources 源码Featured KBstruts2-quickvalidation-plugin-1.0.jar Struts 2 QuickFormValidation1.0 jar Featured 26.8 KBstruts2-quickvalidation-demo.war 演示war包,部署至Tomcat6运行Featured 3.4 MBJavascript_RapidValidation.pdf JavaScript Rapid Validation框架的详细使用及规则说明文档(转载)176KB5演示应用可下载示例应用来体验Struts极速验证框架, 下载地址为:http://struts‐/files/struts2‐quickvalidation‐demo.war . 放入Tomcat后即可查看运行效果. 您可以本demo应用为基础快速的进行开发.本演示包含三个内容:纯后台表单验证前后台一致表单验证(前台验证基于RaplidValidation)前后台一致表单验证(Struts 2 Form 标签)本war包中的唯一的.java文件源码如下:package actions;import com.opensymphony.xwork2.ActionSupport;import common.validation.FormValidator;public class HelloWorldAction extends ActionSupport {// 或者implements Action {@FormValidator(input="form", value=",用户名,required min-length-5 max-length-10 validate-alpha;" +"age,年龄,validate-digits min-value-18 max-value-100;" +"password,密码,required;" +"password2,重复密码,required equals-password-原始密码;" +"email,,validate-email;" +"gender,性别,validate-one-required;" +"ip,,validate-ip;" +"date,生日,validate-date;" +"num1,数字1,validate-number;" +"num2,数字2,validate-number less-than-num1-数字1;" +"float,数字范围,float-range-1-10;" +"address,地址,validate-chinese;" +"zip,邮编,validate-zip;" +"id_num,身份证,validate-id")public String form() throws Exception {return SUCCESS;}@FormValidator(input="form_js", value=",用户名,required min-length-5 max-length-10 validate-alpha;" +"age,年龄,validate-digits min-value-18 max-value-100;" +"password,密码,required;" +"password2,重复密码,required equals-password-原始密码;" +"email,,validate-email;" +"gender,性别,validate-one-required;" +"ip,,validate-ip;" +"date,生日,validate-date;" +"num1,数字1,validate-number;" +"num2,数字2,validate-number less-than-num1-数字1;" +"float,数字范围,float-range-1-10;" +"address,地址,validate-chinese;" +"zip,邮编,validate-zip;" +"id_num,身份证,validate-id")public String form_js() throws Exception {return SUCCESS;}@FormValidator(input="form_tag", value=",用户名,required min-length-5 max-length-10 validate-alpha;" +"age,年龄,validate-digits min-value-18 max-value-100;") public String form_tag() throws Exception {return SUCCESS;}}下面是三个演示的效果:6整合步骤step by step1. 将文件struts2‐quickvalidation‐plugin‐1.0.jar放入Web项目的WEB‐INF/lib目录下;2. 修改您自己的代码的src/struts.xml中的package定义继承自quickValidation;示例代码:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><package name="test" namespace="" extends="quickValidation"> <action name="helloworld" class="actions.HelloWorldAction"> <result name="index">/index.jsp</result><result name="success">/helloworld.jsp</result></action></package></struts>3. 使用注解加入验证规则表达式;在每个需要调用的Action的入口方法处, 加入@FormValidator注解.注解的完整语法如下:@common.validation.FormValidator(input="出错时需要返回的result别名", enabled=true/false, value="表单参数名称1,表单参数中文提示信息1,规则1 规则2…; 表单参数名称2,表单参数中文提示信息2,规则1 规则2…;更多字段验证信息")input参数: 可选. 如果不指定, 则出错时仍然继续进入到Action方法中; 如果指定, 则在表单验证出错时, 返回到给定的result中, 例如: 原始表单输入页面或者统一的错误输出页面; enabled参数: 可选. 是否启用此验证规则, 如果不指定, 则忽略解析注解, 不进行任何验证; value参数: 必填选项, 可输入一个或者多个表单参数验证规则. 简单说就是: [字段1验证配置];[字段2验证配置];…. 虽然不建议, 然而字段验证配置可以留空, 此时不会进行任何验证处理.而每个验证配置的格式如下:表单参数名称: 必填选项. 指向输入的表单控件的名称(input的name);表单参数中文提示信息: 可选. 如果为空, 则和表单参数名称相同. 不为空时, 则显示在出错时的信息提示的开头位置;规则1 规则2…: 可选. 理论上可加入任意多个验证规则, 以单个空格隔开. 在验证开始后, 依次进行每个规则的验证并加入提示信息. 需要注意的是, 除required规则之外的所有规则只有当用户输入的字段值非空时, 才进行有效性验证, 如此便可避免所有字段都成为必填字段的问题发生.每个规则本身则由两部分组成: 规则名‐规则子名‐参数1‐参数2‐参数3‐….规则名和规则子名是固定名称, 不能任意填写, 这两个名称对应一个具体的规则实现类.其中参数是必填选项, 参数的意义则需要参考下一节的验证规则表达式中的说明. 下面举例说明若干验证规则:required 这是特殊规则, 不带规则子名, 也没有额外的参数;float‐range‐1‐20 其中float‐range分别是规则名和规则子名, 而1和20则分别是两个参数. 特别需要注意的是有负数时的情况此时参数列表变为: float-range--1--20, 此时参数值分别为‐1和‐20.如果需要给另一字段加入验证规则, 则以分号隔开.下面是若干验证的示例及其解释:规则 解释@FormValidator 空的验证规则, 不进行任何操作@FormValidator("username,用户名,required min‐length‐5") 对username字段进行验证, 规则为必填, 最小长度为5; 出错时分别提示:用户名不能为空用户名的长度不能小于5, 当前长度为1.由于没有指定input参数, 所以当验证失败时, 仍然会继续进入到业务逻辑处理, 相关的错误信息则存入request 的attribute中.@FormValidator("username, ,required min‐length‐5")由于没有指定字段的中文提示, 因此出错时将提示:username的长度不能小于5, 当前长度为1.@FormValidator(input="index",value=" username,用户名,required min‐length‐5”) 这大概是最常用格式的验证规则的写法了. 此例和上例的区别为: 所以当验证失败时, 将进入input参数所指定的出错信息显示页面.@FormValidator(input="index",enabled=false,value=" username,用户名,required min‐length‐5”) 忽略所有验证规则处理, 常用于调试阶段.@FormValidator(input="index",value=" username,用户名,required min‐length‐5;password2,重复密码,required equals‐password‐原始密码;”) 此规则加入了对重复密码字段的验证, 出错时将提示:重复密码和原始密码的输入不一致@FormValidator(input="index",value="username,用户名,required min‐length‐5;password2,重复密码,required equals‐password;”) 此规则省略了另一字段的中文描述, 出错时将提示:重复密码和前面的输入不一致以下为一个完整的Action类示例代码:import com.opensymphony.xwork2.ActionSupport;import common.validation.FormValidator;public class HelloWorldAction extends ActionSupport {@FormValidator(input="index", value="username,用户名,requiredmin-length-5 max-length-10 validate-alpha;" +"age,年龄,validate-digits min-value-18max-value-100;password,密码,required;" +"password2,重复密码,required equals-password-原始密码;" +"gender,性别, validate-one-required")public String execute() throws Exception {return SUCCESS;}}4. 修改前台显示验证结果.根据Action的不同, 前台的显示划分为两类:普通的错误显示:所有错误信息: ${validationErrors}返回的内容是一个字符串, 显示了所有的出错信息, 而出错字体的颜色则需要用户自己去设置.出错信息的显示格式是以<br>分开的, 例如:用户名不能为空<br>密码不能为空<br>重复密码不能为空<br>性别必须至少选中一项<br>另一种推荐的做法是让Action继承自Struts2中的ActionSupport, 此时则可用Struts 2的标签来显示出错信息, 可定位到具体的字段:<%@ taglib prefix="s" uri="/struts-tags" %><s:actionerror /><s:fielderror/><s:form action="helloworld.action" method="post"><s:textfield name="username" label="用户名" /><s:password name="password" label="密码" /><s:submit/></s:form>或者使用纯JSP来编写页面来定位到单条错误:用户名: <input name=username value=${ername}> ${ername[0]}下面给出这两种写法的完整示例:<%@ page pageEncoding="UTF-8"%><%@ taglib prefix="s" uri="/struts-tags" %><html><head><style>.errorMessage {color:red;}.errorLabel {font-weight:bold}</style><title>测试页面</title></head><body><s:actionerror /><form action="helloworld.action" method=postenctype="multipart/form-data">用户名: <input name=username value=${ername}>${ername[0]} <br>年龄: <input name=age value=${param.age}><br>密码: <input name=password><br>密码重复: <input name=password2><br>邮件: <input name=email><br>性别: <input type=checkbox name=a>男<input type=checkbox name=a>女<br> IP地址: <input name=ip><br>数字1: <input name=num1>数字2: <input name=num2><br>日期:<input name=date><br>附件: <input name=file type=file><br><input type=submit value="提交"></form><span class="errorMessage">${validationErrors}</span>Struts 2表单标签示例:<s:fielderror/><s:form action="helloworld.action" method="post"><s:textfield name="username" label="用户名" /><s:password name="password" label="密码" /><s:submit/></s:form></body></html>7验证规则表达式详解说明: 加红色背景的部分是目前尚不支持的验证规则; 加黄色背景的是增加了第二个可选参数的规则(和前台验证规则略有变动).验证表达式 描述 示例 required 非空域,全部空格也算空validate-number 一个有效数validate-digits 只能包含0-9任意个数字validate-alpha 只能是字母a-z, A-Zvalidate-alphanum 只能是字母和数字的组合validate-email 只能是有效的emailvalidate-url 只能是有效的url地址validate-one-required 至少有一个被选中,例如一组checkbox, radiobutton,它们最好包含在一个div和span中validate-integer 只能是整数,可以有正负号validate-ip 有效的IP地址min-length-$number 最小长度是$number (此处$some表示一个特定的值)最小长度为8: min-length-8max-length-$number 最大长度是$number 最大长度为8:max-length-8 max-value-$number 输入域的最大值是$number 最大值为8.1:max-value-8.1 min-value-$number 输入域的最小值是$number 最大值为-8.1:max-value--8.1equals-$otherInputId-$othe rInputLabel 必须和某个input field相等,用于密码两次输入验证等,$otherInputLabel是可选项,用来描述另一字段信息equals-password重复密码和原始密码输入不一致:equals-password-原始密码less-than-$otherInputId-$o therInputLabel 小于某个input fieldless-than-otherInputId,多用于结束日期不能小于开始日期的需求,$otherInputLabel是可注:相等时也不能通过选项,用来描述另一字段信息great-than-$otherInputId-$ otherInputLabel 大于某个input fieldless-than-otherInputId,$o therInputLabel是可选项,用来描述另一字段信息validate-date-$dateFormat 只能是日期,$dateFormat为日期格式,$dateFormat的可选,默认格式为yyyy-MM-DD validate-date-yyyy年MM月dd 日validate-file-$type1-$type 2-$typeX 验证文件输入域选择的文件类型只能为声明的$type1 –$typeX中的一种validate-file-png-jpegfloat-range-$minValue-$max Value 必须是$minValue到$maxValue的一个浮点数1至20:float-range-1-20int-range-$minValue-$maxVa lue 必须是$minValue到$maxValue的一个整数length-range-$minLength-$m axLength 输入字符串的长度必须在$minLength到$maxLength之间validate-pattern-$RegExp 通过自定义正则表达式$RegExp来验证输入域的正确性 vaidate-patter n-/a/givalidate-chinese 只能是中文(以下为中国的相关验证)validate-phone 有效的电话validate-mobile-phone 有效的手机号validate-id-number 验证是否有效的身份证号码validate-zip 验证邮政编码validate-qq 验证QQ号码8和RapidValidation配合实现前后台一致验证RapidValidation (/p/rapid‐validation/) 是专注于前台的验证框架, 例如下面的例子:<!-- 为form增加required-validate class,标识需要验证form --><form id='helloworld' action="#" class='required-validate'> helloworld:</br><!--通过class添加验证: required表示不能为空,min-length-15表示最小长度为15 --><textarea name='content' class='requiredmin-length-15'></textarea></br><input type='submit' value='Submit'/><input type='reset' value='Reset'/></form>其对应的后台验证规则为:@FormValidator(input="index",value=" content,helloworld,required min‐length‐15”)请注意比较异同, 不同部分已经以红色粗体进行了区分, 相同部分则以绿色粗体标识.大家可以看到, 两者很容易就实现了一致的前后台验证规则.相关的说明文档请访问: /p/rapid‐framework/wiki/rapid_validation , 另外本项目也提供了一份完整文档的转载, 包含详细的规则说明文档和整合步骤:(http://struts‐/files/Javascript_RapidValidation.pdf ).9如何扩展验证规则要扩展验证只需要实现IValidator即可即可, 并将实现类放入包 common.quickvalid.validators下. 下面是IValidator接口定义:package common.quickvalid.validators;import java.util.Map;/***所有验证器的抽象接口.*@author beansoft*日期:2009-12-20*/public interface IValidator {/***实现验证方法.*@param fieldName字段name*@param fieldDescription出错时的字段描述信息*@param params参数列表<String key, String[] values>表单参数Map *@param args参数列表*@return验证信息,为空时表示没有任何出错信息,通过验证*/public String doValidation(String fieldName, String fieldDescription, Map<String, String[]> params, String... args) ;/***获取验证器本身的参数列表.*@return*/public String[] getArgs();/***设置验证器本身的参数列表*@param args-一个或者多个参数,允许为null*/public void setArgs(String[] args);/***获取原始表达式.*@return*/public String getExpression();/***设置原始表达式,用于日期,正则等验证方式,避免和-号冲突.*@param Expression*/public void setExpression(String expression);}在实践中, 已经提供了几种比较常见的实现类的抽象基类, 它们是:BaseValidator, 抽象的验证器实现, 仅实现了 setter和getter;BaseRegexValidator(继承自BaseValidator), 基于正则表达式验证的基类; BaseTwoNumberValidator(继承自BaseValidator), 提供基于两个数字规则的验证, 可获取两个参数(含‐号).类名有一定规则, 将第一个减号替换为下划线即可, 例如:float-range-$minLength-$maxLength 对应的类名是: length_range.下面则给出一些实现类, 供参考:手机号的验证:package common.quickvalid.validators;/***手机号验证*TODO更多号段的支持?*@author beansoft**/public class validate_mobile extends BaseRegexValidator {@Overridepublic String getMessage() {return"只能输入正确的手机号码,如:138********";}@Overridepublic String getRegEx() {return"(^0?[1][35][0-9]{9}$)";}}数字范围的验证:package common.quickvalid.validators;import java.util.Map;/***表单域取值浮点数验证*@author beansoft**/public class float_range extends BaseTwoNumberValidator {public String doValidation(String fieldName, String fieldDescription,Map<String, String[]> params, String... args) { super.setParams(params);String value = getValue(fieldName);super.parseTwoNumberArgs();//重新分析=args// 非空时进行验证if(value != null && value.length() > 0) {boolean result = false;try {(Double.parseDouble(value) <=resultDouble.parseDouble(args[0])) ||(Double.parseDouble(value) >Double.parseDouble(args[1]));} catch(Exception ex) {return fieldDescription + "的输入值不是有效的数字";}if(result) {return fieldDescription + "的输入值" + value + "应该为" + args[0] + "到" + args[1] + "之间的数字";}}return null;}}10下一版本开发计划z将验证规则表达式解析和执行部分独立出来作为核心引擎z兼容JDK 1.4 并提供独立调用的接口z提供Struts 1下的插件机制z提示文字国际化z增强前台验证, 提供时分秒的验证功能如果您对本项目有兴趣, 欢迎加入.。
简单的数据验证及自定义验证规则
![简单的数据验证及自定义验证规则](https://img.taocdn.com/s3/m/e77527210166f5335a8102d276a20029bd6463ed.png)
简单的数据验证及⾃定义验证规则⽅法⼀: 此⽅法是在Action的execute()⽅法中使⽤super.addFieldError("", "姓名不能为空 !");将验证过后的错误信息保存下来(查源码知道, 保存在Map<List(User)>中), 然后转发到页⾯进⾏验证展⽰.此⽅法的缺点: Action中的代码量会⼤⼤增加!具体实现: 为空验证UserAction.java:// 为空验证if (user.getName() == null || "".equals(user.getName())) {super.addFieldError("", "姓名不能为空 !");flag = false;}if (user.getAge() == null) {super.addFieldError("user.age", "年龄不能为空 !");flag = false;}if (user.getSalary() == null) {super.addFieldError("user.salary", "⼯资不能为空 !");flag = false;}if (user.getDate() == null) {super.addFieldError("user.date", "⽣⽇不能为空 !");flag = false;}struts.xml:package name="user" namespace="/" extends="struts-default"><action name="user" class="erAction"><result>user_show.jsp</result><result name="input">user_insert.jsp</result></action></package>user_insert.jsp:<!-- 说明: value="<s:property value="" />", 添加这个是为了在验证为空过后保留⽤户输⼊的信息 <s:property value="fieldErrors[''][0]" />, 这个是验证的错误信息展⽰--><form action="user.action" method="post">姓名: <input type="text" name="" value="<s:property value="" />" /> <s:property value="fieldErrors[''][0]" /> <br>年龄: <input type="text" name="user.age" value="<s:property value="user.age" />" /> <s:property value="fieldErrors['user.age'][0]" /><br> ⼯资: <input type="text" name="user.salary" value="<s:property value="user.salary" />" /> <s:property value="fieldErrors['user.salary'][0]" /> <br>⽣⽇: <input type="text" name="user.date" value="<s:property value="user.date" />" /> <s:property value="fieldErrors['user.date'][0]" /><br> <br><input type="submit" value="提交" /><input type="reset" value="重置" /></form>测试:⽅法⼆: 使⽤struts2框架提供的validate()⽅法进⾏验证此⽅法是针对在接收数据之后进⾏验证, ⽽如果想要在接收数据之前进⾏验证, 就使⽤验证框架进⾏验证(见⽅法三).在Action中重写validate()⽅法:// 不需要判断标识flag, 此⽅法⼀旦发现有错误, 就⾃动跳转到到input所映射的路径中去,// 如果没有错误, 那么就执⾏return ActionSupport.SUCCESS;@Overridepublic void validate() {// 为空验证if (user.getName() == null || "".equals(user.getName())) {super.addFieldError("", "姓名不能为空 !");}if (user.getAge() == null) {super.addFieldError("user.age", "年龄不能为空 !");}if (user.getSalary() == null) {super.addFieldError("user.salary", "⼯资不能为空 !");}if (user.getDate() == null) {super.addFieldError("user.date", "⽣⽇不能为空 !");}super.validate();}@Overridepublic String execute() throws Exception {// 根据flag结果跳转, 这⾥的代码量变少return ActionSupport.SUCCESS;}测试:⽅法三: 使⽤struts2的框架规则进⾏验证操作从struts2的jar包: \apps\struts2-portlet-2.1.8.1.war\WEB-INF\classes中找到validators.xml⽂件, 此⽂件是struts2的框架验证规则,validators.xml:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator Config 1.0//EN""/xwork/xwork-validator-config-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="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"/> </validators>此时UserAction.java中不需要validate()⽅法, UserAction.java:@SuppressWarnings("serial")public class UserAction extends ActionSupport {private User user = new User();@Overridepublic String execute() throws Exception {// 根据flag结果跳转return ActionSupport.SUCCESS;}public User getUser() {return user;}public void setUser(User user) {er = user;}}在与UserAction.java同级包下创建: UserAction-validation.xml找到\apps\struts2-portlet-2.1.8.1.war\WEB-INF\classes\org\apache\struts2\portlet\example⽬录下的FormExample-formExamplePrg-validation.xml⽂件, 拷贝如下内容:<field name="firstName"> <field-validator type="requiredstring"> <message>You must enter a first name</message> </field-validator></field>进⾏修改: 修改之后的UserAction-validation.xml:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator Config 1.0//EN""/xwork/xwork-validator-config-1.0.dtd"><validators> <field name=""> <field-validator type="requiredstring"> <message>姓名不允许为空!</message> </field-validator> </field> <field name="user.age"> <field-validator type="requiredstring"> <message>年龄不允许为空!</message> </field-validator> <field-validator type="int"> <message>年龄必须是整数!</message> </field-validator> </field> <field name="user.salary"> <field-validator type="requiredstring"> <message>⼯资不允许为空!</message> </field-validator> <field-validator type="double"> <message>⼯资必须是数字!</message> </field-validator> </field> <field name="user.date"> <field-validator type="requiredstring"> <message>⽣⽇不允许为空!</message> </field-validator> <field-validator type="date"> <message>⽣⽇必须是⽇期!</message> </field-validator> </field></validators>user_insert.jsp不需要修改:<form action="user.action" method="post">姓名: <input type="text" name="" value="<s:property value="" />" /> <s:property value="fieldErrors[''][0]" /> <br>年龄: <input type="text" name="user.age" value="<s:property value="user.age" />" /> <s:property value="fieldErrors['user.age'][0]" /><br> ⼯资: <input type="text" name="user.salary" value="<s:property value="user.salary" />" /> <s:property value="fieldErrors['user.salary'][0]" /> <br>⽣⽇: <input type="text" name="user.date" value="<s:property value="user.date" />" /> <s:property value="fieldErrors['user.date'][0]" /><br> <br><input type="submit" value="提交" /><input type="reset" value="重置" /></form>测试: 直接保持为空, 提交的结果页⾯, 后台报错:报错信息:Caught exception while loading file org/lxh/struts2demo/action/UserAction-validation.xmlConnection timed out: connect - [unknown location]发现⽂件头的dtd版本不对, 换版本之后:以前的版本:<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator Config 1.0//EN""/xwork/xwork-validator-config-1.0.dtd">现在的版本:<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.0.2//EN""/xwork/xwork-validator-1.0.2.dtd">再次测试:填写两个属性, 再测试: 报错了此时要想显⽰⽤户⾃定义的验证错误的信息, 就要针对每⼀个Action定义个*.properties资源⽂件,在UserAction.java的同级包下创建UserAction.properties:注意: 这个资源⽂件的格式要固定写成: invalid.fieldvalue.字段名称 = 内容# 年龄必须是整数er.age = \u5E74\u9F84\u5FC5\u987B\u662F\u6570\u5B57!# ⼯资必须是数字er.salary = \u5DE5\u8D44\u5FC5\u987B\u662F\u6570\u5B57!# ⽣⽇必须是⽇期格式(yyyy-MM-dd)er.date = \u751F\u65E5\u5FC5\u987B\u662F\u65E5\u671F\u683C\u5F0F(yyyy-MM-dd)再次测试: 发现提交不过去了, ⽽且后⾯的提⽰信息根本不对这是struts2.1.8造成的bug, 在struts2.0中不会出现这个问题.范例: 限制输⼊的长度范围修改: UserAction-validation.xml, 把为空验证放在最后, 但还有有问题<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.0.2//EN""/xwork/xwork-validator-1.0.2.dtd"><validators><field name=""><field-validator type="stringlength"><param name="minLength">6</param><param name="maxLength">10</param><message>姓名的长度应该在${minLength}-${maxLength}之间!</message></field-validator><field-validator type="requiredstring"><message>姓名不允许为空!</message></field-validator></field><field name="user.age"><field-validator type="int"><param name="min">1</param><param name="max">250</param><message>年龄必须在${min}-${max}之间!</message></field-validator><field-validator type="requiredstring"><message>年龄不允许为空!</message></field-validator></field><field name="user.salary"><field-validator type="double"><message>⼯资必须是数字!</message></field-validator><field-validator type="requiredstring"><message>⼯资不允许为空!</message></field-validator></field><field name="user.date"><field-validator type="date"><message>⽣⽇必须是⽇期!</message></field-validator><field-validator type="requiredstring"><message>⽣⽇不允许为空!</message></field-validator></field></validators>-----------------------------------------------------------------⾃定义的验证规则:⾃定义的验证规则包含以下⼏个内容:1. 验证规则的操作类;2. 在validators.xml中注册此规则;3. 编写使⽤此规则的验证的资源的配置⽂件: XxxAction-validation.xml 使⽤正则表达式时最⽅便的⼀种做法范例: 验证数字创建包org.lxh.struts2demo.validator, 此包下创建类RegexValidator.java public class RegexValidator extends FieldValidatorSupport {@Overridepublic void validate(Object arg0) throws ValidationException { System.out.println("***********" + arg0); // 做个测试}}修改UserAction-validation.xml:<field name="user.age"><!-- 编写⾃定义的验证规则 --><field-validator type="regex"><message>年龄必须是数字!</message></field-validator><field-validator type="requiredstring"><message>年龄不允许为空!</message></field-validator></field>在src下创建validators.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator Config 1.0//EN""/xwork/xwork-validator-config-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="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="regex" class="org.lxh.struts2demo.validator.RegexValidator"/></validators>测试: http://localhost:8080/Struts2.1Project/user_insert.jsp, 点提交控制台打印: ***********erAction@5e8fa0ec说明⾃定义的验证规则起作⽤了!继续修改RegexValidator.javaSystem.out.println("***********" + super.getFieldName() + " ---> "+ super.getFieldValue(super.getFieldName(), arg0));1> 保持年龄为空, 提交, 打印: ***********user.age ---> null2> 年龄输⼊20, 提交, 打印: ***********user.age ---> 34说明通过这两个⽅法可以获取属性名和属性值, 继续修改:String fieldName = super.getFieldName();String value = "" + super.getFieldValue(super.getFieldName(), arg0);if (!(value.matches("^\\d+$"))) { // 正则判断super.addFieldError(fieldName, arg0);}但是这样正则在action中就硬编码了, 希望添加⼀个变量接收正则表达式, 然后在配置⽂件中接收正则进⾏设置添加属性private String express;并⽣成getter/setter⽅法private String express;@Overridepublic void validate(Object arg0) throws ValidationException {String fieldName = super.getFieldName();String value = "" + super.getFieldValue(super.getFieldName(), arg0);if (!(value.matches(this.express))) {super.addFieldError(fieldName, arg0);}}UserAction-validation.xml<!-- 编写⾃定义的验证规则 --><field-validator type="regex"> <param name="express">^\d{1, 3}$</param> <message>年龄必须是数字!</message></field-validator>测试:。
08_struts2_表单验证
![08_struts2_表单验证](https://img.taocdn.com/s3/m/0b64d2c1bb4cf7ec4afed058.png)
* 要校验指定的方法通过重写validateXxx()方法实现, validateXxx()只会校验action中
方法名为Xxx的方法。其中Xxx的第一个字母要大写。
* 当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败
2、Action中
* 要继承ActionSupport
* 重写Validateable接口中的validate()方法 ,在该方法中完成验证
3、* 要进行验证:
* * 需求:
* * 用户名不能为null ,""
* * 密码不能为null, "" 并且密码的长度6-12之间
【3、配置验证的xml文件】
* 验证的xml文件的规范在xwork-core-2.1.6.jar包下的:xwork-validator-1.0.3.dtd
* 验证文件的命名
* 在这个校验文件中,对action中字符串类型的username属性进行验证,
首先要求调用trim()方法去掉空格,然后判断用户名是否为空
return "success";
}
public String test(){
System.out.println("test^^^^^^6");
return "success";
}
public String getUsername() {
return username;
【7、在xml中配置验证出错信息】
<result name="input">/validate/login.jsp</result>
Struts2校验器类型详解
![Struts2校验器类型详解](https://img.taocdn.com/s3/m/707a4619650e52ea55189847.png)
Struts2校验器类型详解一、Struts2内建校验器位于xwork-2.0.4.jar压缩包中(com.opensymphony.xwork2.validator.validators)有个文件default.xml ,该文件中定义了Struts2框架内建的校验器。
default.xml文件定义了常用的校验器类型。
首先搞清楚:struts2字段校验器与非字段校验器的区别字段校验器配置格式:<field name="被校验的字段"><field-validator type="校验器名"><!--此处需要为不同校验器指定数量不等的校验规则--><param name="参数名">参数值</param>....................<!--校验失败后的提示信息,其中key指定国际化信息的key--><message key="I18Nkey">校验失败后的提示信息</message><!--校验失败后的提示信息:建议用getText("I18Nkey"),否则可能出现Freemarker template Error--></field-vallidator><!-- 如果校验字段满足多个规则,下面可以配置多个校验器--></field>非字段校验器配置格式:<validator type="校验器名"><param name="fieldName">需要被校验的字段</param><!--此处需要为不同校验器指定数量不等的校验规则--><param name="参数名">参数值</param><!--校验失败后的提示信息,其中key指定国际化信息的key--><message key="I18Nkey">校验失败后的提示信息</message><!--校验失败后的提示信息:建议用getText("I18Nkey"),否则可能出现Freemarker template Error--></validator>非字段校验:先指定校验器:由谁来校验,来校验谁!字段校验器:先指定校验的属性:我来校验谁,由谁来校验!下面是对应在包中的类:<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"/></validators>二、各种类型校验器1、类型转换检验器:(1)非字段校验:<validator type="conversion"><param name="fieldName">myField</param><message>类型转换错误</message><param name ="repopulateField">true</param></validator>(2)字段校验:<field name="myField"><field-validator type="conversion"><message>类型转换错误</message><param name ="repopulateField">true</param></field-validator></field>fieldName:该参数指定检查是否存在转换异常的字段名称,如果是字段校验,则不用指定该参数。
Struts 结合 Validate框架验证详解
![Struts 结合 Validate框架验证详解](https://img.taocdn.com/s3/m/3acb4b165f0e7cd1842536de.png)
Field field,
ActionMessages errors,
Validator validator,
HttpServletRequest request) {
<!ELEMENT var-jstype (#PCDATA)>
这里我们就不一一讲解dtd文件了,这不是今天的重点,结合dtd和以上的xml文件可以一目了然的了解验证的结构,这里我们简单的讲述下一些元素和属性的作用:、
Global:着这里我们可以定义formset一些公用的属性或者对象;
</plug-in>
5. 接下来我们就开始做具体的验证了,我们看如下代码:
<form-validation>
<global></global>
<formset>
<constant>
<constant-name></constant-name>
<!ATTLIST form name CDATA #REQUIRED>
<!ELEMENT field (msg|arg|arg0|arg1|arg2|arg3|var)*> --在field中可以有o-n个msg|arg| var
<!ATTLIST field property CDATA #REQUIRED>
3. 在此基础上我们还必须自己定义一个xml文件。文件名可以任意命名,例如:validator.xm(同样他必须导入相应版本的dtd文件约束它),但是,文件必须创建在类加载器能够加载到得目录下,一般我们放在WEB-INF目录下;这个配置文件由我们自己编辑,描述使用哪种类型的验证模板来进行验证.
struts2框架特征
![struts2框架特征](https://img.taocdn.com/s3/m/386c6d5f58eef8c75fbfc77da26925c52cc59102.png)
struts2框架特征Struts2框架特征Struts2是一种流行的Java Web应用程序开发框架,其特征使其成为许多开发者的首选。
本文将介绍Struts2框架的特征,包括MVC 架构、强大的标签库、拦截器、数据验证、国际化支持以及灵活的配置等。
一、MVC架构Struts2采用了MVC(Model-View-Controller)架构,将应用程序的业务逻辑、数据模型和用户界面分离。
这种架构使开发者能够更好地组织代码、提高代码的可维护性,并能够更容易地进行代码重用和测试。
在Struts2中,Model代表数据模型,可以是POJO(Plain Old Java Object)或者是与数据库交互的实体类;View代表用户界面,通常是JSP页面;Controller则负责处理用户请求、调用业务逻辑,并将处理结果返回给用户。
二、强大的标签库Struts2提供了丰富的标签库,使开发者能够更轻松地构建用户界面。
这些标签库包括表单标签、数据展示标签、控制流标签等,可以大大简化页面开发的工作量。
例如,开发者可以使用Struts2的表单标签库来生成表单,并自动处理表单的数据绑定、验证和错误提示。
这样,开发者无需手动编写大量的HTML和JavaScript代码,能够更快速地完成表单开发。
三、拦截器Struts2的拦截器是其核心特性之一,可用于在请求到达Controller之前和之后执行一些通用的处理逻辑,如日志记录、权限验证、异常处理等。
开发者可以通过配置拦截器栈,将多个拦截器按照特定的顺序组合起来,实现复杂的请求处理流程。
拦截器的使用使得开发者能够将通用的处理逻辑从业务逻辑中分离出来,提高了代码的可维护性和重用性。
同时,Struts2还提供了许多内置的拦截器,如参数封装拦截器、文件上传拦截器等,方便开发者处理不同类型的请求。
四、数据验证在Web应用程序中,数据验证是一项重要的任务。
Struts2提供了强大的数据验证机制,开发者可以通过简单的配置实现对表单数据的验证。
Structs2框架技术简单介绍
![Structs2框架技术简单介绍](https://img.taocdn.com/s3/m/16b407d876eeaeaad1f33050.png)
优点
• 3. 强大的拦截器Struts2的拦截器是一个Action级别 的AOP,Struts2中的许多特性都是通过拦截器来实 现的,例如异常处理,文件上传,验证等。拦截器 是可配置与重用的,可以将一些通用的功能如:登 录验证,权限验证等置于拦截器中以完成一些Java Web项目中比较通用的功能。在我实现的的一Web 项目中,就是使用Struts2的拦截器来完成了系统中 的权限验证功能。
第一步 创建index.jsp
<html><head> <title>第一个Struts简单示例</title> </head> <body> <form action="user/HelloAction" method="post"> 请输入你的大名:<input type="text" name="username" /> <br> <input type="submit" value="提交" /> </form></body></html>
Structs2工作流程
• 此外,如果struts.xml文件中还定义了被请 Action的一些拦截器,那么该Action实例被 调用前后,这些拦截器也会被先后执行。
Structs2工作流程
Structs2工作流程
• 第五步 Action对请求处理完毕以后将返回 一个逻辑视图,该逻辑视图将在struts.xml 文件相应的<result>元素中寻找相应的物理 视图,并返回给客户端 • <result name="success">/WEBINF/page/hello.jsp</result>
struts2常见面试题
![struts2常见面试题](https://img.taocdn.com/s3/m/c8fd15be760bf78a6529647d27284b73f342364f.png)
struts2常见面试题Introduction:Struts2是一种用于开发Java Web应用程序的开源Web应用框架。
在软件工程领域,Struts2常常是面试中的热门话题。
本文将介绍一些常见的Struts2面试题,并提供详细解答和示例。
Question 1: 什么是Struts2框架?它的主要特点是什么?Struts2是一个基于MVC设计模式的Web应用框架。
它通过集成多个核心组件(如拦截器、过滤器、表单验证等)提供了一套丰富的功能,用于简化开发和管理Java Web应用程序。
Struts2的主要特点包括:1. 松耦合:Struts2使用基于配置的方式来管理组件之间的依赖关系,降低了模块之间的耦合。
2. 灵活性:开发人员可以根据自己的需求进行扩展和定制,以适应不同的项目需求。
3. 可测试性:Struts2的组件松耦合特点使得单元测试变得容易,并且可以方便地模拟用户请求进行测试。
Question 2: Struts2的核心组件有哪些?Struts2的核心组件包括:1. Action:处理用户请求的核心组件,负责接收请求并执行相应的业务逻辑。
2. Interceptor:用于对请求进行预处理和后处理的拦截器组件。
3. Result:负责生成响应结果,可以是页面视图或其他格式的数据(如JSON、XML等)。
4. FilterDispatcher:负责将请求分发给合适的Action处理。
5. ValueStack:用于存储Action处理的结果数据,支持OGNL表达式以便于数据的访问和操作。
Question 3: 如何定义一个Struts2的Action?在Struts2中,可以通过以下几种方式来定义一个Action:1. 实现Action接口:通过实现Action接口,并提供相应的业务方法来处理请求。
2. 继承ActionSupport类:ActionSupport是一个提供了一些方便方法的抽象类,可以直接继承并实现自己的业务逻辑。
01、struts2(Struts2开发入门 、常用配置、参数传递) - 副本
![01、struts2(Struts2开发入门 、常用配置、参数传递) - 副本](https://img.taocdn.com/s3/m/d5001b53ce2f0066f5332288.png)
1. Struts2简介1.1. 什么是Struts21.1.1. Struts2的概念Struts2是轻量级的MVC框架,它主要解决了请求分发的问题,重心在于控制层和表现层。
轻量级,指的是Struts2具有较低的侵入性,就是它对我们业务代码的依赖程度很低,简单来说,在使用Struts2框架时,我们的业务代码中基本上不需要import它的包。
Struts2实现了MVC,满足了MVC设计思想。
在我们使用Struts2做开发的时候,就相当于使用了MVC,这是Struts2自动帮助我们实现的,是默认的、隐含的,我们不需要再写特别的代码来实现MVC了。
作为一个框架,Struts2提供了一系列的API,我们可以使用它们来简化代码的编写,从而提升开发效率。
这些API复用程度很高,对业务代码的依赖性也很小,甚至很多是Struts2自动调用的,因此在很大程度上,我们的开发变得可以复用。
Struts2解决请求分发的问题,我们会在后面为什么使用Struts2中讲解。
重心在控制层和表现层,是纵观整个Struts2理论课程来看的,从中我们会体会到这一点,随着大家对Struts2的逐步了解,届时我们再回顾这一点。
1.1.2. 什么是MVCMVC是代码的分层思想,是软件设计领域经典的设计模式。
它根据代码功能的不同,将一个软件的代码分为3部分,即模型、视图、控制器,这3部分代码的含义和功能如下。
1、M-Model 模型模型(Model)的职责是负责业务逻辑。
包含两层:业务数据和业务处理逻辑。
比如实体类、DAO、Service都属于模型层。
2、V-View 视图视图(View)的职责是负责显示界面和用户交互(收集用户信息)。
属于视图的组件是不包含业务逻辑和控制逻辑的JSP。
3、C-Controller 控制器控制器是模型层M和视图层V之间的桥梁,用于控制流程。
比如:在Servlet项目中的单一控制器ActionServlet。
struts2面试题
![struts2面试题](https://img.taocdn.com/s3/m/b50b6c3c178884868762caaedd3383c4bb4cb409.png)
struts2面试题Struts2是一个基于Java开发的Web应用程序框架,被广泛应用于企业级Java应用开发中。
在面试中,面试官可能会提出一些关于Struts2的问题,以评估应聘者的技术水平。
下面是一些常见的Struts2面试题及其详细答案,希望对你在面试中有所帮助。
1. 什么是Struts2?Struts2是一个轻量级的、基于MVC模式的Web应用程序框架。
它采用Java Servlet API和JavaServer Pages (JSP)技术,并提供了一种简单易用的方式来开发可维护和可扩展的Web应用程序。
2. Struts2的主要特性是什么?Struts2的主要特性包括:- MVC架构:将应用程序分为模型、视图和控制器,使开发更容易管理和扩展。
- 拦截器:通过拦截器可以在请求处理的各个阶段添加自定义的逻辑。
- 标签库:提供了丰富的标签库,简化了页面开发。
- 表单验证:提供了灵活且强大的表单验证机制,可以验证用户输入的数据。
- 国际化支持:支持多语言和本地化。
- 配置简单:通过配置文件来管理应用程序的行为。
3. Struts2的工作原理是什么?Struts2的工作原理如下:1) 客户端发送HTTP请求到服务器。
2) 服务器将请求交给Struts2的过滤器(Filter)。
3) 过滤器通过配置文件找到对应的Action,并调用相应的方法。
4) Action处理请求,并返回一个结果页面的名称或一个结果对象。
5) 结果页面的名称通过配置文件进行映射,服务器将其发送给客户端。
4. 什么是Struts2中的Action类?Action类是Struts2框架中的核心组件,用于处理Web请求。
一个Action类对应一个业务功能,其包含了要执行的方法和数据。
它负责接收请求、处理业务逻辑、将结果返回给前端页面。
5. Struts2中的拦截器是什么?有哪些内置的拦截器?拦截器是Struts2中的组件,用于在请求处理的各个阶段添加自定义的逻辑。
Struts2详细实例教程
![Struts2详细实例教程](https://img.taocdn.com/s3/m/6cf79635eefdc8d376ee32d6.png)
Struts2(上)一、经典的MVC模式二、Struts1.x对MVC的实现三、Struts1.x的主要组件和作用组件作用ActionServlet 中央控制器Action 分控制器,调用JavaBean实现业务逻辑,Action可以分为Action、DispatchAction等不同类型ActionForm 封装参数,实现服务器验证,文件上传等Forward 转发到目的地,可以是JSP,也可以是另一个ActionStruts-config.xml 配置文件,配置有ActionForm,Action,Forward等,通过XML解析,然后使用反射技术使用该文件Struts标签库和JSTL类似,和Struts-config.xml、ActionForm、Action等对象可以紧密集成四、Struts1.x 开发实例-登录程序见案例。
五、Struts2(WebWork)的MVCStruts2的MVC架构六、Struts2的主要组件组件作用FilterDispatcher 起中央控制器作用的过滤器Action 处于Model层的Action,调用JavaBean实现业务逻辑struts.xml 核心配置文件,配置有Action、Result等result 和forward类似,转发的目的地,支持多种视图技术。
七、Struts2的实例-登录在MyEclipse环境中建立一个新的web工程,名称“Struts2Login”,存放路径“f:\Struts2Login”。
在Struts2.0.11版本中找到war包struts2-blank-2.0.11.war,解开该war包,在WEB-INF/lib 目录下复制出所有的jar包,这些jar包就是一个Struts2程序所需要的基础jar包,把它们复制到新建的web工程的WEB-INF/lib目录中。
在src目录下建立一个类,包名mypack,类名UserAction,其代码如下:package mypack;import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport {private String username;private String userpass;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getUserpass() {return userpass;}public void setUserpass(String userpass) {erpass = userpass;}@Overridepublic String execute() throws Exception {if ("Mike".equals(username) && "123".equals(userpass)|| "张三".equals(username) && "abc".equals(userpass))return "success";elsereturn "error";}}在src目录下建立Struts2的配置文件struts.xml,内容如下:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><!-- 定义包管理配置的action 继承struts-default.xml中的配置 --><package name="actions" extends="struts-default"><!-- 定义Action(login.action) --><action name="login" class="erAction"><!-- 定义转发路径对应的字符串名 --><result name="success">/Success.jsp</result><result name="error">/Error.jsp</result></action></package></struts>修改web.xml,在其中加入一个过滤器,过滤/*路径。
Struts2介绍
![Struts2介绍](https://img.taocdn.com/s3/m/f3010a2fee06eff9aef807da.png)
Struts2集成指南关于Struts2Struts是Apache软件基金会(ASF)赞助的一个开源项目。
它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。
它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller〔MVC〕设计模式的应用框架〔Web Framework〕,是MVC经典设计模式中的一个经典产品。
Struts,a history在Java EE的Web应用发展的初期,除了使用Servlet技术以外,普遍是在JavaServer Pages(JSP)的源代码中,采用HTML与Java代码混合的方式进行开发。
因为这两种方式不可避免的要把表现与业务逻辑代码混合在一起,都给前期开发与后期维护带来巨大的复杂度。
为了摆脱上述的约束与局限,把业务逻辑代码从表现层中清晰的分离出来,2000年,Craig McClanahan采用了MVC的设计模式开发Struts。
后来该框架产品一度被认为是最广泛、最流行JAVA的WEB应用框架。
Craig McClanahan2006年,WebWork与Struts这两个优秀的Java EE Web框架(Web Framework〕的团体,决定合作共同开发一个新的,整合了WebWork与Struts优点,并且更加优雅、扩展性更强的框架,命名为“Struts 2”,原Struts的1.x版本产品称为“Struts 1”。
至此,Struts项目并行提供与维护两个主要版本的框架产品——Struts 1与Struts 2。
Struts1 vs. Struts2侵入性Struts 1在编程方面是面向抽象类编程,而不是面向接口编程。
Struts 1要求自定义Action 类继承一个特定的抽象基类Action。
另一方面,Struts 1的 Action 依赖于 Servlet API,因为Struts 1 Action 的execute 方法中有HttpServletRequest 和HttpServletResponse 方法。
如何自定义Struts2表单验证后的错误信息显示格式
![如何自定义Struts2表单验证后的错误信息显示格式](https://img.taocdn.com/s3/m/98e6e5125f0e7cd1842536f9.png)
如何自定义Struts2表单验证后的错误信息显示格式/样式(s:fielderror,换行,黑点)前面一段时间学过一些Struts2的知识,感觉Struts2和1.x还是有很大的差别的,我还不好说1.x肯定会过时还是2.0会很快流行,这毕竟是需要作为导向的。
在Struts2中验证真的比较容易,可以在Action中直接写validate,也可以使用validate框架进行验证,这个我觉得比Struts1.x方便了很多,但是有个问题一直困扰了我,直到现在有个小程序要用到这个方面的知识,那就是验证后如何很好地人性化地在jsp 页面中显示了。
大家都知道,Struts2显示验证结果有一些方式,一般通过两种方式,介绍如下:1.在页面的上面或者某个位置全部显示错误代码:<s:fielderror cssStyle="color: red"></s:fielderror>这样会显示所有的错误信息,模拟效果如下:2.在每个字段下面或上面显示,通过<s:fielderror cssStyle="color: red"><s:param>XXX(标签的name属性,象ername)</s:param> </s:fielderror>例:用 戶 名:<input type="text"name="ername"/><s:fielderror cssStyle="color: red"><s:param>ername</s:param></s:fielderror>显示效果如下:上面的差不多是Struts默认显示的两种方式,但是我们常见的显示方式并不是这样的,所有我们需要自定义这种格式,我们的习惯是把错误信息显示在某个出错字段的后面,一行显示,而它给了一个小黑点并且换了行,我们现在就来解决这个问题。
Struts2框架校验文件自动生成技术
![Struts2框架校验文件自动生成技术](https://img.taocdn.com/s3/m/c09ae735376baf1ffc4fad66.png)
d o i : 1 0 . 3 9 6 9 / j . j s s n . 1 6 7 3 — 6 2 9 X. 2 0 0 3 . 0 1 . 0 1 5
Aut o ma t i c Ge ne r a t i o n Te c hn o l o g y o f Va l i d a t i o n Fi l e 0 f St r ut s 2 Fr a me wo r k
p i l e or f We b p a g e s e r v e r or f t h e S t r u t s 2 f r a me wo r k, s t u d y t h e t e c h n o l o g y t h a t p u t p a g e s d a t a s e t i n t o t h e t a b l e s . a u t o ma t i c a l l y g e n e r a t e v a l i d a t i o n . X I / 1 1 b y t h e a p p l i c a t i o n p r o g r a m. On t h e b a s i s o f t h e S t r u t s 2 i n p u t v a e s i g n he t s t r u c t u r e o f t wo t a b l e s, t h e”
件, 提高 了软 件 开发劳 动生 产率 , 同时, 自动生成 技术 也 是软 件工程 未来 重要 的研 究方 向 。
关键 词 : S t r u t s 2 ; 校验 文件 ; v a l i d a t i o n . x m l ; 自动 生成 技术
中图分 类号 : T P 3 1 1 文献标 识码 : A 文章 编号 : 1 6 7 3 - 6 2 9 X( 2 0 1 3 ) O 1 — 0 0 5 9 — 0 4
第七章 MVC框架技术Struts2
![第七章 MVC框架技术Struts2](https://img.taocdn.com/s3/m/bbbce50c79563c1ec5da7108.png)
本章要点
Struts2配置及应用程序原理 Action的设计方法与结果类型 服务器端的输入验证 Struts2国际化、标签库和OGNL表达式 拦截器、文件上传和下载
7.1 Struts2概述
Struts框架的历史
• Struts在经历了1.x的若干版本后,最终发展 到2.0版本,也就是我们常说的Struts2。它是 Struts和WebWork相互结合的产物,代表了 WEB框架的最新技术和规范。本书中Struts2 的内容以最新的Struts2.2.3版本为准。
7.3 输入验证
使用validate()方法
• 要进行输入验证,Action类要继承ActionSupport,并重写 validate()方法。 • 当请求Action的时候,请求中的参数会自动去填充Action的模型 中的同名属性,如果能够从字符串自动转换成相应的Java数据类 型,则转换成功,否则会抛出异常。如果类型转换成功,则填充 属性,并在调用业务方法前,执行validate()方法来判断所有输 入数据的合法性,例如长度是否够,是否是空值等。 • 输入验证可以针对不同的业务方法,例如,对登录进行输入验证, vaidate()方法可以命名成validateLogin()。如果同时有 validate()方法,执行的顺序是先调用validateLogin(),再调用 validate(),前面的方法验证没通过,后面的方法不再执行。
此外,还有SessionAware、ServletResponseAware、 ServletRequestAware、ParameterAware等接口。
多方法的Action
• 前面所定义的Action都是通过execute()方法处理请求。在实际 的应用中,如果为每个业务逻辑定义一个Action,虽然实现方便, 但是Action数量多,struts.xml中需要配置的内容也多,使系统 非常庞杂。实际上,可以用一个Action处理多个业务请求。 • 以YbUserAction为例,可以为每个操作定义一个方法,这些方法 的格式和execute()方法一样。
尚学堂Struts2_02
![尚学堂Struts2_02](https://img.taocdn.com/s3/m/15fba6faf61fb7360b4c6549.png)
<param name=“excludeMethods”>m1,m2</param> <param name="includeMethods">m2</param>
</interceptor-ref> </action> 如果不指定excludeMethods和includeMethods,则所有方法都会被截拦器 截拦. 如果方法在excludeMethods和includeMethods都配置了,则 includeMethods取胜. 如果需要过滤多个方法,方法名之间用逗号隔开.
版权所有:尚学堂科技
尚学堂
手把手教程
Struts+Hibernate+Spring
HttpServletRequest
HttpServletResponse
核心控制器
Intercepter1
Intercepter2
Intercepter3
Action
Result
版权所有:尚学堂科技
尚学堂
手把手教程
版权所有:尚学堂科技
尚学堂Βιβλιοθήκη 手把手教程Struts+Hibernate+Spring
Struts2拦截器——工作原理
拦截器的执行过程是一个递归的过程,越是位于前面的拦截器越被先执行 ,但也是越晚退出。因此,拦截器的调用处理形成了“先进后出”的堆栈 的模式,因此也叫拦截器栈。
版权所有:尚学堂科技
尚学堂
Struts+Hibernate+Spring
Struts2拦截器——作用及意义 早期MVC框架将一些通用操作写死在核心控制器中,致使框 架灵活性不足、可扩展性降低 Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选 择和组合,增强了灵活性,有利于系统的解耦 截拦器是Struts2中最重要的概念之一,是Struts2灵魂。 Struts2中有80%的功能都通过截拦器实现 提高更高层次的解耦,无须侵入框架本身 便可以添加新的功 能.
struts2
![struts2](https://img.taocdn.com/s3/m/de3e718083d049649b665831.png)
一、Struts2入门1.概念什么是Struts2Struts2 是一个用来开发 MVC 应用程序的框架.它提供了 Web 应用程序开发过程中的一些常见问题的解决方案:对页面导航活动进行管理对来自用户的输入数据进行合法性验证统一的布局可扩展性国际化和本地化支持 Ajax表单的重复提交Struts2 VS Struts1Struts2与Struts1 相比,在体系结构方面更优秀,具体表现在类更少,更高效,扩展更容易等。
struts2 不是从 Struts1 扩展而来的, 说它是一个换了品牌标签的 WebWork 更合适。
2.程序Struts2 核心就是一个 Filter,该Filter会对所有的请求进行拦截(/*) StrutsPrepareAndExecuteFilterStrutsPrepareFilter + StrutsExecuteFilterStruts2 将所有的请求拦截下来,具体去访问哪个java类的方法需要读取配置文件 struts.xmlstruts.xml 文件需位于工程的类路径下实现一个 Struts 的 HelloWorld 程序1) 将 %struts2-blank例子%\WEB-INF\lib 目录下所有jar包拷贝至 webproject\WEB-INF\lib 中拷贝至webproject/WEB-INF/web.xml 中3) %struts2-blank例子%\将WEB-INF\classes 下的struts.xml 文件拷贝至工程src下清空 <struts></ struts> 标签之间的内容4) 新建 Action 实例, HelloWorldAction.javaAction可以不必是实现任何接口,它是一个普通java类(pojo),从这点可以看出 Struts2 是非侵入式设计,Action可以不依赖struts和Servlet 而独立存在Action中至少需要定义一个方法,且方法的返回值类型必须为Stringpublic String sayHello() {return "success";}6) 在 WEB-INF 下新建jsp页面hello.jsphello动手练习:用 struts2 实现最简单的mvc二、Struts2 细节1.package 元素配置action的组织包name:配置包名,用于被继承namespace: 配置访问路径以 /a/b/c/action 为例搜索action的顺序为 /a/b/c -- /a/b -- /a -- /extends: 指定继承的包2. action 元素1) name属性配置action的访问名称后缀默认为 action和””可以通过常量进行配置<constant name="struts.action.extension" value="do"></constant>2) class属性配置action对应的java类,必须为完整类名如果继承struts-default 包,默认class 为ActionSupport,该类的 execute方法默认返回 success我们在写 Action 类时通常会选择继承ActionSupport,也就自动继承了 execute 方法,同时可以使用父类定义的常量 SUCCESS、ERROR 等3) method属性配置action的访问方法名,默认访问execute方法4) 通配符映射一个 Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系通配符的映射规则●若找到多个匹配, 没有通配符的那个将胜出●若指定的Action不存在, Struts 将会尝试把这个URI与任何一个包含着通配符 * 的Action名及进行匹配●若 Struts 找到的带有通配符的匹配不止一个, 最后一个匹配将胜出●被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…{0} 匹配整个 URI●* 可以匹配零个或多个字符, 但不包括 / 字符. 如果想把 / 字符包括在内, 需要使用 **. 如果需要对某个字符进行转义, 需要使用 \.例:<action name="*_add" class="cn.itcast.action.Girl" method="add"></action>匹配路径 Boy_add.action Girl_add.action<action name="Boy_*_*" class="cn.itcast.action.Boy" method="{1}"><result name="success"><param name="location">/WEB-INF/jsp/{2}.jsp</param></result></action>Boy_add_delete 会调用 Boy的add方法,转发给 delete.jsp5) 动态方法调用通过 url 动态调用 Action 中的方法<action name="Boy" class="cn.itcast.action.Boy">/strutsdemo/Boy!add.action 会调用Boy类的add方法默认情况下, Struts 的动态方法调用处于激活状态, 若想禁用该功能, 则可以在 struts.xml 文件中配置常量3. Action 类概念:action: 应用程序可以完成的每一个操作(用户的一个动作) 例如:显示一个登陆表单,保存商品信息Action类:Struts2中的Action是pojo(Plain Old Java Objects一个普通的java类)的,可以定义属性和方法,但需要遵循一些规则:●属性的名字必须遵守与 JavaBeans 属性名相同的命名规则. 属性的类型可以是任意类型. 从字符串到非字符串(基本数据库类型)之间的数据转换可以自动发生●必须有一个不带参的构造器●至少有一个供 struts 在执行这个 action 时调用的方法,方法的返回值为String类型(即视图名称)●同一个 Action 类可以包含多个 action.●Struts2 会为每一个 HTTP 请求创建一个新的 Action 实例4. result 元素配置 action 的执行结果name: 配置result结果名称,根据action执行方法的返回值决定找那个 result默认为 successtype: result 结果类型,默认为 dispatcher 类型常用的result类型●dispatcherdispatcher 结果类型是最常用的结果类型, 也是 struts 框架默认的结果类型用于将控制权转发给web应用中的其他资源默认参数:location 用于指定转发的资源路径,通常为一个jsp页面●redirect用于将响应重定向到另一个资源参数:location : 指定重定向的资源路径parse : 指定是否将location的值视为一个 OGNL 表达式来解析默认值为true●redirectAction用于将响应重定向给另一个Action参数:actionName : 指定目标action, 该属性为默认属性namespace : 指定目标 action 所在的 package●chain用于构成一个 Action 链,前一个action将控制权转发给下一个action,并且前一个action的状态在后一个action中继续保持参数:actionName : 指定目标action, 该属性为默认属性namespace : 指定目标 action 所在的 packagemethod :指定调用action的方法,默认调用 execute 方法●httpheader用于将把一个 HTTP 状态发送到浏览器默认参数 status :指定状态码●plaintext将转发的资源作为文本输出 , 不常用。
struts2注解方式的验证
![struts2注解方式的验证](https://img.taocdn.com/s3/m/adbc14fa6394dd88d0d233d4b14e852458fb39d0.png)
struts2注解⽅式的验证struts2的验证分为分编程式验证、声明式验证、注解式验证。
因现在的⼈越来越懒,都追求零配置,所以本⽂介绍下注解式验证。
⼀.hello world参考javaeye的这篇⽂章,按着做⼀次,起码有个初步印象Validation使⽤名字叫做validator的Intercepter,在默认情况下,struts2已经定义了这个Intercepter,我们在不加声明的情况下就可以使⽤Validation了如果是使⽤默认的拦截器,就已经开启了验证框架的了,直接⽤。
开启验证的⽅式是(官⽹):打开验证默认拦截器堆栈“defaultStack”已经打开验证。
在创建⾃⼰的拦截器堆栈⼀定要包括两对validation和workflow拦截器。
来⾃struts-default.xml:<interceptor-stack name="defaultStack">...<interceptor-ref name="validation"><param name="excludeMethods">input,back,cancel,browse</param></interceptor-ref><interceptor-ref name="workflow"><param name="excludeMethods">input,back,cancel,browse</param></interceptor-ref></interceptor-stack>从版本2.0.4开始,Struts为XWork的com.opensymphony.xwork2.validator.ValidationInterceptor拦截器提供了扩展。
struts2burp使用方法
![struts2burp使用方法](https://img.taocdn.com/s3/m/2c198e5ec381e53a580216fc700abb68a982addd.png)
标题:深度解析struts2burp的使用方法1.引言在网络安全领域中,渗透测试是一项不可或缺的任务。
而在渗透测试过程中,要对Web应用程序进行测试,就需要用到一些工具来检测和利用漏洞。
其中,struts2burp是一个非常重要的工具,它能够帮助渗透测试人员发现和利用Struts 2框架的漏洞。
2.简介struts2burpstruts2burp是Burp Suite的一个插件,它专门针对Struts 2框架进行渗透测试。
Struts 2框架是一个流行的开源Java Web应用程序框架,但它也因为一些漏洞而备受关注。
struts2burp的使用方法对于渗透测试人员来说是非常重要的。
3.核心功能在使用struts2burp时,首先需要了解它的核心功能。
它能够帮助用户主动识别Struts 2漏洞,并自动生成漏洞检测payload。
struts2burp还能够辅助用户进行Struts 2注入、执行任意命令和文件上传等攻击。
通过这些功能,渗透测试人员能够更有效地测试Web 应用程序的安全性。
4.使用方法通常情况下,使用struts2burp需要经过以下几个步骤:1) 安装Burp Suite:首先要确保已经安装了Burp Suite,并且安装了struts2burp插件。
2) 配置struts2burp:在Burp Suite中加载struts2burp插件,并进行相关配置。
3) 发现漏洞:使用struts2burp对目标应用程序进行漏洞扫描,发现Struts 2框架的漏洞。
4) 利用漏洞:根据漏洞的类型,使用struts2burp生成相应的payload,并进行测试。
5.个人观点作为一名网络安全工作者,我认为struts2burp是一款非常强大且实用的工具。
它能够帮助渗透测试人员快速发现和利用Struts 2框架的漏洞,提高渗透测试的效率和准确性。
在实际工作中,我也经常使用struts2burp来测试Web应用程序的安全性,它为我的工作提供了很大帮助。
struts2 实验报告
![struts2 实验报告](https://img.taocdn.com/s3/m/77ee6050dcccda38376baf1ffc4ffe473368fdac.png)
1.系统分析与设计1.1系统功能描述本系统是个非常简单的注册、登录系统。
本系统的实现是基于Struts2、Spring、Hibernate三个框架,系统功能单一,业务逻辑简单。
当用户注册信用户时,就是向系统中增加一个新用户,对应的数据库增加一条记录。
当用户输入注册信息时,系统提供了基本的输入验证判断用户输入是否合法,只有当用户输入满足基本输入要求时,才会被提交到实际的登录系统,进行实际的登录处理。
系统还使用了随机产生的图形验证码来防止刷新,防止用户通过单击浏览器的书安心按钮来重复注册多个用户。
系统还提供了一种Ajax方式来验证用户输入的注册名是否有效,系统要求所有的用户名不能重复。
故当用户输完用户名后,系统立即在页面上方提示用户该用户名是否可用,如果系统中没有该用户名,则系统提示该用户名可用;否则提示用户该用户名重复,用户必须重新选择用户名注册。
当用户注册一个新用户名之后,就可以使用系统的登录功能来登录系统了,用户输入登录用的用户名、密码后,系统一样提供了基本的输入校验。
除此之外,系统还采用了随机产生图形验证码来防止恶意用户的暴力破解,系统随机生成一个图形验证码,而用户登录必须输入图形验证码中显示的字符串,只有用户输入的字符串和系统随机生成的验证码字符相同时,系统才允许用户登录。
1.2系统功能流程处理用户注册的流程图东北大学软件学院实践考核类课程(四)实验报告1.3数据库设计ColumnNarneDatatppe HOTH ULLAUTOI NC :FlagsDefaultValue Commentuser_id|S>INT(11)✓ ✓_|UNSIGNED _|ZEROFELLEBBQ username 心.VARCH.4.R(50]_|BINARYQ user_pass VARCHAR(50] ✓_|BIN4RYQ emailVARCHAR(100]1BIN4RY相关的映射文件:<hibernate-mapping package ="org.reg_login.model"><class name ="User"table ="usertable"〉<id name ="id"column ="user_id"><generator class ="identity"/> </id ><property name ="user"column ="user_name"not-null ="true"length ="50"unique ="true"/><property name ="pass"column ="userpass"n ot-null ="true"C=3length ="50"/><property name ="email"length ="100"/></class></hibernate-mapping >一旦提供了上面的映射文件,Hibernate 就可以理解User 和user_table 之间的对应关系。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Struts2ValidatorStruts2验证框架Updated Jun 18, 2010 by cm2...@ Action配置中一定要设置input返回页面添加验证只要创建验证的xml文件1.创建xml文件名验证Action中全部方法在Action同包下,创建:Action类名-validation.xml如:ValidateAction创建ValidateAction-validation.xml验证Action中单个方法<!-- 每个方法单独配置一个Action --><!-- 在Action同包下,创建:Action类名-action方法配置名称-validation.xml --><action name="validateAdd"class="com.struts2.validator.ValidateAction" method="add"><!-- 要创建ValidateAction-validateAdd-validation.xml --><!-- 使用通配符配置 --><!-- 在Action同包下,创建:Action类名-action方法对应的名称-validation.xml --> <action name="validate_*"class="com.struts2.validator.ValidateAction" method="{1}"><!-- 要创建ValidateAction-validate_add-validation.xml,validate_add为访问这个action方法的路径 -->注意事项注意:1.要验证的方法不能叫input.2.这样配置在form表单中要在<s:form action="validate_add">中action写好名称,不能写action="validate_",然后<s:submit value="提交"method="add"/>这样会找不到对应的配置文件,跳过验证.3.如果验证出错,返回input页面时,那些存在ValueStack中的值会丢失,可以将Action实现Preparable接口,然后prepare()方法里初始化添加页面需要的值.4.如果使用Preparable接口,必须在action配置中添加<interceptor-refname="paramsPrepareParamsStack"/>.这样prepare()才能得到form提交的参数.2.创建xml内容<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator1.0.2//EN""/xwork/xwork-validator-1.0.2.dtd"><validators><!-- 要验证的字段名称 --><!-- 要验证Action中UserBean的id字段,name="userBean.id"(userBean为Action中的变量名) --><field name="mail"><!-- type要验证的类型,short-circuit(默认false),true含义,如果当前验证失败了,下面的验证就不执行了.如requiredstring失败了,email就不验证了. --> <!-- field-validator下面可以有多个param元素,但是最多只能有一个message --><field-validator type="requiredstring"><param name="trim">true</param><message>Please enter a mail</message></field-validator><field-validator type="email"><message>Invalid MAIL</message></field-validator></field></validators>Struts内建验证程序(type的值)required保证字段的值不是空值null.空字符串不是空值null.<field name="userName"><field-validator type="required"><message>Please enter a user name</message></field-validator></field>requiredstring保证字段不是空值null,也不是空白(empty).param:trim(boolean) ->true->去除前后空格<field name="userName"><field-validator type="requiredstring"><param name="trim">true</param><message>Please enter a user name</message> </field-validator></field><field name="password"><field-validator type="requiredstring"><param name="trim">false</param><message>Please enter a password</message> </field-validator></field>int验证字段值是否可以转换为一个整数.param: min(int);max(int)<field name="yeaar"><field-validator type="int"><param name="min">1999</param><param name="max">2010</param><message>year:1999-2010</message></field-validator></field>date验证给定日期字段的值是否在一个给定的范围内.param:max(date);min(date)<field name="borthday"><field-validator type="int"><!-- 格式取决于当前地理时区 --><param name="min">1999-01-01</param><param name="max">2010-01-01</param><message>birthday:1999-2010</message> </field-validator></field>email给定的String值是否是一个电子邮件地址<field name="email"><field-validator type="email"><message>Invalid email</message></field-validator></field>url给定的String值是否是一个合法的URL(要有前缀)<field name="url"><field-validator type="url"><message>Invalid URL</message></field-validator></field>expression,fieldexpression验证给定字段是否满足一个OGNL表达式.区别:expression 不是一个字段验证程序,失败时将生成一个动作错误.(JSP中调用<s:actionerror/>才显示出错信息)fieldexpression 是一个字段验证程序,失败时将抛出一个字段错误.(对字段验证)param:expression(String)OGNL表达式expression:public class ExpressionTestAction{//属性生成get,setprivate int min;private int max;}<validator type="expression"><param name="expression">max > min</param><message>Maximum temperature must be greater than Minimum temperature </message></validator><!-- jsp --><s:actionerror/>fieldexpression:public class FieldExpressionTestAction{//属性生成get,setprivate int min;private int max;}<!--对字段验证--><field name="max"><field-validator type="fieldexpression"><param name="expression">max > min</param><message>Maximum temperature must be greater than Minimum temperature </message></field-validator></field>visitor把同一个验证程序配置文件用于多个动作(对一个Bean写验证文件,每个使用的Action只要引用)//UserBeanpublic class UserBean{//属性get,setprivate String name;private int age;}//UserBean-validation.xml(和UserBean放在同一个包中)<field name="name"><field-validator type="requiredstring"><message>用户名必须</message></field-validator></field><field name="age"><field-validator type="int"><param name="min">18</param><param name="max">99</param><message>Age must be between 18and99</message></field-validator></field>//Action的validation.xml<!-- userBean变量名--><field name="userBean"><field-validator type="visitor"><!-- message会和UserBean验证中的message一起显示--><message>用户:</message></field-validator></field>如果另一个Action对UserBean使用另一个标准的验证,可以创建新的验证文件//UserBean-specific-validation.xml<!--和之前的验证不同--><field name="age"><field-validator type="int"><param name="min">30</param><param name="max">50</param><message>Age must be between 30and50</message></field-validator></field>//另一个Action的validation.xml<field name="userBean"><field-validator type="visitor"><!-- xml中扩展的名字,执行UserBean-specific-validation.xml的验证--> <param name="context">specific</param><message>用户1: </message></field-validator></field>conversion检查对某个属性进行类型转换是否会导致一个转换错误<field name="age"><field-validator type="conversion"><message>An age must be an integer.</message></field-validator></field>stringlength验证一个非空的字段值是不是足够的长度param:minLength(int);maxLength(int);trim(boolean)<field name="password"><field-validator type="requiredstring"><param name="minLength">6</param><param name="maxLength">14</param><message>length:6-14</message></field-validator></field>regex给定的值是否与一个给定的正则表达式匹配param:expression(String)正则表达式;caseSensitive(boolean)是否区别大小写,默认为true;trim(boolean)是否去除前后空格<field name="phone"><field-validator type="regex"><param name="expression"><![CDATA[\d\d\d\-\d\d\d\-\d\d\d\d]]></param><message>Invalid phone number or invalid format</message></field-validator></field>3.在action中验证利用Validateable接口实现验证,实现void validate()方法.ActionSupport类已经实现了这个接口//继承ActionSupportpublic class User extends ActionSupport{//属性get,setprivate String userName;private String password;private static List<String> userNames =new ArrayList<String>();static{userNames.add("harry");userNames.add("sally");}//验证方法public void validate(){if(userNames.contains(userName)){//添加出错信息addFieldError("userName","'"+userName +"' has been taken.");}}}4.自定义验证类要创建一个普通的验证程序(非字段验证程序),扩展ValidatorSupport类.验证失败要从validate 方法调用addActionError方法.要创建一个字段验证程序,扩展FieldValidatorSupport类.验证失败要从validate方法调用addFieldError方法.如果要能接受参数,要在类中定义一个相应的属性,并生成get,set.编写类public class StrongPasswordValidator extends FieldValidatorSupport{ //属性private int minLength =-1;public void setMinLength(int minLength){this.minLength = minLength;}public int getMinLength(){return minLength;}//验证方法public void validate(Object object)throws ValidationException{ String fieldName = getFieldName();String value =(String) getFieldValue(fieldName,object);if(value ==null|| value.length()<=0){// use a required validator for thesereturn;}if((minLength >-1)&&(value.length()< minLength)){addFieldError(fieldName,object);}else if(!isPasswordStrong(value)){addFieldError(fieldName,object);}}private static final String GROUP_1 ="abcdefghijklmnopqrstuvwxyz";private static final String GROUP_2 ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";private static final String GROUP_3 ="0123456789";protected boolean isPasswordStrong(String password){boolean ok1 =false;boolean ok2 =false;boolean ok3 =false;int length = password.length();for(int i =0; i < length; i++){if(ok1 && ok2 && ok3){break;}String character = password.substring(i, i +1);System.out.println("character:"+ character);if(GROUP_1.contains(character)){ok1 =true;continue;}if(GROUP_2.contains(character)){ok2 =true;continue;}if(GROUP_3.contains(character)){ok3 =true;}}return(ok1 && ok2 && ok3);}}注册xml在src下创建validators.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator Config 1.0//EN""/xwork/xwork-validator-config-1.0.dtd"><validators><!-- 名称(type对应值),类路径 --><validator name="strongpassword"class="com.validator.StrongPasswordValidator"/></validators>使用验证<field name="password"><field-validator type="strongpassword"><param name="minLength">8</param><message>Password must be at least 8 characters longand contains at least one lower case character,one upper case character, and a digit.</message></field-validator> </field>。