开发者

Using JSF 2.0 Flash Scope problem

I'm having trouble with a basic JSF 2.0 program! I'm trying to implement Flash scope, I've gotten the information carried over to the second page, but am now having trouble with referencing the flashed variables.

He开发者_开发百科re is my first page with its bean, this works fine:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:h="http://java.sun.com/jsf/html">
<h:head>
    <title>Welcome to the JSF PoCs project</title>
 </h:head>
  <h:body>
   <h:form>
     <h1>Welcome to the JSF PoCs project</h1>
     <h:outputText value="Name: "/>
     <h:inputText id="txtName" value="#{registerBean.name}"/>
     <h:outputText value="EMail: "/>
     <h:inputText id="txtEMail"  value="#{registerBean.email}"/> 
     <h:commandButton value="register" action="#{registerBean.register}"/>
     <h:outputText></h:outputText>
    </h:form>
 </h:body>
</html>


import javax.faces.bean.ManagedBean;
@ManagedBean(name="registerBean")
public class RegisterBean {
private String name;
private String email;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String register() {

    JSFUtils.flashScope().put("registerBean", this);
    return "next";
}



}

This is where the problem is! It displays the correct data in the heading1 tags but does not set the next beans variable with the same data?

Now my question is, why does it work for a heading tag but not to set another beans variables?

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:f="http://java.sun.com/jsp/jstl/functions">
<h:head>
    <title>Welcome to the JSF PoCs project</title>
</h:head>
<h:body>
    <h:form>
        <c:set target="${confirmBean}" property="name" value="#    {flash.registerBean.name}"/>
        <c:set target="${confirmBean}" property="email"     value="${flash.registerBean.email}"/>
        <h1>Your User Name will be #{flash.registerBean.name} and email will be #    {flash.registerBean.email}</h1>
        <h:commandButton value="confirm" action="#{confirmBean.confirm}"/>
    </h:form>
</h:body>
</html>


import javax.faces.bean.ManagedBean;

@ManagedBean(name="confirmBean")
public class ConfirmBean {
     private String name;
     private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String confirm() {
    JSFUtils.flashScope().put("confirmBean", this);
    return "confirmPage";
}

}

After the button is pressed on the confirm.xhtml it directs to this page:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
<h:head>
    <title>Welcome to the JSF PoCs project</title>
</h:head>
<h:body>
    You have now registered with:  #{flash.confirmBean.name} and #    {flash.confirmBean.email}<br/>
</h:body>
</html>

Thanks for any help in advance!!!!


The JSTL <c:set> tags runs when the view is built, not when the view is rendered or restored. Thus, they are set in the ConfirmBean only in the request to display the form, not in the request to submit the form. Since the ConfirmBean is request scoped, all set values are lost.

I'd suggest to replace the whole Flash scope by just passing parameters.

<h:commandButton value="confirm" action="#{confirmBean.confirm}">
    <f:param name="name" value="#{registerBean.name}" />
    <f:param name="email" value="#{registerBean.email}" />
</h:commandButton>

with the following in ConfirmBean:

@ManagedProperty(value="#{param.name}")
private String name;

@ManagedProperty(value="#{param.email}")
private String email;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