博客:Struts2与ajax整合之缺点

 之前有篇博客介绍了Struts2ajax的整合,链接Struts2之—集成Json插件实现Ajax

这里不再累述,看以上博客。

   此篇博客想吐槽一下Struts2的缺点——错误处理做的不好,怎么做的不好,哪里做的不好,通过Struts2Ajax的应用缺陷来介绍。

  先提出它的缺点,后面再做出证明。

1Struts2Ajax整合的缺点

无论采用$.post还是$.ajax都捕获不到服务器产生的错误($.ajax捕获错误在servlet能做到),是struts2内部设计的不好,不是Ajax的问题。

2$.post()$.ajax()

大家都知道,$.post()方法与$.ajax()方法的区别:

$.post()方法:不能截获异常;

$.ajax()方法:可以截获异常;

官方文档解释:


 

3Servlet$.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()


 

总结1Servlet$.post()方法不能对异常做出处理,$.ajax()方法能对异常做出处理(通过error:function()回调函数)

 

4Struts2$.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中的错误处理存在这样的缺点,在系统开发时无疑让人很头疼,那么针对这个问题,该如何解决呢?之后的博客再做介绍。

      即便是再完美的框架也有它的缺点,我们要善于发现!

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。