Struts校验框架
Struts校验框架,大体有如下几部分组成
1. 校验提示信息
2. 校验提交页面
3. 校验Form
4. Action
5. 校验配置文件文件
下面以实现一个用户登陆的例子讲解Struts校验框架的组成部分以及相关的写法.
要求用户登陆的时候,输入用户名和密码,再进行登陆.用户名和密码都不能为空,而且密码的长度必须大于6,且小于9.
具体实现步骤如下:
1. 编写校验提示信息资源文件
i) 在工程的src/cn/com/book/demo/struts目录下,添加一个ApplicationResource_temp.properties文件
ii) 在里面添加几条提示资源信息,内容如下:
login.username=用户名
login.password=密 码
login.login=登 陆
login.reset=重 置
error.required={0}必须输入
error.minlength={0}的长度必须大于{1}
error.maxlength={0}的长度必须小于{1}
其中有{}包含数字的表示参数,在具体应用中,将有别的值替代
iii) 在以前的ecoding.bat批处理文件里面,添加一行转换命令
native2ascii -encoding gb2312
ApplicationResources_temp.properties ApplicationResources_zh_CN.properties
iv) 运行ecoding.bat命令,生成一个ApplicationResource_zh_CN.properties文件
v) 刷新工程,重新编译
2. 编写校验Form
i) 打开struts-config.xml设计器
ii) 在设计器上,点击鼠标右键->New->Form,出现如下界面
并如图上样式,在输入框内输入各自的值,Superclass选择org.apache.struts.validator.validatorForm选项,点击Finish
iii) 打开刚刚生成的LoginForm.java文件,添加userName和password两个属性,以及对应的set和get方法,删除自动生成的validate方法和reset方法.代码如下:
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package cn.com.book.demo.struts.form;
import org.apache.struts.validator.ValidatorForm;
/**
* MyEclipse Struts
* Creation date: 11-29-2007
*
* XDoclet definition:
* @struts.form name="loginForm"
*/
public class LoginForm extends ValidatorForm {
private String userName;
private String password;
/*
* Generated Methods
*/
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
iv)
3. 编写login.jsp文件
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<html:form action="/login.do" onsubmit="validateLoginForm(this)">
<bean:message key="login.username"/>:<html:text property="userName"></html:text><br/>
<bean:message key="login.password"/>:<html:password property="password"></html:password><br/>
<html:submit><bean:message key="login.login"/></html:submit>
<html:reset><bean:message key="login.reset"/></html:reset>
</html:form>
<html:javascript formName="loginForm"/>
</body>
</html>
代码注意事项:
i) 粗体部分,是校验框架在jsp中必须的代码
ii) Form里面的<html:text> 和<html:password>的property值,必须同LoginForm.java里面添加的两个属性一致
iii) <html:form>里面的action值,必须同struts-config.xml里面配置的登陆action的path值一致
4. 编写LoginAction.java代码如下:
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package cn.com.book.demo.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import cn.com.book.demo.struts.form.LoginForm;
/**
* MyEclipse Struts
* Creation date: 11-29-2007
*
* XDoclet definition:
* @struts.action path="/login" name="loginForm" input="/login.jsp" scope="request" validate="true"
* @struts.action-forward name="error" path="/login.jsp"
* @struts.action-forward name="success" path="/userList.do"
*/
public class LoginAction extends Action {
/*
* Generated Methods
*/
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
System.out.println("***************");
String path = "error";
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
String userName = loginForm.getUserName();
String password = loginForm.getPassword();
if(userName != null && password != null && password.length()>6 && password.length()<9){
path = "success";
}
return mapping.findForward(path);
}
}
5. 配置struts-config.xml
i) 在struts-config.xml里面添加一个login action如下
<action
attribute="loginForm"
input="/login.jsp"
name="loginForm"
path="/login"
scope="request"
type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="error" path="/login.jsp" />
<forward name="success" path="/userList.do" />
</action>
ii) 在struts-config.xml中,添加一个校验插件如下
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>
iii)
6. 编写loginForm的校验规则
i) 确定WEB-INF目录下是否有validator-rules.xml,如果没有,请将demo工程里面WEB-INF目录下的validator.xml文件,copy到新工程
ii) 在WEB-INF目录下,新建一个validation.xml文件,如果以前存在,就在代码中添加loginForm的校验规则,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN" "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<formset>
<form name="loginForm">
<field property="userName" depends="required">
<msg name="required" key="error.required"/>
<arg0 key="login.username"/>
</field>
<field property="password" depends="required,minlength,maxlength">
<!--msg标签指定消息
name指定对应required校验器
key指定提示信息的key
arg?指定提示消息里面的替代
-->
<msg name="required" key="error.required"/>
<arg0 key="login.password"/>
<msg name="minlength" key="error.minlength"/>
<arg0 key="login.password"/>
<arg1 key="${var:minlength}" name="minlength" resource="false"/>
<var>
<var-name>minlength</var-name>
<var-value>6</var-value>
</var>
<msg name="maxlength" key="error.maxlength"/>
<arg0 key="login.password"/>
<arg1 key="${var:maxlength}" name="maxlength" resource="false"/>
<var>
<var-name>maxlength</var-name>
<var-value>9</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
注意事项:
a) <form>里面的name属性的值,必须同需要校验的form,在struts-config.xml里面定义的form的name值一样
b)
7. 在src目录下的applicationContext.xml文件里面,添加<bean name="/login" class="cn.com.book.demo.struts.action.LoginAction"/>,注册一个新的bean---LoginAction
8. 重新编译工程,发布到web容器,访问login.jsp,就可以演示输入值的校验了