日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Struts2拦截器实现异常处理机制

發布時間:2024/4/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Struts2拦截器实现异常处理机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://bbs.itcast.cn/thread-10364-1-1.html

Struts2攔截器實現異常處理機制?? 在j2ee項目中,系統內部難免會出現一些異常,如果把異常放任不管直接打印到瀏覽器可能會讓用戶感覺莫名其妙,也有可能讓某些用戶找到破解系統的方法。 所以不要在頁面上輸出錯誤信息,使用log日志的方式處理異常并記錄異常。 就拿struts2+hibernate+spring項目說明:通常一個頁面請求到后臺以后,首先是到action(也就是所謂mvc的controller),在action層會調用業務邏輯service,servce層會調用持久層dao獲取數據。最后執行結果會匯總到action,然后通過action控制轉發到指定頁面,執行流程如下圖所示:
而這三層其實都有可能發生異常,比如dao層可能會有SQLException,service可能會有NullPointException,action可能會有IOException,一但發生異常并且程序員未做處理,那么該層不會再往下執行,而是向調用自己的方法拋出異常,如果dao、service、action層都未處理異常的話,異常信息會拋到服務器,然后服務器會把異常直接打印到頁面,結果就會如下圖所示:
?? ???
其實這種錯誤對于客戶來說毫無意義,因為他們通常是看不懂這是什么意思的。 剛學java的時候,我們處理異常通常兩種方法: ①? ?直接throws,放任不管; ②? ? 寫try...catch,在catch塊中不作任何操作,或者僅僅printStackTrace()把異常打印到控制臺。 第一種方法最后就造就了上圖的結果(不符合操作);而第二種方法更不好:頁面不報錯,但是也不執行用戶的請求,簡單的說,其實這就是bug。 那么發生異常到底應該怎么辦呢?我想在大家對java異常有一定了解以后,會知道:異常應該在action控制轉發之前盡量處理,同時記錄log日志,然后在頁面以友好的錯誤提示告訴用戶出錯了,如。 ?
然后我們回到剛才處理異常的地方,如果大家積累了一些項目經驗以后會發現使用上面那種處理異常的方式可能還不夠靈活: ①因為spring把大多數非運行時異常都轉換成運行時異常(RuntimeException)最后導致程序員根本不知道什么地方應該進行try...catch操作 ②每個方法都重復寫try...catch,而且catch塊內的代碼都很相似,這明顯做了很多重復工作而且還很容易出錯。 使用truts2攔截器定義異常攔截器用來解決上述問題,如下圖所示:
??? 首先我的action類、service類和dao類如果有必要捕獲異常,我都會try...catch,catch塊內不記錄log,通常是拋出一個新異常,并且注明錯誤信息,有攔截器來拋出異常信息,并寫入log日志文件:
  • Java代碼
  • //action層執行數據添加操作? ?
  • public String save(){? ?
  • ? ?try{? ?
  • ? ?? ?? ?//調用service的save方法? ?
  • ? ?? ?? ?service.save(obj);? ?
  • ? ?}catch(Exception e){? ??
  • ? ?? ?throw new RuntimeException("添加數據時發生錯誤!",e);? ?
  • ??}? ?
  • ? ?return "success";? ?
  • }??
  • 復制代碼 Struts2自定義攔截器的操作: 在struts2的配置文件<package>下添加:
  • <interceptors>
  • ? ? ? ? ? ? ? ?? ? <!-- 聲明攔截器 -->
  • ? ? ? ? ? ? ? ?? ? <interceptor name="errorInterceptor" class="cn.itcast.elec.util.ErrorInterceptor" />
  • ? ? ? ? ? ? ? ?? ? <!-- 配置攔截器棧 -->
  • ? ? ? ? ? ? ? ?? ? <interceptor-stack name="myErrorInterceptor">
  • ? ? ? ? ? ? ? ?? ?? ?? ?? ?? ? <interceptor-ref name="defaultStack" />
  • ? ? ? ? ? ? ? ?? ?? ?? ?? ?? ? <interceptor-ref name="errorInterceptor" />
  • ? ? ? ? ? ? ? ?? ? </interceptor-stack>
  • </interceptors>
  • <!-- 覆蓋底層的攔截器棧 對包中的所有action都有效 -->
  • <default-interceptor-ref name="myErrorInterceptor"/>
  • ? ? ? ?? ???
  • ? ? ? ?? ???<global-results>
  • ? ? ? ?? ???? ? ? ? <result name="errorMsg">/errorMsg.jsp</result>
  • ? ? ? ?? ???</global-results>
  • ? ? ? ?? ???<global-exception-mappings>
  • ? ? ? ?? ???? ? ? ? <exception-mapping result="errorMsg" exception="java.lang.Exception"></exception-mapping>
  • ? ? ? ? </global-exception-mappings>
  • 復制代碼 然后在異常攔截器對異常進行處理,看下面的代碼:

    攔截器的Java代碼
  • public class ErrorInterceptor implements Interceptor {

  • ? ? ? ? public void init() {

  • ? ? ? ? }

  • ? ? ? ? public String intercept(ActionInvocation actioninvocation) {

  • ? ? ? ? ? ? ? ? String result = null; // Action的返回值? ?
  • ? ? ? ? ? ? ? ? try {
  • ? ? ? ? ? ? ? ? ? ? ? ? // 運行被攔截的Action,期間如果發生異常會被catch住? ?
  • ? ? ? ? ? ? ? ? ? ? ? ? result = actioninvocation.invoke();
  • ? ? ? ? ? ? ? ? ? ? ? ? return result;
  • ? ? ? ? ? ? ? ? } catch (Exception e) {
  • ? ? ? ? ? ? ? ? ? ? ? ? /**??
  • ? ? ? ? ? ? ? ? ? ? ? ???* 處理異常??
  • ? ? ? ? ? ? ? ? ? ? ? ???*/
  • ? ? ? ? ? ? ? ? ? ? ? ? String errorMsg = "出現錯誤信息,請查看日志!";
  • ? ? ? ? ? ? ? ? ? ? ? ? //通過instanceof判斷到底是什么異常類型? ?
  • ? ? ? ? ? ? ? ? ? ? ? ? if (e instanceof RuntimeException) {
  • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //未知的運行時異常? ?
  • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? RuntimeException re = (RuntimeException) e;
  • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //re.printStackTrace();
  • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? errorMsg = re.getMessage().trim();
  • ? ? ? ? ? ? ? ? ? ? ? ? }
  • ? ? ? ? ? ? ? ? ? ? ? ? //把自定義錯誤信息? ?
  • ? ? ? ? ? ? ? ? ? ? ? ? HttpServletRequest request = (HttpServletRequest) actioninvocation
  • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
  • ? ? ? ? ? ? ? ? ? ? ? ? /**??
  • ? ? ? ? ? ? ? ? ? ? ? ???* 發送錯誤消息到頁面??
  • ? ? ? ? ? ? ? ? ? ? ? ???*/
  • ? ? ? ? ? ? ? ? ? ? ? ? request.setAttribute("errorMsg", errorMsg);

  • ? ? ? ? ? ? ? ? ? ? ? ? /**??
  • ? ? ? ? ? ? ? ? ? ? ? ???* log4j記錄日志??
  • ? ? ? ? ? ? ? ? ? ? ? ???*/
  • ? ? ? ? ? ? ? ? ? ? ? ? Log log = LogFactory
  • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .getLog(actioninvocation.getAction().getClass());
  • ? ? ? ? ? ? ? ? ? ? ? ? log.error(errorMsg, e);
  • ? ? ? ? ? ? ? ? ? ? ? ? return "errorMsg";
  • ? ? ? ? ? ? ? ? }// ...end of catch? ?
  • ? ? ? ? }

  • ? ? ? ? public void destroy() {

  • ? ? ? ? }
  • }
  • 復制代碼 最后在errorMsg.JSP頁面顯示具體的錯誤消息即可: ? ?
  • <body>? ?
  • <s:if test="%{#request.errorMsg==null}">? ?
  • ? ? <p>對不起,系統發生了未知的錯誤,請查看日志</p>? ?
  • </s:if>? ?
  • <s:else>? ?
  • ? ? <p>${requestScope.errorMsg}</p>? ?
  • </s:else>? ?
  • </body>??
  • 復制代碼 以上方式可以攔截后臺代碼所有的異常,但如果出現數據庫連接異常時不能被捕獲的,大家可以使用struts2的全局異常處理機制來處理:
    Struts2配置文件代碼
  • <global-results>
  • ? ? ? ?? ???<result name="errorMsg">/errorMsg.jsp</result>
  • </global-results>
  • <global-exception-mappings>
  • ? ? ? ?? ???? ? ? ? <exception-mapping result="errorMsg" exception="java.lang.Exception"></exception-mapping>
  • </global-exception-mappings>
  • 復制代碼 上面這是一個很簡單的異常攔截器,大家可以使用自定義異常,那樣會更靈活一些。 以上異常攔截器可以使用其它很多技術替換:比如spring aop,servlet filter等,根據項目實際情況處理。 輔助:log4j.properties文件的內容: ### direct log messages tostdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE}?%5p?%c{1}:%L?-?%m%n ### direct messages to filehibernate.log ### #log4j.appender.file=org.apache.log4j.FileAppender #log4j.appender.file.File=hibernate.log #log4j.appender.file.layout=org.apache.log4j.PatternLayout #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE}%5p %c{1}:%L - %m%n ### set log levels - for moreverbose logging change 'info' to 'debug' ### log4j.rootLogger=error,?stdout #log4j.logger.org.hibernate=info #log4j.logger.org.hibernate=debug ### log HQL query parseractivity #log4j.logger.org.hibernate.hql.ast.AST=debug ### log just the SQL #log4j.logger.org.hibernate.SQL=debug ### log JDBC bind parameters### #log4j.logger.org.hibernate.type=info #log4j.logger.org.hibernate.type=debug ### log schema export/update### #log4j.logger.org.hibernate.tool.hbm2ddl=debug ### log HQL parse trees #log4j.logger.org.hibernate.hql=debug ### log cache activity ### #log4j.logger.org.hibernate.cache=debug ### log transaction activity #log4j.logger.org.hibernate.transaction=debug ### log JDBC resourceacquisition #log4j.logger.org.hibernate.jdbc=debug ### enable the following lineif you want to track down connection ### ### leakages when usingDriverManagerConnectionProvider ### #log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace log4j.rootLogger=?error,?A1,?R log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout # Print the date in ISO 8601format #log4j.appender.A1.layout.ConversionPattern=%d[%t] %-5p %c - %m%n #log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-ddHH:mm:ss,SSS} %m%n log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd?HH:mm:ss,SSS}?%l?"#"?%m%n log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=/elec.log log4j.appender.R.MaxFileSize=1000KB # Keep one backup file log4j.appender.R.MaxBackupIndex=10 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p?%t?%c?-?%m%n




    http://www.iteye.com/topic/1134409

    Html代碼??
  • <%@?page?language="java"?contentType="text/html;?charset=UTF-8"??
  • ????pageEncoding="UTF-8"%>??
  • <%@taglib?prefix="s"?uri="/struts-tags"%>??
  • <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd">??
  • <html>??
  • <head>??
  • <meta?http-equiv="Content-Type"?content="text/html;?charset=UTF-8">??
  • <title>錯誤頁面</title>??
  • </head>??
  • <body>??
  • ????錯誤信息:??
  • ????<s:property?value="exception.message"?/>??
  • </body>??
  • </html>??

  • 總結

    以上是生活随笔為你收集整理的Struts2拦截器实现异常处理机制的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。