Struts2 官方教程:AJAX
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應用(英文教程)