程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Struts 2 數據校驗功效及校驗成績的處理計劃

Struts 2 數據校驗功效及校驗成績的處理計劃

編輯:關於JAVA

Struts 2 數據校驗功效及校驗成績的處理計劃。本站提示廣大學習愛好者:(Struts 2 數據校驗功效及校驗成績的處理計劃)文章只能為提供參考,不一定能成為您想要的結果。以下是Struts 2 數據校驗功效及校驗成績的處理計劃正文


經由過程繼續ActionSupport類來完成Action開辟,ActionSupport類不只對Action接口停止簡略完成, 同時增長了驗證、當地化等支撐 。真實開辟中自界說Action都須要繼續該類。對用戶登錄添加表單驗證功效

ActionSupport類的感化:

struts2不請求我們本身設計的action類繼續任何的struts基類或struts接口,然則我們為了便利完成我們本身的action,年夜多半情形下都邑繼續com.opensymphony.xwork2.ActionSupport類,偏重寫此類裡的public String execute() throws Exception辦法。由於此類中完成了許多的適用托言,供給了許多默許辦法,這些默許辦法包含國際化信息的辦法、默許的處置用戶要求的辦法等,如許可以年夜年夜的簡化Acion的開辟。 Struts2中平日直接應用Action來封裝HTTP要求參數,是以,Action類裡還應當包括與要求參數對應的屬性,而且為屬性供給對應的getter和setter辦法。

那末Action 接口和 ActionSupport類的差別是甚麼呢?

Action接口有:

public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String LOGIN = "login";
public String execute() throws Exception;

可以看到有五個靜態常量和前往類型為String 的execute()

而Actionsupport這個對象類在完成了Action接口的基本上還界說了一個validate()辦法,重寫該辦法,它會在execute()辦法之前履行,如校驗掉敗,會轉入input處,必需在設置裝備擺設該Action時設置裝備擺設input屬性。

別的,Actionsupport還供給了一個getText(String key)辦法還完成國際化,該辦法從資本文件上獲得國際化信息.

如許在自界說標簽時可以界說一個變量為new actionsupport對象完成國際化。

Actionsupport類有(源碼):

