我有一个MVCPortlet,我尝试在jsp页面中调用ajax。
我的jsp如下:
<%@include file="/html/init.jsp"%>
<portlet:resourceURL var="updateRatAjax" id="updateRatAjax" ></portlet:resourceURL>
<script type="text/javascript">
function selectRat(){
var rat = new Object();
rat.nom = $('#ratsList').val();
alert(rat.nom + ' '/* + portletURL*/);
$.ajax({
url: "${updateRatAjax}" ,
type: 'POST',
dataType: 'json',
data: JSON.stringify(article),
contentType: 'application/json',
mimeType: 'application/json',
success: function (data) {
alert('ajax' + article.nom);
}
});
alert('end of function');
}
</script>
....
<select class="offset2 span4 form-control" name=ratsList id = ratsList onchange="selectRat()">
<option>1</option>
<option>2</option>
<option>3</option>
</select>
<input name = "selectedRat" id ="selectedRat"></input>
我的控制器portlet资源如下:
public class MainControllerPortlet extends MVCPortlet {
...
public void updateRatAjax( ResourceRequest request, ResourceResponse response)
throws IOException, PortletException {
System.out.println(" updateRatAjax");
}
}
我也尝试将这个url调用到js函数中:
url:"<%= updateRatAjax %>",
和
var portletURL = "<%= updateRatAjax %>";
url: portletURL,
没有机会。
alert(rat.nom + ' '/* + portletURL*/);
oes显示
但是,当调用$ .ajax({...})时,js方法必须停止。
该问题可能与应用程序无法使用updateRatAjax方法映射resourceURL有关。 在这个项目中,actionURL被正确地映射到控制器的方法,而我没有在web.xml中映射它们,也没有使用任何分配。 我认为我不需要映射portlet:resourceURL,但我可能错了。我第一次使用portlet:resourceURL所以我对它们一无所知。
提前帮助你。编辑: 在Sudakatux的回答之后,我将JS功能更改为: ...
var portletURL = "${updateRatAjax}"; // "<%= updateRatAjax %>";//working //
alert(rat.nom + '\n ' + portletURL); //portletURL displays correctly with both options on previous line
$.ajax({
url: portletURL ,
type: 'POST',
dataType: 'text',
cache: false,
success: function (data) {
alert('success ajax' );
},
error: function(http, message, exc) {
alert('error ajax');
}
});
奇怪的是,我得到了成功消息,但从未调用过控制器方法:
public void updateRatAjax( ResourceRequest request, ResourceResponse response)
throws IOException, PortletException {
//public void updateRatAjax(ActionRequest request, ActionResponse response) throws PortalException, SystemException {
System.out.println("MainController portlet : updateRatAjax");
}
答案 0 :(得分:3)
试一试
<portlet:resourceURL var="timeSyncURL" id="serverTimeSync" />
<script type="text/javascript">
var serverTimeFunction = function serverTime() {
var time = null;
$.ajax({url: '<%=timeSyncURL.toString() %>',
async: false, dataType: 'text',
success: function(text) {
console.log("updated time "+ text);
time = new Date(Number(text));
console.log("time is "+time);
}, error: function(http, message, exc) {
time = new Date();
}});
所以我在这里调用一个与updateRatAjax方法具有相同签名的服务。并且对我来说工作正常
这是一个不太优雅的选择,但它应该可行 覆盖serveResource方法
@Override
public void serveResource(ResourceRequest resourceRequest,
ResourceResponse resourceResponse)
throws IOException, PortletException {
if(resourceRequest.getResourceID().equals("serverTimeSync")){
PrintWriter out = resourceResponse.getWriter();
out.println(new Date().getTime());
}
serveResource用于AJAX调用,所以这肯定会有效。
答案 1 :(得分:2)
是的,你是对的,你的AJAX电话(
resourceURL
)没有得到 在动作类中使用适当的侦听器进行映射。
问题在于你非常注重基于默认MVC portlet的var
属性将AJAX调用链接到控制器的特定方法,就像我们在Spring MVC portlet中使用{{1注释。
请参阅Multiple Ajax calls liferay portlets:
中的以下几行在此添加更多内容。我们不能使用
@ResourceMapping("xxx")
方法serveResource
。单个Liferay中可以有多个processAction
portlet(这不是Spring MVC portlet),而在这种情况下processAction
它将是单身。
现在,只需覆盖serveReource
,如下所示:
serveResource
此外,如果您有多个AJAX调用,则有两个选项:
<强> 1。在将public void serveResource( ResourceRequest request, ResourceResponse response)
throws IOException, PortletException {
System.out.println(" updateRatAjax");
}
属性添加到resourceRequest.getResourceID()
标记后,使用serveResource
中的id
过滤请求,例如:
<portlet:resourceURL>
<强> 2。通过<portlet:resourceURL id="updateRatAjax" ></portlet:resourceURL>
public void serveResource( ResourceRequest request, ResourceResponse response)
throws IOException, PortletException {
if(resourceRequest.getResourceID().equals("updateRatAjax")){
System.out.println(" updateRatAjax");
}
}
或AJAX <portlet:resourceURL>
使用其他参数过滤请求:
data
或强>
<portlet:resourceURL>
<portlet:param name="action" value="updateRatAjax" />
</portlet:resourceURL>
<强>控制器:强>
data: {
article: JSON.stringify(article),
action: 'updateRatAjax'
},
答案 2 :(得分:1)
对我来说很好 - 一些健全性检查:
alert(rat.nom + ' '/* + portletURL*/);
但未提及alert(rat.nom + portletURL);
(当然还有初始var portletURL = "<%= updateRatAjax %>";
)?strip=0
- 这样可以更轻松地阅读。