我需要从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页面中有一个文件上传小程序。该applet期望可以发送POST请求的地址。 (我无法编辑此发帖请求以添加更多字段或其他内容)。然后,我的servlet的post方法存储文件。托管bean无法完成此工作,因为该servlet必须使用@MultiPartConfig进行注释,并且我无法将此注释添加到jsf托管bean中。
最佳答案
如果返回null
,则只能表示两件事:
考虑到您描述功能需求的方式,我认为是后者。您需要确保同时传递Web应用程序的会话标识符以及来自小程序的HTTP请求。这可以采用
JSESSIONID
cookie或jsessionid
URL路径属性的形式。首先,您需要向applet告知该Webapp正在使用的会话ID。您可以通过将参数传递给保存小程序的
<applet>
或<object>
标记来实现<param name="sessionId" value="#{session.id}" />
(
#{session}
是引用当前 HttpSession
的隐式JSF EL变量,后者又具有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会话中进行。