DWR异常处理

一天一位老兄问我,我用的dwr怎么没有包装异常,以前我通过包装dwr这个类来处理服务器段返回的异常,这个dwr类封装一个你要返回的东西,一个boolean值,还有一个错误的封装,比如说你实际要返回的是一个bean,那就把这个bean写在这个dwr类里面,然后去dwr配置里面把这个dwr类配置成bean。我觉得这个老土了,所以就没去处理,直接返回要的实际的类型,没去处理异常。

我觉得dwr应该有对异常的处理方法。
没什么好说的:看demo:
web.xml
Xml代码 复制代码
  1. <?xml version="1.0" encoding="ISO-8859-1"?>  
  2. <!DOCTYPE web-app PUBLIC   
  3.     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"   
  4.     "http://java.sun.com/dtd/web-app_2_3.dtd">  
  5.   
  6. <web-app id="dwr">  
  7.   
  8.   <servlet>  
  9.     <servlet-name>dwr-invoker</servlet-name>  
  10.     <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>  
  11.   
  12.     <!-- This should NEVER be present in live -->  
  13.     <init-param>  
  14.       <param-name>debug</param-name>  
  15.       <param-value>true</param-value>  
  16.     </init-param>  
  17.   
  18.     <!-- Remove this unless you want to use active reverse ajax -->  
  19.     <init-param>  
  20.       <param-name>activeReverseAjaxEnabled</param-name>  
  21.       <param-value>true</param-value>  
  22.     </init-param>  
  23.   
  24.     <!-- By default DWR creates application scope objects when they are first   
  25.     used. This creates them when the app-server is started -->  
  26.     <init-param>  
  27.       <param-name>initApplicationScopeCreatorsAtStartup</param-name>  
  28.       <param-value>true</param-value>  
  29.     </init-param>  
  30.   
  31.     <!-- This enables full streaming mode. It's probably better to leave this   
  32.     out if you are running across the internet -->  
  33.     <init-param>  
  34.       <param-name>maxWaitAfterWrite</param-name>  
  35.       <param-value>-1</param-value>  
  36.     </init-param>  
  37.   
  38.     <load-on-startup>1</load-on-startup>  
  39.   </servlet>  
  40.   
  41.   <servlet-mapping>  
  42.     <servlet-name>dwr-invoker</servlet-name>  
  43.     <url-pattern>/dwr/*</url-pattern>  
  44.   </servlet-mapping>  
  45.   
  46. </web-app>  
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app id="dwr">

  <servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>

    <!-- This should NEVER be present in live -->
    <init-param>
      <param-name>debug</param-name>
      <param-value>true</param-value>
    </init-param>

    <!-- Remove this unless you want to use active reverse ajax -->
    <init-param>
      <param-name>activeReverseAjaxEnabled</param-name>
      <param-value>true</param-value>
    </init-param>

    <!-- By default DWR creates application scope objects when they are first
    used. This creates them when the app-server is started -->
    <init-param>
      <param-name>initApplicationScopeCreatorsAtStartup</param-name>
      <param-value>true</param-value>
    </init-param>

    <!-- This enables full streaming mode. It's probably better to leave this
    out if you are running across the internet -->
    <init-param>
      <param-name>maxWaitAfterWrite</param-name>
      <param-value>-1</param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
  </servlet-mapping>

</web-app>


dwr:
Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">  
  3.   
  4. <dwr>  
  5.   
  6.   <allow>  
  7.   
  8.     <!-- simpletext -->  
  9.     <create creator="new" javascript="Demo">  
  10.       <param name="class" value="org.getahead.dwrdemo.simpletext.Demo"/>  
  11.     </create>  
  12.     <!-- this is a bad idea for live, but can be useful in testing -->  
  13.     <convert converter="exception" match="java.lang.Exception">  
  14.         <!--<param name='include' value='message,lineNumber'/>-->  
  15.     </convert>  
  16.     <convert converter="bean" match="java.lang.StackTraceElement"/>  
  17.   
  18.   </allow>  
  19.   
  20. </dwr>  
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">

<dwr>

  <allow>

    <!-- simpletext -->
    <create creator="new" javascript="Demo">
      <param name="class" value="org.getahead.dwrdemo.simpletext.Demo"/>
    </create>
    <!-- this is a bad idea for live, but can be useful in testing -->
    <convert converter="exception" match="java.lang.Exception">
    	<!--<param name='include' value='message,lineNumber'/>-->
    </convert>
    <convert converter="bean" match="java.lang.StackTraceElement"/>

  </allow>

</dwr>

java类
Java代码 复制代码
  1. package org.getahead.dwrdemo.simpletext;   
  2.   
  3. import java.io.IOException;   
  4.   
  5. import javax.servlet.ServletException;   
  6.   
  7. import org.directwebremoting.WebContext;   
  8. import org.directwebremoting.WebContextFactory;   
  9.   
  10. /**  
  11.  * Some simple text demos  
  12.  * @author Joe Walker [joe at getahead dot ltd dot uk]  
  13.  */  
  14. public class Demo   
  15. {   
  16.     /**  
  17.      * Return a server side string to display on the client in real time  
  18.      * @param name The name of person to say hello to  
  19.      * @return A demo string  
  20.      * @throws Exception   
  21.      */  
  22.     public String sayHello(String name) throws Exception   
  23.     {   
  24. //      if("dave".equals(name)){   
  25. //              throw new Exception("hello world");   
  26. //      }   
  27.         Integer value = Integer.valueOf(name);   
  28.         Integer id = 100/value;   
  29.         return "Hello, " + id.toString();   
  30.     }   
  31.   
  32. }  
