- 浏览: 519153 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (278)
- java (41)
- 设计模式 (4)
- sql (10)
- webservice (2)
- spring (9)
- struts (6)
- struts2 (32)
- hibernate (27)
- Struts_hibernate_Spring整合 (4)
- Velocity (1)
- Servlet (9)
- JSP (6)
- javascript (19)
- jquery (10)
- ajax (4)
- html、xml (3)
- JDBC (2)
- JDK (6)
- mysql (2)
- oracle (11)
- SqlServer (1)
- DB2 (4)
- tool (7)
- linux (5)
- UML (1)
- eclipse (8)
- 执行文件 (1)
- 应用服务器 (4)
- 代码重构 (1)
- 日本語 (19)
- 交规 (1)
- office (9)
- firefox (1)
- net (1)
- 测试 (1)
- temp (6)
- 对日外包 (1)
- windows (1)
- 版本控制 (1)
- android (2)
- 项目管理 (1)
最新评论
四、 基于 Dojo 的 pub-sub 事件模型
pub-sub 是 publish-subscribe 的缩写,意思是 发布-订阅, 它提供了一种事件处理函数的注册方式。实际上, Struts 2 的 pub-sub 事件模型基本是采用了 Dojo 的 pub-sub 事件模型
4.1 pub-sub 的原理
pub-sub 事件模型提供了一种简化的事件监听方式,通过 pub-sub 事件模型,可以让一个 JavaScript 事件同时触发多个事件处理函数。当我们把一个事件(也可能是一个普通函数) 作为一个发布者注册到一个主题后,如果该事件被触发(普通函数被调用),则该主题下所有的事件处理函数都会被自动调用。如下图:
图 pub-sub 事件模型示意图
Struts 2
并未对 Dojo
的 pub-sub
事件模型进行过多的包装,如果有 Dojo
事件模型的基础,就可以非常容易理解 Struts 2
的 pub-sub
事件模型。
在 Dojo 中将一个事件注册到某个主题下的代码如下:
//将 foo 对象的 bar 方法注册到 /refresh 主题 dojo.event.topic.publish("/refresh","foo","bar");
提示: 事件主题是一个任意字符串,并没有太多额外的要求。
将某个事件处理函数注册到某个主题下的代码如下:
// 在 /refresh 主题下增加了一个匿名事件处理函数 dojo.event.topic.subscribe("/refresh", function(param1,param2){ //this function will be called everytime "/refresh" is published });
当然,Struts 2 在 Dojo 的 pub-sub 事件模型基础之上,进行了简单的包装,它为大部分 Ajax 标签提供了如下 2 个属性:
● listenTopics : 指定系列事件主题名,多个主题之间以英文逗号(,)隔开。配置该元素的 HTML 元素将用于加载服务器响应。
● notifyTopics
: 指定系列事件主题名,
多个主题之间以英文逗号(,)隔开。配置该属性的 HTML 元素将会把事件发布到指定主题,发布主题时会传递 3 个参数: data、type、request
因为 Struts 2 标签发布的事件总是会发送 3 个参数: data 、type 、request,这3个参数就代表了与服务器交互的内容
3 个参数的含义如下:
● data
: 从服务器返回的数据
● type
: 与服务器交互的状态,只有 3 个值: before (交互之前)、 load (加载数据中) 、 error (服务器响应出错)
● request : 代表请求对象本身
因此, Struts 2 中的事件处理函数大致上都是如下形式:
//事件处理函数包含 3 个参数 function a(data,type,request){ }
4.2 pub-sub 的示例
下面代码中使用了一个按钮来发布事件,将事件发布到指定主题;并通过 JavaScript 代码来为该主题增加一个事件处理函数。
/pub-sub/pub-sub1.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ taglib prefix="sx" uri="/struts-dojo-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>pub-sub模型</title> <sx:head/> <script type="text/javascript"> //订阅/lee主题,使用匿名函数监听 dojo.event.topic.subscribe("/lee", function(data, type, request) { alert('正处于Dojo的异步交互过程中,类型是:' + type); alert(request); }); </script> </head> <body> <h3>简单pub-sub模型</h3> <!-- 单击该按钮时将发布事件到/lee主题 --> <sx:submit type="submit" value="提交" align="left" notifyTopics="/lee"/> </body> </html>
上面代码中,定义 “提交“ 按钮时 ,指定了 notifyTopics="/lee" 属性,该属性指定单击按钮时,单击事件将被发布到 /lee 主题
在上面 JavaScript 代码中,使用 dojo.event.topic.subscribe("/lee", function(data, type, request){}); 代码为 /lee 主题注册了一个匿名的事件处理函数。
上面事例代码是直接指定了事件处理函数作为 /lee 主题的订阅者。除此之外,我们也可以指定一个或多个 Struts 2 标签元素作为主题的订阅者,定义订阅者通过为 Struts 2 标签指定 listenTopics 属性实现。一旦指定了一个或多个 Struts 2 标签作为订阅者,这样每当有事件被发布到该主题时,这些 Struts 2 标签将被 “激发” 一次
/pub-sub/pub-sub2.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ taglib prefix="sx" uri="/struts-dojo-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>pub-sub模型</title> <sx:head/> </head> <body> <h3>pub-sub模型</h3> <!-- 定义发布事件的提交按钮 --> <sx:submit type="submit" value="更新" notifyTopics="/change"/> <!-- 定义2个订阅事件的Struts 2标签 --> <sx:div id="t1" cssStyle="background-color:#bbbbbb;width:360px; height:80px" listenTopics="/change" href="../ajax/book.action"/> <sx:div id="t2" cssStyle="border:2px solid black;width:360px; height:120px" listenTopics="/change" href="../ajax/price.action" /> </body> </html>
上面代码让一个 “更新 ” 按钮作为事件发布者 ,让两个 <sx:div /> 元素作为事件的订阅者 ,意思就是每当单击 “更新 ” 按钮时,该按钮将会把单击事件发布到 /change 主题,而订阅者 <sx:div /> 元素的默认行为(更新自己的内容)被触发 。关于 <sx:div /> 标签的用法,请看下一节。
使用 <sx:div /> 元素时,指定了一个 href 属性,该属性指向一个 Action , 该 Action 负责生成该元素里的内容。上面 2 个 book.action 和 price.action 都直接使用 ActionSupport 作为处理类。
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts1custom.i18n.resources" value="messageResource"/> <constant name="struts.i18n.encoding" value="GBK"/> <package name="ajax" extends="struts-default" namespace="/ajax"> <action name="*"> <result>/pub-sub/{1}.jsp</result> </action> <action name=""> <result>.</result> </action> </package> </struts>
/pub-sub/book.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <%=Math.random() > 0.5 ? "疯狂Java讲义" : "Struts 2权威指南"%>
/pub-sub/price.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <h3>今日报价</h3> <ul> <li>西红柿:<%=java.lang.Math.random() * 10%>元/斤</li> <li>黄瓜:<%=java.lang.Math.random() * 10%>元/斤</li> <li>芹菜:<%=java.lang.Math.random() * 10%>元/斤</li> </ul>
通过上面可以看出,每次单击“更新 ”按钮时,将会引起页面中 2 个 DIV 元素里内容的改变。
从上面的介绍可以看出,Struts 2 的 pub-sub 事件模型基本上保留了 Dojo 事件模型特征,而且在原有的基础上,提供了进一步简化。通过使用 Struts 2 的事件模型,可以以更简单的方式来动态更新页面的内容。
<script type="text/javascript"> function newWin(url){ window.open(url, "newwindow", "width=800,height=500,top="+(screen.availHeight-500)/2+",left="+(screen.availWidth-600)/2+", toolbar=no, menubar=no, scrollbars=yes, resizable=no, location=yes, status=no"); } </script> <s:a href="" onclick="newWin('pub-sub/pub-sub1.jsp');" cssStyle="cursor: hand;">pub-sub1.jsp</s:a> <s:a href="" onclick="newWin('pub-sub/pub-sub2.jsp');" cssStyle="cursor: hand;">pub-sub2.jsp</s:a>
4.3 阻止请求
如果想阻止某个 Ajax 过程,则可以先将该 Ajax 标签的事件注册到某个事件主题下,再为该主题增加事件订阅者,并在该事件订阅者中取消该请求
例如,可以通过如下代码将 Ajax 按钮的 Ajax 事件注册到 /request 事件主题下:
<sx:submit type="submit" value="submit" notifyTopics="/request" href="ajaxText.action"/>
下面为 /request 事件主题增加订阅者,并在订阅者中取消 request 如下:
//为 /request 事件主题增加订阅者 dojo.event.topic.subscribe("/request",function(data,type,request){ //取消 request 的 Ajax 请求 request.cancel= true; });
通过上面代码即可强行中止 Ajax 请求
五、 基于 Dojo 的 Ajax 标签
Struts 2 的 Dojo 插件为了简化 Ajax 过程,提供了一些常用的 Ajax 标签,这些常用的 Ajax 标签基本可以满足普通的 Ajax 需要。但对于一些更复杂的 Ajax 通信过程,Struts 2 提供的 Ajax 标签则不够灵活,所以可以使用后面的 JSON 插件来实现
5.1 div 标签
<sx:div /> 标签在页面上生成一个 HTML 的 <div/> 元素,但这个 <div/> 元素的内容不是静态内容,而是从服务器获取的内容。为了让 <sx:div/> 标签能取得服务器的数据,必须为 <sx:div /> 标签指定一个 href 属性,这个 href 属性值是一个 Action ,该 Action 负责生成该 <div/> 元素的内容 。
还可指定该 <sx:div/> 标签生成的 <div/> 元素以固定的频率来更新自身的内容,为了指定更新频率和更新延迟,可以指定如下两个属性:
● updateFreq
: 指定更新 Div 内容的时间间隔,单位是 ms 。如果不指定,则只在页面加载时更新该 Div 的内容
● delay : 指定更新 Div 内容的时间延迟,单位 ms , 如果不指定,且指定了 updateFreq 属性,则页面加载后立即开始计时,准备刷新该 Div 的内容。如果没有指定 updateFreq ,则该属性没有任何意义
如果服务器的响应包含了 JavaScript 代码,且希望在本页面内执行,则可以为该 div 标签指定 executeScripts = "true"
/dojo/sx-div1.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ taglib prefix="sx" uri="/struts-dojo-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>远程div</title> <sx:head/> </head> <body> 仅一次获取服务器内容的div<br /> <sx:div id="div1" cssStyle="border: 1px solid black;background-color:#dddddd; width:300px;height:40px;padding-top:8px;padding-left:20px" href="random.action"> 初始化文本 </sx:div> 动态更新内容的div,每隔1s刷新一次(通过指定updateFreq="1000")<br /> 使用indicator(通过指定indicator="indicator")<br /> <sx:div id="div2" cssStyle="border: 1px solid black;background-color:#dddddd; width:300px;height:40px;padding-top:8px;padding-left:20px" href="random.action" updateFreq="1000" indicator="indicator"> 初始化文本 </sx:div> <img id="indicator" alt="Loading..." style="display:none" src="${pageContext.request.contextPath}/dojo/images/indicator.gif"/><br /> 3s之后才开始更新(通过指定delay="3000")<br /> 指定与服务器交互出错的提示(通过指定errorText属性)<br /> 指定与服务器交互过程中的提示(通过指定loadText属性)<br /> <sx:div id="div3" cssStyle="border: 1px solid black;background-color:#dddddd; width:300px;height:40px;padding-top:8px;padding-left:20px" href="random.action" updateFreq="1000" delay="3000" errorText="加载服务器数据出错" loadingText="正在加载服务器内容"> 初始化文本 </sx:div> 指定显示系统出错提示(通过指定showErrorTransportText="true")<br> <sx:div id="div4" cssStyle="border: 1px solid black;background-color:#dddddd; width:300px;height:40px;padding-top:8px;padding-left:20px" href="/dojo/AjaxNoUrl.jsp" updateFreq="1000" showErrorTransportText="true" loadingText="正在加载服务器内容"> 初始化文本 </sx:div> 执行服务器脚本(通过指定executeScripts="true") <sx:div id="div5" cssStyle="border: 1px solid black;background-color:#dddddd; width:300px;height:40px;padding-top:8px;padding-left:20px" href="test.action" updateFreq="9000" executeScripts="true" loadingText="正在加载服务器内容"> 初始化文本 </sx:div> </body> </html>
上面的页面代码中,分别定义了几种不同的 div ,有的没有 updateFreq 属性,则该 div 的内容只在页面加载时一次更新;有的指定了 updateFreq ,则指定该 div 内容的固定更新频率;有的指定了 executeScripts="true" ,则该 div 元素可以执行远程服务器端的 JavaScript 代码。
除此之外,上面的 Div 还使用了如下 2 个 Ajax 标签的通用属性:
● showErrorTransportText
: 设置是否显示服务器的错误信息
● loadingText
: 设置当服务器响应还未加载时的显示信息
/dojo/randomStr.jsp
<%@ page contentType="text/html;charset=GBK" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %> <% request.setAttribute("decorator", "none"); //阻止浏览器缓存页面内容 response.setHeader("Cache-Control","no-cache"); //HTTP 1.1 response.setHeader("Pragma","no-cache"); //HTTP 1.0 response.setDateHeader ("Expires", 0); %> 服务器返回的随机数字是:<s:property value="rdmStr"/>
/dojo/testjs.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <% request.setAttribute("decorator", "none"); //阻止浏览器缓存 response.setHeader("Cache-Control","no-cache"); //HTTP 1.1 response.setHeader("Pragma","no-cache"); //HTTP 1.0 response.setDateHeader ("Expires", 0); %> <script language="JavaScript" type="text/javascript"> alert('疯狂Java讲义'); </script> 轻量级Java EE企业应用实战 <script language="JavaScript" type="text/javascript"> alert('疯狂Ajax讲义'); </script>
上面包含了一些 JavaScript 代码,为了在目标页面中执行这些 JavaScript 代码,需要为 <sx:div > 标签指定 executeScripts="true" 属性
RandomAction
package js.dojo; import com.opensymphony.xwork2.ActionSupport; public class RandomAction extends ActionSupport { private String data; public String getRdmStr() { String result = Math.round(Math.random() * 10000) + ""; // 返回data和随机字符串连缀而成的字符串 return data != null && !data.equals("") ? data + result : result; } public void setData(String data) { this.data = HTMLDecoder.decode(data); } public String getData() { return this.data; } }
HTMLDecoder
package js.dojo; public class HTMLDecoder { public static String decode(String str) { // 获取字符串中所有数字 String[] tmp = str.split(";&#|&#|;"); StringBuffer sb = new StringBuffer(""); // 处理每个tmp数组中每个字符串元素 for (int i = 0; i < tmp.length; i++) { // 如果该元素是5位数字,将其转换成非西欧字符 if (tmp[i].matches("\\d{5}")) { sb.append((char) Integer.parseInt(tmp[i])); } // 对于普通字符 else { sb.append(tmp[i]); } } return sb.toString(); } }
Struts.xml
<struts> <constant name="struts.custom.i18n.resources" value="messageResource"/> <constant name="struts.i18n.encoding" value="GBK"/> <include file="struts_4.xml"/> <package name="js" extends="struts-default" namespace="/09">
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.2.dtd"> <struts> <constant name="struts.custom.i18n.resources" value="messageResource"/> <constant name="struts.i18n.encoding" value="UTF-8"/> <package name="js.dojo" extends="struts-default"> <action name="random" class="js.dojo.RandomAction"> <result>/dojo/randomStr.jsp</result> </action> <!-- 配置ajaxText Action --> <action name="ajaxTest" class="js.dojo.AjaxTestAction"> <result>/dojo/ajaxResult.jsp</result> </action> <action name="test"> <result>/dojo/testjs.jsp</result> </action> <action name="books"> <result>/dojo/data_zh_CN</result> </action> <action name="getBooks" class="js.dojo.GetBooksAction"> <result>/dojo/books.jsp</result> </action> <action name="showPerson" class="js.dojo.ShowPersonAction"> <result>/dojo/showPerson.jsp</result> </action> <action name="getChild" class="js.dojo.GetChildNode"> <result>/dojo/bookNode.jsp</result> </action> <action name=""> <result>.</result> </action> </package> </struts>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>struts2</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <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> </web-app>
<s:a href="" onclick="newWin('dojo/sx-div1.jsp');" cssStyle="cursor: hand;">sx-div1.jsp</s:a>
如果不需要 div 调用远程 java 方法,而是定期执行某个 JavaScript ,则可以为该 div 标签指定一个 handler 属性,该属性的值为该 JavaScript 函数即可,如下:
/dojo/sx-div2.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ taglib prefix="sx" uri="/struts-dojo-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>远程div</title> <sx:head/> </head> <script type="text/javascript"> function handler(widget, node) { alert('本地JavaScript函数处理动态div'); node.innerHTML = Math.random() > 0.4 ? "疯狂Java讲义" : "Struts 2权威指南"; } </script> <body> 直接使用本页面的JS函数,不再调用远程服务器<br /> <sx:div id="div1" cssStyle="border: 1px solid black;background-color:#dddddd; width:300px;height:40px;padding-top:8px;padding-left:20px" href="random.action" updateFreq="4000" handler="handler"> 初始化文本 </sx:div> </body> </html>
上面代码中,为 <sx:div> 指定了一个 handler 属性,该属性指向一个 JavaScript 函数。这意味着 div 每次刷新,该 JavaScript 函数都会被调用。 上面即指定了 handler 又指定了 href ,但该 div 标签不会再调用 href 属性指定的 Action ,所以 href 属性可以去除
除此之外,<sx:div> 标签还可将一个表单里包含的所有表单域转换成请求参数,并且把这些请求参数发送给远程服务器 。为了让一个 <sx:div> 标签发送表单里包含的表单域,可以为该 <sx:div> 标签指定如下属性:
● formId
: 该属性的属性值为一个表单元素的 ID , 表明该 <sx:div> 标签会把该表单里的所有表单域转换成请求参数发送到服务器
● formFilter : 指定一个函数用于过滤指定表单内的表单域
除此之外,为了通过在 JavaScript 代码中手动控制 <sx:div> 标签启动自动更新,关闭自动更新,则可以为该 div 标签指定如下 2 个属性:
● startTimerListenTopics
: 设置一个监听的事件主题,当有 Struts 2 组件向该主题发布事件时,该 div 标签的计时器被启动
● stopTimerListenTopics : 设置一个监听的事件主题,当有 Struts 2 组件向该主题发布事件时,该 div 标签的计时器被关闭
/dojo/sx-div3.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ taglib prefix="sx" uri="/struts-dojo-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>远程div</title> <sx:head/> </head> <script type="text/javascript"> var controller = { refresh : function() {alert("手动刷新");}, start : function() {alert("启动自动刷新");}, stop : function() {alert("停止自动刷新");} }; //将controller的refresh方法注册成/refresh主题的发布者 dojo.event.topic.registerPublisher("/refresh", controller, "refresh"); //将controller的start方法注册成/startTimer主题的发布者 dojo.event.topic.registerPublisher("/startTimer", controller, "start"); //将controller的stop方法注册成/stopTimer主题的发布者 dojo.event.topic.registerPublisher("/stopTimer" , controller, "stop"); //为after主题指定一个事件订阅者 dojo.event.topic.subscribe("/after" , function(data, type, e){ alert('与服务器交互过程中. 现在的过程类型是:' + type); }); </script> <body> <form id="testForm"> <s:textfield name="data" label="输入用户数据"/> </form> <input type="button" value="手动刷新" onclick="controller.refresh();" /> <input type="button" value="停止计时器" onclick="controller.stop();" /> <input type="button" value="启动计时器" onclick="controller.start();" /> <br/> 使用pub-sub机制(通过指定listenTopics等属性)<br/> 发送表单请求参数(通过指定formId="form")<br/> <sx:div id="div1" cssStyle="border: 1px solid black;background-color:#dddddd; width:300px;height:40px;padding-top:8px;padding-left:20px" href="random.action" loadingText="正在加载服务器内容..." listenTopics="/refresh" startTimerListenTopics="/startTimer" stopTimerListenTopics="/stopTimer" updateFreq="9000" autoStart="true" formId="testForm" notifyTopics="/after"> 初始化文本 </sx:div> </body> </html>
从上面代码中可以看出,单击“停止计时器 ” ,触发 controller 的 stop 方法,该方法会发布一个事件到 /stopTimer 主题,而页面中的 <sx:div > 标签的 stopTimeListenTopics 属性正是 /stopTimer ,这将引起计时器停止计时,即该<sx:div> 标签的内容停止自动更新。
点击“手动刷新”或则 “启动计时器”,当在文本框中输入 java 字符串,将在下面的文本框内看到 java 字符串,即表单里的请求参数已经被发送到了服务器
发表评论
文章已被作者锁定,不允许评论。
-
Struts1 与 Struts2 的12点区别
2011-11-16 11:14 7401) 在Action实现类方面 ... -
Struts 2 的 Ajax 支持(四)
2011-03-14 16:21 17435.4 tabbedpanel 标签 ... -
Struts 2 的 Ajax 支持(三)
2011-02-11 13:18 24345.2 submit 和 a 标签 ... -
Struts 2 的 Ajax 支持(一)
2011-01-20 14:55 2486一、 Ajax 概述 ... -
Struts 2 的拦截器(三)
2011-01-20 13:09 2907六、 拦截器示例 : 实现权限控制 权限检 ... -
Struts 2 的拦截器(二)
2011-01-12 16:38 1628四、 开发自己的拦截器 Struts 2 ... -
Struts 2 的拦截器(一)
2010-12-31 16:53 2021一、 理解拦截器 ... -
Struts 2 的标签库(五)
2010-12-29 11:35 11426.8 select 标签 以下代码 都是基 ... -
Struts 2 的标签库(四)
2010-12-24 16:21 1645六、 表单标签 表单标签,分为 2 种 : f ... -
Struts 2 的标签库(三)
2010-12-20 14:15 1972四、 数据标签 数据标签主要 ... -
Struts 2 的标签库(二)
2010-12-15 16:21 2030三、 控制标签 Str ... -
Struts 2 的标签库(一)
2010-12-13 13:47 1362一、 Struts 2 标签库概述 ... -
Struts 2 的国际化(二)
2010-12-09 13:25 2259二、 Struts 2 的国际化入门 ... -
Struts 2 的国际化(一)
2010-12-06 22:44 1306一、 程序国际化简 ... -
Struts2 上传和下载文件(三)
2010-12-03 14:58 1793三、 同时上传多个 ... -
Struts2 上传和下载文件(二)
2010-11-29 13:37 1984二、 Struts 2 的文件上传 ... -
Struts2 上传和下载文件(一)
2010-11-17 22:28 2087一、 文件上传的原理 1. 表单元 ... -
struts2 输入校验 (四)
2010-11-15 22:43 1216六、 手动完成输入校验 对于一些特殊的检验 ... -
struts2 输入校验 (三)
2010-11-08 13:25 1721五、 内建校验器 S ... -
struts2 输入校验 (二)
2010-10-28 11:01 2385二、 基本输入校验 MVC ...
相关推荐
### Struts2的Ajax支持详解 #### Ajax概述与Struts2的融合 在现代Web2.0技术蓬勃发展的背景下,Ajax技术因其能够实现网页的异步加载与交互性提升,成为了构建动态网页的重要组成部分。Struts2框架,作为Java Web...
首先,我们来理解一下Struts2是如何实现AJAX支持的。Struts2提供了一个名为`struts2-jquery-plugin`的插件,它扩展了Struts2的功能,将jQuery库集成到框架中。通过这个插件,开发者可以利用jQuery的AJAX功能与Struts...
Struts2是一个强大的MVC(模型-视图-控制器)框架,它被广泛应用于Java Web开发中,提供了灵活的架构支持。Ajax(异步JavaScript和XML)技术则为Web应用程序带来了增强的用户体验,允许页面部分刷新,而无需整体刷新...
Struts2提供了丰富的功能,如拦截器、结果类型、国际化支持等,使得开发者能够更高效地处理请求和响应。 在MVC架构中,Model负责业务逻辑,View负责展示,而Controller负责接收用户请求并调用Model进行处理,然后将...
Struts2为了满足这种需求,实现了与AJAX的无缝集成,提供了一流的AJAX支持。 Struts2的AJAX支持并不是从零开始创建一个新的AJAX框架,而是选择了当时在Java EE平台上广泛使用的AJAX库,如Dojo和Direct Web Remoting...
在实际开发中,我们还需要按照以下步骤配置Struts2以支持AJAX: 1. 在struts.xml配置文件中,定义一个Action类,指定一个返回JSON的Result类型。例如: ```xml <action name="ajaxAction" class=...
在这个"struts2+ajax+jquery"的主题中,我们将深入探讨如何利用Struts2、jQuery和Ajax技术实现Web页面的异步交互。 首先,Struts2作为MVC框架,它的核心是Action,它负责处理用户的请求,并通过配置的Result返回...
Struts2是一个非常流行的Java Web框架,它支持多种扩展,包括Ajax功能。在Struts2中实现Ajax交互,通常需要依赖一些特定的库和插件。以下是对"ajax-struts2需要的3个包"的详细解释: 1. **json.js**: 这是一个...
Struts2是一个流行的Java web框架,它为开发者提供了一种...Struts2提供了很好的集成JSON支持,使得与前端交互变得更加便捷。在实际开发中,还要考虑文件大小限制、安全性(如防止CSRF攻击)以及用户体验优化等问题。
#### 二、Struts 2与Ajax结合的意义 在Web 2.0时代,用户对于Web应用的体验有了更高的要求,传统的表单提交方式已经无法满足用户的即时反馈需求。而Ajax技术的出现则很好地解决了这一问题,通过在后台与服务器进行...
总的来说,Struts2通过与jQuery等JavaScript库的集成,为开发人员提供了强大的Ajax支持,使得在Java Web应用中实现动态交互变得简单且高效。通过理解和熟练运用上述知识点,你可以创建出响应迅速、用户体验良好的Web...
3. **Struts2插件支持**:Struts2提供了Ajax插件,如`struts2-jquery-plugin`和`struts2-json-plugin`,这些插件简化了Ajax与Struts2的集成。它们提供了一系列预定义的标签,可以直接在JSP中使用,无需手动编写...
Struts2是一个强大的MVC框架,它简化了Java Web应用的开发,提供了丰富的拦截器和插件机制,支持多种视图技术。而AJAX(Asynchronous JavaScript and XML)则允许网页在不刷新整个页面的情况下与服务器交换数据并...
除了基本的`<s:div>`标签外,Struts2还支持其他用于实现Ajax功能的标签,如`<s:submit>`、`<s:textfield>`等,它们同样可以在表单提交、文本输入等场景下启用Ajax行为,进一步提升应用的响应速度和用户友好度。...
Struts2框架支持多种方式来实现Ajax请求。其中一种是通过使用Struts2的插件,如`struts2-jquery-plugin`或`struts2-dojo-plugin`,这些插件为开发者提供了丰富的JavaScript库和动作支持。另一种方法是使用纯...
"struts2-dojo-plugin-2.2.3.1.zip_key_可用struts的ajax支持插件"这个标题表明,这个压缩包提供了一个关键的插件,使得Struts2能够支持AJAX操作。这个插件基于Dojo JavaScript库,Dojo是一个强大的JavaScript工具集...
-- 配置Struts2支持JSON --> <constant name="struts.enable.SMD" value="true"/> <constant name="struts.action.extension" value=","/> <constant name="struts.objectFactory" value="struts-default"/> ...
配置Struts2的Ajax和JSON支持通常包括以下几个步骤: 1. 在`struts.xml`配置文件中启用JSON插件: ```xml <constant name="struts.enable.SlashesInActionNames" value="true"/> <constant name="struts.action....
Web2.0的随波逐流,Ajax那是大放异彩,Struts2框架自己整合了对Ajax的原生支持(struts 2.1.7+,之前的版本可以通过插件实现),框架的整合只是使得JSON的创建变得异常简单,并且可以简单的融入到Struts2框架中,...