动态ui:包含

时间:2012-01-09 10:12:01

标签: java jsf jsf-2

我写了这个问题:
https://stackoverflow.com/questions/8589315/jsf2-dynamic-template

但是BalusC和casperOne告诉我写得不好所以我试着更好地解释我的问题 正如我写的那样,我的项目就是这个结构:

  • 在web root 3 xhtml pages:index,include和welcome;
  • 将子文件夹中的所有其他xhtml页面放入WEB-INF中,称为jsf。

我认为这是件好事,但是我使用netbeans'向导创建了所有页面“来自实体类的新JSF页面......”并且为了在这个向导中使用这个结构,我无法直接链接xhtml保存到jsf forlder中的页面,由向导创建,我创建了include.xhtml并修改了重定向到此页面的所有方法,稍后我将解释,include.xhtml仅包含此代码:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html">


   <h:head>
   </h:head>
   <h:body>
      Utente connesso:<h:outputText value="#{userBean.cognome}"/>

      <h:outputText value="#{userBean.nome}"/>
      <br/&gr;

      <ui:include src="#{logicBean.pageIncluded}"/>

   </h:body>
</html>

正如我所说,我修改了所有方法,在LogicBean中调用包含setPageIncluded的action方法并返回“include.xhtml”,如下所示:
PageController.java:

public void prepareList() {
    recreateModel();
    LogicBean l = (LogicBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("logicBean");
    l.action(url+"List.xhtml");
}

LogicBean.java:

public String action(String value) {
   setPageIncluded(value);
   return "include";
}

现在这段代码运作良好,我可以从所有页面导航 只有一个问题,bean LogicBean存储在会话中! 这意味着如果我尝试打开一个新窗口同时导航项目的不同部分,我就无法这样做,因为LogicBean只能包含一个pageInclude值!

我试图使用ViewScope但是我不明白它是如何工作的,在这种情况下它没用,或者我错了什么并且它不能正常工作!
有人可以帮助我吗?

我发现这个问题似乎可以帮助我: dynamic ui:include with el-expression?
但是我不知道它是否有帮助以及如何修改c:forEach和动作方法以便在我的情况下使用它!

我希望这次我能更好地解释我的问题,如果是这样,我会感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您使用经过JEE6认证的服务器,因此您可以使用CDI进行bean管理。有一个名为MyFaces CODI的CDI扩展库,其中包含一个Window作用域捆绑包,您可以使用它来扩展bean的范围而不是使用会话作用域。这将解决bean范围的问题。

首页 - http://myfaces.apache.org/extensions/cdi/