在我的 xhtml 中使用模板(jsf)后,commandLink 和 CommandButton 标签没有调用任何操作 [重复]

Posted

技术标签:

【中文标题】在我的 xhtml 中使用模板(jsf)后,commandLink 和 CommandButton 标签没有调用任何操作 [重复]【英文标题】:After using Template (jsf) in my xhtml, the commandLink and CommandButton tags are not invoking any action [duplicate] 【发布时间】:2014-05-23 20:10:46 【问题描述】:

我以以下方式使用 JSF 模板:

TemplateHeader.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
 xmlns:f="http://xmlns.jcp.org/jsf/core"
   xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head>
    <title>TODO supply a title</title>
    <meta name="viewport" content="width=device-width"/>
</h:head>
     <h:body>

            <ui:composition>
                    <div></div>   
             </ui:composition>

      </h:body>
</html>

模板菜单.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
 xmlns:f="http://xmlns.jcp.org/jsf/core"
   xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head>
    <title>TODO supply a title</title>
    <meta name="viewport" content="width=device-width"/>
</h:head>
        <h:body>
            <ui:composition>
                <div></div>
            </ui:composition>
        </h:body>
</html>

模板内容.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
 xmlns:f="http://xmlns.jcp.org/jsf/core"
   xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
    <title>TODO supply a title</title>
    <meta name="viewport" content="width=device-width"/>
</h:head>
<h:body>
    <ui:composition>
          <div></div>
    </ui:composition>
</h:body>
</html>    

模板页脚.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
 xmlns:f="http://xmlns.jcp.org/jsf/core"
   xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head>
    <title>TODO supply a title</title>
    <meta name="viewport" content="width=device-width"/>
</h:head>
<h:body>
    <ui:composition>
        <div></div>  
    </ui:composition> 
</h:body>
</html>

然后我将所有这些都包含在一个完整的模板文件中:

完整模板.xhtml

 <html> // with all the necessary tags as above
  <h:head>
    <title>State Transport Department- Work Schedule</title>
    <meta name="viewport" content="width=device-width"/>
    <link  rel="stylesheet" type="text/css" href="../CSS/templateCSS.css"/>
 </h:head>

 <h:body style="with the reqd styles">

 <div style="css styles">

  <div style="">
 <ui:insert name="header">
                <ui:include src="/webpages/templates/TemplateHeader.xhtml"/>
            </ui:insert>

</div>

<div>
 <ui:insert name="menu">
                <ui:include src="/webpages/templates/TemplateMenu.xhtml"/>
            </ui:insert> 
</div>

<div>
  <ui:insert name="content">
                <ui:include src="/webpages/templates/TemplateContent.xhtml"/>
            </ui:insert>
</div>

<div>
 <ui:insert name="footer">
                <ui:include src="/webpages/templates/TemplateFooter.xhtml"/>
            </ui:insert> 
</div>

 </div>

 </h:body>
 </html>

然后我将此页面包含在我的主页中,例如:

Test.xhtml

 <html>
 <h:body>
    <h:form>
<ui:composition template="/webpages/templates/CompleteTemplate.xhtml">

            <ui:define name="menu">
      //override the previos wid menues etc
            </ui:define>

             <ui:define name="content"> 
 <h:commandLink id="allocateButton" value="Test Submit"
 action="#myTaskBean.viewMyTask"/> 

 <h:commandButton id="allocateButton" value="Test Submit"
 action="#empDutySchedBean.testMethod"/>
              </ui:define>

 </ui:composition>
         </h:form>
      </h:body>
   </html>

所有的 commandLinks 和 commandButtons 都不起作用。用于菜单的普通 html 锚点有效。

对于 CommandLink,我得到错误:

此链接已被禁用,因为它没有嵌套在 JSF 表单中。

对于CommandButton:源代码中的按钮名称不会像j_something那样呈现给内置jsf,并且它不会调用java方法。

有人说这是我做模板的方式的问题。不过我觉得还好。

【问题讨论】:

