本文为原创,转载时请注明出处:http://blog.csdn.net/ctojxzsycztao;作者:ctojxzsycztao
上一编文章给大家讲了Struts2 的跟踪状态,我们都知道如何跟踪一个用户的状态,那么当一个用户在登录时不输入登录密码,也不输入用户名,登录也会算成功,只是会转发到一个错误页面,但往往在开发中一个错误页面基本上是用来处理整个应用程序的错误显示工作,那么在一个用户在输入无效的用户名或密码后我们不想让页面来转换,也就是不让其调用 execute 方法来持行登录的操作,从而在登录页面上提示用户输入的用户名或密码无效,这样不是更乐观, 相信有很多朋友在这个时候都会想到用 javascript 来验证用户名或密码不能为空的操作,这种作法是推荐使用的,客户端的提交在客户端处理,不用与服务器交互,节约的服务端的资源, 这是一个非常好的一个选择,但有的时候我们还是须望在服务器端处理这一操作,那么在一个Struts2 的应用里怎样去实现这样的操作呢 ! 首先定义一个Action 为 UserAction ,能后实现 ActionSupport , 并重写其的 validate 方法,我们首先要知道 ActionSupport 是一个工具类,它实现了Action 和 Validateable 接口,提供了数据校验功能,重写的 validate 方法其实是 Validateable 接口的,当校验出错时,错误信息将添加到 ActionSupport 的 fieldErrors 域,然后通过 ognl 表达式输出, 还是来看一下如何实现吧!
清单一:UserAction.java
package com.struts2.action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class UserAction extends ActionSupport { private String userName; private String pwd; private String SUCCESS = "success"; private String ERROR = "error"; public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String execute() throws Exception { if(this.getUserName().equals("chen") && this.getPwd().equals("chen")){ ActionContext.getContext().getSession().put("userName", this.getUserName()); return SUCCESS; } return ERROR; } @Override public void validate() { if(this.getUserName() == null || "".equals(this.getUserName().trim())){ addFieldError("userName","用户名不能为空"); } if(this.getPwd() == null || "".equals(this.getPwd().trim())){ addFieldError("pwd","登录密码不能为空"); } } } 清单二:login.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>login</title>
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<s:form action="login">
<s:textfield name="userName" label="userName"></s:textfield>
<s:textfield name="pwd" label="pwd"></s:textfield>
<s:submit value="login"></s:submit>
</s:form>
</body>
</html>清单三:struts.xml<action name="login" class="com.struts2.action.LoginAction"><!-- 为了出错后在login.jsp页面显示 必须指定 input -->
<result name="input">/login.jsp</result>
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>从上面我们可以看到在 UserAction 中重写了 validate 方法,該方法在用户提交时首先被自动调用,如果执行该方法完之后的 Action 类的 fieldErrors 中包含了数据校验错误信息,则转发到 input 指定的页面否则调用 execute 持行登录的操作,上面代码显然看上去不太如人意,Action 继承了 ActionSupport,这对 Action 有污染,我们提倡Action应該是个完整的 POJO ,有利于脱离 struts 框架,可以单独出来进行测试或维护之类的,那么除了上面的校验方式外还有没有其它更好的校验框架呢! 答案是有的,象 struts1.x一样,我们可以通过配置文件来进行校验,它包含表单和非表单二种,下面是requiredstring 校验器,校验用户必须输入某表单域,请看代码清单如下,該件命名应遵守如下规则:ActionName-validation.xml ,ActionName 是指定须要校验的 Action 名,該文件必须放在与Action同一路径.清单四:UserAction-validation.xml<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<!-- 根元素-->
<validators>
<!-- 校验userName -->
<field name="userName">
<!-- 该表单域必须添-->
<field-validator type="requiredstring">
<!--如果校验失败,key 指定资源文件中的 key-->
<message key="com.userNameIsNull"/>
</field-validator>
</field>
<!--校验 password -->
<field name="pwd">
<field-validator type="requiredstring">
<message key="com.PwdIsNull"/>
</field-validator>
</field>
</validators>当配置完这个后,我们还要在struts.xml中指定如上所说的 <result name="input">/login.jsp</result> 当发生错误时转发到 login.jsp 页面处理错误信息,上面提到过 资源配置文件,其文件内容如下:清单五:messages_zh_CN.propertiescom.userNameIsNull=/u9427/u8bf2/u7d8d/u935a/u5d84/u7b09/u9473/u6212/u8d1f/u7ecc/ufffd
com.PwdIsNull=/u7035/u55d9/u721c/u6d93/u5d88/u5158/u6d93/u8679/u2516上面提到过Struts2 国际化一些内容,代码清单五,可能有些朋友还不是很清楚struts2国际化,这个在下一编文章会专独立出来讲,写的不好还请多多谅解