2013-01-25 3 views
6

Google's oneのような単純なカスタマイズ可能なニュースビューページを、フレームのようにもっと単純なものにしようとしています。各フレームオブジェクトには、タイトルとそのコンテンツとして追加されるURLが含まれています。表示する複数の動的コンテンツパネルをプライムします

私はJSFと素形の両方を最新バージョンで使用しています。したがって、私の裏打ちbeanは@ViewScopedであり、ログされたユーザーにアクセスできます。これは@SessionScoped beanに格納され、そのユーザーには対応するフレームがロードされています。

@ViewScoped beanを使って反復しようとすると問題が発生します。これは、c:forEachタグを使用しているためです。それは@ViewScopedですのでnavegableHomeManager豆では動作しませんobviuslyイテレーション

<ui:composition 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" 
xmlns:c="http://java.sun.com/jsp/jstl/core" 
xmlns:p="http://primefaces.org/ui" 
xmlns:fn="http://java.sun.com/jsp/jstl/functions"> 
<h:form> 
    <p:panel header="Noticias"> 
     <h:panelGrid columns="#{fn:length(navegableHomeManager._UserFrames)}" 
      width="100%"> 
      <c:forEach var="frame" items="#{navegableHomeManager._UserFrames}"> 
       <p:column> 
        <p:panel header="#{frame._Name}" closable="true" 
         style="width:95%;height:500px;" id="#{frame._Name}"> 
         <p:ajax event="close" 
          listener="#{navegableHomeManager.actionFrameClosed}" /> 
         <ui:include src="#{frame._Path}" /> 
        </p:panel> 
       </p:column> 
      </c:forEach> 
     </h:panelGrid> 
    </p:panel> 
</h:form> 

:それは私が行う方法です。そのため、Beanはそれぞれの反復で再構築されます。私が到達した解決策は、navegableHomeManagerloggedBeanの間に別の@SessionScoped beanを使用しています。そうすればフレームがそこに格納され、私はそれらを反復に適切にアクセスできます。それは上記のコードで動作しています。

しかし、私がそのように反復したいときはいつも、@SessionScoped bean(すべての単一のケースに対して特定のbeanを作成する)を使用することは義務であるとは思わない。 それで、繰り返しを避けるためにコンポーネントを使用しようとしました。

<p:dataGrid columns="#{fn:length(navegableHomeManager._UserFrames)}" 
      value="#{navegableHomeManager._UserFrames}" var="frame"> 
    <p:column> 
     <p:panel header="#{frame._Name}" closable="true" 
        style="width:95%;height:500px;"> 
      <p:ajax event="close" 
         listener="#{navegableHomeManager.actionFrameClosed}" /> 
      <ui:include src="#{frame._Path}" /> 
     </p:panel> 
    </p:column> 
</p:dataGrid> 

それはBeanが@ViewScopedまたは@SessionScopedある場合であっても、フレームのプロパティが設定されているため、ui:includeタグがすでにいない先のパスを使用して構築されていないので、私は先をレンダリングすることはできませんどちらも動作しません。パスはdinamically。私は、c:forEachタグを使用してc:forEachと同時にui:includeが適用されているので、これを通過する唯一の方法だと思います。

あなたのアイデアをプールします。

UPDATE

ここで私は、文脈の理解を助けるために、よりXHTMLコードを投稿してください。新しいページはテンプレートに統合されています。それは目標とされているページ(/system/home/index.xhtml)です:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
template="/templates/general_template.xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:c="http://java.sun.com/jsp/jstl/core"> 

<ui:define name="metadata"> 
    <f:event type="preRenderView" 
     listener="#{navegableHomeManager.initialize}" /> 
</ui:define> 

<ui:define name="general_content"> 
    <ui:include src="/system/home/home_view.xhtml" /> 
</ui:define> 

そして、それは、私もそれを実行しようとしましたが、仕事にc:forEachタグをしていない方法です。

<context-param> 
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name> 
    <param-value>/system/home/index.xhtml</param-value> 
</context-param> 

そして、それは、バッキングBeanヘッダーです:

@ManagedBean 
@ViewScoped 
@URLMapping(id = "home", pattern = "/home", viewId = "/system/home/index.xhtml") 
public class NavegableHomeManager extends SystemNavegable { 

/** 
* 
*/ 
private static final long serialVersionUID = 6239319842919211716L; 

@ManagedProperty(value = "#{loggedBean}") 
private LoggedBean _LoggedBean; 

//More stuff 

答えて

6

スティック<c:forEach>に固執する。それはあなたが探している仕事です。 <ui:include>はビューの作成時に実行されるため、ビューの作成時に繰り返しタグを実行する必要があります。

  1. は、特定のビューのための貯蓄部分の状態をオフにし

    @RequestScoped豆と使用に

    <context-param> 
        <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name> 
        <param-value>/news.xhtml</param-value> 
    </context-param> 
    
  2. は変更にそれを

    @ViewScoped豆の問題に関しては、あなたは2つのオプションをしました<f:param>および@ManagedPropertyを使用して、要求パラメータによってポストバック間の状態を維持します。

JSF 2.2が使用可能な場合は3番目のオプションがあります.JSF 2.2にアップグレードするだけです。彼らはビュースコープの豆と部分的な状態の節約で鶏卵の問題を修正しました。

+0

お返事ありがとうございます。なんらかの理由で、 'context-param'ベースの解決策は機能しません。 'navegableHomeManager'はフレームを直ちに' loggedBean'からリカバリしますが、 'forEach'タグは'#{fn:length(navegableHomeManager._UserFrames)} 'が' 1'を返しても反復しません。 Beanはページにアクセスしたときにのみ構築されますが、これは正しいです。安定版がなく、100%信頼できないため、JSF 2.2にアップグレードすることもできません。 –

+0

context paramに関して、間違ったビューIDを指定したようです(注:ビューIDはURLではなく、物理ファイルへのコンテキスト相対パスなので、JSFのものを '* .jsf'にマップしたとしても、ビューIDに '.xhtml'を使ってください)。残念ながら、これまで提供された情報に基づいて問題を理解するのは難しいです。 – BalusC

+0

私のコードBalusCをさらに追加して質問を更新しました。それが助けてくれることを願って。 –