2011-10-18 29 views
1

我一直在試圖對Seam WeldMyFaces CODI進行一些簡單的測試。在將CODI jar文件添加到我的項目後,我發現它爲每個請求添加了windowId請求值,即使bean作用域爲RequestScoped。是否真的有必要在每個請求中添加windowId請求參數,而bean在RequestScoped?這種情況下是否有任何實際的現實場景?如果沒有必要,可以將其刪除嗎?例如:MyFaces CODI和windowId請求參數問題

這是bean類的代碼:

import javax.enterprise.context.RequestScoped; 
import javax.inject.Named; 

@Named("myBean") 
@RequestScoped 
public class MyBean{ 
private String firstName; 
private String lastName; 

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getLastName() { 
    return lastName; 
} 

public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 
} 

這是頁面的正文:

<body> 
<h:form> 
<h:inputText value="#{myBean.firstName}"></h:inputText> 
<br/> 
<h:inputText value="#{myBean.lastName}"></h:inputText> 
<br/> 
<h:commandButton value="submit"></h:commandButton> 
</h:form> 
</body> 

回答

3

的Apache MyFaces的CODI添加WINDOWID支持的瀏覽器選項卡分隔豆。 如果您使用@WindowScoped,@ViewAccessScoped,CODIs @ConversationScoped等一些CODI範圍,那麼您將爲每個瀏覽器選項卡獲得單獨的上下文實例。

假設您有一個客戶關係管理應用程序。使用CODI @WindowScoped,您可以在不同的瀏覽器選項卡/窗口中打開不同的客戶。你會使用@SessionScoped,然後每次都會覆蓋這些值(對於@SessionScoped bean,每個會話只有1個上下文實例)。

當然,您可以很容易地禁用此功能。請檢查我們的官方WIKI: https://cwiki.apache.org/confluence/display/EXTCDI/Index

+0

非常感謝您的及時回答;然而,我必須爭辯更多。是的,windowId有必要將瀏覽器標籤與其他標籤區分開來;但是,我們是否需要始終區分標籤?我的意思是爲什麼我們需要它,如果沒有談話涉及?我做了這樣的測試:我只有一個JSF頁面,它包含一個h:表單;它還包含一個h:commandButton,用於重新顯示當前頁面;我只有一個bean,它是RequestScoped;這個bean在那個頁面的h:form中被引用;但是,CODI仍會將windowId添加到請求中。有必要嗎? – carawan

+0

>我的意思是爲什麼我們需要它,如果沒有談話涉及? 我們假設您從使用ConversationScoped的頁面轉到另一個頁面(ViewScoped),然後返回到原始ConversationScoped。如果您將windowId放在中間頁面上,那麼您將失去對話。請注意,CODI的'對話'機制與Seam2和CDI的對話有着根本的不同。 – struberg

+0

我不確定我們是否在同一頁面上。我的問題是爲什麼我們需要windowId,如果我們只有一個bean(只有一個)在項目中並且它是RequestScoped。我根本沒有任何其他bean。 – carawan

3

需要一些時間才能在官方wiki中找到解決方案。 https://cwiki.apache.org/confluence/display/EXTCDI/Index

如果你不使用@WindowScoped,@ViewAccessScoped並確保你不需要這個WINDOWID參數,那麼你就可以在你的項目中創建一個這樣的類:

@Specializes 
@ApplicationScoped 
public class CustomWindowContextConfig extends WindowContextConfig { 

    @Override 
    public boolean isAddWindowIdToActionUrlsEnabled() { 
     return false; 
    } 

    @Override 
    public boolean isUrlParameterSupported() { 
     return false; 
    } 
}