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

时间:2012-11-02 11:08:54

标签: java jsf servlets applet managed-bean

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

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

如此post中所述。但是我只得到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请求。 (我无法编辑此帖子请求以添加更多字段或其他内容)。然后我的servlet的post方法存储文件。这个工作不能由托管bean完成,因为servlet必须用@MultiPartConfig注释,我不能将这个注释添加到jsf托管bean。

1 个答案:

答案 0 :(得分:6)

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

  1. JSF尚未预先创建bean。
  2. applet-servlet交互不使用与webapp相同的HTTP会话。
  3. 考虑到你描述功能需求的方式,我认为这是后者。您需要确保传递webapp的会话标识符以及来自applet的HTTP请求。这可以采用JSESSIONID Cookie或jsessionid网址路径属性的形式。

    首先,您需要告诉applet有关webapp正在使用的会话ID。您可以通过将参数传递到持有小程序的<applet><object>标记来执行此操作

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

    #{session}是一个隐式JSF EL变量,引用当前HttpSession,后者又有getId()方法;您不需要为其创建托管bean那个或那个,上面的代码行是按原样完成的)

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

    String sessionId = getParameter("sessionId");
    

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

    setRequestProperty()

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

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

    (请注意,案件在两种情况下都很重要)

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