本文爲原創,轉載時請註明出處: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.properties
com.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國際化,這個在下一編文章
會專獨立出來講,寫的不好還請多多諒解