【问题标题】:Session scoped CDI bean accessed via <jsp:useBean> seems to be a different one than in servlet通过 <jsp:useBean> 访问的会话范围 CDI bean 似乎与 servlet 中的不同
【发布时间】:2016-07-02 12:12:03
【问题描述】:

我想将 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?

【问题讨论】:

  • AFAIK,你是否用@Named("foo") 注释你的类,bean 将存储在名为“foo”的会话属性中。 jsp:useBean 和 jsp:getProperty 在 1999 年很棒。现在它们已经完全过时了。

标签: jsp servlets cdi usebean


【解决方案1】:

摆脱&lt;jsp:useBean&gt;&lt;jsp:getProperty&gt; 标签。它们早于servletsELCDI。这些标签用于不使用任何自定义 servlet 或 MVC 框架提供的 servlet 的 JSP 页面。另见 a.o. jsp:useBean scope.

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

@Named
@SessionScoped
public class UserSessionBean implements Serializable {}

名称默认为不大写的类名。因此,${userSessionBean} 可以在 EL 中使用上述 CDI 托管 bean。这也适用于纯 JSP 页面。

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

就是这样。您可以在您的服务甚至 servlet 中继续使用@Inject 来获取相同的实例。请注意,上面 JSP sn-p 中的 JSTL &lt;c:out&gt; 对于打印值并不是绝对必要的。没有它,JSP 2.0 也一样好。

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

但是 JSP 作为一种相当古老的视图技术并没有像Facelets 那样具有内置的 XSS 预防功能。 &lt;c:out&gt; 必须用于转义用户控制的输入,以防止潜在的 XSS 攻击漏洞。另见 a.o. XSS prevention in JSP/Servlet web application.

最后但并非最不重要的一点是,请确保您的学习资源跟上了当前可用的版本。那些&lt;jsp:useBean&gt; 标签是上个世纪的。

【讨论】:

  • 感谢您的回答。不幸的是,这不起作用((@Named(“userSessionBean”)@SessionScoped public class UserSessionBean 实现 Serializable { .... java.sun.com/jsp/jstl/core" prefix="c" %>

    电子邮件:

  • 我得到完全空的输出((虽然这个有效但只显示初始值((

  • 您要部署到哪个容器?这应该适用于任何支持 CDI 的容器。至少,如果配置正确,它在Tomcat+Weld 中对我有用。
  • apache-tomee-plus-7.0.1
  • @BalusC 这证实了我对命名的想法,但我在规范中搜索了确认,但找不到任何确认。是在某处指定的吗?有参考吗?
猜你喜欢
  • 2012-01-20
  • 1970-01-01
  • 2014-07-17
  • 2012-05-26
  • 2013-12-13
  • 2012-12-26
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
相关资源
最近更新 更多