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