【问题标题】:MyFaces CODI and windowId request parameter issueMyFaces CODI 和 windowId 请求参数问题
【发布时间】:2011-12-09 18:41:12
【问题描述】:

我一直在尝试对 Seam WeldMyFaces 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>

【问题讨论】:

    标签: jsf-2 myfaces codi


    【解决方案1】:

    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

    【讨论】:

    • 非常感谢您的及时答复;但是,我不得不多争论一点。是的,windowId 是区分浏览器选项卡和其他选项卡所必需的;但是,我们是否需要一直区分标签?我的意思是,如果不涉及对话,为什么我们需要它?我做了一个这样的测试:我只有一个 JSF 页面,它包含一个 h:form;它还包含一个重新显示当前页面的 h:commandButton;我只有一个 bean,它是 RequestScoped;该 bean 在该页面中的 h:form 中被引用;但是,CODI 仍将 windowId 添加到请求中。有必要吗?
    • > 我的意思是,如果不涉及对话,为什么我们需要它?假设您从使用 ConversationScoped 的页面转到另一个页面 (ViewScoped),然后返回到原始的 ConversationScoped。如果您将 windowId 放在中间页面上,那么您将失去对话。请注意,CODI 的“对话”机制与 Seam2 和 CDI 的对话机制根本不同。
    • 我不确定我们是否在同一页面上。我的问题是,如果我们在项目中只有一个 bean(只有一个)并且它是 RequestScoped,为什么我们需要 windowId。我根本没有其他豆子。
    【解决方案2】:

    在官方 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-13
      • 2014-01-29
      • 2012-11-11
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多