2017-11-28 8 views
-1

2つのポートレットがあり、ポートレットAからポートレットBにイベントを送信しようとしています。今問題は、両方のポートレットを同じページに保管すると動作しますが、別のページにそれらを保持すると、PortletBのviewAction.jspページが、ポートレットBのProcessActionメソッドにも関わらず更新されません。 pritingが印刷されるので、コントロールがその部分に来ると思います)。異なるページのポートレットのイベントdoes not reload view.jsp

ポートレットA view.jsp

<portlet:actionURL var="changedb" name="processEvent"/> 


<aui:form method="post" action="<%=changedb.toString() %>"> 
<aui:fieldset> 
    <aui:select label="Select Bot" id="options" name="botname" 
required="true" showEmptyOption="true"> 
     <aui:option value="otion1" name="option1" 
>option1</aui:option> 
     <aui:option value="option2" name="option2" 
>option2</aui:option> 
    </aui:select> 
<aui:button type="submit" value="Send"/> 
</aui:fieldset> 
</aui:form> 

Javaメソッド:

@ProcessAction(name="processEvent") 
public void process(ActionRequest request, ActionResponse response) { 
    String bot = ParamUtil.getString(request, "botname",""); 
    String url = "somehttplink" + bot; 
    System.out.print("control came inside changedbportlet"); 
    System.out.println(url); 
    QName qName = new QName("botchange"); 
    response.setEvent(qName, url); 

} 

ポートレットB(受信機)

<portlet:defineObjects /> 

<% 
String url = (String) renderRequest.getParameter("url"); 
%> 
<main class="container"> 
<div class="row"> 
<div class="col-lg-12"> 
    <div id="initial-screen"> 
<iframe class="iframe" src="<%= url %>" width = "1000" height="800" 
></iframe> 
</div> 
</div> 
</div> 
</main> 

Javaメソッド:

@ProcessEvent(qname = "botchange") 
public void myEvent(EventRequest request, EventResponse response) 
     throws javax.portlet.PortletException, 
    java.io.IOException { 
    Event event = request.getEvent(); 
    String url = (String) event.getValue(); 
    System.out.println("control came to showpageportlet"); 
    System.out.print(url); 
    response.setRenderParameter("url", url); 
} 

私はLiferay 7とosgiモジュールを使用しています。https://web.liferay.com/community/wiki/-/wiki/Main/portlet+to+portlet+communicationの手順に従って、portlet-ext.propertiesファイルの下のコマンドも追加しました。

portlet.event.distribution=layout-set 

私は間違っていますか?

+0

PortletAがページ上のすべてのポートレットのレンダリングをトリガーするため、同じページにある場合は機能します。他の場所にPortletBを持っている場合は、evenメソッドだけがトリガーされます。何をアーカイブしようとしていますか? –

+0

フィルタに基づいてiframe urlを変更しようとしていて、両方のポートレットを別のページに配置する必要があります。 –

+0

PortletAを直接変更してPortletBに送信するか、または単に状態を変更したい場合、ユーザーがPortletBに来ると、別のURLが送信されますか? –

答えて

2

PortletAが状態を変更する必要があるPortletBに情報を送信するシナリオでは、現在のページにはないため、この事実を覚えておく必要があります。

イベントは情報を送信するだけですが、ProtletBはそれを覚えています。

イベント・ハンドラ・メソッドで編集され、レンダリング(doView)メソッドで読み取られるポートレット・プリファレンスを格納する場合は、セッション属性を使用できます。デフォルトを持つことを忘れないでください。

これでイベントの値を保存することができます。

PortletPreferences preferences = request.getPreferences(); 
preferences.setValue("url", url); 
preferences.store(); 

これにアクセスしてください。

request.getPreferences(); 
String state = (String) preferences.getValue("url", "") 
+0

私が間違っている場合は、セッション。私が読むことができるのは、それが最後のオプションでなければならないということです。あなたはそれに数バイトしか格納できませんし、liferay 7もsession.andの数を制限していると思います.2番目に、私は非常に新しい生涯を過ごしています。あなたが言ったオプションについてはより良いでしょう。 –

+0

はい、セッションは慎重に使用する必要があります。それはあなたが保存しているデータの文字とあなたが期待しているユーザーの数、ログインしているかどうかのタイプに依存します...私はポータル設定を使う方法を参考にしました。 –

+0

このメソッドは、ポートレットが異なるページに存在する場合に機能しますか?私はこれを試していたが、doviewメソッドのprocesseventで設定したデータを取得できない理由はわかりません。 –