public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable {
protected static Logger LOG = LoggerFactory.getLogger(ActionSupport.class);
private final ValidationAwareSupport validationAware = new ValidationAwareSupport();
private transient TextProvider textProvider;
private Container container;
public void setActionErrors(Collection<String> errorMessages) {
validationAware.setActionErrors(errorMessages);
}
public Collection<String> getActionErrors() {
return validationAware.getActionErrors();
}
public void setActionMessages(Collection<String> messages) {
validationAware.setActionMessages(messages);
}
public Collection<String> getActionMessages() {
return validationAware.getActionMessages();
}
@Deprecated
public Collection<String> getErrorMessages() {
return getActionErrors();
}
@Deprecated
public Map<String, List<String>> getErrors() {
return getFieldErrors();
}
public void setFieldErrors(Map<String, List<String>> errorMap) {
validationAware.setFieldErrors(errorMap);
}
public Map<String, List<String>> getFieldErrors() {
return validationAware.getFieldErrors();
}
public Locale getLocale() {
ActionContext ctx = ActionContext.getContext();
if (ctx != null) {
return ctx.getLocale();
} else {
if (LOG.isDebugEnabled()) {
LOG.debug("Action context not initialized");
}
return null;
}
}
public boolean hasKey(String key) {
return getTextProvider().hasKey(key);
}
public String getText(String aTextName) {
return getTextProvider().getText(aTextName);
}
public String getText(String aTextName, String defaultValue) {
return getTextProvider().getText(aTextName, defaultValue);
}
public String getText(String aTextName, String defaultValue, String obj) {
return getTextProvider().getText(aTextName, defaultValue, obj);
}
public String getText(String aTextName, List<?> args) {
return getTextProvider().getText(aTextName, args);
}
public String getText(String key, String[] args) {
return getTextProvider().getText(key, args);
}
public String getText(String aTextName, String defaultValue, List<?> args) {
return getTextProvider().getText(aTextName, defaultValue, args);
}
public String getText(String key, String defaultValue, String[] args) {
return getTextProvider().getText(key, defaultValue, args);
}
public String getText(String key, String defaultValue, List<?> args, ValueStack stack) {
return getTextProvider().getText(key, defaultValue, args, stack);
}
public String getText(String key, String defaultValue, String[] args, ValueStack stack) {
return getTextProvider().getText(key, defaultValue, args, stack);
}
public String getFormatted(String key, String expr) {
Map<String, Object> conversionErrors = ActionContext.getContext().getConversionErrors();
if (conversionErrors.containsKey(expr)) {
String[] vals = (String[]) conversionErrors.get(expr);
return vals[0];
} else {
final ValueStack valueStack = ActionContext.getContext().getValueStack();
final Object val = valueStack.findValue(expr);
return getText(key, Arrays.asList(val));
}
}
public ResourceBundle getTexts() {
return getTextProvider().getTexts();
}
public ResourceBundle getTexts(String aBundleName) {
return getTextProvider().getTexts(aBundleName);
}
public void addActionError(String anErrorMessage) {
validationAware.addActionError(anErrorMessage);
}
public void addActionMessage(String aMessage) {
validationAware.addActionMessage(aMessage);
}
public void addFieldError(String fieldName, String errorMessage) {
validationAware.addFieldError(fieldName, errorMessage);
}
public String input() throws Exception {
return INPUT;
}
public String doDefault() throws Exception {
return SUCCESS;
}
public String execute() throws Exception {
return SUCCESS;
}
public boolean hasActionErrors() {
return validationAware.hasActionErrors();
}
public boolean hasActionMessages() {
return validationAware.hasActionMessages();
}
public boolean hasErrors() {
return validationAware.hasErrors();
}
public boolean hasFieldErrors() {
return validationAware.hasFieldErrors();
}
public void clearFieldErrors() {
validationAware.clearFieldErrors();
}
public void clearActionErrors() {
validationAware.clearActionErrors();
}
public void clearMessages() {
validationAware.clearMessages();
}
public void clearErrors() {
validationAware.clearErrors();
}
public void clearErrorsAndMessages() {
validationAware.clearErrorsAndMessages();
}
public void validate() {
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public void pause(String result) {
}
private TextProvider getTextProvider() {
if (textProvider == null) {
TextProviderFactory tpf = new TextProviderFactory();
if (container != null) {
container.inject(tpf);
}
textProvider = tpf.createInstance(getClass(), this);
}
return textProvider;
}
@Inject
public void setContainer(Container container) {
this.container = container;
}

可以看到外面有許多的辦法,但我們很顯著看到有一個我們很懂得的,validate(),數據校驗的辦法。經由過程這個辦法,我們可以登錄時,用戶名和暗碼為空的提醒,或其他··

如今舉一個簡略的例子:當用戶名和暗碼為空,給客戶一個友愛提醒。

上面經由過程兩種方法來論述Struts 2的數據校驗功效。

1. 編碼方法校驗

1) Action必定要繼續自ActionSupport

2) 針對某個要停止校驗的要求處置辦法編寫一個 public void validateXxx()辦法,在辦法外部停止表雙數據校驗.

3) 也可針對一切的要求處置辦法編寫public void validate()辦法。

4) 在校驗辦法中,可以經由過程addFieldError()辦法來添加字段校驗毛病新聞。

5) 當校驗掉敗時,Struts框架會主動跳轉到name為input的Result頁面。在校驗掉敗頁面中,可使用<s:fielderror/>來顯示毛病新聞
6) 簡略,靈巧。但重用性不高

重寫validate辦法

1.我們編寫的Action普通繼續與ActionSupport,而ActionSupport不只完成了Action接口,還完成了Validatable接口,供給了數據校驗功效。在Validatable接口中界說一個validate辦法,重寫該辦法,假如校驗表單輸出域湧現毛病,則將毛病添加到ActionSupport類的fieldError域中,然後經由過程OGNL表達式輸入。

上面是用戶登錄校驗界面:

