我一直在尝试对 Seam Weld 和 MyFaces CODI 进行一些简单的测试。将CODI jar文件添加到我的项目后,我发现它为每个请求添加了一个 windowId 请求值,即使bean范围是 RequestScoped 。当bean在 RequestScoped 中时,是否真的有必要在每个请求中添加 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>
答案 0 :(得分:3)
Apache MyFaces CODI添加windowId以支持浏览器选项卡分离的bean。 如果您使用某些CODI范围,例如@WindowScoped,@ ViewAccessScoped,CODIs @ConversationScoped,那么您将为每个浏览器选项卡获取单独的上下文实例。
假设您有一个客户关系管理应用程序。使用CODI @WindowScoped,您可以在不同的浏览器选项卡/窗口中打开不同的客户。你会使用@SessionScoped,那么你每次都会覆盖这些值(对于@SessionScoped bean,每个会话只有1个上下文实例)。
当然,您可以非常轻松地禁用此功能。请查看我们的官方WIKI: https://cwiki.apache.org/confluence/display/EXTCDI/Index
答案 1 :(得分:3)
在官方维基中找到解决方案需要一些时间。 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;
}
}