2010-11-04 54 views
9

在JSP中,有一個屬性會話用於在請求中禁用自動生成會話。在jsf中沒有會話生成

<%@page contentType="text/html" pageEncoding="UTF-8" session="false" %> 

有沒有辦法在JSF2中做同樣的事情?

謝謝

爲什麼?因爲我們有一個公共註冊表單頁面作爲應用程序中的默認頁面。這是一個非常簡單的形式,每次人們(或機器人等)請求主頁時創建會話。 ManagedBean是RequestScope,但JSF在第一次登錄請求中創建一個會話。

+0

@BalusC增加了爲什麼有問題。 – angelcervera 2010-11-04 13:02:56

回答

7

只要不使用視圖/會話範圍豆(所以使用唯一的請求或應用程序作用域bean),並在web.xml設置以下環境參數保存到client的(默認值),而不是server設置狀態。

<context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>client</param-value> 
</context-param> 

那麼JSF不會創建會話,並且將視圖狀態在隱藏的輸入字段的名稱javax.faces.ViewState形式存放在有需要時。

創建和管理會話的成本是相當可以忽略的。此外,在使用客戶端視圖狀態保存時,您仍然必須權衡(de)序列化視圖狀態和網絡帶寬的成本。


更新按您的評論:

@BalusC是的,這可能是一個全球性的解決方案。但我只需要在這個公共頁面中使用這種方法。在其他頁面我想要服務器端的狀態保存方法。

啊對了。對不起,我沒有在JSF/Facelets中看到任何好的方法來禁用會話,或者在每個請求的基礎上更改視圖狀態保存。我會考慮使用普通的HTML <form>而不是JSF <h:form>,讓它提交到另一個JSF頁面並在與JSF頁面關聯的bean中使用@ManagedProperty。例如。

<form action="register.jsf" method="post"> 
    <input type="text" name="username" /> 
    <input type="password" name="password" /> 
    <input type="submit" /> 
</form> 

@ManagedBean 
@RequestScoped 
public class Register { 

    @ManagedProperty(value="#{param.username}") 
    private String username; 

    @ManagedProperty(value="#{param.password}") 
    private String password; 

    @PostConstruct 
    public void init() { 
     // Do your thing here. 
     System.out.println("Submitted username/password: " + username + "/" + password); 
    } 

    // ... 
} 
2

從BalusC其實答案並不因爲鑽嘴魚科2.1.19/2.2.0正確的。你可以在他的博客here中閱讀關於這個。 現在完全夠用只設置:

<f:view transient="true"> 
    Your regular content 
</f:view> 

正如提到的職位是說:

不被創建的視圖狀態,因此會議也沒有產生的時候不會被創建。 [...]請記住將相關的託管bean放在請求範圍內,而不是視圖/會話範圍內,否則您只是擊敗了「無狀態」一詞的含義。

接着代碼段存在於com.sun.faces.application.view.FaceletViewHandlingStrategy類:

 /* 
     * Make sure we have a session here if we are using server state 
     * saving. The WriteBehindStateWriter needs an active session when 
     * it writes out state to a server session. 
     * 
     * Note if you flag a view as transient then we won't acquire the 
     * session as you are stating it does not need one. 
     */ 
     if (isServerStateSaving() && !viewToRender.isTransient()) { 
      getSession(ctx); 
     }  

另外要注意,一些第三方組件庫,例如ICEfaces或其他框架,例如Apache Shiro可以爲了某些目的自己創建會話。