2013-04-26 2 views
0

Я пытаюсь ввести Facelet в часть моей главной страницы программным путем, используя FaceletContext#includeFacelet() (я не могу использовать <ui:include>) и после прочтения ответа к this question, я написал следующий код (это простой тест):Включая Facelet с FaceletContext # includeFacelet() не работает в JSF 2.0

мнение, 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> 

Управляемая боб:

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> 

Я не знаю, почему, не только ничего не происходит, даже метод компонента был выполнен, но и методы компоненты кажется остановка будет выполняться для второго щелчка, и я не сделал получить какое-либо исключение в течение всего исполнения.

+0

HTML! = Facelet – BalusC

+0

@BalusC: После прочтения некоторых документов у меня возникла путаница в отношении смысла Facelets: следует ли только добавить структуру шаблонов Facelets на моей странице? (a используется для самостоятельной работы без использования всей структуры шаблонов, хотя ..) или мне нужно настроить все мое приложение, добавив javax.faces.DEFAULT_SUFFIX в web.xml, com .sun.facelets.FaceletViewHandler в face-config.xml и добавление jsf-facelets.jar в библиотеку? Какое оптимальное решение сделать, в том числе и facelets, работает? – Bardelman

ответ

1

Вызов FaceletContext.includeFacelet() не будет работать, потому что этот метод используется движком Facelets внутри. Не предполагается, что пользователи делают это таким образом. Мой совет - не использовать FaceletContext внутри управляемых компонентов.

Вместо этого, на мой взгляд, лучший способ сделать это - использовать <ui:include src=#{someELPointingToTheTargetFacelet}/>. Таким образом, facelets может заранее знать, что контент является «динамическим» и принимает надлежащие меры предосторожности.

В общем, лучше разрешить facelets обрабатывать изменения дерева компонентов через c: if, ui: include src = "# {...}", c: выбрать и так далее (но пропустить c: forEach) ,

+0

Я знаю, что это не самый подходящий способ, но, как я упомянул в своем вопросе, я не могу использовать , потому что инъекция должна быть выполнена в программно созданной UIHtmlPanelGroup. Кроме того, реализован как обработчик тега и не существует соответствующего класса UIComponent, поэтому я не могу его также динамически создавать. Я надеюсь, что смогу найти рабочий пример о том, чего я хочу достичь, поскольку, похоже, он работал, например, в вопросе, на который я ссылался выше. – Bardelman

+0

Я попытался бы избежать шага по созданию компонента программно вообще. Есть способы сделать это, например, включение в фасет и создание настраиваемого компонента, который превращает фасет в его содержимое. В настоящее время нет «официального» способа программным образом включать контент, созданный с помощью facelets, и попытаться сделать это будет специфичным для реализации. – lu4242

Смежные вопросы