将请求参数注入视图范围的bean(不同的portlet)

时间:2016-07-11 13:56:58

标签: jsf request portlet view-scope viewparams

我尝试传递两个视图,即portlet-A中的第一个视图,以及portlet-B中的第二个视图(同一个.war中的两个portlet)。 为此,我决定使用JSF' f:viewParam'和' f:param'功能,以便将属性(从portlet-A视图)注入请求对象,以便portlet-B视图可以从请求对象中检索它,并将此属性值传递给视图范围的支持bean属性。

Portlet-A视图代码:

<p:dataScroller value="#{searchManager.List}" var="ccp" >
    ...
    <p:link value="#{ccp.title}" onclick="myonClick(event)" >
         <f:param name="id" value="#{ccp.id}" />             
    </p:link>
    ...
</p:dataScroller>

JS代码:

function myonClick(event) {
    event.preventDefault();
    window.open("viewer", "_blank");
}

请注意,portlet-B视图必须显示在基于Liferay的页面上,与显示portlet-A视图的页面不同。

Portlet-B视图代码:

<f:metadata>
    <f:viewParam name="id" value="#{resultItemManager.id}" />       
</f:metadata>

<h:head />

<h:body>
    <p>Details:</p>
        <h:outputText value="#{resultItemManager.id}" />
</h:body>

当显示portlet-B时,浏览器地址字段设置为&#39; http://host:8080/viewer&#39;并且标记呈现为&#39; 0&#39; (零)。

我不知道我执行目标任务的方式是否合适。但如果是的话,我不知道为什么它不起作用。 所以我非常感谢任何帮助/评论。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

Portlet-A视图代码:

<p:dataScroller value="#{searchManager.List}" var="ccp" >
...
    <p:link value="#{ccp.title}" onclick="myonClick(event, #{ccp.id})" />
...
</p:dataScroller>

JS代码:

function myonClick(event, itemId) {
    event.preventDefault();
    window.open("viewer" + "?id=" + itemId, "_blank");
}

Portlet-B视图代码(Portlet-B视图必须显示在基于Liferay的页面上,与显示portlet-A视图的页面不同):

<h:body>
    <p>Details</p>
    <h:outputText value="#{itemManager.id}" />              
</h:body>

Portlet-B端托管bean:

@ManagedBean(name = "resultItemManager")
@ViewScoped
public class ItemManager implements Serializable {

  @ManagedProperty(value = "")
  public long id;

  ...

  @PostConstruct
  public void init() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext extContext = facesContext.getExternalContext();
    RenderRequest renderRequest = (RenderRequest) extContext.getRequest();
    HttpServletRequest httpRequest = PortalUtil.getOriginalServletRequest(
         PortalUtil.getHttpServletRequest(renderRequest));
    this.id = Long.parseLong(httpRequest.getParameter("id"));
  }
}

这样,就不需要使用ViewParams。 El&#39; itemId&#39; param附加到http请求,以便在Portlet-B端的init()PostConstruct方法中检索它。此外,视图显示在新的不同页面上。