我对JSF真的很陌生,我已经学了整整2天了。除了最初对概念的困惑之外,我对eclipse也有一些问题。我使用JSF 2.0,显然是Eclipse和Tomcat 7。
首先,让我描述一下我想要做什么:在学习JSF的范围内,我想要有一个User类,包含姓名、年龄和Id。然后,我想列出预定义的用户并添加一个提交表单。除此之外,还有一个"用户详情"选项。
下面是我的代码:
用户类:
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(){}
}
用户"bean":
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。(都在datatable中),看起来好像这个函数被调用的次数和arraylist中的值一样多。"System.out.println("Called!")"被写入的次数与数组列表中有多少个值一样多。我做错什么了吗?我不认为应该为数组列表中的每个对象调用它。
(2)在users.xhtml中,这部分代码
<h:commandButton action="#{usersBean.addUser(user)}" value="Add" type="submit"></h:commandButton>
被eclipse突出显示,它读着:"方法必须有签名"String Method(),…"我是否以错误的方式调用了该方法?是否有一个替代发送对象到UsersBean的addUser函数?如果Eclipse将此定义为错误,那么正确的方法是什么?
非常感谢您的时间和回答!
1)在JSF中,方法(用于构建视图)可以被调用多次。为了进行适当的测试,您可以创建包含20个或更多用户的用户列表,并再次检查getAll
方法将被调用多少次。我想还是那个数字(你是3个)。
2) JSF中的Action方法应该返回重定向结果(类型为String)。这就是为什么你有关于"签名字符串方法"消息的原因。将addUser
方法的签名从public void addUser(User u)
更改为public String addUser(User u)
,返回导航到新页面的结果或返回null留在同一页面