如果 flash.keep() 在 bean 中但不在 Facelets 页面的 EL 中,为什么要删除密钥?
Why is flash.keep() removing the key if it is in a bean but not in EL in Facelets page?
所以我有这个非常小的 JSF 示例:
<!DOCTYPE html>
<html xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Index</title>
</h:head>
<h:body>
<h:form>
<h:commandButton action="#{reqScopedBackingBean.foo()}" value="Submit"/>
</h:form>
</h:body>
</html>
foo 的实现如下所示:
package biz.tugay.jsftags;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
@ManagedBean
@RequestScoped
public class ReqScopedBackingBean {
public String foo() {
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("message", "Success!!");
return "hello?faces-redirect=true";
}
}
最后hello.xhtml
如下:
<!DOCTYPE html>
<html xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Hello</title>
</h:head>
<h:body>
<h:outputText value="#{flash.keep.message}"/>
</h:body>
</html>
在上面的例子中,当我点击提交时,我将被重定向到 hello.xhtml 并看到 "Success!!" 文本就好了。当我刷新页面时,我仍然会看到消息,因为我正在调用 keep 方法,如下所示:
#{flash.keep.message}
现在转到另一个示例:
index.xhtml和ReqScopedBackingBean一样,不过这次hello.xhtml如下:
<!DOCTYPE html>
<html xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Hello</title>
</h:head>
<h:body>
#{otherBean.pullValuesFromFlash()}
<h:outputText value="#{otherBean.message}"/>
</h:body>
</html>
和OtherBean.java
如下:
@ManagedBean
@RequestScoped
public class OtherBean {
private String message;
public void pullValuesFromFlash() {
final Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
flash.keep("message");
final String message = (String) flash.get("message");
setMessage(message);
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
我希望行为与第一个示例相同。但是,当我在 hello.xhtml 时,我将看不到成功消息。但是,如果我注释掉这一行:
// flash.keep("message");
然后消息将出现(但在 hello.xhtml 上刷新将不会像第一个示例那样重新显示成功消息)。
我的问题是,这里有什么区别?
怎么样
#{flash.keep.message}
不同于
flash.keep("message");
final String message = (String) flash.get("message");
?
在将当前 flash 范围的条目放入下一个 flash 范围之前,您遇到了 Flash#keep()
. Basically, Mojarra unnecessarily removes 的 Mojarra 错误。
如果您按以下方式重新排序逻辑,它将起作用。
public void pullValuesFromFlash() {
Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
String message = (String) flash.get("message");
flash.keep("message");
setMessage(message);
}
我有 fixed this bug as per issue 4167.
与具体问题无关,那些<h:outputText>
是不必要的。您可以安全地删除它们以减少样板文件。另见 Is it suggested to use h:outputText for everything?
所以我有这个非常小的 JSF 示例:
<!DOCTYPE html>
<html xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Index</title>
</h:head>
<h:body>
<h:form>
<h:commandButton action="#{reqScopedBackingBean.foo()}" value="Submit"/>
</h:form>
</h:body>
</html>
foo 的实现如下所示:
package biz.tugay.jsftags;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
@ManagedBean
@RequestScoped
public class ReqScopedBackingBean {
public String foo() {
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("message", "Success!!");
return "hello?faces-redirect=true";
}
}
最后hello.xhtml
如下:
<!DOCTYPE html>
<html xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Hello</title>
</h:head>
<h:body>
<h:outputText value="#{flash.keep.message}"/>
</h:body>
</html>
在上面的例子中,当我点击提交时,我将被重定向到 hello.xhtml 并看到 "Success!!" 文本就好了。当我刷新页面时,我仍然会看到消息,因为我正在调用 keep 方法,如下所示:
#{flash.keep.message}
现在转到另一个示例:
index.xhtml和ReqScopedBackingBean一样,不过这次hello.xhtml如下:
<!DOCTYPE html>
<html xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Hello</title>
</h:head>
<h:body>
#{otherBean.pullValuesFromFlash()}
<h:outputText value="#{otherBean.message}"/>
</h:body>
</html>
和OtherBean.java
如下:
@ManagedBean
@RequestScoped
public class OtherBean {
private String message;
public void pullValuesFromFlash() {
final Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
flash.keep("message");
final String message = (String) flash.get("message");
setMessage(message);
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
我希望行为与第一个示例相同。但是,当我在 hello.xhtml 时,我将看不到成功消息。但是,如果我注释掉这一行:
// flash.keep("message");
然后消息将出现(但在 hello.xhtml 上刷新将不会像第一个示例那样重新显示成功消息)。
我的问题是,这里有什么区别?
怎么样#{flash.keep.message}
不同于
flash.keep("message");
final String message = (String) flash.get("message");
?
在将当前 flash 范围的条目放入下一个 flash 范围之前,您遇到了 Flash#keep()
. Basically, Mojarra unnecessarily removes 的 Mojarra 错误。
如果您按以下方式重新排序逻辑,它将起作用。
public void pullValuesFromFlash() {
Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
String message = (String) flash.get("message");
flash.keep("message");
setMessage(message);
}
我有 fixed this bug as per issue 4167.
与具体问题无关,那些<h:outputText>
是不必要的。您可以安全地删除它们以减少样板文件。另见 Is it suggested to use h:outputText for everything?