在JSF中放置初始化代码的适当位置?

时间:2012-03-06 09:25:03

标签: jsf

适当的地方在哪里?在JSF中放置后面的初始化片段,以便在服务器启动时只执行一次?

1.  ExternalContext extContext = FacesContext.getCurrentInstance().getExternalContext();
2.  HttpSession sesion = (HttpSession)extContext.getSession(true); 
3.  String parA = extContext.getInitParameter("parA");
4.  String parB = someCalculations(parA);       
5.  sesion.setAttribute("parB", parB);

基本上我想从web.xml context-param部分读取参数parA,做一些转换,并将它包含在session中(作为新的parB参数)。

PostConstructApplicationEvent和eager = true技术不起作用,因为此时会话为空(第4行)。 ServletContextListener技术不起作用,因为FacesContext不可用。

谢谢!

1 个答案:

答案 0 :(得分:0)

申请开始时没有会话;这个要求是不可能满足的。

我将您的要求解释为:

  • 执行昂贵的应用范围计算
  • 将此应用程序范围结果注入其他范围

JSF的方法是通过托管bean。这是一个应用程序范围bean,用于执行上下文参数的一次性转换:

package foo;

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

@ManagedBean
@ApplicationScoped
public class SomeCalculationsBean {
  @ManagedProperty("#{initParam.paraA}")
  private String paraA;

  private String someCalculation;

  public String getParaA() {
    return paraA;
  }

  public void setParaA(String paraA) {
    this.paraA = paraA;
    this.someCalculation = //do some transformation
  }

  public String getSomeCalculation() {
    return someCalculation;
  }
}

然后可以根据需要将此值注入其他范围:

package foo;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class SomeSessionBean {
  @ManagedProperty("#{someCalculationsBean.someCalculation}")
  private String paraB;

  public String getParaB() {
    return paraB;
  }

  public void setParaB(String paraB) {
    this.paraB = paraB;
  }
}

未经测试的代码。此实现假定支持JSF注释,但您可以使用faces-config.xml bean配置执行相同的操作。