<body>
<%--輸入校驗信息--%>
<%--想要單個提醒 <s:fielderror fieldName="uname"/>--%>
<%--<s:property value=""/>
--%><div ><s:fielderror/></div> 
<s:form name="form1" namespace="/" method="post" action="LoginValidateAction">
<s:div>請輸出用戶名:<s:textfield name="user.uname" ></s:textfield></s:div>
<s:div>請輸出暗碼:<s:password name="user.upwd" ></s:password></s:div>
<s:submit value="登錄"></s:submit>
</s:form>
<%--debug --%>
<s:debug></s:debug>
</body>

用戶輸出數據後,提交到LoginValidateAction 中:

public class LoginValidateAction extends ActionSupport implements Action {
public User user;
public Map<String, Object> map;
//驗證的辦法,會對一切的Action起感化
@Override 
public void validate() {
if(user.getUname().length()==0){
addFieldError("uname", "用戶名不克不及為空!");

}
if(user.getUpwd().length()==0){
addFieldError("upwd", "暗碼不克不及為空!");
} 

} 
//處置營業的辦法
public String execute() throws Exception {
System.out.println(user.getUname());
if(user.getUname().equals("admin")&&user.getUpwd().equals("admin")){
//讓Struts2注入 map聚集
map.put("uname", user.getUname());
//假如登錄勝利,前往“ success”
return SUCCESS;
}
else{
//登錄掉敗,前往 error
return INPUT; //此處必定是 input
}
}
/**
* @return the user
*/
public User getUser() {
return user;
}
/**
* @param user the user to set
*/
public void setUser(User user) {
this.user = user;
}

下面的LoginValidateAction類重寫了validate辦法,該辦法會在履行excute辦法之前履行,假如履行該辦法以後,Action類的filedError中包括了數據校驗毛病,要求將被轉發到input邏輯視圖。

struts.xml設置裝備擺設以下:

<!-- 數據校驗 -->
<action name="LoginValidateAction" class="cn.struts2.action.LoginValidateAction">
<!-- 成果為“success”時,跳轉至success.jsp頁面 -->
<result name="success">success.jsp</result>
<!-- 成果為"error"時,跳轉至fail.jsp頁面 或 還在登錄界面 login.jsp-->
<result name="input">LoginValidateAction.jsp</result>
<result name="login">fail.jsp</result> 
<result name="error">fail.jsp</result> 
</action>

在客戶真個後果:

然則年夜家留意沒有呢,當提醒毛病的時刻不太是我們想要的的後果顯示。

這個不是我們所想要的,那末我們怎樣改呢?其實這重要顯示的struts2主題款式招致的,

再來看看:

它主動給我們添加了款式。struts2供給了三種主題,ajax, simple, xhtml,它默許的是xhtml主題,固然你可以寫隨意率性個你本身的主題,我們稱之為自界說主題。可以經由過程設置處理以上成績

有兩種辦法可以處理:

1.簡略的辦法(也很適用,針對一切struts2標簽),在Struts.xml中,加高低一行代碼便可以了。

<constant name="struts.ui.theme" value="simple" />

代表一切的頁面采取的都是 simple主題了,這時候它輸入的頁面,不回添加任何過剩的代碼,好比 table tr td 等,我們便可以像其他編纂頁面的方法編纂頁面的作風。

如今再來看看,毛病的提醒格局

我們可以經由過程設置如許一個標簽:

<s:property value="errors.uname[0]"/>

把這個標簽正文失落:

<div ><s:fielderror/></div> 

但我們設置成 如許時,會湧現如許的後果。

這類後果就有點想我們平凡輸出毛病時的誰人提醒了,還有其他屬性值,這裡就不消逐個羅列了。

應用Struts2的校驗框架

XML設置裝備擺設方法校驗。

在編碼方法之前被履行。

1) 針對要校驗的Action類,在同包下編寫一個名為:Action類名-validation.xml校驗規矩文件。

2) 在校驗規矩文件中添加校驗規矩:詳細的校驗器名,參數可參看Struts2的reference或Struts2的API。

a) Field校驗:針對Action類中每一個非自界說類型的Field停止校驗的規矩。

