Struts-config.xml是struts框架的核心配置文件,其最基本的功能是用來配置Action和ActionForm,通知Struts框架完成傳遞和頁面流轉(zhuǎn).
一.處理異常的exception和global-exception
在Web應用中,對異常處理位置都是業(yè)務邏輯失敗的信息.因為異常處理還需要編寫ActionErrors,給出報錯信息將導致在Action會看到許多的ActionErrors的代碼.
struts解決了這個問題,它允許程序員配置任何異常,并且在將異常轉(zhuǎn)化為報錯信息的時候,不必須自行使用"try catch"來捕捉,寫報錯轉(zhuǎn)發(fā)到出錯頁面.
1.局部異常
就是針對一個Action響應所拋出的異常,該異常將只負責Action的程序段,并且自定義在<action>元素中.
局部異常的定義:
<action-mapping>
<action
input="SampleJsp.jsp"
指定了SampleForm對象使用的ActionForrm對象名稱,與form-bean元素定義的name屬性一致
name="SampleForm"
指定了SampleForm對象使用的ActionForm對象名稱
path="/SampleAction"
如果使用了SampleForm.do的響應,那么ActionServlet控制器組件就會自動找到本Action對象
scope="request"
使用ActionForm的范圍
type="struts.sample.cap3.sample1.action.SampleAction"
解釋本Action對象的路俓
validate="false">
定義使用的ActionForm在Action是否需要檢驗
<expetion
key="userNameException"
指定了在資源配置文件中報錯信息的鍵
path="/SampleJsp.jsp"
指定了報錯之后所轉(zhuǎn)發(fā)到的JSP頁面,在該頁面中可以通過標簽庫來讀取報錯信息,并顯示
type="struts.sample.cap3.sample1.exception.UserNameException"/>
指定了該異常類的java實體名
<exception
key="SampleJsp.jsp"
type="java.sql.SQLException"/>
</action>
</action-mappings>
2.全局異常
指對所有定義在Struts-config.xml的Action程序都進行處理,他定義在<global-exception>元素中
<global-exception>
<exception
key="passWordException.jsp"
path="SampleJsp.jsp"
type="struts.sample.cap3.sample.exception.passWordException"/>
<global-exception>
定義全局變量時無需將<exception>元素作為任何<action>元素的子元素,而是直接作為 <global-exception>的子元素.
簡單示例:
(1).自定義標簽類
UserNameException.java
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);
}
}
(2)業(yè)務邏輯類
UserNameService.java
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");
}
}
(3)Action類
SampleAction.java
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;
}
}
(4)資源配置文件
application.properties
userNameException=用戶名無法確定
XXX=XXX
....
(5)JSP頁面
<%@ 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>
二:global-forwards標記與全局轉(zhuǎn)發(fā)
1.全局轉(zhuǎn)發(fā)
所謂全局轉(zhuǎn)發(fā),就是在整個應用程序中,無論怎樣的請求者都可以使用的全局中轉(zhuǎn).它可以僅僅通過一個請求轉(zhuǎn)發(fā)到一個JSP頁面,也可以通過另一個請求轉(zhuǎn)發(fā)到另一個已經(jīng)定義的Action請求.可以理解為全局轉(zhuǎn)發(fā)就是一個控制器,它可以隨著按鈕(請求)的切換而轉(zhuǎn)換(轉(zhuǎn)發(fā))到任何一個頻道(JSP頁面和請求).
2. global-forward標記的配置
<blobal-forward>
<forward
name="Login"
path="/LoginSampleJSP.jsp"/>
<forward
name="success"
path="/SampleAction"
redirect="true" 屬性允許在2個Web context中進行轉(zhuǎn)發(fā),默認為false
contextRelative="true"/> 屬性允許在多個struts配置文件模塊中都可以識別轉(zhuǎn)發(fā),默認為false.
</blobal-forwards>
name的屬性,path的屬性是必須的,它們分別表示了轉(zhuǎn)發(fā)標識和轉(zhuǎn)發(fā)定位,對于任何一個<forward>元素都可以被設置.它實現(xiàn)了無論是全局轉(zhuǎn)發(fā)還是局部轉(zhuǎn)發(fā)都可以在模塊間實現(xiàn)通訊.
3.Struts-config.xml中的轉(zhuǎn)發(fā)
(1).<action>元素結(jié)合Action bean的局部轉(zhuǎn)發(fā)
(2).<action>元素的簡單局部轉(zhuǎn)發(fā)
(3).Action bean中的程序轉(zhuǎn)發(fā)
(4).<global-forwards>的全局轉(zhuǎn)發(fā)
(1)這類轉(zhuǎn)發(fā)是在請求到來后做一些業(yè)務邏輯,然后根據(jù)業(yè)務需要將結(jié)果轉(zhuǎn)發(fā)到另一個請求或直接顯示出一個JSP頁面.
Struts-config.xml配置
<action-mapping>
<action
name="SampleForm"
path="/SampleAction"
scope="request"
type="struts.sample.cap3.sample1.action.SampleAction"
validate="false">
<forward name="SampleAction" path="/SampleJsp.jsp"/>
<forward name="failue" path="/Login"/>
</action>
</action-mapping>
Action bean程序代碼
public class SampleAction extends Action{
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request ,
HttpServletResponse response) throws Exception{
//業(yè)務邏輯代碼................
if(true){
return mapping.findForward("SampleAction");
}else{
return mappingForward("failue")
}
}
(2) 這類轉(zhuǎn)發(fā)只需要定義<action>元素,而不用專門的Action bean來配合工作,可以轉(zhuǎn)發(fā)到請求或JSP頁面.通常這類轉(zhuǎn)發(fā)被用作直接轉(zhuǎn)發(fā)到一個JSP顯示頁面的請求.
<action forward="/SampleJsp.jsp" path="/Welcome"/>
利用<action>元素的forward屬性和path屬性來完成工作,沒有定義的ActionForm的name屬性和定義Action bean Java實體名的type屬性.當請求為path屬性所定義的內(nèi)容時,將直接轉(zhuǎn)發(fā)到forward屬性所指定的地方...
(3).通過Action bean的execte方法由程序員利用代碼來制定轉(zhuǎn)發(fā).通常這類轉(zhuǎn)發(fā)被使用在不確定轉(zhuǎn)發(fā)目的地的場合,可能會根據(jù)請求request或ActionForm傳入的內(nèi)容來指定轉(zhuǎn)發(fā)
Struts-config.xml配置
<action-mapping>
<action
name="SampleForm"
path="/SampleAction"
scope="request"
type="struts.sample.cap3.sample1.action.SampleAction"
validate="false">
<forward name="SampleAction" path="/SampleJsp.jsp"/>
<forward name="failue" path="/Login"/>
</action>
</action-mapping>
Action bean程序代碼
public class SampleAction extends Action{
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request ,
HttpServletResponse response) throws Exception{
//業(yè)務邏輯代碼................
return new ActionForward(request.getParmeter("pageFlow"));}
}
返回的ActionForward類型對象可以實現(xiàn)動態(tài)轉(zhuǎn)發(fā),本示例中使用JSP頁面中名為"pageFlow"的控件所指定的值作為轉(zhuǎn)發(fā)目的地."pageFlow"控件的值可以是一個請求,也可以是一個JSP頁面.這樣,轉(zhuǎn)發(fā)的目的地就完全交給進行請求的JSP頁面來指定.
(4).這一類型的轉(zhuǎn)發(fā)僅僅關(guān)注在轉(zhuǎn)發(fā)這個動作上面,而不關(guān)注請求,因此全局轉(zhuǎn)發(fā)必須配合<action>元素或者Action bean來實現(xiàn)"請求-轉(zhuǎn)發(fā)"的整個過程.這類轉(zhuǎn)發(fā)通常被使用在有統(tǒng)一轉(zhuǎn)發(fā)目的地的顯式邏輯中.
struts-config.xml配置(同上)
Actionbean部分(同上)+
return mapping.findForward("Login");
return mapping.findForward("SampleAction");
四.控制器
Struts框架的控制器由ActionServlet(Struts Servlet) RequestProcessor(請求處理),ModoleConfig(存儲配置信息),Action,
ActionForward(Action的轉(zhuǎn)發(fā))5個主要對象多組成,他們完成了Struts框架服務器端表示層MVC的所有工作.
流程如下
1.客戶端的請求到來后發(fā)送到ActionServlet中
2.ActionServlet調(diào)用RequestProoessor處理用戶請求
3.RequestProcess根據(jù)Module得到請求對應的Action
4.具體Action對象處理請求的具體工作
5.從Action的處理返回ActionForward,轉(zhuǎn)發(fā)到指定的目的地....
posted on 2007-09-22 17:59
冬天出走的豬 閱讀(693)
評論(0) 編輯 收藏 所屬分類:
struts