package org.getahead.dwrdemo.simpletext;

import java.io.IOException;

import javax.servlet.ServletException;

import org.directwebremoting.WebContext;
import org.directwebremoting.WebContextFactory;

/**
 * Some simple text demos
 * @author Joe Walker [joe at getahead dot ltd dot uk]
 */
public class Demo
{
    /**
     * Return a server side string to display on the client in real time
     * @param name The name of person to say hello to
     * @return A demo string
     * @throws Exception 
     */
    public String sayHello(String name) throws Exception
    {
//    	if("dave".equals(name)){
//				throw new Exception("hello world");
//    	}
    	Integer value = Integer.valueOf(name);
    	Integer id = 100/value;
    	return "Hello, " + id.toString();
    }

}

Jsp代码 复制代码
  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />   
  2. <script type='text/javascript' src='/dwr/interface/Demo.js'> </script>   
  3.   <script type='text/javascript' src='/dwr/engine.js'> </script>   
  4. <script type='text/javascript' src='/dwr/util.js'> </script>   
  5. <script type="text/javascript" src='index.js'> </script>   
  6.   
  7. <div id="demoDiv">   
  8.   
  9.   <p>   
  10.     Name:   
  11.     <input type="text" id="demoName" value="Joe"/>   
  12.     <input value="Send" type="button" onclick="update()"/>   
  13.     <br/>   
  14.     Reply: <span id="demoReply" style="background:#eeffdd; padding-left:4px; padding-right:4px;"></span>   
  15.   </p>   
  16. </div>  
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <script type='text/javascript' src='/dwr/interface/Demo.js'> </script>
    <script type='text/javascript' src='/dwr/engine.js'> </script>
  <script type='text/javascript' src='/dwr/util.js'> </script>
  <script type="text/javascript" src='index.js'> </script>

  <div id="demoDiv">

    <p>
      Name:
      <input type="text" id="demoName" value="Joe"/>
      <input value="Send" type="button" onclick="update()"/>
      <br/>
      Reply: <span id="demoReply" style="background:#eeffdd; padding-left:4px; padding-right:4px;"></span>
    </p>
  </div>


Js代码 复制代码
  1. function update() {   
  2.   var name = dwr.util.getValue("demoName");   
  3.   Demo.sayHello(name,{    
  4.             callback:getData,   
  5.         errorHandler:errorHandler,   
  6.         exceptionHandler:exceptionHandler   
  7.         /*  
  8.         function(errorString,exception) {  
  9.             alert('error:'+errorString);  
  10.         },  
  11.         exceptionHandler:function(errorString,exception) {  
  12.             alert('exception:'+errorString + ":" + exception.message);  
  13.         }*/  
  14. });   
  15. }   
  16.   
  17.   
  18. function getData(data){   
  19.     dwr.util.setValue("demoReply", data);   
  20. }   
  21.   
  22. function errorHandler(errorString, exception){   
  23.  alert(exception.message);   
  24. }   
  25. function exceptionHandler(exceptionString, exception){   
  26.  alert(exception.message);   
  27. }  
function update() {
  var name = dwr.util.getValue("demoName");
  Demo.sayHello(name,{ 
  	        callback:getData,
		errorHandler:errorHandler,
		exceptionHandler:exceptionHandler
		/*
		function(errorString,exception) {
			alert('error:'+errorString);
		},
		exceptionHandler:function(errorString,exception) {
			alert('exception:'+errorString + ":" + exception.message);
		}*/
});
}


function getData(data){
	dwr.util.setValue("demoReply", data);
}

function errorHandler(errorString, exception){
 alert(exception.message);
}
function exceptionHandler(exceptionString, exception){
 alert(exception.message);
}


还有一种更简单的就是在页面上写上
Jsp代码 复制代码
  1. DWREngine.setErrorHandler(dispatchErr);   
  2.   
  3. function dispatchErr( msg , ex )   
  4. {   
  5.     alert( msg );   
  6. }  
DWREngine.setErrorHandler(dispatchErr);

function dispatchErr( msg , ex )
{
    alert( msg );
}

写的都不用改就OK了
参考:
http://flower-city.spaces.live.com/blog/cns!5CDF3197CFFC015F!518.entry
dwr异常解决
环境dwr2.0 原因是据说dwr2.0的异常处理支持比1.0好很多

定义异常处理函数:
function errorHandler(errorString, exception){
alert(exception.message);
}
function exceptionHandler(exceptionString, exception){
alert(exception.message);
}

设置通用的异常处理函数:
dwr.engine.setExceptionHandler(exceptionHandler)
dwr.engine.setErrorHandler(errorHandler);

在dwr.xml中配置异常类转换器:
<convert converter="exception" match="com.jeyo.monica.service.OrderServiceException">
  <param name='include' value='message,lineNumber'/>
</convert>
<convert converter="exception" match="java.lang.Exception">
  <param name='include' value='message,lineNumber'/>
</convert>

业务处理过程中一定需要将对应的异常转换为上面定义的异常才可以被dwr捕捉的
如下:
try{
}catch(Exception e){
throw new OrderServiceException(e);
}
.....

自定义的异常处理
调用dwr远程调用时多带若干参数:
如下格式:
OrderService.create(order,
  {
   callback:finishSaveOrderTicket,
   errorHandler:errorHandler,
   exceptionHandler:exceptionHandler
  }
);

ok,上面的处理完成后,发生异常时就会把你的异常中的message 使用alert函数打印出来
原文地址:https://www.cnblogs.com/wangle1001986/p/3098582.html