2015-08-26 3 views
2

У меня есть мастер-шаблон JSF 2 следующим образом:Почему <УИ: фрагмент визуализации> не оценивается на <ч: outputStylesheet> и <ч: outputScript>

<!DOCTYPE html> 
<html lang="#{localeManager.language}" 
    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"> 

    <f:view locale="#{localeManager.locale}"> 
     <h:head> 
      <meta charset="UTF-8" /> 
      <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
      <meta name="viewport" content="width=device-width, initial-scale=1" /> 
      <title><ui:insert name="title">Default Title.</ui:insert></title> 

      <!-- Development Stylesheets --> 
      <ui:fragment rendered="#{facesContext.application.projectStage eq 'Development'}"> 
       <h:outputStylesheet name="css/bootstrap.css" library="bootstrap" /> 
       <h:outputStylesheet name="css/font-awesome.css" library="fontawesome" /> 
      </ui:fragment> 

      <h:outputStylesheet name="css/main.css" library="core" /> 
      <ui:insert name="header-stylesheet" /> 

      <!-- Production Stylesheets --> 
      <ui:fragment rendered="#{facesContext.application.projectStage eq 'Production'}"> 
       <h:outputStylesheet name="css/bootstrap.min.css" library="bootstrap" /> 
       <h:outputStylesheet name="css/font-awesome.min.css" library="fontawesome" /> 
      </ui:fragment> 

      <ui:insert name="header-script" /> 
     </h:head> 

     <h:body> 
      <div id="wrapper"> 
       <div id="header"> 
        <ui:insert name="header">Default content</ui:insert> 
       </div> 

       <div id="body"> 
        <ui:insert name="body">Default body</ui:insert> 
       </div> 

       <div id="footer"> 
        <ui:insert name="footer">Default footer</ui:insert> 
       </div> 
      </div> 

      <!-- Development Scripts --> 
      <ui:fragment rendered="#{facesContext.application.projectStage eq 'Development'}"> 
       <h:outputScript name="jquery-2.1.4.js" library="jquery" /> 
       <h:outputScript name="js/bootstrap.js" library="bootstrap" /> 
      </ui:fragment> 

      <!-- Production Scripts --> 
      <ui:fragment rendered="#{facesContext.application.projectStage eq 'Production'}"> 
       <h:outputScript name="jquery-2.1.4.min.js" library="jquery" /> 
       <h:outputScript name="js/bootstrap.min.js" library="bootstrap" /> 
      </ui:fragment> 
      <ui:insert name="body-script" /> 
     </h:body> 
    </f:view> 
</html> 

При развертывании его в Wildfly 9.0.1 Финал, я вижу, что весь мой атрибут <ui:fragment> получает визуализированный. Почему это? Я занимаюсь разработкой с использованием JSF 2.2.

Проект «Мои лица» - Development.

Примечание: Из всех ответов в этом вопросе ни один из них не является решением этой проблемы (поэтому я сделал домашнее задание).

ответ

2

<h:outputStylesheet> и <h:outputScript> - это специальные компоненты. Они будут во время создания времени создания уже добавлять объявленный список стилей или ресурсов сценария к виду через UIViewRoot#addComponentResource() (see Mojarra source code here).

Это независимо от состояния rendered компонента или его родителей. В эффектах они в основном перемещаются до самого конца <h:head> или <h:body>, в зависимости от значения атрибута target, заставляя их больше не сидеть внутри <ui:fragment>.

Тогда во время рендеринга рассматривается только их собственный атрибут rendered (и фактически также <h:head>, но это бессмысленно).

У вас есть 2 варианта:

  1. использовать представление времени сборки тег условно добавить их к представлению. В любом случае условие этапа проекта - это область приложения.

    <!-- Development Stylesheets --> 
    <c:if test="#{facesContext.application.projectStage eq 'Development'}"> 
        <h:outputStylesheet ... /> 
        <h:outputStylesheet ... /> 
    </c:if> 
    
    <!-- Production Stylesheets --> 
    <c:if test="#{facesContext.application.projectStage eq 'Production'}"> 
        <h:outputStylesheet ... /> 
        <h:outputStylesheet ... /> 
    </c:if> 
    
  2. Проверить состояние в собственном rendered атрибута компонентного ресурса. При необходимости используйте <c:set>, чтобы создать короткую переменную EL.

    <c:set var="dev" value="#{facesContext.application.projectStage eq 'Development'}" scope="application" /> 
    
    <!-- Development Stylesheets --> 
    <h:outputStylesheet ... rendered="#{dev}" /> 
    <h:outputStylesheet ... rendered="#{dev}" /> 
    
    <!-- Production Stylesheets --> 
    <h:outputStylesheet ... rendered="#{not dev}" /> 
    <h:outputStylesheet ... rendered="#{not dev}" /> 
    
+0

Так что, если я использую JSTL условную 'if', я не должен использовать' $ 'вместо' '#? –

+0

Вы можете, но это не единообразно и излишне запутывает стартеры. В Facelets '$ {}' ведет себя точно так же, как '# {}', но в JSP '$ {}' сразу («статически») оценивается, а '# {}' оценивается только при каждом вызове («отложенное «). – BalusC

+0

Спасибо. Я получил материал для работы с JSTL условным 'if'. –

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

  • Нет связанных вопросов^_^