2014-05-18 108 views
0

對於JSF我真的很陌生,我已經完全在2天內瞭解它。除了最初的概念混淆之外,我也對eclipse有問題。 我使用的JSF 2.0顯然是Eclipse和Tomcat 7.JSF 2.0 - 將對象傳遞給bean

首先,讓我描述一下我想要做的事情:在學習JSF的範圍中,我想要一個User類,名稱,姓氏,年齡和身份證。然後,我想列出預先定義的用戶並添加提交表單。除此之外,還有一個「用戶詳細信息」選項。

這裏是我的代碼:

用戶等級:

package com.tutorial; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 

@ManagedBean 
@RequestScoped 
public class User { 

private String name; 
private String surname; 
private int age; 
private int id; 

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

public String getSurname() { 
    return surname; 
} 
public void setSurname(String surname) { 
    this.surname = surname; 
} 

public int getAge() { 
    return age; 
} 
public void setAge(int age) { 
    this.age = age; 
} 

public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 

public User(String name, String surname, int age, int id) { 
    super(); 
    this.name = name; 
    this.surname = surname; 
    this.age = age; 
    this.id = id; 
} 

public User(){} 
} 

用戶 「豆」:

package com.tutorial; 

import java.util.ArrayList; 
import java.util.List; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.context.FacesContext; 

@ManagedBean 
@SessionScoped 
public class UsersBean { 

private List<User> listOfUsers = new ArrayList<User>(); 
private String passedParameter; 

public UsersBean() 
{ 
    listOfUsers.add(new User("Tywin", "Lannister", 60, 1)); 
    listOfUsers.add(new User("Tyrion", "Lannister", 30, 2)); 
    listOfUsers.add(new User("Jaime", "Lannister", 31, 3)); 
} 
public List<User> getAll() 
{ 

    System.out.println("Called!"); 
    return listOfUsers; 
} 

public User getDetails() 
{ 
    passedParameter = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("userID"); 
    int id = Integer.parseInt(passedParameter); 
    User selected = null; 
    for (User u : listOfUsers) 
    { 
     if (u.getId() == id) 
     { 
      selected = u; 
     } 
    } 
    return selected; 
} 

public void addUser(User u) 
{ 
    u.setId(listOfUsers.size()+1); 
    listOfUsers.add(u); 
} 
} 

users.xml中(部分代碼):

<f:view> 
     <!-- http://stackoverflow.com/questions/8083469/method-must-have-signature-string-method-etc-but-has-signature-void --> 
     <h:dataTable value="#{usersBean.all}" var="u"> 
     <h:column> 
      <f:facet name="header"> 
       User ID 
      </f:facet> 
       #{u.id} 
     </h:column> 
     <h:column> 
      <f:facet name="header"> 
       Name 
      </f:facet> 
       #{u.name} 
     </h:column> 
     <h:column> 
      <f:facet name="header"> 
       Details 
      </f:facet> 
      <h:link outcome="usersDetails" value="get details"> 
       <f:param name="userID" value="#{u.id}"></f:param> 
      </h:link> 
     </h:column>  
     </h:dataTable> 

     <h:form> 
      <h:outputText value="Name"></h:outputText> 
      <h:inputText value="#{user.name}"></h:inputText> 
      <h:outputText value="Surname"></h:outputText> 
      <h:inputText value="#{user.surname}"></h:inputText> 
      <h:outputText value="Age"></h:outputText> 
      <h:inputText value="#{user.age}"></h:inputText> 
      <h:commandButton action="#{usersBean.addUser(user)}" value="Add" type="submit"></h:commandButton> 
     </h:form> 

    </f:view> 

而且最後,usersDetails.xhtml(部分代碼以及):

<ui:define name="content"> 
<ui:param name="user" value="#{usersBean.details}" /> 
    <h:outputText value="#{user.name}"></h:outputText> 
    <h:outputText value="#{user.surname}"></h:outputText> 
    <h:outputText value="#{user.id}"></h:outputText> 
</ui:define> 

好了,現在的問題:

(1)users.xhtml(見上面的代碼 - usersBean.all在數據表),它看起來好像這個函數被調用許多在arraylist中有值的時候。 「System.out.println(」Called!「)」的編寫次數與arraylist中的值相同。我做錯了什麼?我不相信這是應該爲arraylist中的每個對象調用。

(2)在users.xhtml,代碼

<h:commandButton action="#{usersBean.addUser(user)}" value="Add" type="submit"></h:commandButton> 

,這部分是由偏食突出顯示,並記載:「方法必須署名 「字符串()的方法,...」 難道我調用該方法以錯誤的方式?是否有發送對象到UsersBean的ADDUSER功能的替代方案?什麼是正確的做法,如果Eclipse的定義這是錯的?

非常感謝您的時間和答案!

回答

0

1)在JSF中,方法(用於buldin g視圖)可以被多次調用。爲了正確測試,您可以創建20個或更多用戶的用戶列表,並再次檢查將調用多少次getAll方法。我認爲它仍然是相同的數字(在你的情況下是3)。

2)JSF中的Action方法應返回重定向結果(String類型)。這就是爲什麼你有關於「簽名字符串方法」的消息的原因。將addUser方法的簽名從public void addUser(User u)更改爲public String addUser(User u),並返回導航到新頁面的結果或null留在同一頁面上。

+0

你是完全正確的,我現在有5個用戶在列表中,它被稱爲3次。請您詳細說明爲什麼該方法被稱爲3次,如果我明確地稱它只有一次? – user3588536

+0

請參閱[爲什麼JSF多次調用getters](http://stackoverflow.com/questions/2090033/why-jsf-calls-getters-multiple-timesV) –

相關問題