那麼,有一點需要注意,doView()
主要負責渲染您的portlet。您的要求可以通過
1 - processAction
(Portlet Action)或
2 - serveResource
(Portlet AJAX服務)更好地實現。
在我看來,AJAX請求響應將是最合適的情況;爲此你只需要在你的portlet視圖上創建一個資源URL。像:
<portlet:resourceURL var="ajaxResourceURL" />
一個JavaScript方法添加到頁面,在那裏你可以生成AJAX請求您的portlet。該方法將是這個樣子,
<script type="text/javascript">
function _callAjax(val1, val2){
var url = '<%=ajaxResourceURL %>'; // pass resource URL you created using scriplet/EL.
jQuery.ajax({
type : "POST",
url : url,
cache:false,
dataType: "json",
data: {
value1: val1, // extra parameters if you want to pass
value2: val2
},
success : function(data){
// do whatever you want with your response data
},
error : function(XMLHttpRequest, textStatus, errorThrown){
alert(errorThrown);
alert(textStatus);
}
});
};
</script>
調用上的按鈕/鏈接點擊事件AJAX方法:
<input type="button" onclick="_callAjax('val1', 'val2')" value="Send" />
最後,在你的portlet的操作監聽器類添加以下serveResource
方法,負責用於處理基於AJAX的請求。
在這裏你可以得到你的請求參數和生成意義上的迴應你想要的:
@Override
public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException,IOException {
String value1 = ParamUtil.getString(request , "value1", "default"); // request parameters
String value2 = ParamUtil.getString(request , "value2", "");
PrintWriter writer = response.getWriter();
JSONObject jsonObject = new JSONObject();
jsonObject.put(String key, boolean/long/Collection/double/Map/Object value);
writer.write(jsonObject.toString());
}
完蛋了!希望,這將有助於你:)
我會建議不要在portlet中使用HttpServletRequest或HttpServletResponse類。它打破了整個portlet編程模型,只是歡迎進一步的不良做法。看到破窗的想法http://www.codinghorror.com/blog/2005/06/the-broken-window-theory.html –
*請注意,在'doView'中實現這個不好的做法恰恰是因爲它* * *不* * *工作*。這就是'serveResource'是 –