jsf - 在任何 Servlet 相关类中按名称获取 JSF 托管 bean

标签 jsf jakarta-ee servlets jsf-2 managed-bean

我正在尝试编写一个自定义 servlet(用于 AJAX/JSON),我想在其中按名称引用我的 @ManagedBeans。我希望绘制 map :

http://host/app/myBean/myProperty

至:

@ManagedBean(name="myBean")
public class MyBean {
    public String getMyProperty();
}

是否可以从常规 servlet 按名称加载 bean?是否有我可以使用的 JSF servlet 或帮助程序?

我似乎被Spring宠坏了,这一切都太明显了。

最佳答案

在基于 servlet 的工件中,例如 @WebServlet@WebFilter@WebListener,您可以获取“普通”JSF @ManagedBean @RequestScoped 作者:

Bean bean = (Bean) request.getAttribute("beanName");

@ManagedBean @SessionScoped:

Bean bean = (Bean) request.getSession().getAttribute("beanName");

@ManagedBean @ApplicationScoped:

Bean bean = (Bean) getServletContext().getAttribute("beanName");

请注意,这先决条件是 JSF 已预先自动创建了该 bean。否则这些将返回null。然后,您需要手动创建 bean 并使用 setAttribute("beanName", bean)

<小时/>

如果您能够使用 CDI @Named而不是自 JSF 2.3 弃用的 @ManagedBean 以来,它就更简单了,特别是因为您不再需要手动创建 bean:

@Inject
private Bean bean;

请注意,当您使用 @Named @ViewScoped 时,这将不起作用,因为该 bean 只能由 JSF View 状态标识,并且仅当 FacesServlet 时才可用> 已被调用。因此,在之前运行的过滤器中,访问 @Injected @ViewScoped 将始终抛出 ContextNotActiveException

<小时/>

只有当您位于@ManagedBean内时,您才可以使用 @ManagedProperty :

@ManagedProperty("#{bean}")
private Bean bean;

请注意,这在 @Named@WebServlet 或任何其他工件内不起作用。它确实仅在 @ManagedBean 内部有效。

<小时/>

如果您不在 @ManagedBean 内,但 FacesContext 随时可用(即 FacesContext#getCurrentInstance() 不可用返回null),您也可以使用 Application#evaluateExpressionGet() :

FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);

可以方便地进行如下操作:

@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
    FacesContext context = FacesContext.getCurrentInstance();
    return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}

可以按如下方式使用:

Bean bean = findBean("bean");
<小时/>

另请参阅:

关于jsf - 在任何 Servlet 相关类中按名称获取 JSF 托管 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2633112/

相关文章:

java - JSF 不工作 : Select SelectOneMenu And Dynamically Update Other SelectOneMenu With Ajax

jsf - 无法从 Servlet 过滤器内的 FacesContext 检索 session

java.sql.SQL语法错误异常 : ORA-01795: maximum number of expressions in a list is 1000

java - 强制 web.xml 中特定 url 模式的 404 错误

jsp - 升级正在运行的 Tomcat servlet

java - 如何在jsf中解决周围的命名容器?

java - Hello World facelets 2.0 导航

java - 改变 List<String> 的类型

servlets - 当用户未登录时,Servlet 过滤器在无限重定向循环中运行

java - 如何将对象(定义到 servlet 中)放入 session 中以将其用于 JSP 页面?