好吧,需要注意的一件事是,它doView()
主要负责呈现您的 portlet。您的要求可以通过
1 - processAction
(Portlet Action) 或
2 - serveResource
(Portlet AJAX service) 更好地实现。
在我看来,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());
}
就是这样!希望,这对你有帮助:)