通过<jsp:useBean>访问的会话范围的CDI bean似乎与servlet不同

Vad*_*dOs 1 jsp servlets usebean cdi

我想将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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我以这种方式使用bean时,它工作正常,我在JSP页面上看到了初始值.

<jsp:useBean id="userSessionBean" class="package.UserSessionBean"/>
<jsp:getProperty name="userSessionBean" property="email"/>
Run Code Online (Sandbox Code Playgroud)

当我将相同的bean注入到我从API中的另一个servlet调用的服务中时,会出现问题.在这种情况下,我没有在JSP页面获得更新值.看起来我在JSP页面和使用@Inject注释的服务内部获得了不同的bean

任何人都可以建议如何在JSP和从servlet访问的服务层中使用相同的SessionScoped bean?

Bal*_*usC 6

摆脱<jsp:useBean><jsp:getProperty>标签.它们早于servlet,ELCDI.这些标记用于JSP页面,它不使用任何自定义servlet或MVC框架提供的servlet.另请参见ao jsp:useBean范围.

CDI方法是简单地@Named在bean类上添加注释,以便在EL中为其命名.

@Named
@SessionScoped
public class UserSessionBean implements Serializable {}
Run Code Online (Sandbox Code Playgroud)

名称默认为decapitalized类名.因此,上述CDI托管bean将在EL中提供${userSessionBean}.这也适用于普通的JSP页面.

<p>Email: <c:out value="${userSessionBean.email}" /></p>
Run Code Online (Sandbox Code Playgroud)

就这样.您可以继续使用@Inject您的服务甚至servlet来获取相同的实例.请注意,上面的JSP代码段中的JSTL <c:out>对于打印值并不是绝对必要的.你可以从JSP 2.0开始就没有它.

<p>Email: ${userSessionBean.email}</p>
Run Code Online (Sandbox Code Playgroud)

但JSP作为一种相当侏罗纪的视图技术并没有像Facelets那样内置XSS预防.在<c:out>必须使用转义用户控制的输入,以防止潜在的XSS攻击漏洞.另请参见JSP/Servlet Web应用程序中的 ao XSS预防.

最后但同样重要的是,确保您的学习资源能够满足当前可用的版本.这些<jsp:useBean>标签来自上个世纪.