适当的地方在哪里?在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不可用。
谢谢!
答案 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配置执行相同的操作。