如果我为我的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)
答案 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是一篇很好的文章。