struts封装请求、类型转换、数据验证

来源:互联网 发布:python 命令 编辑:程序博客网 时间:2024/05/03 06:24

一、封装请求到正文对象中(非常重要)

分为静态参数封装、动态参数封装有三种形式

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><constant name="struts.devMode" value="true"/><package name="p1" extends="struts-default"><!-- 静态参数封装的的配置 一般不用--><action name="action1" class="com.itheima.web.action.Demo1Action" method="addUser"><!-- 当我们不写任何拦截器时,默认的拦截器栈defaultStack它来为我们工作。 但是,只要写了任何一个拦截器,默认的就全都不起作用了 --><!-- 使用注入的方式,给动作类的中的参数赋值 --><param name="username">张三</param><param name="age">18</param></action><!-- 动态参数封装的第一种形式的配置 --><action name="action2" class="com.itheima.web.action.Demo2Action" method="addUser"></action><!-- 动态参数封装的第二种形式的配置 --><action name="action3" class="com.itheima.web.action.Demo3Action" method="addUser"></action><!-- 动态参数封装的第三种形式的配置 --><action name="action4" class="com.itheima.web.action.Demo4Action" method="addUser"></action></package></struts>
package com.itheima.web.action;import com.opensymphony.xwork2.ActionSupport;/** * 静态参数封装 * @author zhy * */public class Demo1Action extends ActionSupport {private String username;private int age;public String addUser(){System.out.println(username+","+age);return null;//不返回任何结果视图   NONE常量}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
package com.itheima.web.action;import com.opensymphony.xwork2.ActionSupport;/** * 动态参数封装,第一种情况: * 数据模型与动作类写在一起 * @author zhy * */public class Demo2Action extends ActionSupport {private String username;private int age;public String addUser(){System.out.println(username+","+age);return null;//不返回任何结果视图   NONE常量}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>动态参数封装</title>  </head>  <body>    <form action="${pageContext.request.contextPath}/action2.action" method="post">    <%--表单中的name属性取值必须和动作类中数据模型的set方法后面的名称一致。 --%>    用户名:<input type="text" name="username" /><br/>    年龄:<input type="text" name="age"/><br/>    <input type="submit" value="提交" />    </form>  </body></html>



package com.itheima.web.action;import com.itheima.domain.User;import com.opensymphony.xwork2.ActionSupport;/** * 动态参数封装,第二种情况: * 数据模型与动作类分开写 * @author zhy * */public class Demo3Action extends ActionSupport {//定义数据模型对象private User user = new User();public String addUser(){System.out.println(user.getUsername()+","+user.getAge());return null;//不返回任何结果视图   NONE常量}public User getUser() {System.out.println("getUser");return user;}public void setUser(User user) {System.out.println("setUser");this.user = user;}}


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>动态参数封装</title>  </head>  <body>    <form action="${pageContext.request.contextPath}/action3.action" method="post">    <%--表单中的name属性取值必须和动作类中数据模型的set方法后面的名称一致。 --%>    用户名:<input type="text" name="user.username" /><br/>    年龄:<input type="text" name="user.age"/><br/>    <input type="submit" value="提交" />    </form>  </body></html>



package com.itheima.web.action;import com.itheima.domain.User;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;/** * 动态参数封装,第三种情况:模型驱动 * 要想使用模型驱动,必须数据模型与动作类分开写 * 实现模型驱动的步骤: * 1.实现一个ModelDriven的接口 * 2.实现接口中的抽象方法getModel() * 3.在使用模型驱动的时候,数据模型必须由我们自己来实例化 *  * 是由一个ModelDriven的拦截器为我们做的 *  * 实际开发中采用的方式 * @author zhy * */public class Demo4Action extends ActionSupport implements ModelDriven<User>{//定义数据模型对象private User user = new User() ;//使用模型驱动,必须自己实例化模型对象//该方法返回的是数据模型public User getModel() {return user;}public String addUser(){System.out.println(user.getUsername()+","+user.getAge());return null;//不返回任何结果视图   NONE常量}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>动态参数封装</title>  </head>  <body>    <form action="${pageContext.request.contextPath}/action4.action" method="post">    <%--需要注意name属性的取值,已经不是一个普通的字符串了 --%>    用户名:<input type="text" name="username" /><br/>    年龄:<input type="text" name="age"/><br/>    <input type="submit" value="提交" />    </form>  </body></html>
package com.itheima.domain;import java.io.Serializable;public class User implements Serializable {private String username;private int age;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

二、案例


1.用户注册案例


<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><constant name="struts.devMode" value="true"/><package name="p1" extends="struts-default"><action name="register" class="com.itheima.web.action.UserAction" method="register" ><result type="redirect">/success.jsp</result><!-- 当注册成功之后重定向的结果视图 --><result name="exists">/message.jsp</result><!-- 当用户名已经存在之后,转向的结果视图 --></action></package></struts>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>用户注册</title>  </head>  <body>   <form action="${pageContext.request.contextPath}/register.action" method="post">   用户名:<input type="text" name="username" /><br/>   密码:<input type="password" name="password" /><br/>   生日:<input type="text" name="birthday" /><br/>   爱好:<input type="checkbox" name="hobby" value="吃饭"/>吃饭   <input type="checkbox" name="hobby" value="睡觉"/>睡觉   <input type="checkbox" name="hobby" value="写代码"/>写代码   <br/>   已婚:<input type="checkbox" name="married" value="true"/><br/>   <input type="submit" value="注册" />   </form>  </body></html>

package com.itheima.web.action;import com.itheima.domain.User;import com.itheima.service.IUserService;import com.itheima.service.impl.UserServiceImpl;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;/** * 用户操作相关的动作类 * @author zhy * */public class UserAction extends ActionSupport implements ModelDriven<User> {private IUserService service = new UserServiceImpl();//定义一个用户的数据模型,注意:由于使用了模型驱动,我们必须自己实例化对象private User user = new User();public User getModel() {return user;}public String register(){//1.根据用户名获取数据库的用户对象User dbUser = service.findUserByUsername(user.getUsername());//2.判断对象是否存在if(dbUser != null){//2.1如果存在,则表明用户有了,返回exists的结果视图return "exists";}//3.不存在,保存用户信息int res = service.register(user);//4.如果执行结果大于0if(res > 0){return SUCCESS;}//5.如果不大于0,返回nullreturn null;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}

package com.itheima.service;import com.itheima.domain.User;/** * 用户相关操作的业务层接口 * @author zhy * */public interface IUserService {/** * 根据用户名判断用户是否存在 * @param username * @return */User findUserByUsername(String username);/** * 用户注册 * @param user * @return */int register(User user);}
package com.itheima.service.impl;import com.itheima.dao.IUserDao;import com.itheima.dao.impl.UserDaoImpl;import com.itheima.domain.User;import com.itheima.service.IUserService;public class UserServiceImpl implements IUserService {private IUserDao dao = new UserDaoImpl();public User findUserByUsername(String username) {return dao.selectUserByUsername(username);}public int register(User user) {return dao.addUser(user);}}


package com.itheima.domain;import java.io.Serializable;import java.util.Date;public class User implements Serializable {private String username;private String password;private Date birthday;private String hobby;private boolean married;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}public boolean isMarried() {return married;}public void setMarried(boolean married) {this.married = married;}}



package com.itheima.dao;import com.itheima.domain.User;/** * 用户相关操作的持久层接口 * @author zhy * */public interface IUserDao {/** * 根据用户名称查询用户 * @param username * @return */User selectUserByUsername(String username);/** * 保存用户信息 * @param user * @return */int addUser(User user);}

package com.itheima.dao.impl;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanHandler;import com.itheima.dao.IUserDao;import com.itheima.domain.User;import com.itheima.utils.DBCPUtil;public class UserDaoImpl implements IUserDao {private QueryRunner qr = new QueryRunner(DBCPUtil.getDataSource());public User selectUserByUsername(String username) {try{return qr.query("select * from user where username = ? ",new BeanHandler<User>(User.class),username);}catch(Exception e){throw new RuntimeException(e);}}public int addUser(User user) {try{return qr.update("insert into user(username,password,birthday,hobby,married)values(?,?,?,?,?)",user.getUsername(),user.getPassword(),user.getBirthday(),user.getHobby(),user.isMarried());}catch(Exception e){throw new RuntimeException(e);}}}

package com.itheima.utils;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;/** * 使用开源数据源: * DBCP:DataBase Connection Pool 是apache公司实现的一个开源的数据源。 * 使用步骤: *  1.拷贝jar包 *  2.写配置文件 *  3.使用 * @author zhy * */public class DBCPUtil {  //1.定义一个数据源private static DataSource ds;//2.使用静态代码块,给数据源赋值static{try {Properties prop = new Properties();InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");prop.load(in);ds = BasicDataSourceFactory.createDataSource(prop);} catch (Exception e) {throw new ExceptionInInitializerError("初始化连接池失败!");}}//3.提供一个获取数据源的方法public static DataSource getDataSource(){return ds;}//4.提供一个获取连接的方法,注意,以后获取连接,必须使用该方法public static Connection getConnection(){try {return ds.getConnection();} catch (SQLException e) {throw new RuntimeException(e);}}}

#连接设置driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/day25username=rootpassword=1234#<!-- 初始化连接 -->initialSize=10#最大连接数量maxActive=50#<!-- 最大空闲连接 -->maxIdle=20#<!-- 最小空闲连接 -->minIdle=5#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->maxWait=60000#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。connectionProperties=useUnicode=true;characterEncoding=utf8#指定由连接池所创建的连接的自动提交(auto-commit)状态。defaultAutoCommit=true#driver default 指定由连接池所创建的连接的只读(read-only)状态。#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)defaultReadOnly=#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLEdefaultTransactionIsolation=READ_COMMITTED

create database day25;use day25;create table user(username varchar(100) primary key,password varchar(100),birthday date,hobby varchar(255),married bit(1));

2、用户输入非法的日期处理

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><constant name="struts.devMode" value="true"/><package name="p1" extends="struts-default"><action name="register" class="com.itheima.web.action.UserAction" method="register" ><result type="redirect">/success.jsp</result><!-- 当注册成功之后重定向的结果视图 --><result name="exists">/message.jsp</result><!-- 当用户名已经存在之后,转向的结果视图 --><!-- 当出现问题之后,需要从哪来回哪去 --><result name="input">/register1.jsp</result></action></package></struts>



<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%--导入struts2的标签库 --%><%@ taglib uri="/struts-tags" prefix="s" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>用户注册,使用的是struts2的标签</title>    <s:head></s:head>  </head>  <body>  <s:actionerror/><%-- 动作错误 --%>  <s:fielderror /><%-- 字段错误 --%>  <%--struts2的form标签,它提供了和原始html表单标签几乎一致的属性  action:请求的地址。直接写动作名称。不用写contextPaht  method:请求的方式。在这里不用写。struts2的form表单默认就是post  enctype:表单编码的MIME类型  --%>  <s:form action="register.action">  <s:textfield name="username" label="用户名" requiredLabel="true" requiredPosition="left"/>  <s:password name="password" label="密码" showPassword="true"/>  <s:textfield name="birthday" label="生日"/>  <s:submit value="注册"/>  </s:form>      <%--    <form action="${pageContext.request.contextPath}/register.action" method="post">   用户名:<input type="text" name="username" /><br/>   密码:<input type="password" name="password" /><br/>   生日:<input type="text" name="birthday" /><br/>   爱好:<input type="checkbox" name="hobby" value="吃饭"/>吃饭   <input type="checkbox" name="hobby" value="睡觉"/>睡觉   <input type="checkbox" name="hobby" value="写代码"/>写代码   <br/>   已婚:<input type="checkbox" name="married" value="true"/><br/>   <input type="submit" value="注册" />   </form>--%>  </body></html>

package com.itheima.web.action;import com.itheima.domain.User;import com.itheima.service.IUserService;import com.itheima.service.impl.UserServiceImpl;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;/** * 用户操作相关的动作类 * @author zhy * */public class UserAction extends ActionSupport implements ModelDriven<User> {private IUserService service = new UserServiceImpl();//定义一个用户的数据模型,注意:由于使用了模型驱动,我们必须自己实例化对象private User user = new User();public User getModel() {return user;}public String register(){//1.根据用户名获取数据库的用户对象User dbUser = service.findUserByUsername(user.getUsername());//2.判断对象是否存在if(dbUser != null){//2.1如果存在,则表明用户有了,返回exists的结果视图return "exists";}//3.不存在,保存用户信息int res = service.register(user);//4.如果执行结果大于0if(res > 0){return SUCCESS;}//5.如果不大于0,返回nullreturn null;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}
#全局类型转换器文件名的命名规范:xwork-conversion.properties。文件放到类路径的根路径#全局类型转换器声明,声明方式是以使用的数据类型(全类名)作为key,以类型转换器的全类名作为valuejava.util.Date=com.itheima.web.converter.MyTypeConvertor
package com.itheima.web.converter;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Map;import org.apache.struts2.util.StrutsTypeConverter;/** * 需求: *   把表单中的MM/dd/yyyy格式的数据转成日期类型 *   把数据库中的本地日期格式,转成MM/dd/yyyy形式输出 *  * 自定义子类转换器: * 第一步:编写一个类,继承自StrutsTypeConverter,实现convertFromString,convertToString抽象方法 * @author zhy * */public class MyTypeConvertor extends StrutsTypeConverter {//定义一个类型转换器private DateFormat format = new SimpleDateFormat("MM/dd/yyyy");/** * 把字符串数组中的数据转成日期类型 *  * 方法参数详解: *  Map context:是OGNL的上下文对象,我们暂时不知道,所以暂时也不用 *  String[] values:要转换的数据 *  Class toClass:目标类型 */public Object convertFromString(Map context, String[] values, Class toClass) {//1.先看看有没有数据if(values == null || values.length == 0){return null;}//2.取出数组中的第一个元素String date = values[0];//3.判断目标类型的字节码是不是日期类型if(toClass == java.util.Date.class){try {//4.使用DateFormat进行转换,并且返回转换后的结果return format.parse(date);} catch (ParseException e) {e.printStackTrace();return null;}}return null;}/** * 把日期类型的数据转换成字符串 *  * 方法参数详解: * Map context:是OGNL的上下文对象,我们暂时不知道,所以暂时也不用 *  Object o:要转换的数据 */public String convertToString(Map context, Object o) {//1.判断object是不是日期类型if(o instanceof Date){Date date = (Date)o;//2.是日期类型,使用转换器转成指定格式的字符串,并返回return format.format(date);}return null;}}
3.数据验证
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><constant name="struts.devMode" value="true"/><package name="p1" extends="struts-default"><action name="register" class="com.itheima.web.action.UserAction" method="regist" ><result type="redirect">/success.jsp</result><!-- 当注册成功之后重定向的结果视图 --><result name="exists">/message.jsp</result><!-- 当用户名已经存在之后,转向的结果视图 --><result name="input">/register.jsp</result></action><action name="findAll" class="com.itheima.web.action.UserAction" method="findAll" ><result>/findall.jsp</result></action><!-- 声明式验证器案例的动作类配置 --><action name="addStudent" class="com.itheima.web.action.StudentAction" method="addStudent" ><result name="input">/student.jsp</result></action></package></struts>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%--导入struts2的标签库 --%><%@ taglib uri="/struts-tags" prefix="s" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>用户注册,使用的是struts2的标签</title>    <s:head></s:head>  </head>  <body>  <s:actionerror/> <%--动作错误 --%>  <%--<s:fielderror /> 字段错误 --%>  <%--struts2的form标签,它提供了和原始html表单标签几乎一致的属性  action:请求的地址。直接写动作名称。不用写contextPaht  method:请求的方式。在这里不用写。struts2的form表单默认就是post  enctype:表单编码的MIME类型  --%>  <s:form action="addStudent.action">  <s:textfield name="username" label="用户名" />  <s:textfield name="age" label="年龄"/>  <s:textfield name="email" label="邮箱"/>  <s:textfield name="password" label="密码" />  <s:textfield name="repassword" label="确认密码"/>  <s:textfield name="score" label="成绩"/>  <s:textfield name="url" label="个人主页"/>  <%--list中的取值是生成一个list集合,并往集合中放入元素 --%>  <s:radio name="gender" list="{'男','女'}"  label="性别"/>  <s:submit value="注册"/>  </s:form>  </body></html>

package com.itheima.web.action;import com.itheima.domain.Student;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;public class StudentAction extends ActionSupport implements ModelDriven<Student> {private Student student = new Student();public Student getModel() {return student;}public String addStudent(){return SUCCESS;}public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}}

<?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="username"><field-validator type="requiredstring"><message>请输入用户名</message></field-validator></field><field name="age"><field-validator type="int"><!-- 使用注入的方式,设置最大和最小值 --><param name="min">18</param><param name="max">100</param><message>请输入18-100之间的整数</message></field-validator></field><field name="email"><field-validator type="email"><message>请输入正确的邮箱格式</message></field-validator></field><field name="password"><field-validator type="requiredstring"><!-- 注入取消使用trim --><param name="trim">false</param><message>请输入密码</message></field-validator><field-validator type="stringlength"><param name="minLength">3</param><param name="maxLength">8</param><message>密码长度是3~8位的</message></field-validator></field><!-- 确认密码和密码必须保持一致,是2个字段的事,所以要使用基于验证器的声明方式 --><validator type="expression"><param name="expression"><![CDATA[password == repassword]]></param><message>两次密码必须一致</message></validator><field name="score"><field-validator type="regex"><param name="regex">\d+</param><message>请输出正确的成绩</message></field-validator></field><field name="url"><field-validator type="url"><message>请输入正确的url地址</message></field-validator></field><field name="gender"><!-- required是一个只验证是否null的内置验证器,不会去除空格 --><field-validator type="required"><message>请选择性别</message></field-validator></field></validators>

package com.itheima.web.action;import org.apache.struts2.interceptor.validation.SkipValidation;import com.itheima.domain.User;import com.itheima.service.IUserService;import com.itheima.service.impl.UserServiceImpl;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;/** * 用户操作相关的动作类 * @author zhy * */public class UserAction extends ActionSupport implements ModelDriven<User> {private IUserService service = new UserServiceImpl();//定义一个用户的数据模型,注意:由于使用了模型驱动,我们必须自己实例化对象private User user = new User();public User getModel() {return user;}/** * 在struts2的框架中,它也提供了一个Map<表单的字段名,错误提示> * 我们要做的: * 往map中存放错误信息 *  * 编程式验证: * 1.动作类必须继承ActionSupport * 2.重写validate方法 *  * validate方法会在动作方法执行之前,进行验证 *  * 当重写了validate方法,它会对动作类中的所用动作方法进行验证。 * 解决验证所有动作方法的问题: * 第一种方式: * 使用@SkipValidation的注解 *  第二种方式: *  定义验证方法的名称:validate+动作名称  动作名称的首字符还要大写 public void validateRegister(){if(StringUtils.isEmpty(user.getUsername())){//存入错误信息,直接调用父类的addFieldError方法,存入错误信息。第一个参数是表单name属性的值。第二个参数是错误提示addFieldError("username", "请输入用户名");}}*///public void validate(){//if(StringUtils.isEmpty(user.getUsername())){////存入错误信息,直接调用父类的addFieldError方法,存入错误信息。第一个参数是表单name属性的值。第二个参数是错误提示//addFieldError("username", "请输入用户名");//}//}public String findAll(){return SUCCESS;}public String regist(){//1.根据用户名获取数据库的用户对象User dbUser = service.findUserByUsername(user.getUsername());//2.判断对象是否存在if(dbUser != null){//2.1如果存在,则表明用户有了,返回exists的结果视图return "exists";}//3.不存在,保存用户信息int res = service.register(user);//4.如果执行结果大于0if(res > 0){return SUCCESS;}//5.如果不大于0,返回nullreturn null;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}



<?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"><!-- 当使用ActionClassName-ActionName-validation.xml来命名文件时,它是一个指定动作方法的验证器。只会验证指定的动作方法 --><validators><!-- 基于字段的声明式验证 --><!-- field中name属性指定的是表单name属性的取值 --><field name="username"><!-- struts2框架为我们集成了很多的内置验证器。requiredstring会验证输入内容是否为空,是否为空字符串。并且去掉左右空格--><field-validator type="requiredstring"><message>用户名必须存在</message></field-validator></field><!-- 基于验证器的验证 --><validator type="requiredstring"><!-- 以注入的方式,提供要验证的字段信息 setFieldName("password");--><param name="fieldName">password</param><message>密码必须输入</message></validator></validators>

<?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"><!-- 当使用ActionClassName-validation.xml来命名文件时,它是一个动作类验证器。会验证动作类中的所有动作方法 --><validators><!-- 基于字段的声明式验证 --><!-- field中name属性指定的是表单name属性的取值 --><field name="username"><!-- struts2框架为我们集成了很多的内置验证器。requiredstring会验证输入内容是否为空,是否为空字符串。并且去掉左右空格--><field-validator type="requiredstring"><message>用户名呢</message></field-validator></field></validators>




阅读全文
0 0
原创粉丝点击