【问题标题】:Accessing JSF session scoped bean from servlet which is called by applet embedded in JSF webapp从嵌入在 JSF webapp 中的小程序调用的 servlet 访问 JSF 会话范围的 bean
【发布时间】:2012-10-23 00:59:41
【问题描述】:

我需要从 servlet 访问会话范围的 bean。我已经试过了

UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");

post 中所述。但是我只得到 null 结果,尽管 UserBean 的一个实例已经被实例化了。这些是我用于 userBean 的注释/导入:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class UserBean implements Serializable{
 ... }

为什么我无法摆脱 servlet 的一些背景:我的 jsf 页面中有一个文件上传小程序。这个小程序需要一个可以发送它的 POST 请求的地址。 (我无法编辑此帖子请求以添加更多字段或其他内容)。然后我的 servlet 的 post 方法存储该文件。这项工作不能由托管 bean 完成,因为 servlet 必须使用 @MultiPartConfig 进行注释,并且我无法将此注释添加到 jsf 托管 bean。

【问题讨论】:

    标签: java jsf servlets applet managed-bean


    【解决方案1】:

    如果它返回null,那么它只能表示两件事:

    1. JSF 尚未预先创建 bean。
    2. applet-servlet 交互不使用与 web 应用相同的 HTTP 会话。

    鉴于您描述功能需求的方式,我认为是后者。您需要确保将 webapp 的会话标识符与来自 applet 的 HTTP 请求一起传递。这可以是JSESSIONID cookie 或jsessionid URL 路径属性的形式。

    首先,您需要告诉小程序 webapp 正在使用的会话 ID。您可以通过将参数传递给持有小程序的<applet><object> 标记来实现

    <param name="sessionId" value="#{session.id}" />
    

    #{session} 是一个隐含的 JSF EL 变量,它引用了当前的 HttpSession,它又具有一个 getId() 方法;您不需要为此创建托管 bean,以上代码行按原样完成)

    可以在小程序中检索如下:

    String sessionId = getParameter("sessionId");
    

    您没有描述您如何与 servlet 交互,但假设您为此使用 standard Java SE URLConnection,指向 @WebServlet("/servleturl") servlet,那么您可以使用 setRequestProperty() 设置请求标题:

    URL servlet = new URL(getCodeBase(), "servleturl");
    URLConnection connection = servlet.openConnection();
    connection.setRequestProperty("Cookie", "JSESSIONID=" + sessionId);
    // ...
    

    或者,您也可以将其作为 URL 路径属性传递:

    URL servlet = new URL(getCodeBase(), "servleturl;jsessionid=" + sessionId);
    URLConnection connection = servlet.openConnection();
    // ...
    

    (请注意,这两种情况下的情况都很重要)

    无论哪种方式,applet-servlet 交互都将在与 JSF 托管 bean 相同的 HTTP 会话中进行。

    【讨论】:

    • 嗯,因为小程序是第三方小程序(JUpload),我不想编辑它的源代码。我会寻找一个参数来保持相同的 Session id ,我想我记得有一个。再次感谢您的帮助 ;-)
    • 啊,可能有一个参数获取上传目标URL?然后,您可以将会话 ID 内联为路径片段。例如。 &lt;param name="some" value="servleturl;jsessionid=#{session.id}" /&gt;
    • 是的,我使用了一个参数“postURL”。然后,我将会话 ID 附加到该调用:-)
    • 嘿 Balus,我现在有一个 ViewScoped Bean,我在其中存储了一些我想在处理文件上传请求的 servlet 中使用的表单输入数据。是否可以从 servlet 中访问 ViewScoped bean?如果我将范围更改为 SessionScope,我可以处理输入,但使用 ViewScoped 如果我尝试像这样访问 bean,则会得到 NullPointerException: UploadBean uploadBean = (UploadBean) request.getSession().getAttribute("uploadBean");
    • 按钮。
    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2014-07-17
    • 2011-09-02
    • 2014-12-02
    • 1970-01-01
    相关资源
    最近更新 更多