0

当我单击“左侧”菜单中的按钮时,我不明白如何在中心屏幕中显示。

现在我有了,当我单击“左”菜单中的按钮时,新页面打开时没有“左”菜单,但我不想要它,我需要“左”菜单没有消失。

下面是我的代码。

<h:head>
    <title>Facelet Title</title>
</h:head>
   <frameset rows="65,*" frameborder="0">
            <frame scrolling="no" src="header.xhtml"/>
            <frameset cols="200,*" frameborder="0">
                    <frame scrolling="no" src="menu.xhtml"/>
             </frameset>
    </frameset>

4

4 回答 4

4

基本上,您需要给目标框架 a并在元素的属性中name指定它。例如target<a>

<frame name="center">

<a href="page.xhtml" target="center">

但这并不完全是模板化现代 Web 应用程序的正确方法。框架集在用户体验和 SEO 价值方面有许多缺点。相反,应该使用任何服务器端视图技术(如您正在使用的 Facelets)的包含和模板工具。只有当您手头完全没有服务器端视图技术(因此,只有纯 HTML)或您想要呈现外部网站时,才应使用框架集。

使用 Facelets,您应该使用类似这样的东西作为主模板

/WEB-INF/templates/layout.xhtml

<!DOCTYPE html>
<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title><ui:insert name="title">Default title</ui:insert></title>
    </h:head>
    <h:body>
        <div id="header"><ui:include src="/WEB-INF/includes/header.xhtml"></div>
        <div id="menu"><ui:include src="/WEB-INF/includes/menu.xhtml"></div>
        <div id="content"><ui:insert name="content">Default content</ui:insert></div>
    </h:body>
</html>

(您可以使用 CSS 以您想要的方式定位布局组件,例如float:lefton#menu#content

这就是模板客户端(您实际通过 URL 打开的页面)的样子:

/page.xhtml

<ui:composition template="/WEB-INF/templates/layout.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">

    <ui:define name="title">
        New page title here
    </ui:define>

    <ui:define name="content">
        <h1>New content here</h1>
        <p>Blah blah</p>
    </ui:define>
</ui:composition>

有关现代 JSF/Facelets Web 应用程序的开源示例,请查看OmniFaces 展示应用程序等。

当您使用 PrimeFaces 时,还有另一种选择,即<p:layout>. 请参阅其展示应用程序中的“完整示例”,例如这个

也可以看看:

于 2012-06-24T11:14:37.977 回答
0

这是一个简单的页眉、页面、页脚示例。您可以使用一个表单 ID 让所有人信不信由你。标头位于 WebContent/templates 中。另一个 .xhtml 可以放在 WebContent 中。如果您的@ManagedBean String 方法返回“second”,则会显示页面 second.xhtml。每个页面仍然与它自己的@ManagedBean 对话。

<body">
<f:view>
<div id="container">
<h:form id="templateForm">
    <div id="header">
        <ui:include src="header.xhtml" />
    </div>

    <div id="wrapper">
        <div id="firstId">
            <ui:insert name="first"></ui:insert>
        </div>
        <div id="secondId">
            <ui:insert name="second"></ui:insert>
        </div>
        <div id="inputMaskId">
            <ui:insert name="inputMask"></ui:insert>
        </div>
        <div id="valtestId">
            <ui:insert name="valtest"></ui:insert>
        </div>
    </div>

    <div id="footer">
        <ui:include src="footer.xhtml" />
    </div>
</h:form>
</div>      
</f:view>
</body>
于 2013-03-16T13:55:23.293 回答
0

您的描述有点令人困惑,但我想 JSF 模板系统就是您所追求的,使您能够在多个页面上包含相同的代码(例如菜单)。框架非常过时,基本上不再使用。

请参阅http://www.mkyong.com/jsf2/jsf-2-templating-with-facelets-example/上的示例

作为进一步的评论,这个问题似乎与 Primefaces 无关(这是一个组件包,这些评论都不包含在您的代码中)。

于 2012-06-24T11:08:38.777 回答
0

我们可以使用布局代替包含命名空间 xmlns:p="http://primefaces.org/ui"

<p:layout fullPage="true">
<p:layoutUnit position="north" size="100" header=
"Top" resizable="true" closable="true" collapsible="true">
<h:outputText value="Layout content for North" />
</p:layoutUnit>
<p:layoutUnit position="south" size="100" header="Bottom"
resizable="true" closable="true" collapsible="true">
<h:outputText value="Layout content for South" />
</p:layoutUnit>
<p:layoutUnit position="west" size="200" header=
"Left" resizable="true" closable="true" collapsible="true">
<h:outputText value="Layout content for West" />
</p:layoutUnit>
<p:layoutUnit position="east" size="200" header=
"Right" resizable="true" closable="true" collapsible="true">
<h:outputText value="Layout content for Right" />
</p:layoutUnit>
<p:layoutUnit position="center">
<h:outputText value="Layout content for Center" />
</p:layoutUnit>
</p:layout>

这将呈现五个面板

于 2014-06-03T13:10:53.757 回答