struts2項目中需要在頁面上使用jquery的autocomplete,在網上查到可以用struts2的json plugin,就此麻煩開始。先下載了json0.34,老是提示出錯,找不到某某方法,一看說是版本問題,我用的是struts2.1.6,按json plugin的網站說的,0.34應該支持struts2.1.x的,卻不能支持。只好下載0.33來用,還不錯,這次沒有鬧騰,順利調通。
接下來的問題是jquery的autocomplete接收的字符串不是標準的json格式,而是string|string|string/n(換行用於區分每組值)。一開始想修改autocomplete的腳本,但看上去很不方便,因爲現在的autocomplete是支持多個值的,例如取user值,可以附帶user fullname,以及email等其他值。組合的格式是,userId|fullname|email.../n,如果想要再附加多個值都可以。而json格式是key-value格式的,這個key是不一定的,對於autocomplete來說,就要和具體邏輯綁定在一起。這樣修改是不划算的。
json plugin本身顯得比較山寨,文檔上顯示plugin停止更新了,由struts2-json-plugin.jar在struts2.1.7包含發佈,但並沒有對新的jar如何使用沒有提供文檔,不知道是不是和原來的一樣。另外,從json plugin生成json的方式看,感覺很耗資源,要產生一個有實用價值的的json字符串,需要有對應名字的set方法,外帶有list的參數,而list中要包含map的key-value對象,一個獲取名字的功能,一次取100條記錄的話,資源消耗十分厲害。
此時,考慮到ajax的用法應當是朝着開放而自由的方向,而並非要受到各種限制。例如,日後如果發起xhr請求之後,需要服務器返回json,xml或者自己定製格式的結果的話,目前的方案是無法滿足要求的。所以決定再去struts2的網站上查一查,看看有無其他支持ajax的方法,一查果然有。具體內容如下:
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 StringBufferInputStream("Hello World! This is a text string response from a Struts 2 Action.");
此處的StringBufferInputStream從jdk1.1開始就淘汰了,用ByteArrayInputStream代替,將字符串轉換爲
byte[]之後new ByteArrayInputStream() 就可以了。在此處可以自己任意組合要返回的字符串,xml,json或者是定製格式。
return SUCCESS;
}
}
<action name="text-result" class="actions.TextResult">
<result type="stream">
<param name="contentType">text/html</param>
<param name="inputName">inputStream</param>
</result>
</action>
用上面的代碼,很順利的調通代碼,也無需修改autocomplete的腳本。這樣,也爲日後更大範圍在項目中使用ajax找到一個穩定的途徑。 通過上面的經歷,明顯感覺到那些所謂的插件,例如對dojo,jquery等知名ajax的包裝,很明顯是畫蛇添足,沒啥前途的。這方面還是 直接使用dojo.js或是jquery.js來的好,想用任何流行的widget都可以,又何必去等這個所謂的插件呢。這個和.net的ajax社區開發的ajax lib方向上有點像,過度包裝後,失去了其靈活性,修改和維護的代價過大,不值得。也令人不放心。