對於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的定義這是錯的?
非常感謝您的時間和答案!
你是完全正確的,我現在有5個用戶在列表中,它被稱爲3次。請您詳細說明爲什麼該方法被稱爲3次,如果我明確地稱它只有一次? – user3588536
請參閱[爲什麼JSF多次調用getters](http://stackoverflow.com/questions/2090033/why-jsf-calls-getters-multiple-timesV) –