我是JSF的新手,我现在已经学习了两天。除了最初对概念的困惑之外,我也有与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中(参见上面的代码 - 在datatable中的usersBean.all),看起来这个函数被调用的次数与arraylist中的值一样多。 “System.out.println(”Called!“)”的编写次数与arraylist中的值一样多。我做错了什么吗?我不相信它会被称为arraylist中的每个对象。
(2)在users.xhtml中,这部分代码
<h:commandButton action="#{usersBean.addUser(user)}" value="Add" type="submit"></h:commandButton>
由eclipse突出显示,它显示:“方法必须有签名”字符串方法(),...“ 我是否以错误的方式调用该方法?有没有将对象发送到UsersBean的addUser函数的替代方法?如果Eclipse将其定义为错误,那么正确的方法是什么?
非常感谢你的时间和答案!
答案 0 :(得分:0)
1)在JSF中,可以多次调用方法(用于构建视图)。为了进行正确的测试,您可以创建包含20个或更多用户的用户列表,并再次检查将调用getAll
方法的次数。我认为它仍然是相同的数字(在你的情况下为3)。
2)JSF中的Action方法应返回重定向结果(类型为String)。这就是你有关于“签名字符串方法”的消息的原因。将addUser
方法的签名从public void addUser(User u)
更改为public String addUser(User u)
并返回导航到新页面的结果或 null 以保留在同一页面上。