<field name="要校驗的Field名">
<field-validator type="校驗規矩器名" short-circuit="能否要短途徑校驗(默許是false)">
<param name="校驗器要應用的參數名">值</param>
<message>校驗掉敗時的提醒新聞</message>
</field-validator>
<!-- 還可添加其它的校驗規矩 -->
</field>

b) 非Field校驗:針對Action類的某些Field應用OGNL表達停止組合校驗。

<validator type="fieldexpression">
<param name="fieldName">pwd</param>
<param name="fieldName">pwd2</param>
<param name="expression"><![CDATA[pwd==pwd2]]></param><!-- OGNL表達式 -->
<message>確認暗碼和暗碼輸出紛歧致</message>
</validator>

c) visitor校驗:重要是用來校驗Action類中的自界說類型Field。(針對應用模子驅動方法時)

i) 在Action類的的校驗規矩文件中針對自界說類型Field應用visitor校驗規矩。

<!-- 針對自界說Field應用visitor校驗 -->
<field name="user">
<field-validator type="required" short-circuit="true">
<message>用戶的信息必填</message><!-- 新聞前綴 -->
</field-validator>
<field-validator type="visitor"><!-- 指定為visitor校驗規矩 -->
<param name="context">userContext</param><!-- 指定本visitor校驗的高低文名 -->
<param name="appendPrefix">true</param><!-- 能否要添加校驗掉敗新聞的前綴 -->
<message>用戶的</message><!-- 新聞前綴 -->
</field-validator>
</field>

ii) 針對visitor的Field編寫一個校驗規矩文件.文件名為: visitor字段類型名[-visitor校驗的高低文名]-validation.xml. 例如: 本例中的文件名為User-userContext-validation.xml

留意: 此文件要寄存到visitor字段類型地點的包下.

iii) 在visitor的Field校驗規矩文件中針對要校驗的Field添加校驗規矩.

  我們還可以不重寫validate辦法,而經由過程增長校驗設置裝備擺設文件來停止數據校驗。這個校驗設置裝備擺設文件經由過程應用Struts2已有的校驗器來完成對表單域的校驗,上面以requiredstring校驗器為例,這個校驗器是一個必填校驗器,指定某個表單域必需輸出。

上面是這個校驗設置裝備擺設文件LoginValidateAction-validation.xml的寫法:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" 
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="uname">
<field-validator type="requiredstring">
<message>用戶名不克不及為空</message>
</field-validator>
</field>
<field name="upwd">
<field-validator type="requiredstring">
<message>暗碼不克不及為空</message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength">18</param>
<param name="minLength">6</param>
<message>暗碼長度應當在${minLength}--${maxLength}位之間</message>
</field-validator>
</field>
</validators>

留意:這個校驗設置裝備擺設文件必需遵照上面兩個規矩:

  1、該文件命運格局必需是Action類名-validation.xml,例如本例中該文件名為:LoginValidateAction-validation.xml

  2、該文件必需與Action類的class文件位於統一途徑下,本例中文件位於

LoginValidateAction類的代碼照樣一樣:

public class LoginValidateAction extends ActionSupport implements Action {
public User user;
public Map<String, Object> map;
//驗證的辦法,會對一切的Action起感化
@Override 
public void validate() {
if(user.getUname().length()==0){
addFieldError("uname", "用戶名不克不及為空!");
}
if(user.getUpwd().length()==0){
addFieldError("upwd", "暗碼不克不及為空!");
} 
} 
//處置營業的辦法
public String execute() throws Exception {
System.out.println(user.getUname());
if(user.getUname().equals("admin")&&user.getUpwd().equals("admin")){
//讓Struts2注入 map聚集
map.put("uname", user.getUname());
//假如登錄勝利,前往“ success”
return SUCCESS;
}
else{
//登錄掉敗,前往 error
return INPUT; //此處必定是 input
}
}
/**
* @return the user
*/
public User getUser() {
return user;
}
/**
* @param user the user to set
*/
public void setUser(User user) {
this.user = user;
}

以上所述是小編給年夜家引見的Struts 2 數據校驗功效及校驗成績的處理計劃,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved