具有一个简单的.xhtml,主要是一个按钮在外面:
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<f:view>
<h:body>
<h:form>
<h:messages id="messages" />
<h:outputLabel for="name-field" /><h:inputText id="name-field" value="#{mySession.name}" />
<h:commandButton value="Submit" action="#{myService.goOutside}" />
</h:form>
</h:body>
</f:view>
</html>
还有一个支持它的简单后备bean:
@Named
@SessionScoped
public class MySession implements Serializable {
private String name = "My Name";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private static final Logger LOG = Logger.getLogger(MySession.class.getName());
@PostConstruct
public void init() {
LOG.info("MySession initialized!");
}
}
还有RequestScoped
bean支持goOutside
服务方法:
@Named
@RequestScoped
public class MyService {
private static final Logger LOG = Logger.getLogger(MyService.class.getName());
public String goOutside() throws IOException {
LOG.info("Enter goOutside");
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.invalidateSession(); // To make sure that old session with old user defaults are not retained!
ec.redirect("https://en.wikipedia.org/");
LOG.info("Exit goOutside");
return null;
}
}
这按预期方式工作-在记录“退出goOutside”之后,我看不到“ MySession已初始化!”直到并且除非我重新访问原始的xhtml。
在我的完整代码的上下文中-直到这些部分看起来基本上相同,我没有得到这样的行为:MySession
bean在重定向之后和重新访问原始URL之前立即被重新初始化。
我仍在尝试剥离原始代码,直到它能以最小的代码量找出应该中断的地方-但由于将其编织到其余部分中,我觉得可能要花点时间
如果将引入关于此问题的任何想法-这将缩短我的研究。或者,我可以将问题改写为:“我应该在上面的代码中添加些什么,以便立即看到MySession初始化?”。