如何将变量的值从jsf的bean页面(即bean.java)移动到另一个java类?

时间:2011-10-14 09:00:19

标签: java jsf primefaces javabeans

如何将变量的值从jsf的bean页面(即bean.java)移动到另一个java类?当我试图这样做时,第二个java类中的变量值为NULL。,

我使用了primefaces UI框架(类似于jsf)并将每个字段值分配给bean类。分配给bean类中每个变量的值是正确的。但是当我试图将这些值移动到另一个.java文件时。变量的范围死亡,值为NULL。查看我的编码..

LOGIN.XHTML

<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui">


<h:head></h:head>
<h:body>

<p:panel header="Login" style="">
<h:form>

<h:panelGrid columns="2" cellpadding="2">
<h:outputText value="Username"></h:outputText>
<p:inputText id="userName" value="#{loginBean.userName}"></p:inputText>
<h:outputText value="Password"></h:outputText>
<p:password id="password" value="#{loginBean.password}"></p:password>
<p:commandButton value="Sign in" ajax="false" actionListener="#{loginBean.forward}"></p:commandButton>



</h:panelGrid>

</h:form> 

</p:panel>
</h:body>


</html>

loginBean.java

package bean;
import receive.*;
public class loginBean {
public String userName;
public String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void forward()
{
System.out.println(getUserName());
receiveclass r=new receiveclass();
r.dbc();
}
}

receiveclass.java

package receive;
import bean.loginBean; 
public class receiveclass {
loginBean lb=new loginBean();

public void dbc()
{
  String s= lb.getUserName();
  String p=lb.getPassword();
  System.out.println(s);
  System.out.println(p);
  //System.out.println("hi");

}

}

输出是,

如果我以管理员身份提供,管理员在文本字段中

我收到的是

管理 空值 空

2 个答案:

答案 0 :(得分:1)

您手动创建bean而不是让JSF管理bean。 JSF根本不会使用手动创建的bean。您需要让JSF自动创建和管理这些bean。您可以通过将其注入@ManagedProperty来访问其他JSF托管bean:

在您的特定情况下,以下内容应该有效:

@ManagedBean
@RequestScoped
public class LoginBean {

    private String userName;
    private String password;

    @ManagedProperty
    private ReceiveClass receiveClass;

    public void forward() {
        receiveClass.dbc(this);
    }

    // Add/generate getters and setters.
}

@ManagedBean
@SessionScoped
public class ReceiveClass {

    public void dbc(LoginBean loginBean) {
        System.out.println(loginBean.getUserName());
    }

}

(请注意,我已修复代码以正确遵守Java Naming Conventions。类名称应以大写字母开头)

另见:

答案 1 :(得分:0)

在您的接收类中,您创建了一个全新的loginBean实例。值只能为空。

我是这样做的:我创建了一个Java类,其中我有像这样的静态函数

public class JSFHelper 
{
   public static Object getMyObject(String objname, Class<?> classname )
   {    
      FacesContext fCtx = FacesContext.getCurrentInstance();
      ELContext elCtx = fCtx.getELContext();
      ExpressionFactory ef = fCtx.getApplication().getExpressionFactory();
      ValueExpression ve = 
        ef.createValueExpression(elCtx, "#{" + objname+ "}",classname);
      return (Object) ve.getValue(elCtx);
   }
}

如果我需要来自另一个Bean的值,它将在你的接收类中看起来像这样:

public class receiveclass 
{        

   public void dbc()        
   {          
       loginBean lb=(loginBean)JSFHelper.getMyObject("loginBean",loginBean.class);
       String s= lb.getUserName();          
       String p=lb.getPassword();          
       System.out.println(s);          
       System.out.println(p);          
       //System.out.println("hi");    
   }                
}