从servlet访问JSF会话作用域bean,由嵌入在JSF webapp中的applet调用

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

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

如本文所述。 但是我只得到null作为结果,尽管UserBean的实例是alreay instatiated。 这些是我用于userBean的注释/导入:

 import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; @ManagedBean @SessionScoped public class UserBean implements Serializable{ ... } 

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

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

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

考虑到你描述function需求的方式,我认为这是后者。 您需要确保传递webapp的会话标识符以及来自applet的HTTP请求。 这可以是JSESSIONID cookie或jsessionid URL路径属性的forms。

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

  

#{session}是一个隐含的JSF EL变量,引用当前的HttpSession ,后者又有一个getId()方法;你不需要为那个左右创建一个托管bean,上面的代码行是完整的 -是)

可以在applet中检索,如下所示:

 String sessionId = getParameter("sessionId"); 

您没有描述如何与servlet交互,但假设您正在使用标准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会话中。