Struts2与ajax整合之缺点
之前有篇博客介绍了Struts2与ajax的整合,链接Struts2之—集成Json插件实现Ajax
这里不再累述,看以上博客。
此篇博客想吐槽一下Struts2的缺点——错误处理做的不好,怎么做的不好,哪里做的不好,通过Struts2中Ajax的应用缺陷来介绍。
先提出它的缺点,后面再做出证明。
1,Struts2与Ajax整合的缺点
不管採用$.post还是$.ajax都捕获不到server产生的错误($.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中的错误处理存在这种缺点,在系统开发时无疑让人非常头疼,那么针对这个问题,该怎样解决呢?之后的博客再做介绍。
即便是再完美的框架也有它的缺点,我们要善于发现!
Struts2与ajax整合之缺点的更多相关文章
- Struts2与Ajax的整合
整合: 导入jar包 sturts2-json-plugin-2.1.8.1.jar 说明: 在该jar包中有struts-plugin.xml文件 <struts> ...
- Struts2之ajax初析
Web2.0的随波逐流,Ajax那是大放异彩,Struts2框架自己整合了对Ajax的原生支持(struts 2.1.7+,之前的版本可以通过插件实现),框架的整合只是使得JSON的创建变得异常简单, ...
- 关于Struts与Ajax整合时的异常处理
关于Struts与Ajax整合时的异常处理问题: 问题还原: 从而当有异常发出时,会将异常信息发送到页面上.如下图所示:这是一个比较经典的过程: 错误提示页面: 由于sendError()方法里 ...
- 二十六:Struts2 和 spring整合
二十六:Struts2 和 spring整合 将项目名称为day29_02_struts2Spring下的scr目录下的Struts.xml文件拷贝到新项目的scr目录下 在新项目的WebRoot-- ...
- Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8整合例子(附完整的请假流程例子,jbpm基础,常见问题解决)
Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8 整合例子(附完整的请假流程例子). 1.jbpm4.4 测试环境搭建 2.Jbpm4.4+hibernat ...
- struts2与struts1整合,java.lang.InstantiationException, Exception occurred during processing request: null
做了2个action,其中一个运行没有问题,另一个报错,看下面的报错信息,再看了看struts.xml,因为没有给GetBooks这个action配置actionform,所以就导致报null.下面是 ...
- 第一次做的struts2与spring整合
参考:http://www.cnblogs.com/S-E-P/archive/2012/01/18/2325253.html 这篇文章说的关键就是“除了导入Struts2和Spring的核心库之外, ...
- Struts2结合Ajax实现登录
前言:Struts2作为一款优秀的MVC框架,和Ajax结合在一起,用户就会有良好的体验,本篇博文我们来模拟一个简单的登录操作,实现Ajax的异步请求,其中Struts2进行的是链接处理,Action ...
- Spring+Struts2+Hibernate框架整合流程
一:基本步骤 新建Maven项目,导入相关依赖(推荐) 在WEB-INF的web.xml中进行配置 ————–Hibernate配置 —————- 创建entity包,创建数据库相关实体类 根据实体类 ...
随机推荐
- 分析NTFS文件系统得到特定文件的内容
找某一个文件的内容(如要读取文件D:\dir\dir2\text.txt,详细过程例如以下: (1)读取分区表/分区链表信息,找到磁盘F的起始扇区. (2)读取D盘的第一个扇区(分区的BOOTSETO ...
- spring mvc + mybatis + spring aop声明式事务管理没有作用
在最近的一个项目中,采用springMVC.mybatis,发现一个很恼人的问题:事务管理不起作用!!网上查阅了大量的资料,尝试了各种解决办法,亦未能解决问题! spring版本:3.0.5 myba ...
- NET基础课--对象的筛选和排序(NET之美)
1.数据量不大的时候取出数据缓存于服务器,然后排序,筛选等基于缓存进行以提高效率. 排序或筛选的方法是使用集合类型提供的,如List<T>.sort() List<T>.Fi ...
- Fix an “Unapproved Caller” SecurityAgent Message in Mac OS X
上午一进公司就被日本分公司的美女呼叫,说mac硬盘加密经常开机后需要输入硬盘加密密码才可以登录,我想应该是硬盘加密后没有给用户添加许可证,所以每次登录系统都要进行验证.于是远程到用户电脑上后,准备在硬 ...
- HTML基础知识笔记(一)
HTML定义 HTML指的是超文本标记语言 HTML不是编程语言,而是标记语言 标记语言是一套标记标签 HTML是用标记标签来描述网页 HTML标签1 <html></html& ...
- SQL Server 模式和名称解析
模式实际上是名称空间,因此在SQL Serve中调用数据库对象时,一定要设置对象引用的环境.每个用户都被赋予了一个默认模式,在用户登录SQL Server并凋用数据库对象时,这个默认模式就是对象引用方 ...
- ibatis复用SQL片段、引入片段 动态条件增加
1:ibatis复用SQL片段.引入片段 使用[sql]和[include]标签: 通常情况下,你会这样写:xml 代码 <select id="selectItemCount&qu ...
- ubuntu 16.04 下载源
修改适当的更新源 可以使得aptget安装的速度变得快很多 ubuntu的更新源在 /etc/apt/sources.list 修改更新源 sudo vi /etc/apt/sources.list ...
- 控制点:ControlPoint
位于control:Points面板下,kitControl面板的ControlPallette中也存在控制点. 控制点是什么呢?一个数据值.一个传感器的值.比如,温度值,风速值,压力值,光照值,开关 ...
- MySql存储引擎介绍
MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表.若要修改默认引擎,可以修改配置文件中的default-storage-engin ...