2012-04-11 25 views
0

我看过类似的问题,但我不认为这是一个转发,因为我可以从WebFilter访问ManagedBean,但奇怪的是更新的属性....并不是真的更新。下面是详细信息:SessionScoped Managed Bean值没有从Servlet Filter中更改

我有一个过滤器,这是否(在Glassfish 3.1.2,WebFilter的注释使用钻嘴鱼科2.1.6):

public void doFilter(ServletRequest request, ServletResponse response, 
       FilterChain chain) 
     throws IOException, ServletException { 
    // FacesContextHelper is a utility class to get some Faces stuff 
    FacesContextHelper facesContextHelper = new FacesContextHelper(); 
    // this returns the correct instance of a SessionScoped ManagedBean 
    userInfoView = (UserInfoView) facesContextHelper.getManagedBean(request, 
     response, "userInfoView", UserInfoView.class); 
    // ... some computation here to get the 'vm' URL parameter 
    userInfoView.setViewMode(viewMode); 
    // .... 
    chain.doFilter(request, response); 
} 

现在在facelet里,我用这viewMode

<h:panelGroup layout="block" rendered="#{userInfoView.viewMode ne 1}"> 
    <ui:include src="/WEB-INF/jsf/v2/products.xhtml"/> 
</h:panelGroup> 

为了完整性起见,这里是一个局部UserInfoView:

@ManagedBean(name = "userInfoView") 
@SessionScoped 
public class UserInfoView extends AbstractView 
    implements ServiceConstant, Serializable { 
private Integer viewMode = 0; 

public Integer getViewMode() { 
    return viewMode; 
} 

public void setViewMode(Integer viewMode) { 
    this.viewMode = viewMode; 
} 
} 

现在发生什么是由于某种原因(它似乎链接到JSESSIONID)我会有预期的行为:
- 具有“vm = 1”在GET请求集(调用UserInfoView setViewMode)viewMode为1
- 所述的facelet得到适当的值

然后只需重新启动Glassfish和:
- 具有在GET请求中的 “VM = 1” STILL集(调用UserInfoView setViewMode)的VIEWMODE 1
- 的Facelet获取--default **值(即0)

我怀疑RESTORE_VIEW阶段莫名其妙地重置变量为默认值,虽然我没有什么来支持这一理论而不是追查请求的生命周期的其他...

有什么我应该知道何时从Servlet过滤器中更改SessionScoped托管bean的变量?我的方法有问题吗?

回答

1

不回答你的问题,但由于使用的是JSF 2,更好的方式来传递这些参数的使用:

<f:viewParam name="vm" value="userInfoView.viewMode"/> 
+0

我要看看这个选项。这可能是一种比我所知的更好的方法(直接在Bean的getViewMode中获取请求参数 – JScoobyCed 2012-04-11 07:51:30