编辑4

我想做的是实现forgotPassword页面。出于示例目的,我采取了以下示例,但这不是真正的用户相关问题,我将在会话范围内保留用户名。

index.xhtml将是我将在其中输入用户名的忘记密码页面。输入用户名后,我将单击Welcome Me - Action,然后在chkMe()中,我将检查该用户并在其电子邮件ID和welcome.xhtml中发送新密码,我会说Hi User ABC, we have sent new password at [email protected]



主要职位

我试图用两种情况将数据从一个bean打印到另一个。下面是我的代码。

index.xhtml

<?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:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>JSF 2.0 Hello World</title>
    </h:head>
    <h:body>
        <h3>JSF 2.0 Hello World Example - hello.xhtml</h3>
        <h:form>
           <h:inputText value="#{helloBean.name}"></h:inputText>
           <h:commandButton value="Welcome Me - Plain" action="welcome"></h:commandButton>
           <h:commandButton value="Welcome Me - Action" action="#{helloBean.chkMe()}"></h:commandButton>
        </h:form>
    </h:body>
</html>


welcome.xhtml

<?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>JSF 2.0 Hello World</title>
    </h:head>
    <h:body bgcolor="white">
        <h3>JSF 2.0 Hello World Example - welcome.xhtml</h3>
        <h4>Welcome --#{helloBean.name}--</h4>
    </h:body>
</html>


HelloBean.java

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import java.io.Serializable;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class HelloBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private String name;

    public String getName() {
        return name;
    }

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

    public String chkMe() {
        return takeMeToAnotherPage("welcome");
    }

    public String takeMeToAnotherPage(String linkToGo) {
        return linkToGo + "?faces-redirect=true";
    }
}


当我在文本字段中输入Checking作为文本并单击按钮Welcome Me - Plain时,我在welcome.xhtml中将文本视为Welcome --Checking--文本,但是当我单击Welcome Me - Action时,我看不到任何文本(我看到为Welcome ----

我不知道为什么会这样。

任何想法/建议为什么会这样。



编辑1

我相信这都是由于?faces-redirect=true引起的,但是我必须使用它,就像我不使用?faces-redirect=true一样,地址栏中的URL是以前的URL。

例如如果我在page1.xhtml上,然后转到page2.xhtml,则URL仍会显示page1.xhtml。

因此,不确定在这种情况下该怎么办。



编辑2

好吧,我真正想要做的是forgotPassword页面,我将在index.xhtml中输入用户名(考虑上述示例),如果该用户名正确,则在welcome.xhtml上将显示Hi User ABC, Please use new password for next login. We have sent you email at [email protected]

RequestScope运行正常,但问题出在URL地址,因此我添加了?faces-redirect=true。但是由于其重定向,http会话正在关闭,因此在welcome.xhtml上,我没有任何价值(上面发生的事情)。

skuntsel的另一种解决方案是使用FlashScope,但是再次出现问题是,当我刷新welcome.xhtml时,数据消失了,这使我发疯。

谁能建议需要做什么?



编辑3

会话范围中的问题如下。

考虑我打开两个选项卡,在两个选项卡上都有index.xhtml。在tab1上,输入Fahim并单击Welcome Me - Action。在tab1上,welcome.xhtml出现了,我看到的文字为Welcome Fahim。太棒了。

现在,我进入tab2,并输入名称为XYZ,然后单击Welcome Me - Action,我得到welcome.xhtml,并且文本显示为Welcome XYZ。这也是完美的。

问题是当我回到tab1并刷新页面时。刷新tab1(welcome.xhtml)时,我看到Welcome XYZ错了,因为它早先是Welcome Fahim,应该是Welcome Fahim

最佳答案

在我看来,在会话范围内使用当前用户是一个好主意。

不过,如果不合适,我可以提供更多选择。

传递用户名作为视图参数

转化为

<h:form>
    <h:inputText value="#{helloBean.name}"/>
    <h:commandButton value="Welcome Me - Action" action="#{helloBean.chkMe}"/>
</h:form>




public String chkMe() {
    return takeMeToAnotherPage("welcome");
}

public String takeMeToAnotherPage(String linkToGo) {
    return linkToGo + "?faces-redirect=true&username=" + name;
}


welcome.xhtml中的其他视图参数

<f:metadata>
    <f:viewParam name="username"/>
</f:metadata>


另一个选择是及时实例化另一个请求范围的Bean并将信息传递给它

<h:form>
   <h:inputText value="#{helloBean.name}"/>
   <h:commandButton value="Welcome Me - Plain" action="welcome">
       <f:setPropertyActionListener value="#{helloBean.name}" target="#{welcomePageBean.username}"/>
   </h:commandButton>
</h:form>




@ManagedBean
@RequestScoped
WelcomePageBean {

    private String username;//+getter + setter
    //other fields associated with the welcome view

}


使用Flash对象

详细信息输入视图(片段),base.xhtml

<h:form>
    <h:outputText value="Enter user name for password reset: " />
    <h:inputText value="#{flash.username}" />
    <br/>
    <h:commandButton value="Send me a confirmation email" action="#{forgotBean.changePassword}" />
<h:form>


ForgotBeanbase.xhtml

@ManagedBean
@RequestScoped
public class ForgotBean {

    public ForgotBean() {   }

    public String changePassword() {
        //check user constraints and return failure outcome in case somthing is wrong
        //generate new password and persist it to the database
        //send a configmation e-mail
        return "successful-reset?faces-redirect=true";
    }

}


成功视图(片段),successful-reset.xhtml

<h:outputText value="Password was reset for user #{receptorBean.username}, e-mail configmation sent." />
<br/>
<h:link value="View homepage" outcome="home" />


ReceptorBeansuccessful-reset.xhtml

@ManagedBean
@RequestScoped
public class ReceptorBean {

    @ManagedProperty("#{flash}")
    private Flash flash;

    private String username;

    public ReceptorBean() {   }

    public String getUsername() {
        if(username == null) {
            String uname = (String)flash.get("username");
            flash.keep("inputText");
            username= uname;
        }
        return username;
    }

    public Flash getFlash() {
        return flash;
    }

    public void setFlash(Flash flash) {
        this.flash = flash;
    }

}

关于java - 在另一个页面中打印Bean数据(RequestScope),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15037870/

10-12 12:54