簡體   English   中英

會話范圍的CDI bean通過以下方式訪問 <jsp:useBean> 似乎與servlet中的有所不同

[英]Session scoped CDI bean accessed via <jsp:useBean> seems to be a different one than in servlet

我想將CDI SessionScoped bean注入JSP頁面。

import javax.enterprise.context.SessionScoped;
import java.io.Serializable;

@SessionScoped
public class UserSessionBean implements Serializable {

    private String email = "email";

    public UserSessionBean(){}

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

當我以這種方式使用bean時,它工作正常,並且在JSP頁面上看到了初始值。

<jsp:useBean id="userSessionBean" class="package.UserSessionBean"/>
<jsp:getProperty name="userSessionBean" property="email"/>

當我將同一個bean注入服務時,就會出現問題,該服務是從API內部的另一個servlet調用的。 在這種情況下,我不會在JSP頁面上獲得更新的值。 看起來我在JSP頁面和使用@Inject注釋的服務中獲得了不同的bean

有人可以建議在JSP和從servlet訪問的服務層中使用同一個SessionScoped bean的可能性嗎?

擺脫<jsp:useBean><jsp:getProperty>標記。 它們早於servletELCDI 這些標記用於JSP頁面,這些頁面不使用任何自定義servlet或MVC框架提供的servlet。 另請參見jsp:useBean scope

CDI方法是將@Named批注簡單地放在bean類上,以在EL中為其命名。

@Named
@SessionScoped
public class UserSessionBean implements Serializable {}

該名稱默認為大寫的類名稱。 上面的CDI托管bean因此可以由${userSessionBean}在EL中使用。 在純JSP頁面中也可以使用。

<p>Email: <c:out value="${userSessionBean.email}" /></p>

就這樣。 您可以在服務甚至servlet中繼續使用@Inject來獲取同一實例。 請注意,上面的JSP代碼段中的JSTL <c:out>對於打印該值不是嚴格必需的。 沒有JSP 2.0,您就可以做到。

<p>Email: ${userSessionBean.email}</p>

但是,JSP作為一種相當侏儒的視圖技術,沒有像Facelets那樣具有內置的XSS預防功能。 <c:out>必須用於轉義用戶控制的輸入,以防止潛在的XSS攻擊漏洞。 另請參閱JSP / Servlet Web應用程序中的XSS預防

最后但並非最不重要的一點是,確保您的學習資源緊跟當前可用的版本。 這些<jsp:useBean>標記來自上個世紀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM