struts2 数据校验 ( Validateable,validation ) (1)

一。

1.继承 ActionSupport

    ActionSupport 已经实现了 Action 接口,还实现了 Validateable 接口,提供数据校验功能。

    在 Validateble 接口定义了一个 validate() 方法,重写该方法,如果校验表单输入域出现出错,则将错误添加到 ActionSupport 类的 fieldErrors 域中,然后通过 OGNL 表达式负责输出。

 

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;

//继承ActionSupport来实现Struts 2的Action类
public class LoginAction extends ActionSupport
{
	//下面是Action内用于封装用户请求参数的两个属性
	private String username;
	private String password;
	//username属性的getter和setter方法
	public String getUsername()
	{
		return username;
	}
	public void setUsername(String username)
	{
		this.username = username;
	}
	//password属性的getter和setter方法
	public String getPassword()
	{
		return password;
	}
	public void setPassword(String password)
	{
		this.password = password;
	}
	//处理用户请求的execute方法
	public String execute() throws Exception
	{
		//当用户请求参数的username等于crazyit,密码请求参数为leegang时,
		//返回success字符串,否则返回error字符串
		if (getUsername().equals("crazyit")
			&& getPassword().equals("leegang"))
		{
			//通过ActionContext对象访问Web应用的HTTP Session
			ActionContext.getContext().getSession()
				.put("user" , username);
			return SUCCESS;
		}
		else
		{
			return ERROR;
		}
	}
	//完成输入校验需要重写的validate方法
	public void validate()
	{
		//如果用户名为空,或者用户名为空字符串
		if (getUsername() == null || 
			getUsername().trim().equals(""))
		{
			//添加校验错误提示,使用getText方法来使提示信息国际化
                       //非国际化  addFieldError("username", "失败!"));
			addFieldError("username", getText("user.required"));
		}
		//当密码为空,或者密码为空字符串时,添加表单校验错误
		if (getPassword() == null ||
			getPassword().trim().equals(""))
		{
			addFieldError("password", getText("pass.required"));
		}
	}
}

    下面的 Action 类重写了 validate 方法,该方法会在 execute 方法之前执行,如果执行该方法之后,Action 类的 fieldErrors中已经包含了数据校验错误,请求将被转发 到 input 逻辑视图出,所以 在 struts.xml 中 要配置 input ,如下:

<?xml version="1.0" encoding="GBK"?>
<!-- 指定Struts 2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
	"http://struts.apache.org/dtds/struts-2.1.dtd">
<!-- struts是Struts 2配置文件的根元素 -->
<struts>
	<!-- Struts 2的Action必须放在指定的包空间下定义 -->
	<package name="strutsqs" extends="struts-default">
		<!-- 定义login的Action,该Action的实现类为lee.LoginAction类 -->
		<action name="login" class="lee.LoginAction">
			<!-- 定义处理结果和视图资源之间映射关系 -->
			<!-- 定义input的逻辑视图名,对应login.jsp页面 -->
			<result name="input">/login.jsp</result>
			<result name="error">/error.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
		<!-- 定义获取图书的Action,对应实现类为lee.GetBooksAction -->
		<action name="getBooks" class="lee.GetBooksAction">
			<!-- 如果处理结果返回login,进入login.jsp页面 -->
			<result name="login">/login.jsp</result>
			<!-- 如果处理结果返回success,进入showBook.jsp页面 -->
				<result name="success">/showBook.jsp</result> 
		</action>

	</package>
</struts>

 支持国际化

   getText(key) 方法可以根据资源文件加载获得国际化提示信息

	public void validate()
	{
		//如果用户名为空,或者用户名为空字符串
		if (getUsername() == null || 
			getUsername().trim().equals(""))
		{
			//添加校验错误提示,使用getText方法来使提示信息国际化
                        //非国际化addFieldError("username", "失败!"));
			addFieldError("username", getText("user.required"));
		}
		//当密码为空,或者密码为空字符串时,添加表单校验错误
		if (getPassword() == null ||
			getPassword().trim().equals(""))
		{
			addFieldError("password", getText("pass.required"));
		}
	}
 

 

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!-- 导入Struts 2标签库 -->
<%@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><s:property value="getText('loginPage')"/></title>
	<meta name="website" content="http://www.crazyit.org" />
</head>
<body>
<!-- 使用form标签生成表单元素 -->
<s:form action="login">
     <!-- 支持国际化 -->
	<!-- 生成一个用户名文本输入框 -->
	<s:textfield name="username" key="user"/>
	<!-- 生成一个密码文本输入框 -->
	<s:textfield name="password" key="pass"/>
    
    <!-- 不支持国际化 -->	
        <!-- 生成一个用户名文本输入框 -->
	<s:textfield name="username" label="用户名"/>
	<!-- 生成一个密码文本输入框 -->
	<s:textfield name="password" label="密  码"/>

        <!-- 生成一个提交按钮 -->
	<s:submit key="login"/>
</s:form>
</body>
</html>
 

2.使用 Struts2 的校验框架

     Action (不重写 validate 方法),却增加一个校验配置文件,配置文件通过 Struts2 已有的校验器,完成表单校验。Struts2 提供了大量的数据校验器,包括表单域校验器和飞表单域校验器2种。

     以下使用了 requiredstring 校验器,该校验器是一个必填校验器------指定某个表单域必须输入

<?xml version="1.0" encoding="GBK"?>
<!-- 指定校验规则文件的DTD信息 -->
<!DOCTYPE validators PUBLIC 
	"-//OpenSymphony Group//XWork Validator 1.0.3//EN" 
	"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<!-- 校验规则定义文件的根元素 -->
<validators>
	<!-- 校验第一个表单域:username -->
	<field name="username">
		<!-- 该表单域必须填写 -->
		<field-validator type="requiredstring">
			<!-- 如果校验失败,显示user.required对应的信息 -->
			<message key="user.required"/>
		</field-validator>
	</field>
	<!-- 校验第二个表单域:password -->
	<field name="password">
		<field-validator type="requiredstring">
			<!-- 如果校验失败,显示pass.required对应的信息 -->
			<message key="pass.required"/>
		</field-validator>
	</field>
</validators>

     ActionName-validation.xml:其中 ActionName 就是需要校验的 Action 的类名。

因此上面的校验规则文件应该命名为 "LoginAction-validation.xml",并且该文件应该与 Action 类的 class 文件位于同一个路径下。增加该检验规则文件后, LoginAction 不必重写 validate() 方法也可完成输入校验。

     在 struts.xml 文件的 Action 定义中,一样需要为 input 逻辑视图指定物理视图资源,将 input 逻辑视图映射到 login.jsp

 

 

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;

//继承ActionSupport来实现Struts 2的Action类
public class LoginAction extends ActionSupport
{
	//下面是Action内用于封装用户请求参数的两个属性
	private String username;
	private String password;
	//username属性的getter和setter方法
	public String getUsername()
	{
		return username;
	}
	public void setUsername(String username)
	{
		this.username = username;
	}
	//password属性的getter和setter方法
	public String getPassword()
	{
		return password;
	}
	public void setPassword(String password)
	{
		this.password = password;
	}
	//处理用户请求的execute方法
	public String execute() throws Exception
	{
		//当用户请求参数的username等于crazyit,密码请求参数为leegang时,
		//返回success字符串,否则返回error字符串
		if (getUsername().equals("crazyit")
			&& getPassword().equals("leegang"))
		{
			//通过ActionContext对象访问Web应用的HTTP Session
			ActionContext.getContext().getSession()
				.put("user" , username);
			return SUCCESS;
		}
		else
		{
			return ERROR;
		}
	}
}
 
<!-- 定义login的Action,该Action的实现类为lee.LoginAction类 -->
		<action name="login" class="lee.LoginAction">
			<!-- 定义处理结果和视图资源之间映射关系 -->
			<!-- 定义input的逻辑视图名,对应login.jsp页面 -->
			<result name="input">/login.jsp</result>
			<result name="error">/error.jsp</result>
			<result name="success">/welcome.jsp</result>
		</action>
 
<s:form action="login">
	<!-- 生成一个用户名文本输入框 -->
	<s:textfield name="username" key="user"/>
	<!-- 生成一个密码文本输入框 -->
	<s:textfield name="password" key="pass"/>
	<!-- 生成一个提交按钮 -->
	<s:submit key="login"/>
</s:form>

 

 

 

 

你可能感兴趣的:(apache,xml,jsp,struts,XHTML)