<s:a>这个标签生成一个超级链接,用于像服务器发送异步请求,并将服务器响应加载在指定HTML元素中
web.xml
<?
xml version="1.0" encoding="GBK"
?>
< web-app version ="2.4" xmlns ="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
< servlet >
< servlet-name > dwr </ servlet-name >
< servlet-class > uk.ltd.getahead.dwr.DWRServlet </ servlet-class >
< init-param >
< param-name > debug </ param-name >
< param-value > true </ param-value >
</ init-param >
</ servlet >
< servlet-mapping >
< servlet-name > dwr </ servlet-name >
< url-pattern > /dwr/* </ url-pattern >
</ servlet-mapping >
< filter >
< filter-name > struts2 </ filter-name >
< filter-class > org.apache.struts2.dispatcher.FilterDispatcher </ filter-class >
</ filter >
< filter-mapping >
< filter-name > struts2 </ filter-name >
< url-pattern > /* </ url-pattern >
</ filter-mapping >
</ web-app >
< web-app version ="2.4" xmlns ="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
< servlet >
< servlet-name > dwr </ servlet-name >
< servlet-class > uk.ltd.getahead.dwr.DWRServlet </ servlet-class >
< init-param >
< param-name > debug </ param-name >
< param-value > true </ param-value >
</ init-param >
</ servlet >
< servlet-mapping >
< servlet-name > dwr </ servlet-name >
< url-pattern > /dwr/* </ url-pattern >
</ servlet-mapping >
< filter >
< filter-name > struts2 </ filter-name >
< filter-class > org.apache.struts2.dispatcher.FilterDispatcher </ filter-class >
</ filter >
< filter-mapping >
< filter-name > struts2 </ filter-name >
< url-pattern > /* </ url-pattern >
</ filter-mapping >
</ web-app >
struts.xml
<!
DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< constant name ="struts.custom.i18n.resources" value ="messageResource" />
< constant name ="struts.i18n.encoding" value ="GBK" />
< package name ="ajax" extends ="struts-default" >
< action name ="AjaxTest" class ="lee.AjaxTestAction" >
< result > /AjaxResult.jsp </ result >
</ action >
< action name ="Test3" >
< result > /testjs.jsp </ result >
</ action >
</ package >
</ struts >
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< constant name ="struts.custom.i18n.resources" value ="messageResource" />
< constant name ="struts.i18n.encoding" value ="GBK" />
< package name ="ajax" extends ="struts-default" >
< action name ="AjaxTest" class ="lee.AjaxTestAction" >
< result > /AjaxResult.jsp </ result >
</ action >
< action name ="Test3" >
< result > /testjs.jsp </ result >
</ action >
</ package >
</ struts >
RandomAction
package
lee;
import com.opensymphony.xwork2.Action;
import java.io.Serializable;
public class AjaxTestAction implements Action, Serializable
... {
private static int counter = 0;
private String data;
public long getServerTime()
...{
return System.currentTimeMillis();
}
public int getCount()
...{
return ++counter;
}
public String getData()
...{
return "服务器提示:" + data;
}
public void setData(String data)
...{
this.data = data;
}
public String execute() throws Exception
...{
return SUCCESS;
}
}
import com.opensymphony.xwork2.Action;
import java.io.Serializable;
public class AjaxTestAction implements Action, Serializable
... {
private static int counter = 0;
private String data;
public long getServerTime()
...{
return System.currentTimeMillis();
}
public int getCount()
...{
return ++counter;
}
public String getData()
...{
return "服务器提示:" + data;
}
public void setData(String data)
...{
this.data = data;
}
public String execute() throws Exception
...{
return SUCCESS;
}
}
AjaxResult.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); //prevents caching at the proxy server
%>
服务器计数器: < s:property value ="count" />< br >
当前时间是: < s:property value ="serverTime" />< br >
服务器返回的提示是: < s:property value ="data" />
<% ... @ 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); //prevents caching at the proxy server
%>
服务器计数器: < s:property value ="count" />< br >
当前时间是: < s:property value ="serverTime" />< br >
服务器返回的提示是: < s:property value ="data" />
testjs.jsp
<%
...
@ page contentType="text/html;charset=GBK" language="java"
%>
<% ...
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); //prevents caching at the proxy server
%>
< script language ="JavaScript" type ="text/javascript" > ...
alert('Spring2.0宝典');
</ script >
轻量级J2EE企业应用实战
< script language ="JavaScript" type ="text/javascript" > ...
alert('基于J2EE的Ajax宝典!');
</ script >
<% ...
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); //prevents caching at the proxy server
%>
< script language ="JavaScript" type ="text/javascript" > ...
alert('Spring2.0宝典');
</ script >
轻量级J2EE企业应用实战
< script language ="JavaScript" type ="text/javascript" > ...
alert('基于J2EE的Ajax宝典!');
</ script >
remotelink.jsp
<%
...
@ page contentType="text/html;charset=GBK" language="java"
%>
<% ... @ taglib prefix="s" uri="/struts-tags" %>
< html >
< head >
< title > 远程链结 </ title >
< s:head theme ="ajax" />
</ head >
< script type ="text/javascript" > ...
function before()...{alert("before request");}
function after()...{alert("after request");}
function handler(widget,node)...{
alert("本地函数");
dojo.byId(widget.targetsArray[0]).innerHTML="spring2.0宝典";
}
dojo.event.topic.subscribe("/after",function(data,type,e)...{
alert("正处于dojo的异步交互过程中,类型是:"+type);
})
</ script >
< body >
< s:url id ="ajaxTest" value ="/AjaxTest.action" />
< s:url id ="test3" value ="/Test3.action" />
< div id ="t1" style ="background-color:#bbbbbb;width:360px;height:80px" > Div 1 </ div >
< br />
< div id ="t2" style ="background-color:#bbbbbb;width:360px;height:80px" > Div 2 </ div >
< br />
< br />
同时修改Div1和Div2的内容 < br />
且将事件发布到/after主题(指定notifyTopics属性) < br />
< s:a id ="link1"
theme ="ajax"
href ="%{ajaxTest}"
indicator ="indicator"
targets ="t1,t2" notifyTopics ="/after" > 修改Div1和Div2内容 </ s:a >
< img id ="indicator" src ="${pageContext.request.contextPath}/images/indicator.gif" alt ="Loading..." style ="display:none" />
< br />
指定服务期返回失败时的错误提示(指定errorText属性) < br />
因为系统中AjaxNoUrl.jsp页面不存在,肯定出错! < br />
< s:a id ="link2"
theme ="ajax"
href ="/AjaxNoUrl.jsp"
errorText ="系统服务器返回信息出错"
targets ="t1" > 修改'Div 1'内容,使用自定义出错提示 </ s:a >
< br />
指定系统加载中的提示信息(指定loadingText属性) < br />
< s:a id ="link3"
theme ="ajax"
href ="%{ajaxTest}"
loadingText ="系统正在加载中..."
targets ="t1" > 修改'Div 1'内容,使用自定义加载信息 </ s:a >
< br />
执行远程JavaScript代码(指定executeScripts=true属性) < br />
< s:a id ="link4"
theme ="ajax"
href ="%{test3}"
executeScripts ="true"
targets ="t2" > 接执行远程JavaScript </ s:a >
< br />
通过使用自定义JavaScript函数来实现Ajax交互(指定handle属性) < br />
< s:a id ="link5"
theme ="ajax"
href ="%{ajaxTest}"
handler ="handler"
targets ="t2" > 使用自定义的处理函数 </ s:a >
< form id ="form" >
< input type =textbox name ="data" >
</ form >
提交表单请求(通过指定formId属性)
< s:a id ="link6"
theme ="ajax"
href ="%{ajaxTest}"
targets ="t2"
formId ="form" > Div 2 会显示在上面文本框中输入的内容 </ s:a >
</ body >
</ html >
<% ... @ taglib prefix="s" uri="/struts-tags" %>
< html >
< head >
< title > 远程链结 </ title >
< s:head theme ="ajax" />
</ head >
< script type ="text/javascript" > ...
function before()...{alert("before request");}
function after()...{alert("after request");}
function handler(widget,node)...{
alert("本地函数");
dojo.byId(widget.targetsArray[0]).innerHTML="spring2.0宝典";
}
dojo.event.topic.subscribe("/after",function(data,type,e)...{
alert("正处于dojo的异步交互过程中,类型是:"+type);
})
</ script >
< body >
< s:url id ="ajaxTest" value ="/AjaxTest.action" />
< s:url id ="test3" value ="/Test3.action" />
< div id ="t1" style ="background-color:#bbbbbb;width:360px;height:80px" > Div 1 </ div >
< br />
< div id ="t2" style ="background-color:#bbbbbb;width:360px;height:80px" > Div 2 </ div >
< br />
< br />
同时修改Div1和Div2的内容 < br />
且将事件发布到/after主题(指定notifyTopics属性) < br />
< s:a id ="link1"
theme ="ajax"
href ="%{ajaxTest}"
indicator ="indicator"
targets ="t1,t2" notifyTopics ="/after" > 修改Div1和Div2内容 </ s:a >
< img id ="indicator" src ="${pageContext.request.contextPath}/images/indicator.gif" alt ="Loading..." style ="display:none" />
< br />
指定服务期返回失败时的错误提示(指定errorText属性) < br />
因为系统中AjaxNoUrl.jsp页面不存在,肯定出错! < br />
< s:a id ="link2"
theme ="ajax"
href ="/AjaxNoUrl.jsp"
errorText ="系统服务器返回信息出错"
targets ="t1" > 修改'Div 1'内容,使用自定义出错提示 </ s:a >
< br />
指定系统加载中的提示信息(指定loadingText属性) < br />
< s:a id ="link3"
theme ="ajax"
href ="%{ajaxTest}"
loadingText ="系统正在加载中..."
targets ="t1" > 修改'Div 1'内容,使用自定义加载信息 </ s:a >
< br />
执行远程JavaScript代码(指定executeScripts=true属性) < br />
< s:a id ="link4"
theme ="ajax"
href ="%{test3}"
executeScripts ="true"
targets ="t2" > 接执行远程JavaScript </ s:a >
< br />
通过使用自定义JavaScript函数来实现Ajax交互(指定handle属性) < br />
< s:a id ="link5"
theme ="ajax"
href ="%{ajaxTest}"
handler ="handler"
targets ="t2" > 使用自定义的处理函数 </ s:a >
< form id ="form" >
< input type =textbox name ="data" >
</ form >
提交表单请求(通过指定formId属性)
< s:a id ="link6"
theme ="ajax"
href ="%{ajaxTest}"
targets ="t2"
formId ="form" > Div 2 会显示在上面文本框中输入的内容 </ s:a >
</ body >
</ html >
remotebutton.jsp
<%
...
@ page contentType="text/html; charset=UTF-8"
%>
<% ... @ page pageEncoding="UTF-8" %>
<% ... @ taglib prefix="s" uri="/struts-tags" %>
< html >
< head >
< title > 远程按钮 </ title >
< s:head theme ="ajax" debug ="true" />
</ head >
< script type ="text/javascript" > ...
dojo.event.topic.subscribe("/after", function(data, type, e)...{
alert('正处于Dojo的异步交互过程中,类型是:'+type);
//data : text returned
//type : "before", "load" or "error"
//e : request object
});
</ script >
< body >
< div id ="t1" style ="background-color:#bbbbbb;width:360px;height:80px" > 将被改变的结果 </ div >
< s:url id ="ajaxTest" value ="/AjaxTest.action" />
简单的提交按钮,使用indicator < br >
< img id ="indicator" src ="${pageContext.request.contextPath}/images/indicator.gif" alt ="Loading..." style ="display:none" />
<!-- targets属性设置用于装载被改变的HTML元素 -->
< s:submit type ="submit" theme ="ajax" value ="提交" targets ="t1" href ="%{ajaxTest}" align ="left" indicator ="indicator" />
< br />
简单的提交按钮,使用pub-sub事件模型(设置notifyTopics=/after属性) < br >
< s:submit type ="submit" theme ="ajax" value ="提交" targets ="t1" href ="%{ajaxTest}" align ="left" notifyTopics ="/after" />
< br />
图片按钮(通过指定type="image") < br >
< s:submit type ="image" theme ="ajax" label ="Alt Text" targets ="t1"
src ="${pageContext.request.contextPath}/images/struts-power.gif" href ="%{ajaxTest}" align ="left" />
< br />
异步方式提交表单:(在下面输入的文本将在上面显示)
< s:form id ="form" action ="AjaxTest" >
< input type ="text" name ="data" />
< s:submit type ="button" theme ="ajax" label ="发送" targets ="t1" id ="ajaxbtn" />
</ s:form >
</ body >
</ html >
<% ... @ page pageEncoding="UTF-8" %>
<% ... @ taglib prefix="s" uri="/struts-tags" %>
< html >
< head >
< title > 远程按钮 </ title >
< s:head theme ="ajax" debug ="true" />
</ head >
< script type ="text/javascript" > ...
dojo.event.topic.subscribe("/after", function(data, type, e)...{
alert('正处于Dojo的异步交互过程中,类型是:'+type);
//data : text returned
//type : "before", "load" or "error"
//e : request object
});
</ script >
< body >
< div id ="t1" style ="background-color:#bbbbbb;width:360px;height:80px" > 将被改变的结果 </ div >
< s:url id ="ajaxTest" value ="/AjaxTest.action" />
简单的提交按钮,使用indicator < br >
< img id ="indicator" src ="${pageContext.request.contextPath}/images/indicator.gif" alt ="Loading..." style ="display:none" />
<!-- targets属性设置用于装载被改变的HTML元素 -->
< s:submit type ="submit" theme ="ajax" value ="提交" targets ="t1" href ="%{ajaxTest}" align ="left" indicator ="indicator" />
< br />
简单的提交按钮,使用pub-sub事件模型(设置notifyTopics=/after属性) < br >
< s:submit type ="submit" theme ="ajax" value ="提交" targets ="t1" href ="%{ajaxTest}" align ="left" notifyTopics ="/after" />
< br />
图片按钮(通过指定type="image") < br >
< s:submit type ="image" theme ="ajax" label ="Alt Text" targets ="t1"
src ="${pageContext.request.contextPath}/images/struts-power.gif" href ="%{ajaxTest}" align ="left" />
< br />
异步方式提交表单:(在下面输入的文本将在上面显示)
< s:form id ="form" action ="AjaxTest" >
< input type ="text" name ="data" />
< s:submit type ="button" theme ="ajax" label ="发送" targets ="t1" id ="ajaxbtn" />
</ s:form >
</ body >
</ html >
struts.properties
struts.custom.i18n.resources=messageResource
struts.i18n.encoding=utf-8
struts.locale = UTF-8