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はそれぞれの反復で再構築されます。私が到達した解決策は、navegableHomeManager
とloggedBean
の間に別の@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
お返事ありがとうございます。なんらかの理由で、 'context-param'ベースの解決策は機能しません。 'navegableHomeManager'はフレームを直ちに' loggedBean'からリカバリしますが、 'forEach'タグは'#{fn:length(navegableHomeManager._UserFrames)} 'が' 1'を返しても反復しません。 Beanはページにアクセスしたときにのみ構築されますが、これは正しいです。安定版がなく、100%信頼できないため、JSF 2.2にアップグレードすることもできません。 –
context paramに関して、間違ったビューIDを指定したようです(注:ビューIDはURLではなく、物理ファイルへのコンテキスト相対パスなので、JSFのものを '* .jsf'にマップしたとしても、ビューIDに '.xhtml'を使ってください)。残念ながら、これまで提供された情報に基づいて問題を理解するのは難しいです。 – BalusC
私のコードBalusCをさらに追加して質問を更新しました。それが助けてくれることを願って。 –