我想将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页面上获得更新的值。看起来我使用@Inject
注释
有人可以建议如何在JSP和从servlet访问的服务层中使用相同的SessionScoped bean吗?
答案 0 :(得分:6)
删除<jsp:useBean>
和<jsp:getProperty>
标记。它们优先于servlets,EL和CDI。这些标记用于JSP页面,它不使用任何自定义servlet或MVC框架提供的servlet。另见a.o. jsp:useBean scope
CDI方法是简单地在bean类上放置@Named
注释,在EL中为它命名。
@Named
@SessionScoped
public class UserSessionBean implements Serializable {}
名称默认为decapitalized类名。因此,${userSessionBean}
将在EL中提供上述CDI托管bean。这也适用于普通的JSP页面。
<p>Email: <c:out value="${userSessionBean.email}" /></p>
这就是全部。您可以继续在服务中使用@Inject
甚至servlet来获取相同的实例。请注意,上面的JSP代码段中的JSTL <c:out>
对于打印值并不是绝对必要的。你可以自从JSP 2.0在没有它的情况下做得很好。
<p>Email: ${userSessionBean.email}</p>
但是JSP作为一种相当侏罗纪的视图技术没有像Facelets这样的内置XSS预防。必须使用<c:out>
来逃避用户控制的输入,以防止潜在的XSS攻击漏洞。另见a.o. XSS prevention in JSP/Servlet web application
最后但并非最不重要的是,请确保您的学习资源与当前可用的版本相匹配。那些<jsp:useBean>
标签来自上个世纪。