java - Liferay portlet + struts2 + Ajax

标签 java ajax jsp struts2 liferay

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

我正在使用 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/

相关文章:

java - 更改水平盒节点位置

javascript - 监控用户 session 以防止编辑冲突

php - 通过 postgres 中的单个查询访问一组值

java - Hibernate 保存返回错误的生成 ID

java - 我应该学习什么来提高我的 Java 技能?

java - 如何获取其他设备的对端IP地址

jsp - 从JSP页面获取所有参数

javascript - 当详细信息传递到模态时,id 未定义

javascript - 无法使用 javascript 将 JSON 响应转换为 HTML 表

javascript - 无需按钮即可动态更改JSP页面内容