【参考方案1】:

您的模板方式错误,您不需要在所有页面中设置&lt;h:body&gt;&lt;h:head&gt;

您的完整结构应该类似于:

mainTemplate.xhtml

<!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:ui="http://java.sun.com/jsf/facelets"
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:f="http://java.sun.com/jsf/core">
<f:view>
     <h:head>
         <ui:insert name="header">
                 <!-- so that each implementing page can set its own title -->
             <title></title>
         </ui:insert>
    </h:head>

    <h:body>
         <!-- if your menu is shared through all site, otherwise set it as ui:insert -->
         <ui:include src="menu.xhtml" />
         <ui:insert name="body"></ui:insert>
         <ui:insert name="footer"></ui:insert>
    </h:body>
</f:view>

现在您的表单页面将是:

test.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                template="mainTemplate.xhtml">
    <ui:define name="header">
        <title>Test Page</title>
    </ui:define>

    <ui:define name="body">
        <h:form id="myForm">
            <!-- your jsf inputs, commandbutton, etc... -->
        </h:form>
    </ui:define>

    <ui:define name="footer">
        <!-- include can come anywhere inside ui:define -->
        <ui:include src="testPageCustomFooter.xhtml" />
    </ui:define>

</ui:composition>

您当然可以拥有多个模板,但您的&lt;ui:composition&gt; 可以通过template 属性一次实现一个。 实现模板不会强迫您使用ui:define all ui:insert,这取决于您在每个特定页面中的需要。 在test.xhtml 中还要注意,您不会重写&lt;html&gt;&lt;h:head&gt;&lt;h:body&gt;,您直接在&lt;ui:composition&gt; 内部开始实现,&lt;ui:define&gt; 之外的任何内容都不会在您的页面中呈现. 希望这能解决问题。

【讨论】:

你解释得真好!我明白我在哪里犯了错误。非常感谢你!还有一件事;我应该在哪里应用 css 属性?如果我在所有页面上都有某些通用链接,我是将它们添加到 mainTemplate 页面还是单独添加到所有页面? 并添加jQuery外部链接参考? 我尝试实现它,但它没有正常工作。我所做的是我创建了一个 xhtml 文件,所有页面共有的所有组件都称为 Components.xhtml ,然后我 它到我的 MainTemplate.xhtml 页面。在 MainTemplate.xhtml 中,我添加了一个 insert 元素,我将在其他页面中覆盖该元素。将它包含到我的 Test.xhtml 页面后,我在组件页面中添加的 menu 等没有出现,但一些 css 属性有效。我试图 该部分,但它没有出现在屏幕上。我不知道为什么。 我已将我的新查询添加为另一个问题,您可能会很好地理解我的问题。 ***.com/questions/23008471/… 抱歉给我带来的麻烦! :) @user3485692 如果您有共享链接,请在mainTemplate.xhtml 中设置它们,其中包括脚本源和 css 链接。关于你的结构似乎很好,但我不太确定你的 ui:define 是如何设置的。始终查看源代码以检查渲染的内容和未渲染的内容【参考方案2】:

JSF 忽略ui:composition 之外的所有内容。如果您使用模板,则组件树是基于模板的内容构建的(我看不到h:form)。 JSF 只使用模板页面中ui:define 内的部分。

所以您的h:form 不会添加到组件树中。您必须将其添加到模板或 ui:define 中。

【讨论】:

好的,谢谢! :)

以上是关于在我的 xhtml 中使用模板(jsf)后,commandLink 和 CommandButton 标签没有调用任何操作 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JSF/Primefaces 如何将另一个域中的 .xhtml 包含到您的 .xhtml 中

将 JSF .xhtml 文件映射为无扩展名

Spring boot JSF可执行JAR找不到xhtml文件

<!DOCTYPE> 部分在 JSF 中应该如何显示? HTML5 还是 XHTML?

带有 ui:define 的 JSF2.0 部分渲染

JSF 2.0在bean(或页面?)之间传递数据