[英]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>
標記。 它們早於servlet , EL和CDI 。 這些標記用於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.