Viewscoped托管bean和Portlets

时间:2012-12-31 12:20:22

标签: java jsf-2 portlet liferay-6

我正在创建一个在视图和编辑模式中应用的portlet。我想要一种情况,并且更新将portlet从编辑模式切换到视图模式。以下是我的代码段

@ManagedBean(name = "portletBackingBean")
@ViewScoped
public class FirstPortlet extends GenericFacesPortlet implements Serializable {


private transient Logger logger = LoggerFactory.getLogger(getClass());

private void doActionResponse(PortletMode mode){
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext =
    facesContext.getExternalContext();
    ActionResponse actionresponce = (ActionResponse) externalContext.getResponse();
    try {
        actionresponce.setPortletMode(mode);
    } catch (PortletModeException e) {
        // TODO Auto-generated catch block
        LiferayFacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Error setting property"));
    }
}


private String userName;

/**
 * @return the userName
 */
public String getUserName() {
    return userName;
}

/**
 * @param userName the userName to set
 */
public void setUserName(String userName) {
    this.userName = userName;
}


//submitting the values
public void doSubmit(){
    if(this.userName != null) {
        logger.debug("value of property in backing bean set to " + getUserName());
        doActionResponse(PortletMode.VIEW);
    }


}

到目前为止一切顺利,但随后portlet在查看模式下呈现,#{portletBackingBean.userName}的值为null。

请有更优雅的方式来做到这一点

提前致谢

1 个答案:

答案 0 :(得分:3)

此代码存在一些严重缺陷。

@ManagedBean(name = "portletBackingBean")
@ViewScoped
public class FirstPortlet extends GenericFacesPortlet implements Serializable {
//...
  private String userName;

portlet ......

  • 始终是应用范围
  • 必须是线程安全的
  • 不能是托管bean
  • 不能拥有每用户状态(例如userName

每当解析portletBackingBean时,它将导致JSF框架创建FirstPortlet类的新实例。它不会返回对包含它的portlet实例的引用。

此外,如果您对编辑和视图portlet模式使用不同的视图@ViewScoped不适合此状态。

简而言之,我认为您需要再次查看模型设计,并弄清楚如何将状态与portlet功能分开。