【问题标题】:JSF view not rendered in PrimeFaces TabviewJSF 视图未在 PrimeFaces Tabview 中呈现
【发布时间】:2013-09-20 02:55:02
【问题描述】:

我知道以前有人问过这个问题,但是即使在仔细查看了包括 Balus 优秀答案“h:commandLink / h:commandButton is not being invoked”+“侦听和调试 JSF 生命周期阶段”在内的各种帖子之后,我仍然无法理解为什么我不能渲染 JSF我的标签页。

我在 CSS 选项卡“规则”下有一个 PrimeFaces 选项卡“规则管理”,它成功显示了以下 Jsf 文件 RuleAdmin2.xhtml。在该页面中,我有一个按钮来创建新规则。

它应该使用新屏幕 (RuleDetails.xhtml) 的值更新支持 bean 目标属性 (ruleAdminBK.target) 并在“规则管理”选项卡中呈现此文件。

当我调试时,我注意到“创建新规则”确实被调用并且目标填充了正确的文件“RuleDetails.xhtml”。但是,该选项卡仍显示父表单“RuleAdmin2.xhtml”。

当我单击“规则”链接时,整个页面都会刷新,“规则管理”选项卡会显示正确的页面 (RuleDetails.xhtml)。

在我看来,它比 bean 更新之前的选项卡呈现。

日志文件中没有相关信息,也没有消息。

非常感谢任何提示,因为我的想法已经不多了。

这是我的代码: 我的 Facelet 模板 (matTemplate.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:c="http://java.sun.com/jsp/jstl/core"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">

    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta name="sessionTimeout" http-equiv="refresh" content="#{session.maxInactiveInterval};url='/mat/errorExpired.xhtml?faces-redirect=true&amp;viewName=#{view.viewId}'" />
        <f:metadata>
            <ui:insert name="metadata">Placeholder Data</ui:insert>
        </f:metadata>

        <title><ui:insert name="title">Placeholder Title</ui:insert></title>
        <ui:insert name="head"></ui:insert>
        <style type="text/css">
            @media print {
                #header, #mainmenu, #footer
                {
                    display: none !important;
                }
                #wrapper {
                    width:760px;
                    border-left:0px solid #013f7a;
                    border-right:0px solid #013f7a;
                    margin:0 auto;
                    background:#fff;
                    padding:0 5px;
                }
            }
         </style>
    </h:head>

    <h:body>
        <h:form id="templateForm">

        <div id="wrapper">
            <ul id="mainmenu">
                <li><h:link outcome="/home3.xhtml">Home</h:link></li>        
                <li><h:link outcome="/admin/rules/RuleAdmin.xhtml">Rules</h:link></li>
            </ul>
            <div id="content"  >
                <ui:insert name="content">Content</ui:insert>
            </div>
        </div>        
        <div id="footer">
            <ui:insert name="footer" >
            </ui:insert>
         </div>
        </h:form>
    </h:body>
</html>

我定义标签的主页:

<?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"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core" xml:lang="en" lang="en"
      xmlns:c="http://java.sun.com/jstl/core"
      xmlns:p="http://primefaces.org/ui" >
       <ui:composition template="./../../WEB-INF/matTemplate.xhtml">
            <ui:define name="content">
                <p:tabView id="tabView" dynamic="true" cache="false" activeIndex="0">
                        <p:tab id="tab1" title="Rules Administration">     
                              <ui:include src="#{ruleAdminBK.target}" />            
                        </p:tab>  
                  </p:tabView>       
            </ui:define>
        </ui:composition>
</html>

以及被调用的支持 bean。

@Component
@Scope("session")
public class RuleAdminBK extends BaseBean {

    private static final String _RULE_DETAILS = "/admin/rules/RuleDetails.xhtml";
    private static final String _RULE_ADMIN = "/admin/rules/RuleAdmin2.xhtml";
    private String target = _RULE_ADMIN;

public void cmdCreateNew_Click() {
        setTarget(_RULE_DETAILS);
    }

最后是 2 个 JSF 文件: RuleAdmin2.xhtm

<?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"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core" xml:lang="en" lang="en"
    xmlns:p="http://primefaces.org/ui">
<ui:composition>
    <h:panelGroup layout="block" id="rulesAdministration">
        <h:outputText id="lblStatus" value="#{ruleAdminBK.lblStatus}" />
        <table width="100%">
            <tr>
                <td align="center"><br />
                    <h1>Rules Administration</h1> <br /> <h:outputLabel
                        id="lblErrorText1" value="#{ruleAdminBK.lblErrorText}"
                        styleClass="ValidateMsg" /></td>
            </tr>
            <tr>
                <td align="right"><p:commandButton
                        action="#{ruleAdminBK.cmdCreateNew_Click}" value="create rule" /></td>
            </tr>
        </table>
    </h:panelGroup>
</ui:composition>
</html>

RuleDetails.xhtml

<?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"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core" xml:lang="en" lang="en"
    xmlns:p="http://primefaces.org/ui">


<f:view beforePhase="#{ruleDetailsBK.Page_BeforePhase}">
    <h:outputText value="TBD" />
</f:view>
</html>

【问题讨论】:

  • 请以 SSCCE 风格发布代码。例如,为了重现您的具体问题,&lt;br&gt; 的存在是绝对必要的吗?不?然后请从代码中省略它以减少代码噪声。对这 1000 个其他标签和属性执行相同的操作。这样,专家只需浏览一下代码就可以更快地发现原因。另请参阅stackoverflow.com/tags/jsf/info 请注意,代码仍必须在没有(非明显)修改的情况下复制'n'paste'n'runnable,以便我们自己(和您自己!)在一个空白的操场项目中看到问题。
  • 谢谢 BalusC。我以 SCCCE 风格更新了我的代码,并添加了有助于解决它的 cmets。
  • 这有帮助(尽管可以消除更多的行.. 元标记和打印 css 无关紧要)。为了排除一个和另一个,当您在 &lt;ui:include src&gt; 中硬编码 /admin/rules/RuleAdmin2.xhtml 时是否有效?如果是这样,在托管 bean 的(post)构造函数中放置一个断点,并判断它是在每个会话中仅调用一次(如您所说,通过注释),还是在每个请求中调用?
  • 我在 bean 中添加了一个 @PostConstruct 显示。它只被调用一次。 ui:include 在页面刷新后呈现正确文件的事实使我看到了您的posting 之一。 正在恢复视图期间创建一个新的视图范围 bean 实例!那可能是我的问题。解决这个问题的解决方案是否仍然单独定义每个包含并通过 组件有条件地呈现它?

标签: jsf-2 primefaces


【解决方案1】:

您更新组件的代码部分在哪里?也许您可以尝试以下方法 - 在方法 *cmdCreateNew_Click()* 中以编程方式更新组件,如下所示:

public void cmdCreateNew_Click() {
    setTarget(_RULE_DETAILS);
    //add this line and check the path to the component
    RequestContext.getCurrentInstance().update("templateForm:content:tabView");
}

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多