jsf ポートレットから jsf ページの送信ボタンをクリックすると、jsf Bean の mymethod が呼び出されます。
<h:commandButton id="id1" action="#{Mybean.mymethod}" value="Click" />
public String mymethod() {
FacesContext fc = FacesContext.getCurrentInstance();
Object obj = fc.getExternalContext().getResponse();
if (obj instanceof ActionResponse){
System.out.println("ActionResponse !");
} else if (obj instanceof RenderResponse) {
System.out.println("RenderResponse !");
}
}
しかし、Response オブジェクトを満足させるタイプはありません。それはどのような種類の応答ですか?それが ActionResponse であるかどうかを把握しようとしているため、setEvent メソッドを設定する必要があります。そして、それは ActionResponse タイプである必要があると思いますよね? なぜそうではないのだろうか。
<-変更->
今、私はアクションレスポンスを取得しています。1.1 ではなく jsf 1.2 を使用していて、別のシステムにいることが原因である可能性があります。
ポートレット A の場合、次のように Bean にイベントを設定しました。
ar.setEvent("showResults", "true"); //ar is ActionResponse
次に、ポートレット B のポートレット クラスでは、次のようにしています。
public class IPC extends GenericFacesPortlet {
protected void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException
{
if (request.getAttribute("showResults") == "true") {
request.setAttribute("javax.portlet.faces.viewId", "/JsfB_alt.jsp");
}
super.doView(request, response);
}
@ProcessEvent
public void processIPCEvent(EventRequest eRequest, EventResponse eResponse)
throws PortletException, IOException
{
Event event = eRequest.getEvent();
if(event.getName().equals("showResults")){
System.out.println("Event encountered !");
eRequest.setAttribute("showResults", "true");
}
}
}
そこで私がやろうとしているのは、イベントを設定してポートレット A のボタンをクリックしたときに、ポートレット B のデフォルト ビューを /JsfB.jsp から /JsfB_alt.jsp に変更することです。
しかし、「発生したイベント」が印刷されていないことがわかるため、イベントはリッスンされません。
@Override を使用して processIPCEvent を processEvent に変更しようとしましたが、まだ呼び出されていません。イベントが発生したときに自動的に呼び出されることを願っていますよね?ar.setEvent() でのイベントの設定に問題があると思います。どう思いますか?
参考までに、私は weblogic サーバー 10.3 と jsf 1.2 を使用しています。
何が問題なのか提案してください。