之前有篇博客介紹了Struts2與ajax的整合,鏈接Struts2之—集成Json插件實現Ajax
這裏不再累述,看以上博客。
此篇博客想吐槽一下Struts2的缺點——錯誤處理做的不好,怎麼做的不好,哪裏做的不好,通過Struts2中Ajax的應用缺陷來介紹。
先提出它的缺點,後面再做出證明。
1,Struts2與Ajax整合的缺點
無論採用$.post還是$.ajax都捕獲不到服務器產生的錯誤($.ajax捕獲錯誤在servlet能做到),是struts2內部設計的不好,不是Ajax的問題。
2,$.post()與$.ajax()
大家都知道,$.post()方法與$.ajax()方法的區別:
$.post()方法:不能截獲異常;
$.ajax()方法:可以截獲異常;
官方文檔解釋:
3,Servlet中$.ajax()
Servlet中$.ajax()可正常工作,能正常捕獲異常,並作出處理(使用回調函數error:function())
例子:
新建Servlet類——AjaxServlet.java:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AjaxServlet extends HttpServlet {
/**
* Constructor of the object.
*/
public AjaxServlet() {
super();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
response.setContentType("text/html");
PrintWriterout = response.getWriter();
int a = 1/0; //異常
out.println("</HTML>");
out.flush();
out.close();
}
public void init()throws ServletException {
//Put your code here
}
public voiddestroy() {
super.destroy();// Just puts "destroy" string in log
//Put your code here
}
}
Web.xml:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xmlversion="1.0" encoding="UTF-8"?>
<web-appversion="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<servlet>
<servlet-name>AjaxServlet</servlet-name><servlet-class>cn.itcast.oa0909.servlet.AjaxServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>AjaxServlet</servlet-name> <url-pattern>/AjaxServlet</url-pattern>
</servlet-mapping>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
</span>
用戶User類——實體類:
<span style="font-family:KaiTi_GB2312;font-size:18px;">private Long uid;//用戶id
privateString username;//用戶名
/************get/set方法*******************************************/
publicLong getUid(){
returnuid;
}
publicvoidsetUid(Long uid) {
this.uid= uid;
}
publicStringgetUsername() {
returnusername;
}
publicvoidsetUsername(String username) {
this.username=username;
}</span>
UserAction.java——處理業務,獲取用戶
<span style="font-family:KaiTi_GB2312;font-size:18px;">importcn.itcast.oa0909.domain.User;
importcom.opensymphony.xwork2.ActionSupport;
public classUserAction extends ActionSupport {
privateLong uid;
privateString username;
/**
* 獲取用戶
* @return
*/
publicString showUser(){
User user = new User();//創建一個User對象
user.setUid(1L);
user.setUsername("hanxuemin");
this.uid=user.getUid();
this.username=user.getUsername();
int a =1/0; //異常
returnSUCCESS;
}
/*******get/set方法**************************/
publicLong getUid() {
return uid;
}
publicString getUsername() {
return username;
}
}</span>
配置Strut2的配置文件Struts.xml
——繼承json-default,指定Action返回的結果集的類型爲:json;
<struts>
<packagename="userjson"namespace="/"extends="json-default">
<actionname="userAction_*"method="{1}"class="cn.itcast.oa0909.struts2.action.UserAction">
<!--指定返回的結果集的類型爲:json -->
<resulttype="json"></result>
</action>
</package>
</struts>
ajax-struts2.html:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><html>
<head>
<title>ajax-struts2.html</title>
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description"content="this is my page">
<metahttp-equiv="content-type"content="text/html;charset=UTF-8">
</head>
<!--引入js文件 -->
<scriptsrc="js/jquery-1.4.2.js"></script>
<scriptsrc="js/test.js"></script>
<body>
我的$.ajax()在Struts2中是否能處理異常,測試頁面 </body>
</html></span>
test.js:
<span style="font-family:KaiTi_GB2312;font-size:18px;">//頁面加載執行
$().ready(function(){
load();//調用load()函數
});
function load(){
$.ajax({
url:"userJSONAction_showUser.action",
type:"POST",
success:function(data){
alert("ID:"+data.uid+", UserName:"+data.username);
},
error:function(XMLHttpRequest,textStatus, errorThrown){
alert("Error!Cannot Get User Information!");
}
});
} </span>
(1)執行ajax-post.html中的$.post()方法:
——調用後臺AjaxServlet.java,其中有異常 int a = 1/0
執行結果:刷新頁面後,毫無反應——不能對異常做出處理
(2)執行ajax-post.html中的$.ajax()方法:
——調用後臺AjaxServlet.java,其中有異常 int a = 1/0
執行結果:刷新頁面後,執行結果如下;代碼中走的錯誤處理函數error:function()
總結1:在Servlet中$.post()方法不能對異常做出處理,$.ajax()方法能對異常做出處理(通過error:function()回調函數)
4,Struts2中$.ajax()
但是,在Struts2中兩個方法一樣,都不能截獲異常——Struts2的缺點;
(在Struts2中,執行$.ajax()方法,無論後臺是否有異常,都執行成功)
例子:
Web.xml:
——配置Struts2的核心的過濾器
<span style="font-family:KaiTi_GB2312;font-size:18px;"><web-appversion="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 配置Struts2的核心的過濾器-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app></span>
用戶User類——實體類:
<span style="font-family:KaiTi_GB2312;font-size:18px;">private Long uid;//用戶id
privateString username;//用戶名
/************get/set方法*******************************************/
publicLong getUid(){
returnuid;
}
publicvoidsetUid(Long uid) {
this.uid= uid;
}
publicStringgetUsername() {
returnusername;
}
publicvoidsetUsername(String username) {
this.username=username;
}</span>
UserAction.java——處理業務,獲取用戶
<span style="font-family:KaiTi_GB2312;font-size:18px;">importcn.itcast.oa0909.domain.User;
importcom.opensymphony.xwork2.ActionSupport;
public classUserAction extends ActionSupport {
privateLong uid;
privateString username;
/**
* 獲取用戶
* @return
*/
publicString showUser(){
User user = new User();//創建一個User對象
user.setUid(1L);
user.setUsername("hanxuemin");
this.uid=user.getUid();
this.username=user.getUsername();
int a =1/0; //異常
returnSUCCESS;
}
/*******get/set方法**************************/
publicLong getUid() {
return uid;
}
publicString getUsername() {
return username;
}
}</span>
配置Strut2的配置文件Struts.xml
——繼承json-default,指定Action返回的結果集的類型爲:json;
<span style="font-family:KaiTi_GB2312;"><struts>
<packagename="userjson"namespace="/"extends="json-default">
<actionname="userAction_*"method="{1}"class="cn.itcast.oa0909.struts2.action.UserAction">
<!--指定返回的結果集的類型爲:json -->
<resulttype="json"></result>
</action>
</package>
</struts>
</span>
ajax-struts2.html:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><html>
<head>
<title>ajax-struts2.html</title>
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description"content="this is my page">
<metahttp-equiv="content-type"content="text/html;charset=UTF-8">
</head>
<!--引入js文件 -->
<scriptsrc="js/jquery-1.4.2.js"></script>
<scriptsrc="js/test.js"></script>
<body>
我的$.ajax()在Struts2中是否能處理異常,測試頁面 </body>
</html></span>
test.js:
<span style="font-family:KaiTi_GB2312;font-size:18px;">//頁面加載執行
$().ready(function(){
load();//調用load()函數
});
function load(){
$.ajax({
url:"userJSONAction_showUser.action",
type:"POST",
success:function(data){
alert("ID:"+data.uid+", UserName:"+data.username);
},
error:function(XMLHttpRequest,textStatus, errorThrown){
alert("Error!Cannot Get User Information!");
}
});
} </span>
執行結果:刷新頁面後,執行結果如下;代碼中走的成功後的回調函數success:function()——應該走error:function(),因爲後臺代碼有異常int a=1/0;
總結:在Struts2中$.ajax()的錯誤處理不能正常使用,(也就是說,無論後臺是否有異常,$.ajax()函數都走成功後的回調函數success:function())——這是Struts2的內部設計缺點
Struts2中的錯誤處理存在這樣的缺點,在系統開發時無疑讓人很頭疼,那麼針對這個問題,該如何解決呢?之後的博客再做介紹。
即便是再完美的框架也有它的缺點,我們要善於發現!