当前位置: 首页 > 知识库问答 >
问题:

未在PrimeFaces Tabview中渲染JSF视图

印曜灿
2023-03-14

我知道以前有人问过这个问题,但即使在仔细阅读了各种帖子,包括Balus的优秀答案“h:commandLink/h:commandButton未被调用”“侦听并调试JSF生命周期阶段”之后,我仍然无法理解为什么我不能在我的选项卡中呈现JSF页面。

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

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

当我调试时,我注意到确实正在调用“createnewrule”,并用正确的文件“RuleDetails”填充目标。xhtml’。但是,该选项卡仍显示父窗体“RuleAdmin2”。xhtml’。

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

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

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

任何提示都非常感谢,因为我已经没有想法了。

这是我的代码:我的Facets模板(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>

后备豆被称为。

@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);
    }

最后是两个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>

规则细节。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>

共有1个答案

柯正谊
2023-03-14

更新组件的代码部分在哪里?也许您可以尝试以下方法-在方法*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");
}
 类似资料:
  • Blade 内部内置了一个非常简单的模板渲染引擎,如果你有一些简单的页面需要渲染可以试试它(生产环境不适用)。 渲染一个模板需要遵守一条准则: 所有的模板文件都存储在 resources/templates 目录下 你可以调用 Response 方法的 render 方法渲染或者返回一个 String 类型的视图路径。 @GetRoute("/index") public void renderI

  • 因为新版的控制器可以无需继承任何的基础类,因此在控制器中如何使用视图取决于你怎么定义控制器。 模板渲染 渲染模板最常用的是控制器类在继承系统控制器基类(\think\Controller)后调用fetch方法,调用格式: fetch('[模板文件]'[,'模板变量(数组)']) 模板文件的写法支持下面几种: 用法 描述 不带任何参数 自动定位当前操作的模板文件 [模块@][控制器/][操作] 常用

  • 渲染某个变量 假定我们定义了一个变量:  <script> export default { data () { return { my_value: '默认值', } }, } </script> 我们就可以这样来显示它:  <div>{{my_value}}</div> 方法的声明和调用 声明一个方法: show_my_value <script> ex

  • 您好,我有以下代码可以有条件地在我的页面中呈现组件: 它得到答案并呈现组件,但为了在我的页面上看到它,我需要刷新页面。我如何解决这个问题?有什么建议吗?

  • 我正在尝试获得一个h:textInput以在更改时重播,我已经用a4j:ajax和f:ajax进行了尝试。 使用a4j:ajax时: 这在面板第一次更新后第一次起作用,它停止更新modell,并且监听器也没有被调用。但是,会触发渲染,从而显示旧值。 现在,当我用f:ajax替换a4j:ajax时,我得到一条错误消息,即在xyzInput中找不到id xyzPG。 当我尝试将重新渲染限制为input