用于Jsf bean操作的ActionResponse对象



当我从jsf portlet中单击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 !");
}
}

但是没有一个类型是满足响应对象的。这是什么类型的反应?因为我试图找出如果它是ActionResponse,那么我需要设置setEvent方法。我猜应该是ActionResponse类型,对吧?我想知道为什么没有。

& lt;修改->

现在我得到了Action Response。可能是因为我用的是jsf 1.2而不是1.1,而且我在不同的系统中。

对于Portlet a,我将bean中的事件设置为如下所示,

ar.setEvent("showResults", "true"); //ar is ActionResponse

然后在Portlet B的Portlet类中,我执行如下操作,

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");
}
}
}

因此,当我通过设置事件单击Portlet A中的按钮时,我要做的是将Portlet B的默认视图从/JsfB.jsp更改为/JsfB_alt.jsp。

但是事件没有被监听,因为我可以看到"事件遇到"没有被打印。

我甚至尝试用@Override改变processIPCEvent到processEvent,但仍然没有调用。我希望在发生任何事件时自动调用它,对吗?我觉得在ar中设置事件有问题。你觉得呢?

仅供参考,我使用weblogic服务器10.3和jsf 1.2

请指出可能的问题。

这可能是,因为您的应用程序中使用了portlet桥接实现。

由于JSF实现是为使用servlet API而编写的,因此它们不会在portlet中开箱即用。因此,当创建上下文时,portlet响应可能会适应servlet响应。上下文只返回在创建时传递给它的对象。

在我使用的桥(IBM实现)中,这些包装器也实现了portlet接口,但我不知道有这样做的需求。

如果你想要一个更全面的答案,你可能需要说明你的平台、库和它们的版本。

我在portlet.xml中使用<event-definition> and <supported-processing-event>定义为java事件(jsr),现在我可以收听它了

相关内容

  • 没有找到相关文章

最新更新