Getter 被调用的次数与 ArrayList 中 h:dataTable 的值一样多,Eclipse 说"方法必须具有签名"字符串方法..."



我对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留在同一页面

相关内容

  • 没有找到相关文章

最新更新