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 數據校驗功效及校驗成績的處理計劃,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!