一.處理異常的exception和global-exception
在Web應用中,對異常處理位置都是業務邏輯失敗的信息.因為異常處理還需要編寫ActionErrors,給出報錯信息將導致在Action會看到許多的ActionErrors的代碼.
struts解決了這個問題,它允許程序員配置任何異常,并且在將異常轉化為報錯信息的時候,不必須自行使用"try catch"來捕捉,寫報錯轉發到出錯頁面.
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" 指定了報錯之后所轉發到的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)業務邏輯類
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標記與全局轉發
1.全局轉發
所謂全局轉發,就是在整個應用程序中,無論怎樣的請求者都可以使用的全局中轉.它可以僅僅通過一個請求轉發到一個JSP頁面,也可以通過另一個請求轉發到另一個已經定義的Action請求.可以理解為全局轉發就是一個控制器,它可以隨著按鈕(請求)的切換而轉換(轉發)到任何一個頻道(JSP頁面和請求).
2. global-forward標記的配置
<blobal-forward>
<forward
name="Login"
path="/LoginSampleJSP.jsp"/>
<forward
name="success"
path="/SampleAction"
redirect="true" 屬性允許在2個Web context中進行轉發,默認為false
contextRelative="true"/> 屬性允許在多個struts配置文件模塊中都可以識別轉發,默認為false.
</blobal-forwards>
name的屬性,path的屬性是必須的,它們分別表示了轉發標識和轉發定位,對于任何一個<forward>元素都可以被設置.它實現了無論是全局轉發還是局部轉發都可以在模塊間實現通訊.
3.Struts-config.xml中的轉發
(1).<action>元素結合Action bean的局部轉發
(2).<action>元素的簡單局部轉發
(3).Action bean中的程序轉發
(4).<global-forwards>的全局轉發
(1)這類轉發是在請求到來后做一些業務邏輯,然后根據業務需要將結果轉發到另一個請求或直接顯示出一個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{
//業務邏輯代碼................
if(true){
return mapping.findForward("SampleAction");
}else{
return mappingForward("failue")
}
}
(2) 這類轉發只需要定義<action>元素,而不用專門的Action bean來配合工作,可以轉發到請求或JSP頁面.通常這類轉發被用作直接轉發到一個JSP顯示頁面的請求.
<action forward="/SampleJsp.jsp" path="/Welcome"/>
利用<action>元素的forward屬性和path屬性來完成工作,沒有定義的ActionForm的name屬性和定義Action bean Java實體名的type屬性.當請求為path屬性所定義的內容時,將直接轉發到forward屬性所指定的地方...
(3).通過Action bean的execte方法由程序員利用代碼來制定轉發.通常這類轉發被使用在不確定轉發目的地的場合,可能會根據請求request或ActionForm傳入的內容來指定轉發
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{
//業務邏輯代碼................
return new ActionForward(request.getParmeter("pageFlow"));}
}
返回的ActionForward類型對象可以實現動態轉發,本示例中使用JSP頁面中名為"pageFlow"的控件所指定的值作為轉發目的地."pageFlow"控件的值可以是一個請求,也可以是一個JSP頁面.這樣,轉發的目的地就完全交給進行請求的JSP頁面來指定.
(4).這一類型的轉發僅僅關注在轉發這個動作上面,而不關注請求,因此全局轉發必須配合<action>元素或者Action bean來實現"請求-轉發"的整個過程.這類轉發通常被使用在有統一轉發目的地的顯式邏輯中.
struts-config.xml配置(同上)
Actionbean部分(同上)+
return mapping.findForward("Login");
return mapping.findForward("SampleAction");
四.控制器
Struts框架的控制器由ActionServlet(Struts Servlet) RequestProcessor(請求處理),ModoleConfig(存儲配置信息),Action,
ActionForward(Action的轉發)5個主要對象多組成,他們完成了Struts框架服務器端表示層MVC的所有工作.
流程如下
1.客戶端的請求到來后發送到ActionServlet中
2.ActionServlet調用RequestProoessor處理用戶請求
3.RequestProcess根據Module得到請求對應的Action
4.具體Action對象處理請求的具體工作
5.從Action的處理返回ActionForward,轉發到指定的目的地....