<?xml version="1.0" encoding="GBK"?> <project name="struts" basedir="." default=""> <property name="dist" value="classes"/> <property name="src" value="src"/> <path id="classpath"> <fileset dir="lib"> <include name="*.jar"/> </fileset> <pathelement path="${dist}"/> </path> <target name="compile" description="Compile all source code"> <delete dir="${dist}"/> <mkdir dir="${dist}"/> <copy todir="${dist}"> <fileset dir="${src}"> <exclude name="**/*.java"/> </fileset> </copy> <javac destdir="classes" debug="true" includeantruntime="yes" deprecation="false" optimize="false" failonerror="true"> <src path="${src}"/> <classpath refid="classpath"/> </javac> </target> </project>
<?xml version="1.0" encoding="GBK"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!-- 定义Struts 2的核心Filter --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- 让Struts 2的核心Filter拦截所有请求 --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
<%-- 网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> author yeeku.H.lee kongyeeku@163.com version 1.0 Copyright (C), 2001-2016, yeeku.H.Lee This program is protected by copyright laws. Program Name: Date: --%> <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <%@taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>请输入您的注册信息</title> <s:head/> </head> <body> <h2>请输入您的注册信息</h2> <s:fielderror/> <s:form action="regist"> <s:textfield name="name" label="用户名"/> <s:textfield name="pass" label="密码"/> <s:textfield name="age" label="年龄"/> <s:textfield name="birth" label="生日"/> <s:submit value="注册"/> </s:form> </body> </html>
<%-- 网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> author yeeku.H.lee kongyeeku@163.com version 1.0 Copyright (C), 2001-2016, yeeku.H.Lee This program is protected by copyright laws. Program Name: Date: --%> <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <%@taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>校验成功</title> </head> <body> <h3>校验成功</h3> 用户名:<s:property value="name"/><br/> 密码:<s:property value="pass"/><br/> 年龄:<s:property value="age"/><br/> 生日:<s:property value="birth"/><br/> </body> </html>
<?xml version="1.0" encoding="GBK"?> <!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.i18n.encoding" value="GBK"/> <package name="lee" extends="struts-default"> <!-- 用户注册的Action --> <action name="regist" class="org.crazyit.app.action.RegistAction"> <!-- 类型转换失败、输入校验失败,转入input对应的视图 --> <result name="input">/WEB-INF/content/registForm.jsp</result> <result>/WEB-INF/content/show.jsp</result> </action> <action name="*"> <result>/WEB-INF/content/{1}.jsp</result> </action> </package> </struts>
package org.crazyit.app.action; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.validator.annotations.*; import java.util.Date; /** * Description: * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> * <br/>Copyright (C), 2001-2016, Yeeku.H.Lee * <br/>This program is protected by copyright laws. * <br/>Program Name: * <br/>Date: * @author Yeeku.H.Lee kongyeeku@163.com * @version 1.0 */ public class RegistAction extends ActionSupport { // 定义4个成员变量封装请求参数 private String name; private String pass; private int age; private Date birth; // name的setter和getter方法 // 使用注解指定必填、正则表达式两个校验规则 @RequiredStringValidator(key = "name.requried" , message = "") @RegexFieldValidator(regex = "\\w{4,25}" ,key = "name.regex" , message = "") public void setName(String name) { this.name = name; } public String getName() { return this.name; } // pass的setter和getter方法 @RequiredStringValidator(key = "pass.requried" ,message = "") @RegexFieldValidator(regex = "\\w{4,25}" ,key = "pass.regex" ,message = "") public void setPass(String pass) { this.pass = pass; } public String getPass() { return this.pass; } // age的setter和getter方法 @IntRangeFieldValidator(message = "" , key = "age.range", min = "1" , max = "150") public void setAge(int age) { this.age = age; } public int getAge() { return this.age; } // birth的setter和getter方法 @DateRangeFieldValidator(message = "" , key = "birth.range", min = "1900/01/01" , max = "2050/01/21") public void setBirth(Date birth) { this.birth = birth; } public Date getBirth() { return this.birth; } }
#违反用户名必须输入的提示信息 name.requried=您必须输入用户名! #违反用户名必须匹配正则表达式的提示信息 name.regex=您输入的用户名只能是字母和数字,且长度必须在4到25之间! #违反密码必须输入的提示信息 pass.requried=您必须输入密码! #违反密码必须匹配正则表达式的提示信息 pass.regex=您输入的密码只能是字母和数字,且长度必须在4到25之间! #违反年龄必须在指定范围的提示信息 age.range=您的年龄必须在${min}和${max}之间! #违反生日必须在指定范围的提示信息 birth.range=您的生日必须在${min}和${max}之间!
#\u8fdd\u53cd\u7528\u6237\u540d\u5fc5\u987b\u8f93\u5165\u7684\u63d0\u793a\u4fe1\u606f name.requried=\u60a8\u5fc5\u987b\u8f93\u5165\u7528\u6237\u540d! #\u8fdd\u53cd\u7528\u6237\u540d\u5fc5\u987b\u5339\u914d\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u63d0\u793a\u4fe1\u606f name.regex=\u60a8\u8f93\u5165\u7684\u7528\u6237\u540d\u53ea\u80fd\u662f\u5b57\u6bcd\u548c\u6570\u5b57\uff0c\u4e14\u957f\u5ea6\u5fc5\u987b\u57284\u523025\u4e4b\u95f4! #\u8fdd\u53cd\u5bc6\u7801\u5fc5\u987b\u8f93\u5165\u7684\u63d0\u793a\u4fe1\u606f pass.requried=\u60a8\u5fc5\u987b\u8f93\u5165\u5bc6\u7801! #\u8fdd\u53cd\u5bc6\u7801\u5fc5\u987b\u5339\u914d\u6b63\u5219\u8868\u8fbe\u5f0f\u7684\u63d0\u793a\u4fe1\u606f pass.regex=\u60a8\u8f93\u5165\u7684\u5bc6\u7801\u53ea\u80fd\u662f\u5b57\u6bcd\u548c\u6570\u5b57\uff0c\u4e14\u957f\u5ea6\u5fc5\u987b\u57284\u523025\u4e4b\u95f4! #\u8fdd\u53cd\u5e74\u9f84\u5fc5\u987b\u5728\u6307\u5b9a\u8303\u56f4\u7684\u63d0\u793a\u4fe1\u606f age.range=\u60a8\u7684\u5e74\u9f84\u5fc5\u987b\u5728${min}\u548c${max}\u4e4b\u95f4! #\u8fdd\u53cd\u751f\u65e5\u5fc5\u987b\u5728\u6307\u5b9a\u8303\u56f4\u7684\u63d0\u793a\u4fe1\u606f birth.range=\u60a8\u7684\u751f\u65e5\u5fc5\u987b\u5728${min}\u548c${max}\u4e4b\u95f4!