我正在尝试编写一个自定义servlet(用于AJAX/JSON),我想在其中引用我@ManagedBeans的名字.我希望能够映射:
http://host/app/myBean/myProperty
至:
@ManagedBean(name="myBean")
public class MyBean {
public String getMyProperty();
}
Run Code Online (Sandbox Code Playgroud)
是否可以从常规servlet中按名称加载bean?是否有我可以使用的JSF servlet或帮助程序?
我似乎被春天宠坏了,这一切都太明显了.
所述的生命周期 @RequestScoped和@SessionScopedBean 管理豆由Servlet容器自身管理,因为它们是基本上作为一个属性存储HttpRequest和HttpSession分别.JSF如何管理生命周期@ViewScopedBean?我知道它是在创建视图时创建的,并且可以使用,直到有回发到另一个视图.但是我发现在我们离开那个视图后不会立即收集垃圾.
我想访问Servlet中的视图范围托管bean.
我搜索了类似的问题,得到了这些问题:
如何从视图范围中获取bean,它FacesContext.getCurrentInstance()在Servlet中不适用,因为它应该给出null结果
JSF - 按名称获取托管bean,它处理所有其他范围但不处理viewcope
我会认为这是不可能的,不是吗?
有一个简单的解决方案可以将bean范围更改为会话范围,但这是最后的机会,因为我担心内存消耗.
我最后需要的是:managebean包含dataTable中显示的一些数据.同一页面应包括这些数据的图表表示的图像(强制性).图像可以由Servlet生成,但它需要访问数据或从db重新加载它们.
我也试过<p:graphicImage>PrimeFaces 2.X,但它与viewscope bean不兼容.有什么建议吗?
在Java EE 6、CDI 1.1.x、Seam 3 等环境中,我们需要查找当前视图的所有 CDI beans ( @ViewScoped)。到目前为止我所尝试的是使用:
@Named
@ViewScoped
public class ViewHelper
{
@Inject
private BeanManager beanManager;
public doSomethingWithTheBeanInstances()
{
Set<Bean<?>> beans = this.getBeanManager().getBeans(
Object.class, new AnnotationLiteral<Any>(){}
);
// do something
...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这会返回它管理的所有bean。
我只需要找到当前视图范围内的那些,并且 - 这将是理想的 - 只找到那些实现特定接口(在多个层次结构级别上继承)的接口。
有什么方法可以做到呢?
请注意,由于 CDI 没有视图范围,因此我们使用Seam 3来注释所有视图范围的 bean,例如:
@Named
@ViewScoped
public class ResultManagerColumnHandler extends BaseColumnHandler
{
....
}
Run Code Online (Sandbox Code Playgroud)
上面是一个需要寻找的实例(它@ViewScoped是 Seam 3 的 CDI 替代品)。
如何做呢?
jsf ×4
view-scope ×3
jsf-2 ×2
managed-bean ×2
servlets ×2
cdi ×1
destroy ×1
jakarta-ee ×1
java-ee ×1
seam3 ×1