JSF会话作用域

时间:2012-08-20 13:16:13

标签: java ajax jsf richfaces

所以我发现了这个问题,这真的很奇怪..

所以我有这个xhtml页面:

<h:form>
        <rich:dataTable value="#{carsBean.myList}" var="car">
            <rich:column>
                <f:facet name="header">
                    <h:outputText value="Name" />
                </f:facet>
                <h:inputText value="#{car.name}">
                    <p:ajax event="keyup" listener="#{carsBean.print}" />
                </h:inputText>
            </rich:column>
            <rich:column>
                <f:facet name="header">
                    <h:outputText value="Company" />
                </f:facet>
                <h:inputText value="#{car.company}">
                    <p:ajax event="keyup" listener="#{carsBean.print}" />
                </h:inputText>
            </rich:column>
            <rich:column>
                <f:facet name="header">
                    <h:outputText value="Address" />
                </f:facet>
                <h:inputText value="#{car.address}">
                    <p:ajax event="keyup" listener="#{carsBean.print}" />
                </h:inputText>
            </rich:column>
        </rich:dataTable>
        <h:commandButton value="save-empty">

        </h:commandButton>
    </h:form>

以下是managedbean:

@ManagedBean(name="carsBean")
@SessionScoped
public class CarsBean implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -7818770780064447805L;
    private List<Car> myList;
    private String test;

    public CarsBean(){}

    public void print(){
        System.out.println("I got hit!");
    }

    /**
     * @return the myList
     */
    @PostConstruct
    void initialiseSession() {
        FacesContext fc = FacesContext.getCurrentInstance();
        fc.getExternalContext().getSession(true);
        if(myList==null){
            myList = new ArrayList<Car>();
        };
        if(myList.isEmpty()){
            for(int a=0;a<10;a++){
                myList.add(new Car("test","test","test"));
            }
        }
    }

    public List<Car> getMyList() {
        return myList;
    }

    /**
     * @param myList the myList to set
     */
    public void setMyList(List<Car> myList) {
        this.myList = myList;
    }

    public String getTest() {
        return test;
    }

    public void setTest(String test) {
        this.test = test;
    }

    public static class Car{
        private String name;
        private String company;
        private String address;

        public Car(){}

        public Car(String name, String company, String address) {
            super();
            this.name = name;
            this.company = company;
            this.address = address;
        }

        /**
         * @return the name
         */
        public String getName() {
            return name;
        }
        /**
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
        /**
         * @return the company
         */
        public String getCompany() {
            return company;
        }
        /**
         * @param company the company to set
         */
        public void setCompany(String company) {
            this.company = company;
        }
        /**
         * @return the address
         */
        public String getAddress() {
            return address;
        }
        /**
         * @param address the address to set
         */
        public void setAddress(String address) {
            this.address = address;
        }
    }
}

现在的目标是在sessioncope中保存用户输入,这样即使用户关闭选项卡或发出新请求,数据仍会保留。

上面的代码可以工作,但我注意到,当我删除输入框上的ajax事件时,它就会发挥作用。

有什么想法吗?

感谢

1 个答案:

答案 0 :(得分:4)

ajax事件导致您的更改被发送到服务器,并在会话中保留。如果你没有它们,你将需要其他东西来做它。通常情况下,你会做一个普通的帖子(你的表单上的任何提交按钮都会这样做)。但是,您的用户必须单击按钮才能明确保存更改。

如果你的目标真的是你的用户可以玩,关闭他们的标签,当他们回来时,一切就像他们离开时一样,无论如何你都需要ajax事件。