4

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

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

如本文所述但是我只得到 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。

4

1 回答 1

6

如果它返回null,那么它只能意味着两件事:

  1. JSF 还没有事先创建 bean。
  2. applet-servlet 交互不使用与 webapp 相同的 HTTP 会话。

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

首先,您需要告诉小程序 webapp 正在使用的会话 ID。您可以通过将参数传递给<applet><object>标记保存小程序来做到这一点

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

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

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

String sessionId = getParameter("sessionId");

您没有描述如何与 servlet 交互,但假设您为此使用标准 Java SEURLConnection,并指向@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 会话中进行。

于 2012-11-02T11:21:10.567 回答