如何将值传递给第二个jsf页面

时间:2014-11-25 13:24:40

标签: jsf

如果我为我的managedbean使用会话范围,那么我可以将一个变量值传递给所有页面但是 如果我对我的managedbean使用viewscope,那么我的变量值将转到第一页但不转到第二页。这意味着

第一页包含

<p:inputText id="email" required="true"
                                    requiredMessage="Enter Email"
                                    value="#{loginController.empEmail}" >
                                </p:inputText>
<p:commandButton id="OTP" action="#{loginController.generateOTPForEmp}" 
                                rendered="#{loginController.loginAsEmp}" value="Generate OTP" update="@form">
                            </p:commandButton>

managedbeans

public String generateOTPForEmp() {
System.out.println(loginAsEmp);
}

第二页包含

<p:inputText id="email" required="true"
                                        requiredMessage="Enter Email"
                                        value="#{loginController.empEmail}" >
                                    </p:inputText>

在第二页“empEmail”中不显示

我还需要将empEmail传递到第二页, 我需要做什么? (使用viewscope)

2 个答案:

答案 0 :(得分:-1)

在作用域的会话中定义用于存储用户数据的bean,视图作用域中的控制器,用于处理视图。

@Named("loginCtrl")
@ViewScoped
public class LoginController {

     @Inject private LoginData data;
     private long viewData;

    @PostConstruct
    public void init(){
       setViewData(System.currentTimeMillis());
    }

    public String  doLogin(){
        return "index2.xhtml";
    }

    public String  goto3(){
        return "index3.xhtml";
    }

    public LoginData getData() {
        return data;
    }


    public void setData(LoginData data) {
        this.data = data;
    }


}

然后您在sessionScope中的数据

@SessionScoped
public class LoginData implements Serializable{

    private String name;
// getters and setters

然后在视图1中

<?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://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form id="form">
            <p><h:outputText value="new data #{loginCtrl.viewData}" /></p>             
            <p><h:inputText id="txName" value="#{loginCtrl.data.name}" /></p>
            <p><h:commandButton value="Login" action="#{loginCtrl.doLogin()}"></h:commandButton></p>
        </h:form>
    </h:body>
</html>

在视图2中

 <h:form id="form">
        <p><h:outputText value=" new data #{loginCtrl.viewData}" /></p>
            <p><h:outputText id="txName2" value="#{loginCtrl.data.name}" /></p>
            <p><h:commandButton value="Login" action="#{loginCtrl.goto3()}"></h:commandButton></p>

        </h:form>

,例如它甚至在视图3中有效

 <h:form id="form">
     <p><h:outputText value="new data #{loginCtrl.viewData}" /></p>             
     <p><h:outputText id="txName2" value="#{loginCtrl.data.name}" /></p>
</h:form>

在“viewData”中,您可以检查每次更改视图时,您都有一个新的bean实例,但具有相同的会话数据。

答案 1 :(得分:-1)

@ViewScoped无法做到这一点,您需要使用@CustomScoped来实现这一目标。 (我假设你不愿意使用@SessionScoped

Here是一篇很好的文章。