对于大学项目,我正在使用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引用会创建它-.-
答案 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配置文件服务器提供,如Glassfish,JBoss 6和Resin。使用这样的Web配置文件服务器时,只需将EJB包含在.war文件中,无需额外的工作。