JSF2:如何在部署时启动服务

时间:2011-01-05 16:33:55

标签: jsf jsf-2 rmi

对于大学项目,我正在使用JSF开发Web应用程序。我的练习是做前端。一个学生应该做后端的东西。这两个部分都是专为应用而设计的。两者都通过RMI进行通信。我想在部署时打开一次连接。

我现在正在解决这个问题。我试图用@ApplicationScoped ManagedBean:

来做到这一点
//Constructor of ApplicationScoped ManagedBean  
public Communication() {
    this.connect();
}

这样可行吗?我试过了,但似乎没有调用managedBean ..

你能建议最佳实践吗?


@Brian:不幸的是我根本不使用EJB -.-

@ BalusC的底池: 我创建了一个communicationbean:

@ManagedBean(name="communication")
@ApplicationScoped
public class Communication {

    public static FrontendCommInterface server;

    public Communication() {
        this.connect();
    }

然后我创建了LoginBean:

@ManagedBean
@ViewScoped
public class Login {

@ManagedProperty(value="#{communication}")
private Communication communicationBean;

public FrontendCommInterface server;

private String username;
private String password;

public Login() {
    server = communicationBean.getConnection();
}

public String login(){
    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
    String sessionId = session.getId();

    try {
        server.login(getUsername(), getPassword(), sessionId);
        return "start.xhtml";

    } catch (RemoteException e) {
        e.printStackTrace();
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Anmeldung nicht erfolgreich: ", getUsername()+", "+getPassword()+", "+sessionId));
        return "login.xhtml";
    }
}

但遗憾的是它抛出异常:

com.sun.faces.mgbean.ManagedBeanCreationException: Klasse org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login can not be instanciated.

java.lang.NullPointerException
    org.dhbw.stg.wwi2008c.mopro.ui.managedBeans.Login.<init>(Login.java:28)

在调试后我发现我的ManagedProperty是空的!它尚未创建!怎么做?我认为通过managedproperty引用会创建它-.-

2 个答案:

答案 0 :(得分:2)

托管bean只有在EL #{managedBeanName}引用时才会自动创建,这可以通过在视图中访问原样,或者作为另一个bean的托管属性注入,或者手动EL来实现 - 由...解决Application#evaluateExpressionGet()

在您的特定情况下,您实际上想要在webapp启动期间初始化一些内容。您更愿意使用ServletContextListener

@WebListener
public class Config implements ServletContextListener {

    public void contextInitialized(ServletContextEvent event) {
        // Do stuff during webapp's startup.
    }

    public void contextDestroyed(ServletContextEvent event) {
        // Do stuff during webapp's shutdown.
    }

}

您甚至可以在必要时预先创建应用程序作用域托管bean(如果您的目的是能够通过@ManagedProperty从其他bean访问它)。

    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute("bean", new Bean());
    }

JSF将应用程序范围的bean存储为ServletContext的属性,并且当一个已存在时,JSF将不会自动创建另一个,因此将使用上述代码示例创建的同一个也是由JSF。

答案 1 :(得分:0)

如果您可以在Web应用程序中使用EJB 3.1 lite {1},则可以使用带有@Startup注释的Singleton会话Bean和@PostConstruct方法。我有一个看起来像:

@Singleton
@Startup
public class CachePrimer {

    @PostConstruct
    public void loadOpenRequests() {
         ...
    }
}

{1}:EJB 3.1 lite包含在JavEE 6的Web Profile中,由Web配置文件服务器提供,如GlassfishJBoss 6Resin。使用这样的Web配置文件服务器时,只需将EJB包含在.war文件中,无需额外的工作。