当前位置: 首页 > 面试题库 >

从Servlet访问JSF会话范围的Bean,该Bean由嵌入在JSF Webapp中的applet调用

楚知
2023-03-14
问题内容

我需要从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页面中有一个文件上传小程序。该applet期望可以发送POST请求的地址。(我无法编辑此发帖请求以添加更多字段或其他内容)。然后,我的servlet的post方法存储文件。托管bean无法完成此工作,因为该servlet必须使用@MultiPartConfig进行注释,并且我无法将此注释添加到jsf托管bean中。


问题答案:

如果返回null,则只能表示两件事:

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

考虑到您描述功能需求的方式,我认为是后者。您需要确保同时传递Web应用程序的会话标识符以及来自小程序的HTTP请求。它可以采用JSESSIONIDCookie或jsessionidURL路径属性的形式。

首先,您需要向applet告知该Webapp正在使用的会话ID。您可以通过将参数传递到<applet><object>标记包含小程序的标签来实现

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

(这#{session}是一个隐式的JSF
EL变量,它引用当前电流HttpSession,该变量又具有一种getId()方法;您无需为此创建托管bean,上面的代码按原样完成)

可以在小程序中按如下方式检索它:

String sessionId = getParameter("sessionId");

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



 类似资料:
  • 我已经对Spring bean使用的注释进行了注释。我通过spring DI成功地创建了相同的bean,并设置了对象注入的范围。现在,我想用Struts2和di做同样的事情。为此,我在中创建了bean定义 和简单的操作来创建bean并将其注入到我的操作中 在JSP中,我在会话bean上使用简单的迭代器 null

  • 问题内容: 这是我的工作方式 然后在 假设用户名是。然后,如果单击,将设置为Peter的用户对象,然后重定向到配置文件页面,该页面现在从中呈现信息。我只想使用创建相同的效果,因此想到了GET请求。所以我这样做 然后该方法就返回 剩下的就是创建一个servlet,捕获该,查询数据库以获取设置为重定向的对象。这是我的servlet 现在我有了,如何访问会话bean来查询数据库中的,然后访问受管Bean

  • 如何从Servlet访问JSF ViewScope托管bean? (假设所讨论的托管bean已经创建,但尚未销毁)

  • tl;dr注入servlet的CDIBean如何可能也在适当的范围内? 在oracle官方教程和一些书籍中,我们可以看到一些简单的示例,展示如何将CDIBean注入servlet。这非常简单,因为我们只需要使用@Inject注释并在bean中启用bean发现。xml。我不明白的是,注入servlet的@RequestScoped或@SessionScoped bean的作用域是否正确。servle

  • 问题内容: 我们有一个搜索表单,其中过滤器绑定到托管bean(会话范围)上的属性。它不是组件绑定,它的属性绑定像。 来自不同机器(然后是不同的会话)的提交数据混合在一起。您搜索“ john”,并得到“ mary”,因为您旁边的那个人刚刚搜索了“ mary”。您的价值在于获取 他 提交的数据而不是您的数据。 我已经在Google上搜索了很多,没有找到解决方案,只是发生了同样的问题。 有人遇到过这个问

  • 问题内容: 我想在JBoss中编写一个简单的servlet,它将在Spring bean上调用方法。目的是允许用户通过点击URL来启动内部工作。 在servlet中获取对Spring bean的引用的最简单方法是什么? JBoss Web服务允许您使用@Resource批注将WebServiceContext注入服务类。在普通servlet中,有什么可比的?解决此特定问题的Web服务将使用大锤压碎