JSF 2.0 - 将对象传递给bean

时间:2014-05-18 13:08:30

标签: jsf-2 xhtml javabeans

我是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将其定义为错误,那么正确的方法是什么?

非常感谢你的时间和答案!

1 个答案:

答案 0 :(得分:0)

1)在JSF中,可以多次调用方法(用于构建视图)。为了进行正确的测试,您可以创建包含20个或更多用户的用户列表,并再次检查将调用getAll方法的次数。我认为它仍然是相同的数字(在你的情况下为3)。

2)JSF中的Action方法应返回重定向结果(类型为String)。这就是你有关于“签名字符串方法”的消息的原因。将addUser方法的签名从public void addUser(User u)更改为public String addUser(User u)并返回导航到新页面的结果或 null 以保留在同一页面上。