[英]SessionScoped Managed Bean value not changed from Servlet Filter
我見過類似的問題,但我不認為這是轉貼,因為我可以從 WebFilter 訪問 ManagedBean,但奇怪的是,更新的屬性....並沒有真正更新。 以下是詳細信息:
我有一個過濾器可以做到這一點(在 Glassfish 3.1.2 上使用 Mojarra 2.1.6,WebFilter 注釋):
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 相關聯)我將具有預期的行為:
- 在 GET 請求中設置“vm=1”(調用 UserInfoView setViewMode)將 viewMode 設置為 1
- Facelet 獲得適當的值
然后只需重新啟動 Glassfish 並:
- 讓 GET 請求中的“vm=1”仍然將 viewMode 設置(調用 UserInfoView setViewMode)為 1
- Facelet 獲得 --default** 值(即 0)
我懷疑 RESTORE_VIEW 階段以某種方式將變量重置為默認值,盡管除了跟蹤請求的生命周期之外我沒有任何東西可以支持這個理論......
從 Servlet 過濾器更改 SessionScoped 托管 bean 的變量時,我應該注意什么? 我的方法有什么問題嗎?
不是您問題的答案,但由於您使用的是 JSF 2,因此傳遞這些參數的更好方法是使用:
<f:viewParam name="vm" value="userInfoView.viewMode"/>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.