4

ajaxを使用したliferayで助けが必要です。現在、ページから ajax メソッドを呼び出してview.jspデータを送信しています。

で使用しているサンプルコードは次のview.jspとおりです。

<%@ include file="/init.jsp"%>

<portlet:actionURL name="AddTest" var="add1" />
<portlet:resourceURL id="AddTest" var="AddTest"></portlet:resourceURL>

<html>
<head>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>

    <script type="text/javascript">
    function addToDo(addToDo){
        var todo =document.getElementById('toDo').value;
        $.ajax({
            url :addToDo,            
              data: {"todo":todo,"CMD":"addToDo"},
              type: "GET",
              dataType: "text",
            success: function(data) {              
                  $("#toDoList").html(data);
            }
        });
    }
    </script>
</head>

<body>

    <portlet:resourceURL var="addToDo" id="addToDo"></portlet:resourceURL>

    <form>
        <input type="text" name="toDo" id="toDo">
        <button name="Add" type="button" onclick="addToDo('<%=addToDo%>')">Add</button>
        <div id="toDoList">

        </div>
    </form>
</body>
</html> 

私のportlet.javaクラスには、この ajax 呼び出しによって呼び出されるメソッドが 1 つあります。

@Override
public void serveResource(ResourceRequest request, ResourceResponse response){
    if(request.getParameter("CMD").equals("addToDo")) {

        System.out.println("came here for add");

        mediatype userToDo = new mediatypeImpl();
        //userToDo.setMediaId(12345);
        try {
            userToDo.setPrimaryKey((CounterLocalServiceUtil.increment()));
            userToDo.setMedianame(request.getParameter("todo"));
            mediatypeLocalServiceUtil.addmediatype(userToDo);
        }
        catch (SystemException e) {
            e.printStackTrace();
        }
    }
}

だから私の質問は、現在@override、任意の ajax クラスからデフォルトのメソッドで呼び出しているだけだということです。portlet.javaしかし、ajax呼び出しでクラスの特定のメソッドを呼び出すにはどうすればよいですか?

私はajaxの新しい蜂です。とにかく私を案内してください...

次のURLでajaxを呼び出すと、次のエラーが発生しました

<portlet:actionURL name="ajax_AddAdvertise" var="addToDo" windowState="<%= LiferayWindowState.EXCLUSIVE.toString()%>"> </portlet:actionURL>



06:47:03,705 ERROR [http-bio-8080-exec-23][render_portlet_jsp:154] java.lang.NoSuchMethodException: emenu.advertise.portlet.RestaurantPortlet.ajax_AddAdvertise(javax.portlet.ActionRequest, javax.portlet.ActionResponse)
    at java.lang.Class.getMethod(Class.java:1605)

私のプロセスアクションメソッドは次のとおりです

 @ProcessAction(name = "ajax_AddAdvertise")
    public void ajax_AddAdvertise(ResourceRequest request,ResourceResponse response) {

}
4

1 に答える 1

10

ajax呼び出しでportlet.javaクラスの特定のメソッドを呼び出すにはどうすればよいですか?

serveResource少なくともデフォルトの実装ではなく、アクションメソッドの場合のように、2 つの異なるバージョンのメソッドを持つことはできないと思います。

別のメソッドが必要な場合は、Spring MVC ( @ResourceMapping)の方法でそれを行う必要があります。

それでも、次のように (完全な例)serveResourceを使用して、メソッドでさまざまなロジックを定義できます。resourceId

JSP で:

<portlet:resourceURL var="myResourceURL" id="myResourceID01" />

ポートレット クラスでは、serveResourceメソッドに次のコードが含まれます。

String resourceID = request.getResourceID();

if(resoureID.equals("myResourceID01")) {
   // do myResourceID01 specific logic
} else {
   // else do whatever you want
}

[重要]ポートレットでは、 、、タグ
を使用しないでください。ポートレットはページ全体ではなくページのフラグメントを生成するためです。許可されていても、結果のページは整形式ではなく、ブラウザによって動作が異なります。さらに、DOM 要素を変更する JavaScript はまったく役に立ちません。<html><head><body>

このコメントの後に編集:
アクション メソッドで ajax を使用することもできます。

人々は一般的に-<portlet:actionURL>のために ajax を使用します。<form>POST

このため、次のactionURLように jsp でわずかに異なる方法で が生成されます。

<portlet:actionURL name="ajax_AddAdvertise" var="addToDo" windowState="<%= LiferayWindowState.EXCLUSIVE.toString()%>">
</portlet:actionURL>

そして、あなたのポートレットでは(質問のように)持つことができます:

@ProcessAction(name = "ajax_AddAdvertise")
public void ajax_AddAdvertise(ActionRequest request, ActionResponse response) {
// ... your code
}
于 2012-11-06T12:40:20.800 に答える