zoukankan      html  css  js  c++  java
  • Struts2与ajax整合之缺点

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

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

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

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

    1Struts2Ajax整合的缺点

    不管採用$.post还是$.ajax都捕获不到server产生的错误($.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中的错误处理存在这种缺点,在系统开发时无疑让人非常头疼,那么针对这个问题,该怎样解决呢?之后的博客再做介绍。

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

     

  • 相关阅读:
    LInq 与lambda表达式
    Java内存模型-jsr133规范介绍(转)
    Java多线程之Lock的使用(转)
    有一个很大的整数list,需要求这个list中所有整数的和,写一个可以充分利用多核CPU的代码,来计算结果(转)
    CountDownLatch
    CyclicBarrier
    java设计模式演示样例
    2012毕业找工作记录点滴
    Objective-C语法之代码块(block)的使用
    权限表设计之代码解析
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4061875.html
Copyright © 2011-2022 走看看