1

我想创建一个可以将朋友添加到列表中的网络应用程序。出于这个原因,我使用 JSF 和 Java Beans,但现在我遇到了一些严重的问题。

首先我创建了一个朋友类:

package at.fhjoanneum.ima11.listoffriendsjsf;

import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;


@Named("friend")
@RequestScoped
public class Friend implements Serializable{

    private String nickname;
    private String firstname;
    private String lastname;

    public Friend() {
    }



 @Override
    public boolean equals(Object obj) {
    if (obj != null && obj instanceof Friend) {
    Friend other = (Friend) obj;
    return this.getNickname().equals(other.getNickname());
    }
    return false;
    }
    // getter, setter, equals, hashcode
    }

为了存储我的朋友,我创建了另一个 bean:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;


@Named("listOfFriendsBean") @SessionScoped
public class ListOfFriendsBean implements Serializable {

    private List<Friend> listOfFriends = new ArrayList<Friend>();


    public String addFriend(Friend friend) {
        if(!listOfFriends.contains(friend)) {
            listOfFriends.add(friend);
            return "index";
        } else {
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_FATAL, "Your friend is already stored in the list!", null);
            FacesContext.getCurrentInstance().addMessage(null, msg);
            return "index";    
        }
    }

    public List<Friend> getListOfFriends() {
        return listOfFriends;
    }

最后但并非最不重要的一点是,我创建了一个 JSF 文件(只是其中的一部分,这只是添加好友的表单。上面是存储好友的表格):

<p:panel header="Add friend">
                <h:panelGrid columns="2" columnClasses="column" cellpadding="5">
                    <p:outputLabel value="Nickname" for="nickname"/>
                    <p:inputText id="nickname" required="true" value="#{friend.nickname}" />
                    <p:outputLabel value="Firstname" for="firstname"/>
                    <p:inputText id="firstname" required="true" value="#{friend.firstname}" />
                    <p:outputLabel for="lastname" value="Lastname"/>
                    <p:inputText id="lastname" required="true" value="#{friend.lastname}" />
                </h:panelGrid>
            </p:panel>


            <p:commandButton value="Add" styleClass="ui-priority-primary" ajax="false" 
                             action="#{listOfFriendsBean.addFriend(friend)}" />

当我添加第一个朋友时,一切正常,但之后我收到一个错误,即该朋友已存储在列表中,并且旧朋友的值已更改为新值。所以我确定我的网络应用程序正在使用同一个朋友实例,但我没有得到它,因为我使用了朋友类的请求范围。它不应该为每个请求创建一个新的朋友实例吗?我该如何解决这个问题?

感谢您的帮助!

4

3 回答 3

0

我不习惯这种用法,但addFriend似乎需要在此处复制 Friend 参数。

于 2013-04-15T17:11:16.837 回答
0

我认为您应该覆盖 Friend bean 的 equals 方法:

    package at.fhjoanneum.ima11.listoffriendsjsf;

    import java.io.Serializable;
    import javax.enterprise.context.RequestScoped;
    import javax.inject.Named;


    @Named("friend")
    @RequestScoped
    public class Friend implements Serializable{

        private String nickname;
        private String firstname;
        private String lastname;

        public Friend() {
        }
    // getter, setter, equals, hashcode

        @Override
        public boolean equals(Object obj){
            if(obj instanceof Friend && isEqual()){
               return true;
            }
            else 
                return false; 
        }

}
于 2013-04-15T17:13:00.507 回答
0

请检查您的 equals 方法,如果它包含正确的业务模型对象覆盖(朋友)

于 2013-04-15T17:28:46.423 回答