一.概述
設(shè)計(jì)模式是對(duì)重復(fù)出現(xiàn)的問(wèn)題的一種可以重用的解決方法,其本質(zhì)其實(shí)是解偶.
1.3.3服務(wù)工作模式
服務(wù)工作者模式將頁(yè)面流轉(zhuǎn),前端控制模式,視圖助手模式合在一起使用,表示"請(qǐng)求--轉(zhuǎn)發(fā)--視圖"的整套流程,服務(wù)器工作者模式也是MVC模式的實(shí)現(xiàn)標(biāo)準(zhǔn),Struts框架本身基于這個(gè)模式實(shí)現(xiàn)
1.4 表示層伸縮性模式
1.4.1異步頁(yè)面模式
當(dāng)遠(yuǎn)程數(shù)據(jù)發(fā)生變化時(shí),將其緩存下來(lái)這個(gè)模式又被稱為"發(fā)布者--訂閱者--模型".功能是利用一個(gè)訂閱者角色在一定的時(shí)間間隔或數(shù)據(jù)發(fā)生變化時(shí)接收來(lái)自發(fā)布者角色的數(shù)據(jù),訂閱者角色同時(shí)會(huì)利用模型層來(lái)更新數(shù)據(jù)庫(kù),常見(jiàn)的應(yīng)用為,當(dāng)發(fā)布服務(wù)器要顯示最新信息的Html頁(yè)面時(shí),會(huì)利用一個(gè)訂閱者角色我負(fù)責(zé).
1.4.2
該模式可以緩存動(dòng)態(tài)的頁(yè)面,盡可能減少重復(fù)生成的頁(yè)面,功能是利用一個(gè)緩存過(guò)濾器截獲請(qǐng)求.判斷該請(qǐng)求所返回的頁(yè)面是否有緩存,如果它在緩存中,則以緩存的頁(yè)面最高效地進(jìn)行響應(yīng);如果沒(méi)有可緩存數(shù)據(jù),則執(zhí)行隨后的工作,緩存生成頁(yè)面的結(jié)果,緩存過(guò)濾器應(yīng)該被擺放在"裝飾過(guò)濾器"和工作Servlet之前,該模式其實(shí)是裝飾器模式的一種變體,常見(jiàn)為對(duì)HTTPServletResponse對(duì)象進(jìn)行裝飾來(lái)保存請(qǐng)求處理結(jié)果
1.4.3
資源池模式 JDBC連接池
客戶
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<!--
-->
<form-validation>
<global> //所有檢驗(yàn)規(guī)則的聲明都被定義<global>元素下作為其子元素
<validator name="required"//每個(gè)validator都代表一個(gè)檢驗(yàn)規(guī)則,name屬性是該檢驗(yàn)規(guī)則的聲明標(biāo)識(shí)
classname="org.apache.struts.validator.FieldChecks"//檢驗(yàn)規(guī)則的實(shí)體類
method="validateRequired"http://檢驗(yàn)類中的方法名,指定聲明標(biāo)識(shí)將調(diào)用該方法來(lái)進(jìn)行檢驗(yàn)
methodParams="java.lang.Object,//檢驗(yàn)類所需要的傳入?yún)?shù)
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
msg="errors.required">//msg屬性指定了報(bào)錯(cuò)信息在資源配置文件中的"鍵值",通過(guò)該"鍵值"從資源配置文件中找到該條報(bào)錯(cuò)信息,并顯示出來(lái).
</validator>
<validator name="integer"
classname="org.apache.struts.validator.FieldChecks"
method="validateInteger"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.integer"
</validator>
<validator name="range"
classname="org.apache.struts.validator.FieldChecks"
method="validateIntRange"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
depends="integer"
msg="errors.range">
</validator>
</global>
</form-validation>
3個(gè)<validator>元素的校驗(yàn)規(guī)則
*校驗(yàn)值是否不為空或不為null
*校驗(yàn)值是否可以安全轉(zhuǎn)換為integer型
*校驗(yàn)該校驗(yàn)值的范圍是否在最大和最小值之間
<validator>元素還有其他屬性來(lái)幫助實(shí)現(xiàn)其他功能
name屬性為range的<validator>元素?fù)碛衐epends屬性,并指定屬性的內(nèi)容為"integer"
depends屬性的含義是:本<validator>校驗(yàn)規(guī)則必須依賴另一個(gè)檢驗(yàn)規(guī)則而實(shí)現(xiàn).換句話說(shuō),就是必須先校驗(yàn)depends屬性所指定的<validator>檢驗(yàn)規(guī)則,通過(guò)后才會(huì)校驗(yàn)自身規(guī)則.depends屬性的內(nèi)容應(yīng)該是另一組<validator>校驗(yàn)規(guī)則的聲明.
(2)2
validator.xml文件
該文件是將validator-rules.xml中的校驗(yàn)和應(yīng)用程序結(jié)合起來(lái)的配置文件,有了validator-rule.xml后,只要通過(guò)validator,.xml將它與具體校驗(yàn)邏輯結(jié)合,就能完成真正的具體校驗(yàn)
結(jié)合validator.xml的ActionForm
validator框架的ActionForm
package struts.sample.cap5.sample.form;
import org.apache.struts.validator.ValidatorForm;
public class CheckForm extends ValidatorForm{//不能繼承普通的ActionForm,必須繼承自ValidatorForm或ValidatorActionForm.若是動(dòng)態(tài)ActionForm,則需要繼續(xù)于DynaValidatorFor或DynaValidatorActionForm
private sring userName;
private int age;
private string email;
private string password;
public String getUserName(){
return userName;
}
public String getUserName(){
return userName;
}
public void setUserName(String userName){
this.userName=userName;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age=age;
}
public String getEmail(){
return email;
}
public void setEmail(string email){
this.email=email;
}
public String getPassWord(){
return password;
}
public void setPassword(String password){
this.password=password;
}
}
*ValidatorForm(或DynaValidatorFor)將根據(jù)surut-config.xml文件中<action>的name屬性,為當(dāng)前ActionForm調(diào)用相應(yīng)的校驗(yàn)規(guī)則,這在validator.xml中可以看到
*ValidatorActionForm(或DynaValidatorActionForm)使用struts-config.xml中<action>的path屬性,為當(dāng)前ActionForm調(diào)用相應(yīng)的檢驗(yàn)規(guī)則.
3.Locale對(duì)象
要?jiǎng)討B(tài)改變Locale對(duì)象,就必須先確定Locale對(duì)象的讀取在框架中是怎樣進(jìn)行的,Locale對(duì)象被保存在什么地方.
Struts框架對(duì)于Locale對(duì)象的讀取是通過(guò)Session來(lái)進(jìn)行的程序開(kāi)始進(jìn)行時(shí),Struts框架就已經(jīng)將Locale對(duì)象的實(shí)例存放在Session中得到Locale對(duì)象,再得到合適的資源配置文件.
把本地化Local對(duì)象的實(shí)例存放在Session中.
(1).存放本地化Locale對(duì)象到Session中是由Struts框架自行完成的..
(2).Struts框架內(nèi)容定義了GloBals類的靜態(tài)全局變量,LOCALE_KEY,用來(lái)表示org,apache,struts.action.LOCALE;不應(yīng)單獨(dú)使用,而是存放Locale對(duì)象用Globals.LOCALE_KEY來(lái)代替
package struts.sample.cap3.sample1.exception;
public class UserNameException extends Exception {
public UserNameException(){
super();
}
public UserNameException(String message){
super();
}
public UserNameException(String message,Throwable cause){
super(message,cause);
}
public UserNameException(Throwable cause){
super(cause);
}
public UserNameException(Exception exc){
super(exc);
}
}
package struts.sample.cap3.sample1.service
import struts.sample.cap3.sample1.exception.UserNameException;
import struts.sample.cap3.sample1.exception.UserNameException2;
public class UserNameService {
public void UserNameLogic() throws UserNameException{
throw new UserNameException("UserName");
}
}
package struts.sample.cap3.sample1.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import struts.sample.cap3.sample1.exception.UserNameException;
import struts.sample.cap3.sample1.service.UserNameService;
public class SampleAction extends Action{
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws Exception{
UserNameService userNameService=new UserNameService();
return null;
}
}
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page language="java"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<html>
<head><title>JSP for SampleForm</title>
</head>
<body>
<html:errors/><p/>
<html:form action="SampleAction.do">
userName : <html:text property="userName"/><br/>
password : <html:password property="password"/><br/>
sex: <html:select property="sex">
<html:option key="F" value="F"/>
<html:option key="M" value="M"/>
</html:select><br/>
age : <html:text property="age"/><br/>
email : <html:text property="email"/><br/>
<html:submit/><html:cacel/>
</html:form>
</body>
</html>
本篇文章包含了在用Struts開(kāi)發(fā)web應(yīng)用時(shí)經(jīng)常碰到的一些異常和錯(cuò)誤,根據(jù)異常或錯(cuò)誤信息本身,經(jīng)常可以找到潛在的錯(cuò)誤發(fā)生原因。
下面列出了一些Struts的常見(jiàn)錯(cuò)誤和異常,并給出了一些可能發(fā)生此類錯(cuò)誤或異常的原因。有的后面有相關(guān)連接,你可以通過(guò)它找到更多的信息。
Cannot retrieve mapping for action |
|
異常 |
javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login (/Login是你的action名字) |
|
|
可能原因 |
action沒(méi)有再 |
Cannot retrieve definition for form bean null |
|
異常 |
org.apache.jasper.JasperException: Cannot retrieve definition for form bean null |
可能原因 |
這個(gè)異常是因?yàn)?/span>Struts根據(jù)struts-config.xml中的mapping沒(méi)有找到action期望的form bean。大部分的情況可能是因?yàn)樵?/span>form-bean中設(shè)置的name屬性和action中設(shè)置的name屬性不匹配所致。換句話說(shuō),action和form都應(yīng)該各自有一個(gè)name屬性,并且要精確匹配,包括大小寫(xiě)。這個(gè)錯(cuò)誤當(dāng)沒(méi)有name屬性和action關(guān)聯(lián)時(shí)也會(huì)發(fā)生,如果沒(méi)有在action中指定name屬性,那么就沒(méi)有name屬性和action相關(guān)聯(lián)。當(dāng)然當(dāng)action制作某些控制時(shí),譬如根據(jù)參數(shù)值跳轉(zhuǎn)到相應(yīng)的jsp頁(yè)面,而不是處理表單數(shù)據(jù),這是就不用name屬性,這也是action的使用方法之一。 |
No action instance for path /xxxx could be created |
|
異常 |
No action instance for path /xxxx could be created |
可能原因 |
特別提示:因?yàn)橛泻芏嘀星闆r會(huì)導(dǎo)致這個(gè)錯(cuò)誤的發(fā)生,所以推薦大家調(diào)高你的web服務(wù)器的日志/調(diào)試級(jí)別,這樣可以從更多的信息中看到潛在的、在試圖創(chuàng)建action類時(shí)發(fā)生的錯(cuò)誤,這個(gè)action類你已經(jīng)在struts-config.xml中設(shè)置了關(guān)聯(lián)(即添加了<action>標(biāo)簽)。 |
在
|
|
在
|
|
你的classpath的問(wèn)題。例如web server沒(méi)有發(fā)現(xiàn)你的資源文件,資源文件必須在 |
|
Problem in |
|
Problem with |
|
相關(guān)鏈接 |
|
No getter method for property XXXX of bean org.apache.struts.taglib.html.BEAN |
|
異常 |
javax.servlet.jsp.JspException: No getter method for property username of bean org.apache.struts.taglib.html.BEAN |
可能原因 |
沒(méi)有位form bean中的某個(gè)變量定義getter 方法 |
這個(gè)錯(cuò)誤主要發(fā)生在表單提交的FormBean中,用struts標(biāo)記<html:text property=”username”>時(shí),在FormBean中必須有一個(gè)getUsername()方法。注意字母“U”。 |
|
Related Links |
|
java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm |
|
錯(cuò)誤 |
java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm |
可能原因 |
這個(gè)錯(cuò)誤主要發(fā)生在在classpath中找不到相應(yīng)的Java .class文件。如果這個(gè)錯(cuò)誤發(fā)生在web應(yīng)用程序的運(yùn)行時(shí),主要是因?yàn)橹付ǖ?/span>class文件不在web server的classpath中(
|
This error is sometimes seen when one or more |
|
相關(guān)連接 |
|
Exception creating bean of class org.apache.struts.action.ActionForm: {1} |
|
異常 |
javax.servlet.jsp.JspException: Exception creating bean of class org.apache.struts.action.ActionForm: {1} |
可能原因 |
Instantiating Struts-provided |
Not associating an |
|
Related Links |
|
Cannot find ActionMappings or ActionFormBeans collection |
|
Exception |
javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection |
可能原因 |
不是標(biāo)識(shí)Struts actionServlet的<servlet>標(biāo)記就是映射.do擴(kuò)展名的<sevlet-mapping>標(biāo)記或者兩者都沒(méi)有在web.xml中聲明。 |
在struts-config.xml中的打字或者拼寫(xiě)錯(cuò)誤也可導(dǎo)致這個(gè)異常的發(fā)生。例如缺少一個(gè)標(biāo)記的關(guān)閉符號(hào)/>。最好使用struts console工具檢查一下。 |
|
另外,load-on-startup必須在web.xml中聲明,這要么是一個(gè)空標(biāo)記,要么指定一個(gè)數(shù)值,這個(gè)數(shù)值用來(lái)表servlet運(yùn)行的優(yōu)先級(jí),數(shù)值越大優(yōu)先級(jí)越低。 |
|
還有一個(gè)和使用load-on-startup有關(guān)的是使用Struts預(yù)編譯JSP文件時(shí)也可能導(dǎo)致這個(gè)異常。 |
|
相關(guān)鏈接 |
|
NullPointerException at ... RequestUtils.forwardURL |
|
異常 |
java.lang.NullPointerException at org.apache.struts.util.RequestUtils.forwardURL(RequestUtils.java:1223) |
可能原因 |
在struts-config.xml中的forward元素缺少path屬性。例如應(yīng)該是如下形式: |
Cannot find bean org.apache.struts.taglib.html.BEAN in any scope |
|
Exception |
javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEAN in any scope |
|
|
Probable Causes |
試圖在Struts的form標(biāo)記外使用form的子元素。這常常發(fā)生在你在</html:form>后面使用Struts的html標(biāo)記。 另外要注意可能你不經(jīng)意使用的無(wú)主體的標(biāo)記,如<html:form … />,這樣web 服務(wù)器解析時(shí)就當(dāng)作一個(gè)無(wú)主體的標(biāo)記,隨后使用的所有<html>標(biāo)記都被認(rèn)為是在這個(gè)標(biāo)記之外的,如又使用了<html:text property=”id”> 還有就是在使用taglib引入HTML標(biāo)記庫(kù)時(shí),你使用的prefix的值不是html。 |
相關(guān)連接 |
|
Missing message for key xx.xx.xx |
|
Exception |
javax.servlet.jsp.JspException: Missing message for key xx.xx.xx |
Probable Causes |
這個(gè)key的值對(duì)沒(méi)有在資源文件 |
|
Cannot find message resources under key org.apache.struts.action.MESSAGE |
|
異常 |
Cannot find message resources under key org.apache.struts.action.MESSAGE |
可能原因 |
很顯然,這個(gè)錯(cuò)誤是發(fā)生在使用資源文件時(shí),而Struts沒(méi)有找到資源文件。 |
Implicitly trying to use message resources that are not available (such as using empty |
|
XML parser issues -- too many, too few, incorrect/incompatible versions |
|
Related Links |
|
No input attribute for mapping path /loginAction |
|
錯(cuò)誤 |
No input attribute for mapping path /xxxxAction |
可能原因e |
No |
Related Links |
|
Strange Output Characters |
|
錯(cuò)誤 |
Strange and seemingly random characters in HTML and on screen, but not in original JSP or servlet. |
可能原因 |
混和使用Struts的html:form標(biāo)記和標(biāo)準(zhǔn)的HTML標(biāo)記不正確。 |
使用的編碼樣式在本頁(yè)中不支持。 |
"Document contained no data" or no data rendered on page |
|
錯(cuò)誤 |
"Document contained no data" in Netscape |
No data rendered (completely empty) page in Microsoft Internet Explorer |
|
可能原因 |
使用一個(gè)Action的派生類而沒(méi)有實(shí)現(xiàn)perform()方法或execute()方法。在Struts1.0中實(shí)現(xiàn)的是perform()方法,在Struts1.1中實(shí)現(xiàn)的是execute()方法,但Struts1.1向后兼容perform()方法。 但你使用Struts1.1創(chuàng)建一個(gè)Action的派生類,并且實(shí)現(xiàn)了execute()方法,而你在Struts1.0中運(yùn)行的話,就會(huì)得到"Document contained no data" error message in Netscape or a completely empty (no HTML whatsoever) page rendered in Microsoft Internet Explorer.”的錯(cuò)誤信息。 |