博客:Struts2与ajax整合之缺点

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

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

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

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

1,Struts2与Ajax整合的缺点

无论采用$.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()

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

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

时间: 2024-10-28 19:18:02

博客:Struts2与ajax整合之缺点的相关文章

struts2,json,ajax整合内容记录

使用ssh三大框架整合时关于struts2,json,ajax整合内容记录.这里写主要部分代码 action部分: 注意事项,action部分的返回值要有set和get方法,否则会报错. package com.hcj.action; import net.sf.json.JSONObject; import com.hcj.dto.User; import com.hcj.service.UserService; import com.opensymphony.xwork2.ActionSup

博客管理

# 博客管理 ### 博客收藏 - 回顾AJAX请求 - 添加用户收藏博客中间关联模型 - 添加功能函数:判断是否收藏.添加收藏.取消收藏 - 添加ajax请求处理的视图函数 - 添加收藏按钮 ```html <div class="collect" style="cursor: pointer;" url="{{ url_for('posts.collect', pid=p.id) }}"> {%- if current_user.

ssm框架整合(java个人博客系统)

个人博客系统:基于Spring+Spring MVC+Mybatis(Maven构建) 1.该个人博客系统是我学习SSM框架的一个Demo,前端使用了Bootstrap,Jquery,大量使用ajax.可以作为大家整合SSM框架的一个参考. 2.项目截图: 3.源码 https://github.com/withstars/Blog-System

将微博或者qq空间的说说同步至博客园 wcf+js(ajax)跨域请求(1)

前天刚写了篇文章使用Bootstrap为你的博客园自定义轮播图片(今天将图片加载的顺序调整了下,不在访问的时候直接加载,而是页面加载最后在脚本里面动态添加dom元素),虽说技术含量不怎么高,但是大家还算感兴趣.其实对博主来说最关键是博客的积分在涨.所以趁热打铁,再来一篇使用wcf+js ajax跨域请求数据同步空间说说的帖子. 因为是请求qq说说的数据,所以要登陆我的qq,这个很麻烦,总不能让每个访客都登陆的qq,然后把数据取出来吧,而且qq也没有相关的接口提供,登陆的时候还要处理验证码.所以这

AJAX用户注册模块,非常实用-途牛博客

在网站设计中,ajax技术的使用已经很普遍了,尤其在交互式的网站中,ajax技术更不可缺少了,几乎在所有的交互式网站应用中,都会看到ajax的技术,大型网站诸如会员的注册,小型网站诸如无刷新的分页技术,给网站浏览者更好的用户体验,在局部网站设计中,如果浏览某一部分出错,而不用去重新刷新整个网页,应用最广的部分则是会员注册的无刷新验证等,无刷新的分页,无刷新的查看更多,无刷新的查询数据库中内容是否存在等等. 下面是ajax的用户注册模块,这个ajax注册模块很实用,大家只要根据自己的需要在扩展下就

重磅回归-SSM整合进阶项目实战之个人博客系统

历经一个多月的重新设计,需求分析以及前后端开发,终于有了一定的输出:我自己实现的spring4+springmvc+mybatis3整合的进阶项目实战-个人博客系统 已然完成了,系统采用mvc三层模式进行整体的开发,涉及到技术一下子很难全部列出,其中不得不提的有:整合shiro实现登录安全认证,整合lucene实现全文信息检索,基于Spring的事件驱动模型实现业务服务模块之间的异步解耦(在RabbitMQ视频教程中我也会重提这个技术点!),爬虫框架Jsoup解析html文本中的图片,整合ued

Hexo 博客快速整合公众号导流工具,不用互推也能实现粉丝躺增!

readmore 插件简介 Hexo 整合 OpenWrite 平台的 readmore 插件,实现博客的每一篇文章自动增加阅读更多效果,关注公众号后方可解锁全站文章,从而实现博客流量导流到微信公众号粉丝目的. ?? 主页 效果 用法 Step #1 - 更新 _config.yml 配置文件 在 _config.yml 配置文件中,配置 readmore 插件相关信息,详情见 OpenWrite 微信公众号增长神器 "ReadMore" 简介. plugins: readmore:

struts2博客学习之旅

1.博客学习笔记(感谢博主):http://www.cnblogs.com/xiaolongSunny/ 2.struts检验器[使用 visitor 校验复合属性 ](感谢博主):http://takeme.iteye.com/blog/1667716

Python爬取CSDN博客文章

之前解析出问题,刚刚看到,这次仔细审查了 0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.windows下环境搭建 3.java里连接redis数据库 4.关于认证 5.redis高级功能总结1.基础底层数据结构1.1.简单动态字符串SDS定义: ...47分钟前1 url :http://blog.csdn.net/youyou1543724847/