使用Struts 2开发应用02:AJAX

文章翻译自Struts 2官方文档。

 

AJAX是Asynchronous JavaScript and XML的首字母缩略词。本质上,JavaScript能产生一个HTTP请求并立即更新部分页面,而不是通过传统的POST或者GET方式并更新整个页面。然而更好的是,一个页面可以包含若干产生同步(异步)请求的JavaScript。

 

关键点是当一个脚本产生一个“AJAX请求”(XHR)时,服务器不知道这个请求来自一个脚本,并且像其他请求一样处理它。AJAX如此成功的一个原因是,它和现有的包括Struts在内的服务器技术一起工作得很好。

 

不是Ajax请求不同,而是Ajax响应。Ajax响应仅仅返回浏览器显示(或者重新显示)页面的一部分,而不是返回整个页面。这个响应可以是XML形式,或者HTML,或者普通文本,另一个脚本,或者调用脚本想要的任何其他东西。

 

Struts 1和Struts 2都能返回任意类型的响应。我们并不限制跳转到一个服务器页面。在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)result做同样的事情。

 

还有更容易的方式!

 

一般来说,使用Struts 2插件(例如,JSON插件,jQuery插件,等等)比直接从action向响应输出更好。更多细节参考下面章节。

Struts 2 Stream result Action

package actions;
 
import java.io.InputStream;
import java.io.StringBufferInputStream;
import com.opensymphony.xwork2.ActionSupport;
 
public class TextResult extends ActionSupport  {
    private InputStream inputStream;
    public InputStream getInputStream() {
        return inputStream;
    }
 
    public String execute() throws Exception {
        inputStream = new ByteArrayInputStream("Hello World! This is a text string response from a Struts 2 Action.".getBytes("UTF-8"));
        return SUCCESS;
    }
}

 Struts 2 Configuring the TextResult Action

<action name="text-result" class="actions.TextResult">
    <result type="stream">
        <param name="contentType">text/html</param>
        <param name="inputName">inputStream</param>
    </result>
</action>

 提示:使用插件,Struts 2也可以返回JSON(JavaScript Object Notation)响应。

 

在客户端,有两种基本的策略,这两个策略可以混合使用也可以分开使用。

 

首先,你可以使用一些JSP标签类型。在这里,你不需要知道所有关于Ajax或者JavaScript的知识。标签库做了所有的事情,你只需要关注如何使用这些标签库。标准的Struts 2标签库包含若干Ajax JSP标签,也可获得许多第三方库,包括:

  • Ajax Tags
  • AjaxParts Taglib
  • ColdTags Suite
  • Prize Tags
  • JSON-taglib
作为选择,你可以在普通HTML页面使用普通Ajax小部件(widget),使用 Dojo, jQuery,或则 YUI,和SteamResult或者 JSON插件。在这里,虽然篇幅有限,但是你实际上已经学习了JavaScript语言的的一部分。

Ajax插件

虽然Struts和开箱即用的Ajax工作的很好,但是为了增加功能,若干以Ajax为中心的插件可以利用。

Ajax标签插件

  • jQuery - jQuery插件提供了ajax功能和UI小部件,UI小部件是一个一个基于jQuery框架的JavaScript Grid。
  • Ajax Parts - AjaxParts标签库(APT)是Java Web Parts(JWP)项目(http://javawebparts.sourceforge.net)的一个组件,APT允许在以Java为基础的web应用中使用纯净的(理解(read):不必编写JavaScript)AJAX功能。
  • Dojo - Ajax标签Dojo插件代表着Struts 2的一个主题。对于Struts 2.1,Dojo标签作为Struts的插件直到版本2.3.x。从版本2.5以后这个插件不再作为Struts2分发版的一部分。
  • YUI - 到目前位置Yahoo用户接口(YUI)插件只有少数几个标签可以使用,因为YUI标签比Dojo版本的标签更容易使用。

其他Ajax插件

  • Ajax File Upload - 我们使用Ajax文件上传插件可以上传文件到服务器并且一部监视文件上传的进度。
  • GWT - Google Web Toolkit插件暴露Struts 2 action给GWT RPC机制。
  • JSON - JSON插件序列化Action的属性到JSON,使响应JavaScript请求更容易。

完整的Struts 2插件列表参考Struts插件仓库。

在JSP中使用Ajax Results

虽然服务器页面大多数时候用来生成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("itis: " + book.toJSONString());
    }
%>

 在示例代码中,作为响应我们用System.out.println返回一个JSON数据流。这项技术的更多信息,参考使用Dojo和JSON构建Ajax应用。

 

你可能感兴趣的:(struts,2)