struts源碼研究3 ActionForm
Posted on 2008-12-09 21:48 wesley1987 閱讀(683) 評(píng)論(0) 編輯 收藏 所屬分類: struts源碼學(xué)習(xí)ActionForm 源碼+注釋翻譯。
郁悶,第一次翻譯的文件被我弄丟了,又重來(lái)了一遍。
import org.apache.struts.upload.MultipartRequestHandler;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
/**
* 一個(gè)ActionForm是可以與一個(gè)或多個(gè)任意的ActionMapping關(guān)聯(lián)的JavaBean。這個(gè)bean的里屬性
* 在對(duì)應(yīng)Action.execute方法調(diào)用前,由對(duì)應(yīng)的request初始化。
*
* 當(dāng)這個(gè)bean的屬性被賦值后,Action.execute方法調(diào)用之前,bean的validate方法
* 將被調(diào)用,這個(gè)方法用來(lái)校驗(yàn)用戶提交的屬性值。如果發(fā)現(xiàn)錯(cuò)誤,就返回一個(gè)包含了這些錯(cuò)誤內(nèi)容的
* error信息。controller將返回至相應(yīng)的輸入表單。如果無(wú)錯(cuò)誤,validate方法就返回null,
* 相應(yīng)的Action.execute方法將被調(diào)用。
*
* 這個(gè)類必須被繼承使用。子類要為所有會(huì)被公開(expose)的bean屬性提供get和set方法,以及
* 重寫一些public或protected方法以提供具體實(shí)現(xiàn)。
*
* 由于ActionForm是JavaBeans,所以根據(jù)JavaBeans的規(guī)范,子類也會(huì)實(shí)現(xiàn)Serializable(可序列
* 化)接口。為了使用ActionForm相關(guān)的introspection API ?,一些容器會(huì)要求一個(gè)Form對(duì)象滿足
* 所有JavaBean規(guī)范。
*
*/
public abstract class ActionForm implements Serializable {
// ----------------------------------------------------- Instance Variables
/**
* <p>The servlet instance to which we are attached.</p>
*/
protected transient ActionServlet servlet = null;
/**
* MultipartRequestHandler
* 這個(gè)form的多請(qǐng)求處理對(duì)象。 //transient表示該屬性將不被序列化。
* //wzl注:該對(duì)象的作用大約是結(jié)合upload包里的類,實(shí)現(xiàn)文件的上傳功能。
* //由于還沒接觸過,所以下面的相關(guān)方法不再翻譯
*/
protected transient MultipartRequestHandler multipartRequestHandler;
// ------------------------------------------------------------- Properties
/**
* @return The servlet instance to which we are attached.
*/
protected ActionServlet getServlet() {
return (this.servlet);
}
/**
* ActionServletWrapper
* 將所屬的控制器servlet以ActionServletWrapper對(duì)象返回。
* //該對(duì)象也在servlet上提供了對(duì)MultipartRequestHandler的使用。
* @return An instance of ActionServletWrapper
*/
public ActionServletWrapper getServletWrapper() {
return new ActionServletWrapper(getServlet());
}
/**
* <p>Return the <code>MultipartRequestHandler</code> for this form The
* reasoning behind this is to give form bean developers control over the
* lifecycle of their multipart requests through the use of the
* <code>finish</code> and/or <code>rollback</code> methods of
* <code>MultipartRequestHandler</code>. This method will return
* <code>null</code> if this form's enctype is not "multipart/form-data".
* </p>
*
* @return The {@link org.apache.struts.upload.MultipartRequestHandler}
* for this form.
* @see org.apache.struts.upload.MultipartRequestHandler
*/
public MultipartRequestHandler getMultipartRequestHandler() {
return multipartRequestHandler;
}
/**
* 設(shè)定所屬的servlet(若非空)實(shí)例。
*
* @param servlet The new controller servlet, if any
*/
public void setServlet(ActionServlet servlet) {
this.servlet = servlet;
// :FIXME: Should this be releasing resources?
}
/**
* <p>Set the Handler provided for use in dealing with file uploads.</p>
*
* @param multipartRequestHandler The Handler to use for fileuploads.
*/
public void setMultipartRequestHandler(
MultipartRequestHandler multipartRequestHandler) {
this.multipartRequestHandler = multipartRequestHandler;
}
// --------------------------------------------------------- Public Methods
/**
* //直接調(diào)用下面那個(gè)重載HTTP的。
*/
public void reset(ActionMapping mapping, ServletRequest request) {
try {
reset(mapping, (HttpServletRequest) request);
} catch (ClassCastException e) {
; // FIXME: Why would this ever happen except a null
}
}
/**
* 用來(lái)重置bean中的屬性。這個(gè)方法在屬性被控制器賦值前調(diào)用。
*
* 默認(rèn)的方法體為空,實(shí)際中發(fā)現(xiàn),唯一需要被重置的是聲明到session中表單的checkboxs屬性
* 除此以外的屬性,都會(huì)在域聲明時(shí)被初始化。
*
* 如果為了實(shí)現(xiàn)form能被多個(gè)請(qǐng)求取值而將其放到了session中,那么你必須非常注意那些被
* 重置(reset)的值,如上面提到的,對(duì)于每一個(gè)輸入表單內(nèi)容的頁(yè)面,必須將session范圍中的
* checkboxs提前重置為fales。這是因?yàn)橹挥挟?dāng)checkbox為fales時(shí)才表示客戶沒有提交該值。
* 如果一個(gè)session中的checkbox沒有被提前重置的話,他將永遠(yuǎn)不會(huì)為fales。
*
* 這個(gè)方法不適合用來(lái)給"修改"類型的頁(yè)面中的表單賦初始值(這應(yīng)該在setup Action中)。你唯一需要
* 關(guān)心的就是將checkbox的值改為fales。所以這個(gè)方法一般不用實(shí)現(xiàn)
*
* @param mapping The mapping used to select this instance
* @param request The servlet request we are processing
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
// Default implementation does nothing
}
/**
* //直接調(diào)用下面那個(gè)重載HTTP的。
*/
public ActionErrors validate(ActionMapping mapping, ServletRequest request) {
try {
return (validate(mapping, (HttpServletRequest) request));
} catch (ClassCastException e) {
return (null);
}
}
/**
* 用來(lái)驗(yàn)證request中的屬性值,并返回一個(gè)ActionErrors對(duì)象,它包含了驗(yàn)證中發(fā)現(xiàn)的錯(cuò)誤信息。
* 如果驗(yàn)證成功,則返回null 或一個(gè)無(wú)錯(cuò)誤信息記錄的ActionErrors對(duì)象。
*
* 默認(rèn)的執(zhí)行體為空并返回null,子類中必須重寫這個(gè)方法以提供需要的驗(yàn)證操作。
*
* @param mapping The mapping used to select this instance
* @param request The servlet request we are processing
* @return 驗(yàn)證失敗就返回錯(cuò)誤信息; 驗(yàn)證成功則返回null或空的信息。
*
* @see DynaActionForm
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
return (null);
}
}
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
/**
* 一個(gè)ActionForm是可以與一個(gè)或多個(gè)任意的ActionMapping關(guān)聯(lián)的JavaBean。這個(gè)bean的里屬性
* 在對(duì)應(yīng)Action.execute方法調(diào)用前,由對(duì)應(yīng)的request初始化。
*
* 當(dāng)這個(gè)bean的屬性被賦值后,Action.execute方法調(diào)用之前,bean的validate方法
* 將被調(diào)用,這個(gè)方法用來(lái)校驗(yàn)用戶提交的屬性值。如果發(fā)現(xiàn)錯(cuò)誤,就返回一個(gè)包含了這些錯(cuò)誤內(nèi)容的
* error信息。controller將返回至相應(yīng)的輸入表單。如果無(wú)錯(cuò)誤,validate方法就返回null,
* 相應(yīng)的Action.execute方法將被調(diào)用。
*
* 這個(gè)類必須被繼承使用。子類要為所有會(huì)被公開(expose)的bean屬性提供get和set方法,以及
* 重寫一些public或protected方法以提供具體實(shí)現(xiàn)。
*
* 由于ActionForm是JavaBeans,所以根據(jù)JavaBeans的規(guī)范,子類也會(huì)實(shí)現(xiàn)Serializable(可序列
* 化)接口。為了使用ActionForm相關(guān)的introspection API ?,一些容器會(huì)要求一個(gè)Form對(duì)象滿足
* 所有JavaBean規(guī)范。
*
*/
public abstract class ActionForm implements Serializable {
// ----------------------------------------------------- Instance Variables
/**
* <p>The servlet instance to which we are attached.</p>
*/
protected transient ActionServlet servlet = null;
/**
* MultipartRequestHandler
* 這個(gè)form的多請(qǐng)求處理對(duì)象。 //transient表示該屬性將不被序列化。
* //wzl注:該對(duì)象的作用大約是結(jié)合upload包里的類,實(shí)現(xiàn)文件的上傳功能。
* //由于還沒接觸過,所以下面的相關(guān)方法不再翻譯
*/
protected transient MultipartRequestHandler multipartRequestHandler;
// ------------------------------------------------------------- Properties
/**
* @return The servlet instance to which we are attached.
*/
protected ActionServlet getServlet() {
return (this.servlet);
}
/**
* ActionServletWrapper
* 將所屬的控制器servlet以ActionServletWrapper對(duì)象返回。
* //該對(duì)象也在servlet上提供了對(duì)MultipartRequestHandler的使用。
* @return An instance of ActionServletWrapper
*/
public ActionServletWrapper getServletWrapper() {
return new ActionServletWrapper(getServlet());
}
/**
* <p>Return the <code>MultipartRequestHandler</code> for this form The
* reasoning behind this is to give form bean developers control over the
* lifecycle of their multipart requests through the use of the
* <code>finish</code> and/or <code>rollback</code> methods of
* <code>MultipartRequestHandler</code>. This method will return
* <code>null</code> if this form's enctype is not "multipart/form-data".
* </p>
*
* @return The {@link org.apache.struts.upload.MultipartRequestHandler}
* for this form.
* @see org.apache.struts.upload.MultipartRequestHandler
*/
public MultipartRequestHandler getMultipartRequestHandler() {
return multipartRequestHandler;
}
/**
* 設(shè)定所屬的servlet(若非空)實(shí)例。
*
* @param servlet The new controller servlet, if any
*/
public void setServlet(ActionServlet servlet) {
this.servlet = servlet;
// :FIXME: Should this be releasing resources?
}
/**
* <p>Set the Handler provided for use in dealing with file uploads.</p>
*
* @param multipartRequestHandler The Handler to use for fileuploads.
*/
public void setMultipartRequestHandler(
MultipartRequestHandler multipartRequestHandler) {
this.multipartRequestHandler = multipartRequestHandler;
}
// --------------------------------------------------------- Public Methods
/**
* //直接調(diào)用下面那個(gè)重載HTTP的。
*/
public void reset(ActionMapping mapping, ServletRequest request) {
try {
reset(mapping, (HttpServletRequest) request);
} catch (ClassCastException e) {
; // FIXME: Why would this ever happen except a null
}
}
/**
* 用來(lái)重置bean中的屬性。這個(gè)方法在屬性被控制器賦值前調(diào)用。
*
* 默認(rèn)的方法體為空,實(shí)際中發(fā)現(xiàn),唯一需要被重置的是聲明到session中表單的checkboxs屬性
* 除此以外的屬性,都會(huì)在域聲明時(shí)被初始化。
*
* 如果為了實(shí)現(xiàn)form能被多個(gè)請(qǐng)求取值而將其放到了session中,那么你必須非常注意那些被
* 重置(reset)的值,如上面提到的,對(duì)于每一個(gè)輸入表單內(nèi)容的頁(yè)面,必須將session范圍中的
* checkboxs提前重置為fales。這是因?yàn)橹挥挟?dāng)checkbox為fales時(shí)才表示客戶沒有提交該值。
* 如果一個(gè)session中的checkbox沒有被提前重置的話,他將永遠(yuǎn)不會(huì)為fales。
*
* 這個(gè)方法不適合用來(lái)給"修改"類型的頁(yè)面中的表單賦初始值(這應(yīng)該在setup Action中)。你唯一需要
* 關(guān)心的就是將checkbox的值改為fales。所以這個(gè)方法一般不用實(shí)現(xiàn)
*
* @param mapping The mapping used to select this instance
* @param request The servlet request we are processing
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
// Default implementation does nothing
}
/**
* //直接調(diào)用下面那個(gè)重載HTTP的。
*/
public ActionErrors validate(ActionMapping mapping, ServletRequest request) {
try {
return (validate(mapping, (HttpServletRequest) request));
} catch (ClassCastException e) {
return (null);
}
}
/**
* 用來(lái)驗(yàn)證request中的屬性值,并返回一個(gè)ActionErrors對(duì)象,它包含了驗(yàn)證中發(fā)現(xiàn)的錯(cuò)誤信息。
* 如果驗(yàn)證成功,則返回null 或一個(gè)無(wú)錯(cuò)誤信息記錄的ActionErrors對(duì)象。
*
* 默認(rèn)的執(zhí)行體為空并返回null,子類中必須重寫這個(gè)方法以提供需要的驗(yàn)證操作。
*
* @param mapping The mapping used to select this instance
* @param request The servlet request we are processing
* @return 驗(yàn)證失敗就返回錯(cuò)誤信息; 驗(yàn)證成功則返回null或空的信息。
*
* @see DynaActionForm
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
return (null);
}
}