ViewScoped bean 根据每个请求构建......第 99 部分
啊……这似乎有一百个答案,但我还没有找到适合我的答案,所以我想我实际上会再问一次。这是我的场景:
从技术上讲,我的网站只有一个页面,其内容会被交换,而不是有多个页面供您导航。起点是这个块:
<?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 是视图:
<?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
中的内容,从而
。我在本示例中将其剥离,因此每个视图基本上都是这样的:
<?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 如何工作的核心内容。有输入吗?
ARGH... This seems to have a hundred answers and I haven't found one that works for me, so I guess I will actually ask it again. Here is my scenario:
My site technically has a single page whose contents get swapped out rather than having multiple pages that you navigate to. The starting point is this chunk:
<?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>
The resourceInclude.xhtml includes my css file:
<?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>
And main.xhtml is the 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>
It consists of three h:panelGroup
s. The first is a set of four general navigation links, each link changes the viewSelector.modeName
value which is used to include the contents in the second h:panelGroup
thusly <ui:include src="#{viewSelector.modeName}-view.xhtml" />
. I have stripped this down for this example so each view is basically this:
<?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>
The third h:panelGroup
is a footer for all the messages to debug what is going wrong.
Anyway, every time I click one of the navigation links, the constructor of the viewSelector bean gets called. This is what my viewSelector bean looks like:
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 );
}
}
I know I must be doing something the wrong way, or else I missing something central as to how JSF works. Any Input?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
中的 EL 导致了这种情况。如果按照 issue 1492< 禁用
web.xml
中的部分状态保存/a> 不是一个选项,那么您需要替换
为
类似的问题之前至少已被问过一次:)
The EL in
<ui:include src>
is causing that.If disabling the partial state saving in
web.xml
as per issue 1492 is not an option,then you need to replace
by something like
A similar question has at least been asked once before :)