在应用程序启动(JSF)中调用操作方法

时间:2011-01-29 03:23:47

标签: jsf

我们需要在调用应用程序的第一页时调用action方法。例如,第一页是index.jsp,当我们直接调用此页面时,不会调用action方法。为此,我们编写了另一个页面,它使用 java script 单击按钮并调用action方法,该方法导航到index.jsp。

我觉得JSF应该有适当的方法来完成这项任务。这样做的赌注是什么?我告诉团队我们可以在加载页面时在构造函数中调用action方法。这是正确的方法吗?有哪些可能的解决方案?

2 个答案:

答案 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。