【问题标题】:Facelet components layouts and javascriptFacelet 组件布局和 javascript
【发布时间】:2011-03-04 03:35:33
【问题描述】:

我有一个关于在 facelet 组件中放置 javascript 的问题。这更多的是关于最佳实践/风格而不是编程问题,但我觉得我想到的所有解决方案充其量都是黑客。好的,这是我的场景:

我有一个这样的 facelet 模板(我的面孔和 apache Trinidad)...

<ui:composition>
<f:view locale="#{myLocale}">
    <ui:insert name="messageBundles" /><!--Here we add load bundle tags-->

    <tr:document mode="strict" styleClass="coolStyleDoc">

        <f:facet name="metaContainer">
            <!--This trinidad defined facet is added to HTML head-->
            <tr:group> <!-- blah bal my own styles and js common to all  -->
                <ui:insert name="metaData" />
            </tr:group>
        </f:facet>
        <tr:form usesUpload="#{empty usesUpload ? 'false' : usesUpload}">
            <div id="formTemplateHeader">
                <ui:insert name="contentHeader" />
            </div>
            <div id="formTemplateContentContainer">
                <div id="formTemplateContent">
                    <ui:insert name="contentBody" />
                </div>
            </div>
            <div id="formTemplateFooter">
                <ui:insert name="contentFooter">
                </ui:insert>
            </div>
        </tr:form>
<!-- etc...--->

现在,想要使用此模板的 facelet 如下所示:

<ui:composition template="/path/to/my/template.jspx">

    <ui:define name="bundles">
        <custom:loadBundle basename="messagesStuff" var="bundle" />
    </ui:define>

    <ui:define name="metaData">
        <script>
        <!-- cool javascript stuff goes here-->
        </script>
    </ui:define>

    <ui:define name="contentHeader">
        <!-- MY HEADING!-->
    </ui:define>

    <ui:define name="contentBody">
        <!-- MY Body!-->
    </ui:define>

    <ui:define name="contentFooter">
        <!-- Copyright/footer stuff!-->
    </ui:define>
</ui:composition>

这一切都很好,但我遇到的问题是当我想在这个页面中使用 facelet 组件时。如果 facelet 组件有自己的 javascript 代码(jQuery 的东西等),我怎样才能使该 javascript 代码包含在生成的 html 的标题部分中? 任何帮助,将不胜感激。请让我知道如果这不清楚或什么...提前谢谢

【问题讨论】:

    标签: java javascript jsf facelets


    【解决方案1】:

    假设 JSF2 Facelets,您应该能够使用 h:head/h:outputScript 标签做一些事情。

    <?xml version='1.0' encoding='UTF-8' ?>
    <!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"
          xmlns:h="http://java.sun.com/jsf/html">
        <h:head>
            <title>JSF2</title>
        </h:head>
        <h:body>
            Hello from Facelets
            <h:outputScript target="head">
            <![CDATA[
              document.write("<!-- this will render in the head tag -->");
            ]]>
            </h:outputScript>
        </h:body>
    </html>
    

    【讨论】:

    • 该死,我希望我使用的是 jsf 2.0。各种好东西,比如注释和你发布的这个解决方案!唉,现在坚持使用旧版本(1.1!!)。也许有一种方法可以使用修改组件树的自定义组件来模拟这种行为?嗯,我可以调查一下,尽管我对这些东西有点不满意。感谢您的回复...我还没有足够的经验来投票
    【解决方案2】:

    大家好,以防万一有人也想知道,像我一样坚持使用旧的 jsf,或者由于某种原因无法使用 McDowell 提出的方法,这就是我的结果正在做。这是一种懒人的方式,仅按惯例而非代码强制执行。

    所以这是我的页面,它使用模板进行布局。可以看到它两次嵌入了customFacelet组件。

    <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:tr="http://myfaces.apache.org/trinidad"
    xmlns:custom="http://mycompany.com/jsf/custom">
    
    <ui:composition template="/path/to/template.jspx">
    
        <ui:define name="bundles">
            <custom:loadBundle basename="bundleName" var="msgs" />
        </ui:define>
    
        <ui:define name="metaData">
          <!-- Custom facelet javascript part only -->
            <custom:faceletComponent type="metaData" />
        </ui:define>
    
        <ui:define name="contentHeader">
            <!-- Fixed header stuff -->
        </ui:define>
    
        <ui:define name="contentBody">
          <!-- Lots of tables and graphs and awesome content first .... -->
    
          <!-- Custom facelet again, this time with content only  -->
            <custom:faceletComponent type="content" data="#{bean.data}"/>
        </ui:define>
    
        <ui:define name="contentFooter">
            <!-- Fixed footer stuff -->
        </ui:define>
    
    </ui:composition>
    

    这里是 facelet,它为 js 和内容定义了单独渲染的区域...

    <?xml version="1.0" encoding="iso-8859-1" standalone="yes" ?>
    

    <!-- This facelet requires the metaData sections to be placed in the header
    
        Required Attributes:
    
        NAME            TYPE                        DESCRIPTION
        =====           =====                       ============
        type            String                  One of ['metaData', 'content']. Determines which section to render
        data      MyBeanType      Get all the facelet data              
    
    -->
    <ui:composition>
    
        <tr:group rendered="#{type eq 'metaData'}">
          <!-- All of this should go in the header-->
            <script type="text/javascript">
                Event.observe(document, 'dom:loaded', function(e) {
          //Funky jQuery stuff here that does tranitions and animations etc
        });
            </script>
        </tr:group>
    
        <tr:group rendered="#{type eq 'content'}">
          <!-- Here is the facelet content, shared widget html etc
        This part relies on the javascript above
      -->
        </tr:group>
    </ui:composition>
    

    【讨论】:

      【解决方案3】:

      您可以通过以下方式包含脚本:

      • &lt;script type="text/javascript" src="externalScript.js"&gt;&lt;/script&gt;
      • 或

        <script type="text/javascript">
        //<![CDATA[
        ....
        //]]>
        </script>
        

      【讨论】:

      • 好吧,也许我不清楚,但我知道我可以在 facelet 中嵌入 js,但可重用的 facelet 组件通常是一个片段,即它不包含 100% 正确的 html。在我的例子中,我将 facelet 嵌入到使用模板的页面中。例如,嵌入的 facelet 只能定义 ...
        。那么如何在嵌入的 facelet 页面中添加 javascript,该页面将在主 HTML 输出的 标记中呈现。是不是更清楚了?
      • 嗯,只要把&lt;ui:insert&gt;放到模板里,然后用&lt;ui:define&gt;定义就行了?
      猜你喜欢
      • 1970-01-01
      • 2018-08-24
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 2018-10-24
      相关资源
      最近更新 更多