第一篇:struts異??偨Y(jié)
Java的Struts框架的異常處理
Struts提供了一個(gè)更簡(jiǎn)單的方式來(lái)處理未捕獲的異常,并將用戶重定向到一個(gè)專門的錯(cuò)誤頁(yè)面。
Struts的異常處理所使用的“exception”攔截容易。“exception”攔截器作為默認(rèn)的棧的一部分,所以不必做任何額外的配置。它可為準(zhǔn)備使用的盒。
根據(jù)
局部異常映射:將
全局異常映射:將
全局異常映射對(duì)所有的Action都有效,但局部異常映射僅對(duì)該異常映射所在的Action有效。
如果局部異常映射和全局異常映射配置了同一個(gè)異常類型,在
有異常往外拋即可。你也可以在方法里面拋,比如throw SQLException。
我們可以使用Struts2的標(biāo)簽輸出異常信息:
輸出異常的message屬性信息:
有了處理系統(tǒng)異常的基礎(chǔ),我們來(lái)看一看自定義異常:
packagecom.exception;public class MyException extends Exception {
private String message;
publicMyException(String message){ super(message);this.message = message;} public String getMessage(){ return message;} public void setMessage(String message){ this.message = message;} }
public String execute()throws Exception { if(!“hello”.equals(usename)||!“world”.equals(password)){ throw new MyException(“用戶名或密碼錯(cuò)誤,您發(fā)現(xiàn)了吧!”);} return “success”;}
在action配置中的異常處理
在全局配置中的異常處理
錯(cuò)誤頁(yè)面error.jsp
<%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%> <%@ taglib prefix=“s” uri=“/struts-tags”%>
第二篇:Struts 2期末考試
1、MVC模式(View-model-controller)
2、MVC模式的優(yōu)點(diǎn):
(1)低耦合性。視圖層、模型層和控制層分離,很容易改變應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則,只需改變MVC的模型層就可以了。
(2)高重用性。多個(gè)視圖可以對(duì)應(yīng)一個(gè)模型,這樣減少了代碼的重復(fù)性及維護(hù)量,一旦模型發(fā)生改變,也易于維護(hù)。
(3)可實(shí)用性。MVC允許使用各種不同的表現(xiàn)層技術(shù)來(lái)訪問(wèn)同一個(gè)服務(wù)器端的代碼。如jsp、velocity等。(4)可維護(hù)性。3個(gè)模塊層相分離,是的web應(yīng)用更易維護(hù)和修改。
3、model2模式下,模型用javaBean充當(dāng),視圖有jsp頁(yè)面充當(dāng),控制器由servlet充當(dāng)。
4.struts2是在struts1的基礎(chǔ)上發(fā)展起來(lái)的,以webwork為核心,采用webwork的設(shè)計(jì)理念。Struts2是webwork的升級(jí)。
5、webwork是基于MVC架構(gòu)模式的J2EE Web框架,現(xiàn)在的最新版本被拆分為XWork和WebWork2兩個(gè)項(xiàng)目。WebWork的優(yōu)點(diǎn):
(1)action不需要與WebWork耦合,提高了代碼的重用率。
(2)支持更多表現(xiàn)層技術(shù),從而有更好的適用性。Webwork的特征:
(1)靈活的validation框架。運(yùn)行開(kāi)發(fā)者在XML文件中定義驗(yàn)證內(nèi)容,在運(yùn)行時(shí)通過(guò)interceptor自動(dòng)應(yīng)用,這樣可以脫離Action類。
(2)Interceptor。在action處理的前后實(shí)現(xiàn)動(dòng)態(tài)攔截,簡(jiǎn)化action代碼。(3)支持I18N(4)支持OGNL表達(dá)式語(yǔ)言
(5)Type Conversion.允許類之間很容易實(shí)現(xiàn)對(duì)象的轉(zhuǎn)換。(6)允許動(dòng)態(tài)對(duì)象圖表遍歷和方法執(zhí)行,使用valuestack透明訪問(wèn)多beans的屬性。
(7)Ioc容器。管理組件的生命周期,使客戶不需要通過(guò)創(chuàng)建注冊(cè)類獲得組件實(shí)例。
(8)velocity templates.使UI組件可重用,從而允許開(kāi)發(fā)者很容易地定制Web頁(yè)面的look&feel。
(9)容易和第三方軟件集成。例如hibernate、spring和sitemesh。
(10)支持多種視圖技術(shù)。如jsp、velosity、freemarker和xml等。
6、struts2框架的大致處理流程:(1)客戶端瀏覽器發(fā)送一個(gè)請(qǐng)求。
(2)核心控制器filterdispatcher根據(jù)請(qǐng)求決定調(diào)用合適的action。
(3)webwork的攔截器鏈自動(dòng)對(duì)請(qǐng)求應(yīng)用通過(guò)功能,如驗(yàn)證。
(4)回調(diào)action的execute()方法,該方法根據(jù)請(qǐng)求的參數(shù)來(lái)執(zhí)行一定的操作。
(5)execute()方法的處理結(jié)果信息將被輸出到瀏覽器中,struts2支持多種形式的視圖。如jsp、html。
7、web.xml xmlns=“http://java.sun.com/xml/ns/javaee” xmlns:xsi=“http://004km.cn/2001/XMLSchema-instance” xsi:schemaLocation=“http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”> org.apache.struts2.dispatcher.FilterDispatcher
ShowWords.java package action;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings(“serial”)
public class ShowWords extends ActionSupport{
private String name;private String words;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getWords(){
return words;}
public void setWords(String words){
this.words = words;
}
public String execute(){
return INPUT;
}else{
words = “歡迎您:” + name;
return SUCCESS;
}
}
}(3)Struts.Xml
“-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”
“http://struts.apache.org/dtds/struts-2.0.dtd”>
extends=“struts-default”>
class=“action.ShowWords”> name=“success”>/showWords.jsp name=“input”>/inputWords.jsp
8、核心控制器FilterDispatcher:
核心控制器是struts2框架的基礎(chǔ),它包含了框架內(nèi)部的控制流程和處理機(jī)制。在web應(yīng)用中,F(xiàn)ilterDispatcher作為一個(gè)filter運(yùn)行,負(fù)責(zé)攔截所有的用戶請(qǐng)求。如果用戶請(qǐng)求以.action結(jié)尾,則該請(qǐng)求被轉(zhuǎn)入Struts框架處理。Struts2框架按模塊可以分為Servlet Filters、struts核心模塊、攔截器和用戶實(shí)現(xiàn)模塊。P33 Srtuts2框架處理一個(gè)請(qǐng)求的步驟:
(1)客戶端提交一個(gè)請(qǐng)求(HttpServletRequest).(2)請(qǐng)求被提交到一系列的過(guò)濾器(filter),首先提交ActionContextCleanUp然后提交到其他過(guò)濾器(SiteMesh等)最后提交到FilterDispatcher。
(3)FilterDispatcher詢問(wèn)ActionMapper是否需要調(diào)用某個(gè)Action來(lái)處理這個(gè)請(qǐng)求。如果ActionMapper決定需要調(diào)用某個(gè)Action,則FilterDispatcher把請(qǐng)求的處理交給ActionProxy。
(4)ActionProxy通過(guò)Configuration Manager(struts.xml)詢問(wèn)框架的配置文件,找到需要調(diào)用的Action類。(5)ActionProxy創(chuàng)建一個(gè)ActionInvocation實(shí)例,同時(shí)ActionInvocation通過(guò)代理模式調(diào)用Action,在調(diào)用之前,ActionInvocation會(huì)根據(jù)配置加載Action相關(guān)的所有攔截器。
(6)一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。
9、使用
元素配置包時(shí)可以指定4個(gè)屬性。屬性名name,必選,指定包的名稱,該名稱是該包被其他包引用的key值。
屬性名extends,可選,指明該包繼承的其他包。用extends繼承包,父包在子包前定義。Struts.xml
“-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”
“http://struts.apache.org/dtds/struts-2.0.dtd”>
value=“gb2312” /> class=“ActionClass1”> name=“success”>/success.jsp extends=“default” namespace=“/skill”> (1)dispatcher結(jié)果類型用來(lái)表示“轉(zhuǎn)發(fā)”到指定結(jié)果類型,它是Struts 2的默認(rèn)結(jié)果類型。 (2)redirect結(jié)果類型用來(lái)“重定向”到指定的結(jié)果資源,該資源可以是JSP文件,也可以是Action類。(3)redirectAction結(jié)果類型也是重定向到其他資源,重新生成一個(gè)新的請(qǐng)求。(4)其他結(jié)果類型 1、簡(jiǎn)述使用攔截的意義。 (1)通過(guò)攔截形式攔截器模塊,極大地提高了系統(tǒng)開(kāi)發(fā)的靈活性和復(fù)用性,AOP使用代理的方式,將多個(gè)攔截器和核心業(yè)務(wù)邏輯組合在一起,滿業(yè)務(wù)需求。 (2)通過(guò)使用攔截器,可以使核心框架代碼比以前更加簡(jiǎn)潔,使開(kāi)發(fā)人員更加快捷地使用框架的特性。 2、簡(jiǎn)述輸入校驗(yàn)流程。(1)(2)客戶端校驗(yàn)。 對(duì)請(qǐng)求的字符串參數(shù)進(jìn)行類型轉(zhuǎn)換,并設(shè)置為對(duì)應(yīng)的Action屬性值。 (3)如果類型轉(zhuǎn)換出現(xiàn)異常,將異常信息封裝到filedError中。 (4)調(diào)用Action的validateXxx()校驗(yàn)方法,其中xxx()方法是Action中對(duì)應(yīng)的處理邏輯方法。 (5)(6)調(diào)用Action類的validate()校驗(yàn)方法。完成上面的步驟后,框架開(kāi)始檢查在以上過(guò)程中是否產(chǎn)生了filedError,如果產(chǎn)生了,則返回邏輯視圖Input;反之,則返回處理方法中的邏輯視圖。 (7)系統(tǒng)根據(jù)上一步驟返回的邏輯視圖,結(jié)合struts.Xml文件的配置內(nèi)容。呈現(xiàn)相應(yīng)的視圖頁(yè)面。 http://58andy.sinaapp.com 學(xué)了很久的java,接觸SSH也有一段時(shí)間了,寫(xiě)成博文總是有點(diǎn)懶,最近在整理一些思緒,把SSH一點(diǎn)一滴放進(jìn)博客里,以備以后改進(jìn),再學(xué)習(xí)。 以我自己的了解,在進(jìn)行struts開(kāi)發(fā)的過(guò)程中,總也是出現(xiàn)很多的亂碼問(wèn)題,但歸根到底,也只是以下三種情況: ㈠頁(yè)面顯示中文亂碼 ㈡?zhèn)鬟f參數(shù)中文亂碼 ㈢國(guó)際化資源文件亂碼 下面就這三中情況介紹怎么在具體項(xiàng)目中處理這些亂碼問(wèn)題。而對(duì)于整體的處理思想,是要統(tǒng)一編碼為: UTF-8.(以myeclipse6支持的struts1.3為準(zhǔn)) ㈠頁(yè)面顯示中文亂碼 對(duì)于在頁(yè)面中顯示出現(xiàn)亂碼,這個(gè)問(wèn)題比較簡(jiǎn)單,便是檢查你的JSP文件里是不是出現(xiàn)了中文要處理,因?yàn)镴SP默認(rèn)的編碼格式為“ISO-8859-1”,當(dāng)JSP中出現(xiàn)要處理的中文時(shí),其顯示就出現(xiàn)亂碼了,這種情況一般出現(xiàn)在手寫(xiě)JSP,或修改時(shí)。因?yàn)樵趍yeclipse6.0中,如果出現(xiàn)了編碼錯(cuò)誤時(shí),程序不會(huì)讓你保存,而是會(huì)提示你注意編碼,這點(diǎn)很好。具體的修改辦法是把 Html代碼 1.<%.@ page language=“java” import=“java.util.” pageEncoding=“ISO-8859-1”> 改成: Html代碼 1.<%.@ page language=“java” import=“java.util.” pageEncoding=“UTF-8”> ㈡?zhèn)鬟f參數(shù)中文亂碼 傳遞參數(shù)出現(xiàn)的亂碼,參數(shù)的內(nèi)容為中文。比如在struts應(yīng)用中,簡(jiǎn)單的一個(gè)登錄界面中,需要傳遞的登錄名為中文時(shí),你沒(méi)經(jīng)處理之前,是會(huì)出現(xiàn)亂碼傳遞的,為了讓我們能看到顯示的亂碼,我們?cè)趯?duì)應(yīng)的Action類的子類里,修改一下,用System.out把接受到的參數(shù)輸出,代碼如下: Java代碼 http://58andy.sinaapp.com 1.public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, 2.HttpServletResponse response)...{ 3.DynaActionForm loginForm =(DynaActionForm)form;4.5.String username =(String)loginForm.get(“username”);6.String password =(String)loginForm.get(“password”);7.System.out.println(“username:”+username);8.System.out.println(“password:”+password);9.if(username.equals(“ivorytower”)&& password.equals(“123456”))...{ 10.return mapping.findForward(“success”);11.} 12.return mapping.findForward(“fail”);13.} 那么當(dāng)你提交了中文輸入后就會(huì)出現(xiàn)亂碼了。 具體的解決方法: ①修改Tomcat---->conf----->server.xml文件,在修改端口的標(biāo)簽后面加一行代碼,如下: Xml代碼 1. 3.redirectPort=“8443” URIEncoding=“UTF-8”/> ②編寫(xiě)過(guò)濾器Filter Java代碼 1.2.import java.io.IOException;3.4.import javax.servlet.Filter;5.import javax.servlet.FilterChain;6.import javax.servlet.FilterConfig;7.import javax.servlet.ServletException;8.import javax.servlet.ServletRequest;9.import javax.servlet.ServletResponse;10.11.public class CharacterEncodingFilter implements Filter...{ http://58andy.sinaapp.com 12.13.@Override 14.public void destroy()...{ 15.} 16.17.@Override 18.public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException,ServletException { 19.request.setCharacterEncoding(“utf-8”);20.chain.doFilter(request, response);21.} 22.23.@Override 24.public void init(FilterConfig arg0)throws ServletException...{ 25.} 26.27.} 利用過(guò)濾器,把requst傳遞的中文參數(shù)都設(shè)成“UTF-8”編碼。 ③修改web.xml文件 打開(kāi)項(xiàng)目里的web.xml文件,在前面加上如下代碼: Xml代碼 1.2. 3. 4. 6. 7. 注意其過(guò)濾的URL為“/*”,表示當(dāng)前的request請(qǐng)求。為了使設(shè)置生效,重起tomcat。 ㈢國(guó)際化資源文件亂碼 http://58andy.sinaapp.com ①利用JDK的native2ascii工具進(jìn)行編碼轉(zhuǎn)換 國(guó)際化問(wèn)題,主要是為了處理文件在瀏覽器上的顯示問(wèn)題,還是以登錄界面來(lái)說(shuō),比如在中文瀏覽器上,我們要看到中文顯示,對(duì)應(yīng)在英文瀏覽器上要顯示英文。那么我們?cè)诘卿浤莻€(gè)界面處理上,就不能直接寫(xiě)上我們的“用戶名”“密碼”等標(biāo)識(shí)了。就要用標(biāo)記轉(zhuǎn)換輸出了,修改為: Html代碼 1.2. 再者,打開(kāi)項(xiàng)目下的資源配置文件ApplicationResources.properties,依據(jù)上面所寫(xiě)key值,設(shè)定成我們要的默認(rèn)值(顯示英文),比如 引用 #Resource for Parameter 'com.v512.example.struts.ApplicationResources #Project webexample2 example.login.username=username example.login.password=password 現(xiàn)在我們動(dòng)手新建一個(gè)資源文件,讓其能顯示中文,直接Ctrl+C,Ctrl+V。改名為ApplicationResources_zh.properties,代碼如下: 引用 #Resource for Parameter 'com.v512.example.struts.ApplicationResources #Project webexample2 example.login.username=用戶名 example.login.password=密碼 但保存,myeclipse會(huì)報(bào)錯(cuò),這時(shí)我們需要修改資源文件的編碼格式。Windons---->Preferences---->Content Type------>Text----->JavaPropertiesFile,把其Default encoding改為“utf-8”,按“update”更新。這樣就能進(jìn)行保存了。但是當(dāng)我們進(jìn)行驗(yàn)證會(huì)不是成功時(shí),仍然給我們的是亂碼。 不急,我們還得做一項(xiàng)任務(wù),打開(kāi)DOS窗口,CMD到資源文件所在目錄,運(yùn)用JDK的native2ascii工具把我們新建的資源文件改成另一個(gè)名字的資源文件,例如bank.properties。命令如下: 引用 >native2ascii-encoding gbk ApplicationResources_zh.properties bank.properties http://58andy.sinaapp.com 打開(kāi)bank.properties資源文件,自動(dòng)生成的代碼如下: 引用 #Generated by ResourceBundle Editor(http://eclipse-rbe.sourceforge.net) example.login.username = u7528u6237u540D example.login.password = u5BC6u7801 然后在myeclipse窗口中,把原來(lái)新建ApplicationResources_zh.properties 刪除,并把bank.properties改為ApplicationResources_zh.properties(為了方便記憶,管理)。然后重起tomcat或進(jìn)行reload文件,我們發(fā)現(xiàn)亂碼問(wèn)題沒(méi)有了。 ②利用Eclipse ResourceBundle Editor插件工具 以上我們是利用了JDK的native2ascii工具來(lái)處理國(guó)際化問(wèn)題,但在EC中,還有一種更方便的工具專門用來(lái)處理編輯java的資源文件國(guó)際化亂碼問(wèn)題,即Eclipse ResourceBundle Editor插件工具。安裝了這個(gè)插件后,我們能進(jìn)行方便的可視化資源文件編輯。推薦。 異常的總結(jié) 算術(shù)異常類:ArithmeticExecption 空指針異常類:NullPointerException 類型強(qiáng)制轉(zhuǎn)換異常:ClassCastException 數(shù)組負(fù)下標(biāo)異常:NegativeArrayException 數(shù)組下標(biāo)越界異常:ArrayIndexOutOfBoundsException 違背安全原則異常:SecturityException 文件已結(jié)束異常:EOFException 文件未找到異常:FileNotFoundException 字符串轉(zhuǎn)換為數(shù)字異常:NumberFormatException 操作數(shù)據(jù)庫(kù)異常:SQLException 輸入輸出異常:IOException 方法未找到異常:NoSuchMethodException java.lang.AbstractMethodError 抽象方法錯(cuò)誤。當(dāng)應(yīng)用試圖調(diào)用抽象方法時(shí)拋出。 java.lang.AssertionError 斷言錯(cuò)。用來(lái)指示一個(gè)斷言失敗的情況。 java.lang.ClassCircularityError 類循環(huán)依賴錯(cuò)誤。在初始化一個(gè)類時(shí),若檢測(cè)到類之間循環(huán)依賴則拋出該異常。 java.lang.ClassFormatError 類格式錯(cuò)誤。當(dāng)Java虛擬機(jī)試圖從一個(gè)文件中讀取Java類,而檢測(cè)到該文件的內(nèi)容不符合類的有效格式時(shí)拋出。 java.lang.Error 錯(cuò)誤。是所有錯(cuò)誤的基類,用于標(biāo)識(shí)嚴(yán)重的程序運(yùn)行問(wèn)題。這些問(wèn)題通常描述一些不應(yīng)被應(yīng)用程序捕獲的反常情況。 java.lang.ExceptionInInitializerError 初始化程序錯(cuò)誤。當(dāng)執(zhí)行一個(gè)類的靜態(tài)初始化程序的過(guò)程中,發(fā)生了異常時(shí)拋出。靜態(tài)初始化程序是指直接包含于類中的static語(yǔ)句段。 java.lang.IllegalAccessError 違法訪問(wèn)錯(cuò)誤。當(dāng)一個(gè)應(yīng)用試圖訪問(wèn)、修改某個(gè)類的域(Field)或者調(diào)用其方法,但是又違反域或方法的可見(jiàn)性聲明,則拋出該異常。 java.lang.IncompatibleClassChangeError 不兼容的類變化錯(cuò)誤。當(dāng)正在執(zhí)行的方法所依賴的類定義發(fā)生了不兼容的改變時(shí),拋出該異常。一般在修改了應(yīng)用中的某些類的聲明定義而沒(méi)有對(duì)整個(gè)應(yīng)用重新編譯而直接運(yùn)行的情況下,容易引發(fā)該錯(cuò)誤。 java.lang.InstantiationError 實(shí)例化錯(cuò)誤。當(dāng)一個(gè)應(yīng)用試圖通過(guò)Java的new操作符構(gòu)造一個(gè)抽象類或者接口時(shí)拋出該異常.java.lang.InternalError 內(nèi)部錯(cuò)誤。用于指示Java虛擬機(jī)發(fā)生了內(nèi)部錯(cuò)誤。 java.lang.LinkageError 鏈接錯(cuò)誤。該錯(cuò)誤及其所有子類指示某個(gè)類依賴于另外一些類,在該類編譯之后,被依賴的類改變了其類定義而沒(méi)有重新編譯所有的類,進(jìn)而引發(fā)錯(cuò)誤的情況。 java.lang.NoClassDefFoundError 未找到類定義錯(cuò)誤。當(dāng)Java虛擬機(jī)或者類裝載器試圖實(shí)例化某個(gè)類,而找不到該類的定義時(shí)拋出該錯(cuò)誤。 java.lang.NoSuchFieldError 域不存在錯(cuò)誤。當(dāng)應(yīng)用試圖訪問(wèn)或者修改某類的某個(gè)域,而該類的定義中沒(méi)有該域的定義時(shí)拋出該錯(cuò)誤。 java.lang.NoSuchMethodError 方法不存在錯(cuò)誤。當(dāng)應(yīng)用試圖調(diào)用某類的某個(gè)方法,而該類的定義中沒(méi)有該方法的定義時(shí)拋出該錯(cuò)誤。 java.lang.OutOfMemoryError 內(nèi)存不足錯(cuò)誤。當(dāng)可用內(nèi)存不足以讓Java虛擬機(jī)分配給一個(gè)對(duì)象時(shí)拋出該錯(cuò)誤。 java.lang.StackOverflowError 堆棧溢出錯(cuò)誤。當(dāng)一個(gè)應(yīng)用遞歸調(diào)用的層次太深而導(dǎo)致堆棧溢出時(shí)拋出該錯(cuò)誤。 java.lang.ThreadDeath 線程結(jié)束。當(dāng)調(diào)用Thread類的stop方法時(shí)拋出該錯(cuò)誤,用于指示線程結(jié)束。 java.lang.UnknownError 未知錯(cuò)誤。用于指示Java虛擬機(jī)發(fā)生了未知嚴(yán)重錯(cuò)誤的情況。 java.lang.UnsatisfiedLinkError 未滿足的鏈接錯(cuò)誤。當(dāng)Java虛擬機(jī)未找到某個(gè)類的聲明為native方法的本機(jī)語(yǔ)言定義時(shí)拋出。 java.lang.UnsupportedClassVersionError 不支持的類版本錯(cuò)誤。當(dāng)Java虛擬機(jī)試圖從讀取某個(gè)類文件,但是發(fā)現(xiàn)該文件的主、次版本號(hào)不被當(dāng)前Java虛擬機(jī)支持的時(shí)候,拋出該錯(cuò)誤。 java.lang.VerifyError 驗(yàn)證錯(cuò)誤。當(dāng)驗(yàn)證器檢測(cè)到某個(gè)類文件中存在內(nèi)部不兼容或者安全問(wèn)題時(shí)拋出該錯(cuò)誤。 java.lang.VirtualMachineError 虛擬機(jī)錯(cuò)誤。用于指示虛擬機(jī)被破壞或者繼續(xù)執(zhí)行操作所需的資源不足的情況。 java.lang.ArithmeticException 算術(shù)條件異常。譬如:整數(shù)除零等。 java.lang.ArrayIndexOutOfBoundsException 數(shù)組索引越界異常。當(dāng)對(duì)數(shù)組的索引值為負(fù)數(shù)或大于等于數(shù)組大小時(shí)拋出。 java.lang.ArrayStoreException 數(shù)組存儲(chǔ)異常。當(dāng)向數(shù)組中存放非數(shù)組聲明類型對(duì)象時(shí)拋出。 java.lang.ClassCastException 類造型異常。假設(shè)有類A和B(A不是B的父類或子類),O是A的實(shí)例,那么當(dāng)強(qiáng)制將O構(gòu)造為類B的實(shí)例時(shí)拋出該異常。該異常經(jīng)常被稱為強(qiáng)制類型轉(zhuǎn)換異常。 java.lang.ClassNotFoundException 找不到類異常。當(dāng)應(yīng)用試圖根據(jù)字符串形式的類名構(gòu)造類,而在遍歷CLASSPAH之后找不到對(duì)應(yīng)名稱的class文件時(shí),拋出該異常。 java.lang.CloneNotSupportedException 不支持克隆異常。當(dāng)沒(méi)有實(shí)現(xiàn)Cloneable接口或者不支持克隆方法時(shí),調(diào)用其clone()方法則拋出該異常。 java.lang.EnumConstantNotPresentException 枚舉常量不存在異常。當(dāng)應(yīng)用試圖通過(guò)名稱和枚舉類型訪問(wèn)一個(gè)枚舉對(duì)象,但該枚舉對(duì)象并不包含常量時(shí),拋出該異常。 java.lang.Exception 根異常。用以描述應(yīng)用程序希望捕獲的情況。 java.lang.IllegalAccessException 違法的訪問(wèn)異常。當(dāng)應(yīng)用試圖通過(guò)反射方式創(chuàng)建某個(gè)類的實(shí)例、訪問(wèn)該類屬性、調(diào)用該類方法,而當(dāng)時(shí)又無(wú)法訪問(wèn)類的、屬性的、方法的或構(gòu)造方法的定義時(shí)拋出該異常。 java.lang.IllegalMonitorStateException 違法的監(jiān)控狀態(tài)異常。當(dāng)某個(gè)線程試圖等待一個(gè)自己并不擁有的對(duì)象(O)的監(jiān)控器或者通知其他線程等待該對(duì)象(O)的監(jiān)控器時(shí),拋出該異常。 java.lang.IllegalStateException 違法的狀態(tài)異常。當(dāng)在Java環(huán)境和應(yīng)用尚未處于某個(gè)方法的合法調(diào)用狀態(tài),而調(diào)用了該方法時(shí),拋出該異常。 java.lang.IllegalThreadStateException 違法的線程狀態(tài)異常。當(dāng)縣城尚未處于某個(gè)方法的合法調(diào)用狀態(tài),而調(diào)用了該方法時(shí),拋出異常。 java.lang.IndexOutOfBoundsException 索引越界異常。當(dāng)訪問(wèn)某個(gè)序列的索引值小于0或大于等于序列大小時(shí),拋出該異常。 java.lang.InstantiationException 實(shí)例化異常。當(dāng)試圖通過(guò)newInstance()方法創(chuàng)建某個(gè)類的實(shí)例,而該類是一個(gè)抽象類或接口時(shí),拋出該異常。 java.lang.InterruptedException 被中止異常。當(dāng)某個(gè)線程處于長(zhǎng)時(shí)間的等待、休眠或其他暫停狀態(tài),而此時(shí)其他的線程通過(guò)Thread的interrupt方法終止該線程時(shí)拋出該異常。 java.lang.NegativeArraySizeException 數(shù)組大小為負(fù)值異常。當(dāng)使用負(fù)數(shù)大小值創(chuàng)建數(shù)組時(shí)拋出該異常。 java.lang.NoSuchFieldException 屬性不存在異常。當(dāng)訪問(wèn)某個(gè)類的不存在的屬性時(shí)拋出該異常。 java.lang.NoSuchMethodException 方法不存在異常。當(dāng)訪問(wèn)某個(gè)類的不存在的方法時(shí)拋出該異常。 java.lang.NullPointerException 空指針異常。當(dāng)應(yīng)用試圖在要求使用對(duì)象的地方使用了null時(shí),拋出該異常。譬如:調(diào)用null對(duì)象的實(shí)例方法、訪問(wèn)null對(duì)象的屬性、計(jì)算null對(duì)象的長(zhǎng)度、使用throw語(yǔ)句拋出null等等。 java.lang.NumberFormatException 數(shù)字格式異常。當(dāng)試圖將一個(gè)String轉(zhuǎn)換為指定的數(shù)字類型,而該字符串確不滿足數(shù)字類型要求的格式時(shí),拋出該異常。 java.lang.RuntimeException 運(yùn)行時(shí)異常。是所有Java虛擬機(jī)正常操作期間可以被拋出的異常的父類。 java.lang.SecurityException 安全異常。由安全管理器拋出,用于指示違反安全情況的異常。 java.lang.StringIndexOutOfBoundsException 字符串索引越界異常。當(dāng)使用索引值訪問(wèn)某個(gè)字符串中的字符,而該索引值小于0或大于等于序列大小時(shí),拋出該異常。 java.lang.TypeNotPresentException 類型不存在異常。當(dāng)應(yīng)用試圖以某個(gè)類型名稱的字符串表達(dá)方式訪問(wèn)該類型,但是根據(jù)給定的名稱又找不到該類型是拋出該異常。該異常與 ClassNotFoundException的區(qū)別在于該異常是unchecked(不被檢查)異常,而ClassNotFoundException 是checked(被檢查)異常。 java.lang.UnsupportedOperationException 不支持的方法異常。指明請(qǐng)求的方法不被支持情況的異常。 異常 javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login(/Login是你的action名字) 可能原因 action沒(méi)有再struts-config.xml 中定義,或沒(méi)有找到匹配的action,例如在JSP文件中使用 action=“Login.do”.將表單提交給Login.do處理,如果出現(xiàn)上述異常,請(qǐng)查看struts-config.xml中的定義部分,有時(shí)可能是打錯(cuò)了字符或者是某些不符合規(guī)則,可以使用strutsconsole工具來(lái)檢查。 -------------------- 異常 org.apache.jasper.JasperException: Cannot retrieve definition for form bean null 可能原因 這個(gè)異常是因?yàn)镾truts根據(jù)struts-config.xml中的mapping沒(méi)有找到action期望的form bean。大部分的情況可能是因?yàn)樵趂orm-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的使用方法之一 寧波工程學(xué)院學(xué)年論文 Struts2框架分析 湯禹鑫 寧波工程學(xué)院,(315016) E-mail 372854786@qq.com 摘 要: 本文對(duì)基于MVC模式,延續(xù)了Struts1和WebWork優(yōu)勢(shì)的WEB框架——Struts2框架的各個(gè)層次的組成、功能進(jìn)行了詳細(xì)的介紹。關(guān)鍵詞:Struts2;框架;J2EE; 1.引言 Apache Struts2是一個(gè)為企業(yè)級(jí)應(yīng)用打造的優(yōu)秀的、可擴(kuò)展的Web框架。該框架旨在充分精簡(jiǎn)應(yīng)用程序的開(kāi)發(fā)周期,從而減少創(chuàng)建、發(fā)布、應(yīng)用所花費(fèi)的時(shí)間。而且對(duì)于Struts1有很多革命性的改進(jìn),但它并不是全新的框架,而是在WebWork框架的基礎(chǔ)上發(fā)展起來(lái)的。所以也可以說(shuō)Struts2是WebWork的升級(jí),吸收了Struts1和WebWork的優(yōu)勢(shì),穩(wěn)定性、性能都有了很好的保證。 2.Struts2的起源和背景 2.1 Struts1 在過(guò)去,Struts1是所有MVC框架中不容辯駁的勝利者。其程序運(yùn)行流程如圖2-1所示。 圖2-1 Struts 1的程序運(yùn)行流程 但是對(duì)于Struts 1框架而言,因?yàn)樗cJSP/Servlet耦合非常緊密,因而導(dǎo)致了許多不可避免的缺陷,還有支持的表現(xiàn)層技術(shù)單 一、代碼嚴(yán)重依賴于Struts 1 API。隨著Web應(yīng)用的拙見(jiàn)擴(kuò)大,這些缺陷逐漸變成制約Struts 1發(fā)展的的重要因素——這也是Struts 2出現(xiàn)的原因。 寧波工程學(xué)院學(xué)年論文 (1)客戶端初始化一個(gè)指向Servlet容器(例如Tomcat)的請(qǐng)求; (2)這個(gè)請(qǐng)求經(jīng)過(guò)一系列的過(guò)濾器(Filter)(這些過(guò)濾器中有一個(gè)叫做ActionContextCleanUp的可選過(guò)濾器,這個(gè)過(guò)濾器對(duì)于Struts2和其它框架的集成很有幫助,例如:SiteMesh Plugin); (3)接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問(wèn)ActionMapper來(lái)決定這個(gè)請(qǐng)求是否需要調(diào)用某個(gè)Action; (4)如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher把請(qǐng)求的處理交給ActionProxy; (5)ActionProxy通過(guò)Configuration Manager詢問(wèn)框架的配置文件,找到需要調(diào)用的Action類; (6)ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例; (7)ActionInvocation實(shí)例使用命名模式來(lái)調(diào)用,在調(diào)用Action的過(guò)程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用; (8)一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過(guò)程中可以使用Struts 2 框架中繼承的標(biāo)簽,在這個(gè)過(guò)程中需要涉及到ActionMapper。 3.2 Struts 2配置文件 Struts2 配置文件是用戶請(qǐng)求(View)和業(yè)務(wù)邏輯模塊(Model)Action 之間聯(lián)系的橋梁。開(kāi)發(fā)者可以通過(guò)修改Struts2的配置文件來(lái)快速適應(yīng)業(yè)務(wù)需求,它是整個(gè)Struts2的精髓之一。當(dāng)然,熟悉Struts1和WebWork的框架的人對(duì)配置文件一定不會(huì)陌生,同Struts1和WebWork框架一樣,Struts2框架配置文件也分為XML文件和屬性資源文件兩種。struts.xml 文件中包含了Action 的定義以及Action 的返回值對(duì)應(yīng)的視圖資源、命名空間等信息。此外,用戶也可以定義自己的XML文件,然后通過(guò)include指令將其包含到struts.xml文件中。另一類配置文件是屬性資源文件。資源文件中一般采用固定的Key-Value形式,用于定義Struts2 全局或者局部的資源數(shù)據(jù),例如定義國(guó)際化、開(kāi)發(fā)模式等信息。 3.3 Struts 2控制器 Struts 2的控制器組建是Struts 2框架的核心,事實(shí)上所有MVC框架都是以控制器組件為核心的。正如前面提到的,Struts 2的控制器由兩個(gè)部分組成:FilterDispatcher和業(yè)務(wù)控制器Action。前者由框架提供,負(fù)責(zé)攔截所有的用戶請(qǐng)求,其過(guò)程如圖3-3所示 寧波工程學(xué)院學(xué)年論文 圖3-1 過(guò)濾器處理請(qǐng)求過(guò)程 對(duì)于業(yè)務(wù)控制器Action,Struts 2框架為用戶提供了一個(gè)名為Action的接口,在接口中定義了SUCCESS、ERROR、INPUT、LOGIN、NONE五個(gè)靜態(tài)的字符串和一個(gè)execute方法,用戶在編寫(xiě)自己的Action時(shí)只要實(shí)現(xiàn)該接口并重寫(xiě)其中的execute方法,將所要實(shí)現(xiàn)的業(yè)務(wù)邏輯在該方法中處理就行了,當(dāng)調(diào)用此Action時(shí),Struts 2框架會(huì)自調(diào)用execute方法來(lái)完成所需的業(yè)務(wù)邏輯處理。實(shí)際上,在Struts2中起作用的業(yè)務(wù)邏輯并不是用戶自定義的Action ,而是系統(tǒng)生成的Action代理,只不過(guò)Action代理以用戶定義的Action為目標(biāo)。 3.4 Struts 2標(biāo)簽庫(kù) 于業(yè)Struts 2的標(biāo)簽庫(kù)也是Struts 2的重要組成部分,Struts 2的標(biāo)簽庫(kù)提供了非常豐富的功能,這些標(biāo)簽不僅提供了表現(xiàn)層數(shù)據(jù)處理,而且還提供了基本的流程控制功能,還提供了國(guó)際化、Ajax支持等功能。使用標(biāo)簽,開(kāi)發(fā)者可以最大限度地減少頁(yè)面代碼的書(shū)寫(xiě)。 4.Struts 2框架應(yīng)用舉例 例如課本上的Struts2用作登陸的例子,添加Struts 2功能框架核心需要如下三個(gè)步驟:(1)修改web.xml文件,在web.xml中配置Struts 2的核心Filter。 org.apache.struts2.dispatcher.FilterDispatcher (2)將Struts 2框架的類庫(kù)復(fù)制到Web應(yīng)用的WEB-INF/lib路徑下(也可以自己手動(dòng)進(jìn)行添加)。 寧波工程學(xué)院學(xué)年論文 5.結(jié)論 Struts 2結(jié)合了Struts 1框架和WebWork框架的優(yōu)點(diǎn),其框架的各個(gè)組件都是可靠的松散耦合。Struts 2最大的特點(diǎn)就是簡(jiǎn)單性,引入了OGNL表達(dá)式和值棧的概念,可以用最單間的代碼實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)訪問(wèn)。總而言之,Struts 2是一個(gè)當(dāng)今Web開(kāi)發(fā)中一個(gè)很重要而且功能足夠強(qiáng)大的框架,能讓我們更好地設(shè)計(jì)和完成Web應(yīng)用。 參考文獻(xiàn) [1]鄭阿奇.J2EE應(yīng)用實(shí)踐教程.電子工業(yè)出版社,2011年7月.[2]李剛.Strut s2權(quán)威指南.電子工業(yè)出版社,2007年9月.[3]閆術(shù)卓.楊強(qiáng).Strut s2技術(shù)詳解.電子工業(yè)出版社,2008年6月.第三篇:struts處理中文亂碼問(wèn)題總結(jié)
第四篇:異常的總結(jié)
第五篇:Struts 2框架分析