gpt4 book ai didi

jsf - 根据每个请求构建 ViewScoped bean……第 99 部分

转载 作者:行者123 更新时间:2023-12-04 22:40:04 25 4
gpt4 key购买 nike

<分区>

ARGH... 这似乎有一百个答案,但我还没有找到适合我的答案,所以我想我真的会再问一遍。这是我的场景:

从技术上讲,我的网站只有一个页面,其内容会被换出,而不是让您导航到多个页面。起点是这个 block :

<?xml version="1.0" encoding="UTF-8"?>
<f:view 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 />
<h:body>
<ui:include src="resourceInclude.xhtml" />
<ui:include src="main.xhtml" />
</h:body>
</f:view>

resourceInclude.xhtml 包含我的 css 文件:

<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:outputStylesheet library="css" name="test.css" target="head" />
</ui:composition>

main.xhtml 是 View :

<?xml version="1.0" encoding="UTF-8"?>
<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">
<h:panelGroup styleClass="test-container" layout="block">
<h:form id="main-form">
<h:panelGroup styleClass="test-header" layout="block">
<h:panelGroup styleClass="navigation" layout="block">
<ul>
<li><h:commandLink action="#{viewSelector.setModeHome}">
<h:outputText value="Home" />
</h:commandLink></li>
<li><h:commandLink action="#{viewSelector.setModeReports}">
<h:outputText value="ASAP Reports" />
</h:commandLink></li>
<li><h:commandLink action="#{viewSelector.setModeSupport}">
<h:outputText value="Technical Support" />
</h:commandLink></li>
<li><h:commandLink action="#{viewSelector.setModeHelp}">
<h:outputText value="Help" />
</h:commandLink></li>
</ul>
</h:panelGroup>
</h:panelGroup>
<h:panelGroup styleClass="test-content" layout="block">
<ui:include src="#{viewSelector.modeName}-view.xhtml" />
</h:panelGroup>
<h:panelGroup styleClass="test-footer" layout="block">
<h:messages />
</h:panelGroup>
</h:form>
</h:panelGroup>
</ui:composition>

它由三个h:panelGroup组成秒。第一个是一组四个通用导航链接,每个链接都会更改 viewSelector.modeName用于包含第二个 h:panelGroup 中内容的值因此<ui:include src="#{viewSelector.modeName}-view.xhtml" /> .我已经为这个例子去掉了这个,所以每个 View 基本上是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<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">
<h:panelGroup styleClass="test-home-view">
<p>home</p>
</h:panelGroup>
</ui:composition>

第三个h:panelGroup是所有调试出错信息的页脚。

无论如何,每次我单击其中一个导航链接时,都会调用 viewSelector bean 的构造函数。这是我的 viewSelector bean 的样子:

package org.mitre.asias.aires.controller;


import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;


import org.apache.log4j.Logger;


@ManagedBean( name="viewSelector" )
@ViewScoped
public class ViewSelector {
protected static Logger log = Logger.getLogger( ViewSelector.class );
private Mode mode = Mode.HOME;
public static final String PORTLET_NAME = "Test";

public static enum Mode {
HOME(1, "home"),
REPORTS(2, "reports"),
SUPPORT(3, "support"),
HELP(4, "help");

private int value;
private String name;

private Mode( int value, String name ) {
this.value = value;
this.name = name;
}

public int getValue() {
return value;
}

public String getName() {
return name;
}
}

public ViewSelector() {
log.trace( "constructing new ViewSelector" );
}

public Mode getMode() {
log.trace( "getting mode" );

return mode;
}

public String getModeName() {
log.debug( "in getmodename" );
return getMode().getName();
}

public String getPortletName() {
return PORTLET_NAME;
}

public boolean isModeReports() {
return getMode() == Mode.REPORTS;
}

public void setMode( Mode mode ) {
this.mode = mode;
}

public void setModeHelp() {
setMode( Mode.HELP );
}

public void setModeHome() {
setMode( mode = Mode.HOME );
}

public void setModeReports() {
setMode( mode = Mode.REPORTS );
}

public void setModeSupport() {
setMode( mode = Mode.SUPPORT );
}
}

我知道我一定是做错了什么,否则我就错过了一些关于 JSF 工作原理的核心内容。有任何输入吗?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com