我遇到了我的會話作用域bean的奇怪行爲。我用以下的進口和註釋,使其sessionscoped:@SessionScoped bean @ViewScoped行爲
編輯:更多的代碼
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class DetailsBean implements Serializable {
private LinkedHashMap<String, String> folder;
@Inject
private ApplicationBean appBean;
@Inject
private UserBean userBean;
@PostConstruct
public void resolveID() {
this.folder = new LinkedHashMap<String, String>();
for (LinkedHashMap<String, String> tempfolder : appBean.getRepositoryContent()) {
if (tempfolder.get("text:nodeid").equals(URLid)) {
this.folder = tempfolder;
}
}
}
JSF頁面的代碼片段:
<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"
xmlns:rich="http://richfaces.org/rich">
<f:metadata>
<f:viewParam name="id" value="#{detailsBean.URLid}" required="true" requiredMessage="You must provide an Object Id"/>
<f:event type="preRenderView" listener="#{detailsBean.resolveID}" />
</f:metadata>
<h:head>
<title>Dataset #{detailsBean.name}</title>
</h:head>
<h:body>
<h:form>
<h:panelGrid columns="2" columnClasses="fixed-column">
Name <h:inputText value="#{detailsBean.name}"
id="name" required="true"
requiredMessage="name required"/>
<rich:message for="name" ajaxRendered="true"/>
</h:panelGrid>
</h:body>
</h:form>
</html>
現在,當我點擊一個鏈接在我的JSF頁面這樣的一個DetailsBean被實例化。當我點擊另一個具有不同內容的鏈接時,使用相同的bean,因爲我仍然在同一個Session中。現在奇怪的是,即使我創建了2個不同的瀏覽器標籤,即使在刷新頁面後,它們也顯示不同的內容。同一個bean實例如何顯示不同的內容?我通常認爲只有一個@ViewScoped bean可以實現這一點?不要誤會我我想讓他們展示不同的內容,所以@ViewScoped將是在這裏使用的正確決定,但我只是想知道這是如何可能的...
EDIT2:當我使用javax.faces.ViewScoped ,上面的代碼不工作了(我得到java.io.NotSerializableException因爲LinkedHashMap中的那麼)
它不應該是可能的,但如果你有一些邏輯事情在你的支持者,你是不知道的,那麼有可能。請發佈更多代碼。 – Catfish
好吧我編輯。 jsf頁面上的內容使用文件夾映射並從中獲取字符串。 – nico1510
你能發佈使用這個支持bean的視圖代碼片段嗎? – Catfish