我们需要在调用应用程序的第一页时调用action方法。例如,第一页是index.jsp
,当我们直接调用此页面时,不会调用action方法。为此,我们编写了另一个页面,它使用 java script 单击按钮并调用action方法,该方法导航到index.jsp。
我觉得JSF应该有适当的方法来完成这项任务。这样做的赌注是什么?我告诉团队我们可以在加载页面时在构造函数中调用action方法。这是正确的方法吗?有哪些可能的解决方案?
答案 0 :(得分:11)
只需在应用程序作用域bean的@PostConstruct
方法中完成工作,该方法是eager
构造的或者至少绑定到页面。
@ManagedBean(eager=true)
@ApplicationScoped
public class Bean {
@PostConstruct
public void init() {
// Here.
}
}
或者,如果JSF(读作:FacesContext
)在实际作业中没有相关角色,您也可以使用ServletContextListener
。
@WebListener
public class Config implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
// Do stuff during webapp startup.
}
public void contextDestroyed(ServletContextEvent event) {
// Do stuff during webapp shutdown.
}
}
如果您尚未使用Servlet 3.0,请按以下方式在web.xml
中注册。
<listener>
<listener-class>com.example.Config</listener-class>
</listener>
答案 1 :(得分:2)
使用JSF 2.0
如果您想在应用程序启动时执行某些操作(即使尚未加入),您可以使用SystemEventListener并将其订阅到PostConstructApplicationEvent。
监听器示例:
package listeners;
import javax.faces.application.Application;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ListenerFor;
import javax.faces.event.PostConstructApplicationEvent;
import javax.faces.event.SystemEvent;
import javax.faces.event.SystemEventListener;
public class MySystemListener implements SystemEventListener{
@Override
public void processEvent(SystemEvent event) throws AbortProcessingException {
System.out.println("started");
}
@Override
public boolean isListenerForSource(Object source) {
return source instanceof Application;
}
}
要承认您必须在faces-config.xml
中包含此片段<application>
<system-event-listener>
<system-event-listener-class>
listeners.MySystemListener
</system-event-listener-class>
<system-event-class>
javax.faces.event.PostConstructApplicationEvent
</system-event-class>
</system-event-listener>
</application>
如果您想在用户进入特定页面时执行操作,您可以使用其他系统事件和 f:event 标记在页面显示之前接收通知。
例如:
...
<h:body>
<f:event type="preRenderView" listener="#{bean.action}"/>
<h:form>
<!--components-->
</h:form>
</h:body>
...
以下是有关使用系统事件的更多详细信息:http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/#system-events。
在JSF 1.2中,我认为您可以收到通知的一种方法是使用PhaseListener并检查当前呈现的视图的ID。