具有请求和会话范围的Java Bean

时间:2013-04-15 16:59:02

标签: java jsp servlets scope javabeans

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

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

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)}" />

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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; 
        }

}

答案 2 :(得分:0)

如果plz包含正确的业务模型对象覆盖(朋友)

,则检查你的equals方法