我是JSF(2)的新手。
在Struts中,我们可以从app.action
之类的URL调用操作。这会调用一个动作并返回一个结果页面,比如一个JSP(最初没有JSP / HTML)。
如何在JSF中完成同样的事情? (我知道如何从.xhtml调用一个动作) 即直接从URL调用托管bean并获取结果页面。
答案 0 :(得分:5)
如果它正在准备初始GET请求的数据,只需在请求的(post)构造函数中执行该作业,或者查看与该页面关联的作用域托管bean。
@ManagedBean
@RequestScoped
public class Bean {
public Bean() {
// Here.
}
@PostConstruct
public void init(){
// Or here, certainly if you rely on injected dependencies like @EJB.
}
}
如果它正在控制请求/响应并且可能会重定向/导航到另一个页面,那么请在preRenderView
中执行该作业。
<f:event type="preRenderView" listener="#{bean.listener}" />
与
public void listener() {
// ...
// You want to redirect?
externalContext.redirect(newURL);
// Or you want to navigate?
navigationHandler.handleNavigation(context, null, "newOutcome");
}
或者,如果您要挂钩所有请求,请使用filter:
@WebFilter("/*")
public class MyFilter implements Filter {
// ...
}
答案 1 :(得分:5)
您所询问的模式并不是JSF工作方式的原生模式。
基于请求的框架(如Struts和Spring MVC,以及较旧的基于Model-2 Servlet / JSP的方法确实可以这样工作。
在JSF中,首先是自动映射到请求URL的页面(视图)。没有一个bean直接映射到URL的概念,也没有一个bean的概念,它具有与视图强制1:1关系的框架。虽然有一个支持bean的概念,但这是按照惯例。对于JSF,所有bean都是“辅助bean”,仅由视图引用。
BalusC在他的回答中概述了当今可用于从JSF中基于请求的框架获取某些行为的流行方法。通过引入view actions,JSF 2.2将略微扩展这种支持,这正式化了preRenderViewEvent
的一些典型用例。
也就是说,JSF是一个非常灵活的框架,很少有东西是一成不变的。可以通过精心设计的插件和装饰系统替换或添加许多JSF的行为。
对于此用例,可以覆盖JSF将URL绑定到(Facelets)视图这一事实,实际上您可以让bean直接对请求做出反应。虽然目的略有不同,但这是我基本上为JavaVDL所做的,通过覆盖所谓的视图处理程序。
你必须问问自己这是否真的是你想要做的,如果你想以这种方式工作,JSF是否是你的最佳选择。但是通过JavaVDL(sourcecode here)中概述的方法,您应该能够做到这一点。请注意,最后一种方法不适合初学者,如果你想自己解决这个问题需要相当多的JSF经验。 (如果您或其他任何人希望拥有此功能,请考虑在OmniFaces issues list)为其创建问题。