gpt4 book ai didi

Ajax 未在我的 Liferay portlet 中触发

转载 作者:行者123 更新时间:2023-12-04 22:21:04 24 4
gpt4 key购买 nike

我有一个 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>

我的 Controller portlet 资源如下:

public class MainControllerPortlet extends  MVCPortlet {
...
public void updateRatAjax( ResourceRequest request, ResourceResponse response)
throws IOException, PortletException {
System.out.println(" updateRatAjax");

}
}

我也试过在js函数中这样调用url:

  url:"<%= updateRatAjax %>",

 var portletURL = "<%= updateRatAjax %>";
url: portletURL,

没有机会。 alert(rat.nom + ' '/* + portletURL*/);显示器但是当调用 $.ajax({...}) 时,js 方法必须停止。

该问题可能与应用程序无法使用 updateRatAjax 方法映射 resourceURL 有关。在这个项目中,actionURL 被正确映射到 Controller 的方法,我没有将它们映射到 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');
}

});

奇怪的是,我收到了成功消息,但从未调用 Controller 方法:

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");
}

最佳答案

试一试

<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 调用,因此这肯定会起作用。

关于Ajax 未在我的 Liferay portlet 中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33327568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com