0

メインページの一部にFaceletをプログラムで使用して挿入しようとしてFaceletContext#includeFacelet()います(使用できません)。この質問<ui:include>への回答を読んだ後、次のコードを書きました(単純なテストケースです):

ビューindex.xhtml:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
        <title>Insert title here</title>
        <script src="JS/jquery-1.8.3.js" />
        <script type="text/javascript">
            $(function(){
                $('#mondiv').click(function(){
                    console.log("mondiv is clicked !");                     
                    includefacelet();
                });
            });
        </script>
    </h:head>
    <body>
        <h:form id="form1">
            <div id="mondiv" style="background-color: red; position: absolute; width: 20px; height: 20px;" />
            <p:remoteCommand name="includefacelet" actionListener="#{bean.includefacelet}" />
            <br /><br />
            <h:panelGroup id="pg" layout="block" style="background-   color:blue;position:absolute;width:200px;height:200px;" />
        </h:form>
    </body>
</html>

マネージド Bean:

package beans.a4jTests;

import java.io.IOException;

import javax.faces.application.Application;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIForm;
import javax.faces.component.html.HtmlPanelGroup;
import javax.faces.context.FacesContext;
import javax.faces.view.facelets.FaceletContext;

import org.primefaces.context.RequestContext;

@ManagedBean
@SessionScoped
public class Bean {

    public void includefacelet(){
        FacesContext fc = FacesContext.getCurrentInstance();
        UIForm form1 = (UIForm) fc.getViewRoot().findComponent("form1");
        HtmlPanelGroup pg = (HtmlPanelGroup) form1.findComponent("pg");
        FaceletContext faceletContext = (FaceletContext) fc.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);

        try {
            faceletContext.includeFacelet(pg, "NewFile.html");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //Refrsh
        RequestContext context = RequestContext.getCurrentInstance();         
        context.update("form1");
        context.update("pg");
        System.out.println("includefacelet is executed");
    }

}

インクルードnewfile.html:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
        <title>Insert title here</title>
    </head>
    <body>
        Hello ! this is the newfile.html
    </body>
</html>

ビーンメソッドが実行されても何も起こらないだけでなく、2回目のクリックでビーンメソッドの実行が停止しているように見え、実行全体で例外が発生しなかった理由はわかりません。

4

1 に答える 1

1

FaceletContext.includeFacelet() の呼び出しは機能しません。そのメソッドは Facelets エンジンによって内部的に使用されるためです。ユーザーがそのようにすることは想定されていません。私のアドバイスは、マネージド Bean 内で FaceletContext を使用しないことです。

代わりに、私の意見では、それを行うための最良の方法はを使用すること<ui:include src=#{someELPointingToTheTargetFacelet}/>です。このようにして、Facelets はコンテンツが「動的」であることを事前に認識し、適切な予防措置を講じることができます。

一般に、c:if、ui:include src="#{...}"、c:choose などを使用して facelets でコンポーネント ツリーの変更を処理できるようにすることをお勧めします (ただし、c:forEach はスキップします)。

于 2013-04-26T19:07:16.903 に答える