AJAX是异步JavaScript及XML的缩写词。根本上,一段JavaScript可以创建一个HTTP请求,并直接更新页面的某部分,而没有普通情况那样的POST或GET请求、并且刷新整个页面。更棒的是,一个页面可以包含多个创造同步(异步)请求的JavaScript。
关键点是当一段脚本创建一个“Ajax请求”(XHR)时,服务器不知道它来自脚本,并且像对待其它请求那样处理它。Ajax如此成功的一个原因是,它能够与仙游的服务器端技术配合良好,包括Struts。
不一样的不是Ajax请求,而是Ajax响应(Ajax response)。不是返回一个供浏览器来显示(或重显示)的完整页面,一个Ajax响应会只返回页面的一部分。这个响应可以是XML,HTML,普通的文本,另一个脚本,或者任何执行调用的脚本所希望的其它东西。
Struts1和Struts2都能够返回任意类型的响应。我们不局限在转发服务器页面。在Struts 1 中,你可以做类似下面这样的事:
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("Hello World! This is an AJAX response from a Struts Action.");
out.flush();
return null;
在Struts 2 中,我们可以用Stream结果做相同的事。
有更简单的办法哦!
使用Struts 2 插件(例如 JSON 插件, jQuery 插件等等),是普遍、推荐的来书写直接来自于动作的响应。请阅读下面的部分来了解细节。
Struts 2 result Action
package actions;
<b>
import java.io.InputStream;
import java.io.StringBufferInputStream;
import com.opensymphony.xwork2.ActionSupport;
<b>
public class TextResult extends ActionSupport{
private InputStream inputStream;
public InputStream getInputStream() {
return inputStream;
}
<b>
public String execute() throws Exception {
inputStream = newByteArrayInputStream("Hello World! This is a text string response from a Struts Action.");
return SUCCESS;
}
}
Struts 2 配置TextResult 动作
<action name="text-result" class="actions.TextResult">
<result type="stream">
<param name="contentType">text/html</param>
<param name="inputName">inputStream</param>
</result>
</action>
Struts2 同样也可以使用插件来返回一个JSON响应。
在客户端,有两种基本的策略,就是混合与匹配。
搜先,你可以使用一个JSP标签类型。这里,你不需要知道非常多关于Ajax或JavaScript的知识。taglib完成了所有工作,你只需要指出,如何使用tablib。标准Struts 2 taglib 包括了几个 Ajax JSP 标签,以及大量可用的第三方库,包括:
- Ajax Tags
- AjaxParts Taglib
- ColdTags Suite
- Prize Tags
- JSON-taglib
你可以利用像Dojo、JQUERY、或者YUI,以及StreamResult或者JSON插件,在普通旧式的HTML页面上使用普通旧式的Ajax窗体。这里,天空才是极限,但你实际上需要将JavaScript作为一门语言进行一定的学习。
Ajax 插件
尽管Struts能够与Ajax即插即用,但为了附加好处,有几个以Ajax为中心的插件可以使用。
- jQuery
- Ajax Parts
- Dojo
- YUI
其它Ajax插件
- Ajax File Upload
- GWT
- JSON
Ajax Results with JSP
尽管服务器端的页面大部分情况下更多地用来生成HTML,但我们可以使用服务器端页面来创建其它类型的数据流。这里是一个例子:
book.jsp
“`
<%@ page import = java.util.Iterator,
java.util.List,
com.esolaria.dojoex.Book,
com.esolaria.dojoex.BookManager” %>
<%
String bookIdStr = request.getParameter(“bookId”);
int bookId = (bookIdStr == null || “”.equals(bookIdStr.trim()) ) ? 0:Integer.parseInt(bookIdStr);
Book book = BookManager.getBook(bookId);
if( book != null ) {
out.println(book.toJSONString());
System.out.println(“it is: “+book.toJSONString());
}
%>
在上面的示例代码中,我们使用System.out.println 来返回一个JSON数据流作为响应。关于这个技术更多的内容,可以查看文档使用Dojo和JSON构建Ajax应用(英文教程)