Jsf 获取会话映射
在我的代码中,我有一个简单的Jsf 获取会话映射,jsf,Jsf,在我的代码中,我有一个简单的阶段侦听器 public class PhaseTracker implements PhaseListener { private static final Logger LOGGER = LoggerFactory.getLogger(PhaseTracker.class); @Override public void afterPhase(PhaseEvent pe) { LOGGER.debug("afterPhase
阶段侦听器
public class PhaseTracker implements PhaseListener {
private static final Logger LOGGER = LoggerFactory.getLogger(PhaseTracker.class);
@Override
public void afterPhase(PhaseEvent pe) {
LOGGER.debug("afterPhase " + pe.getPhaseId());
LOGGER.debug(""+FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("haveErrors"));
}
@Override
public void beforePhase(PhaseEvent pe) {
LOGGER.debug("beforePhase " + pe.getPhaseId());
boolean error = false;
Iterator<FacesMessage> messageIterator = pe.getFacesContext().getMessages();
while (messageIterator.hasNext()) {
FacesMessage message = messageIterator.next();
if (message.getSeverity().equals(FacesMessage.SEVERITY_ERROR)) {
LOGGER.debug("beforePhase severity is error");
error = true;
}
}
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("haveErrors", error);
LOGGER.debug(""+FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("haveErrors"));
}
@Override
public PhaseId getPhaseId() {
LOGGER.debug("getPhaseId");
return PhaseId.ANY_PHASE;
}
}
我有一个null
源代码,我不明白为什么。像这样试试
public synchronized void beforePhase(PhaseEvent event) {
FacesContext context = event.getFacesContext();
ExternalContext ex = context.getExternalContext();
String viewId = "/index.xhtml";
if (context.getViewRoot() != null && context.getViewRoot().getViewId() != null) {
viewId = context.getViewRoot().getViewId();
}
String localeCode = (String) ex.getSessionMap().get("localeCode");
if (localeCode == null) {
ex.getSessionMap().put("localeCode", "en");
context.getViewRoot().setLocale(new Locale("en"));
// System.out.println("locale code " +"En?");
} else if (localeCode != null) {
//System.out.println("locale code " +localeCode);
ex.getSessionMap().put("localeCode", localeCode);
context.getViewRoot().setLocale(new Locale(localeCode));
}
您无法在Facelets(XHTML)文件中编写Java代码,因此很难理解/可视化您试图访问它的确切方式。此外,与具体问题无关,这种相当笨拙的方法也可以通过在EL中计算
{facesContext.validationFailed}
来实现,而不需要整个阶段的侦听器。
public synchronized void beforePhase(PhaseEvent event) {
FacesContext context = event.getFacesContext();
ExternalContext ex = context.getExternalContext();
String viewId = "/index.xhtml";
if (context.getViewRoot() != null && context.getViewRoot().getViewId() != null) {
viewId = context.getViewRoot().getViewId();
}
String localeCode = (String) ex.getSessionMap().get("localeCode");
if (localeCode == null) {
ex.getSessionMap().put("localeCode", "en");
context.getViewRoot().setLocale(new Locale("en"));
// System.out.println("locale code " +"En?");
} else if (localeCode != null) {
//System.out.println("locale code " +localeCode);
ex.getSessionMap().put("localeCode", localeCode);
context.getViewRoot().setLocale(new Locale(localeCode));
}