gpt4 book ai didi

java - Liferay portlet + struts2 + Ajax

转载 作者:行者123 更新时间:2023-11-30 10:57:22 24 4
gpt4 key购买 nike

自从过去几天以来,我已经尝试了很多次,但仍然无法解决这个问题。

我正在使用 liferay 6.1 和 struts 2。基本上我的 liferay portlet 中有两个下拉列表,一个用于国家,另一个用于州。选择国家时,州列表需要根据选择的国家在下拉列表中。我正试图通过 AJAX 来做到这一点。 (下面是我从谷歌找到的代码,它在一个单独的动态 Web 项目中工作,但是当我在 liferay portlet 中尝试这个时它抛出错误。

下面是我的代码:

开始页面.jsp

<script >
$(document).ready(function() {
$('#country').change(function(event) {
var country = $("select#country").val();
alert(country);
$.getJSON("<s:url action='ajaxAction' namespace='ajax' includeParams='none' />", {countryName : country}, function(jsonResponse) {
$('#ajaxResponse').text(jsonResponse.dummyMsg);
alert($('#ajaxResponse').text(jsonResponse.dummyMsg));
var select = $('#states');
select.find('option').remove();
$.each(jsonResponse.stateMap, function(key, value) {
$('<option>').val(key).text(value).appendTo(select);
});
});
});
});
</script>




<s:form name="StartPage" id="StartPage">

<s:select id="country" name="country"
list="{'Select Country','India','US'}" label="Select Country" />
<br />
<br />
<s:select id="states" name="states" list="{'Select State'}"
label="Select State" />
<br />
<br />
<div id="ajaxResponse"></div>

</s:form>

struts.xml

<package name="default" extends="json-default">
<action name="ajaxAction" class="com.action.AjaxJsonAction">
<result type="json">/WEB-INF/view/StartPage.jsp
</result>
</action>
</package>

Action 类:

public class AjaxJsonAction  extends DefaultActionSupport{

private Map<String, String> stateMap = new LinkedHashMap<String, String>();
private String dummyMsg;
//Parameter for Jquery
private String countryName;

@Override
public String execute() {
System.out.println("i am executed...");
System.out.println("CountryName: " + countryName);
if (countryName.equals("India")) {
stateMap.put("1", "Kerala");
stateMap.put("2", "Tamil Nadu");
stateMap.put("3", "Jammu Kashmir");
stateMap.put("4", "Assam");
} else if (countryName.equals("US")) {
stateMap.put("1", "Georgia");
stateMap.put("2", "Utah");
stateMap.put("3", "Texas");
stateMap.put("4", "New Jersey");
} else if (countryName.equals("Select Country")) {
stateMap.put("1", "Select State");
}
dummyMsg = "Ajax action Triggered";
System.out.println("exiting.....");
return "success";
}

public Map<String, String> getStateMap() {
return stateMap;
}

public String getDummyMsg() {
return dummyMsg;
}

public String getCountryName() {
return countryName;
}

public void setStateMap(Map<String, String> stateMap) {
this.stateMap = stateMap;
}

public void setDummyMsg(String dummyMsg) {
this.dummyMsg = dummyMsg;
}

public void setCountryName(String countryName) {
this.countryName = countryName;
}
}

错误日志:

java.lang.IllegalArgumentException: application/json;charset=UTF-8 is not a supported mime type
at com.liferay.portlet.MimeResponseImpl.setContentType(MimeResponseImpl.java:159)
at org.apache.struts2.portlet.servlet.PortletServletResponse.setContentType(PortletServletResponse.java:219)
at org.apache.struts2.json.JSONUtil.writeJSONToResponse(JSONUtil.java:225)
at org.apache.struts2.json.JSONResult.writeToResponse(JSONResult.java:211)
at org.apache.struts2.json.JSONResult.execute(JSONResult.java:172)
at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373)

最佳答案

您可以为此使用 AJAX AUI 脚本。我正在使用 Liferay 6.2 sp2 SDK 和 Liferay MVC portlet。您可以尝试使用 struts 方法,看看它是否对您有帮助。

在您的 AUI 脚本中使用 liferay.provide 函数。

<aui:script>
Liferay.provide(
window,
'<portlet:namespace />updatePermState',
function() {
var A = AUI();
var url = '<%= ajaxCallResourceURL.toString() %>';
A.io.request(
url,
{
//data to be sent to server
data: {
<portlet:namespace />param1: (document.getElementById('<portlet:namespace/>mCountry').value),
}, .....

}

在您的 portlet 类中创建 servResource 函数。这将与您的 AUI 调用连接:

public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException, PortletException {

resourceResponse.setContentType("text/javascript");
... ...
//Send Data Back
resourceResponse.setContentType("text/html");
}

在调用的 JSP 文件中添加:

<!-- Create a serveResource URL -->
<portlet:resourceURL var="ajaxCallResourceURL" />

AJAX 调用。我在 Country 字段上使用 onChange 方法。我的 UpdatePermState() 函数正在创建一个动态状态的 div。

<aui:select name="mCountry" id="mCountry" label="Country of permanent address*" inlineLabel="left" onChange='<%= renderResponse.getNamespace() + "updatePermState();" %>'>

关于java - Liferay portlet + struts2 + Ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32665561/

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