开发者

ViewScoped works like RequestScoped - why?

I wrote a ViewScoped Managed-Bean and every time I refresh the page in my webbrowser, the Managed-Bean seems to be recreated, article is null, it loads a new article-object and so on. For me it looks like the same behaviour as RequestScoped.

I use Eclipse IDE for Java EE Developers, the newest JDK, Apache Tomcat 7.0.8 and Mojarra 2.0.3.

What is wrong?

Managed-Bean:

...
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
...
@ManagedBean
@ViewScoped
public class CreateArticle {

    @ManagedProperty(value = "#{index.facade}")
    private PersistenceFacade facade;
    private Article article;
    private Vector<ArtCategory> artcat;

    public CreateArticle() {
        artcat = ArtCategory.listArtCat();
    }

    @PostConstruct
    public void postCreateArticle() {
        if (article == null) {
            try {
                article = facade.createArticle();
            } catch (DAOException e) {
                e.printStackTrace();
            }
        }
    }

    public void setFacade(PersistenceFacade facade) {
        this.facade = facade;
    }

    public Vector<ArtCategory> getArtcat() {
        return artcat;
    }

    public Article getArticle() {
        return article;
    }

    public String save() {
        try {
            facade.save(article);
            facade.commit();
        } catch (DAOException e) {
            e.printStackTrace();
        }
        FacesMessage message = new FacesMessage(
                "Successful!");
        FacesContext.getCurrentInstance().addMessage(null, message);
        return "/testpage.xhtml";
    }

}

createArticle.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">
<h:head>
    <title>Create article</title>
</h:head>
<h:body>
    <h1>
        <h:outputText value="System" />
    </h1>
    <h2>
        <h:outputText value="Test1" />
    </h2>
    <h3>
        <h:outputText value="Test2" />
    </h3>
    <h:form>
        <h:panelGrid columns="3">
            <h:outputLabel for="artname">Articlename</h:outputLabel>
            <h:inputText id="artname" value="#{createArticle.article.artname}"
                required="true">
                <f:ajax event="blur" render="artnameMessage" />
            </h:inputText>
            <h:message id="artnameMessage" for="artname" />

            <h:outputLabel for="briefdesc">Brief description</h:outputLabel>
            <h:inputTextarea id="briefdesc"
                value="#{createArticle.article.briefdesc}" required="false">
                <f:ajax event="blur" render="briefdescMessage" />
            </h:inputTextarea>
            <h:message id="briefdescMessage" for="briefdesc" />

            <h:outputLabel for="price">Price</h:outputLabel>
            <h:inputText id="price" value="#{createArticle.article.price}"
                required="true">
     开发者_JAVA百科           <f:ajax event="blur" render="priceMessage" />
            </h:inputText>
            <h:message id="priceMessage" for="price" />

            <h:outputLabel for="selectartcat">Article Category</h:outputLabel>
            <h:selectOneMenu id="selectartcat"
                value="#{createArticle.article.artcatnr}" required="true">
                <f:selectItems value="#{createArticle.artcat}" var="artcat"
                    itemLabel="#{artcat.name}" itemValue="#{artcat.artcatnr}" />
                <f:ajax event="blur" render="selectartcatMessage" />
            </h:selectOneMenu>
            <h:message id="selectartcatMessage" for="selectartcat" />

            <h:panelGroup />
            <h:commandButton value="Save"
                action="#{createArticle.save}">
                <f:ajax execute="@form" render="@form" />
            </h:commandButton>
            <h:messages globalOnly="true" layout="table" />
        </h:panelGrid>
    </h:form>
</h:body>
</html>


That's expected behaviour. Surely it will be recreated when you fire brand new HTTP GET requests by refreshing the page in the browser. Otherwise it would act like a session scoped bean and it would make the view scope useless (think about new GET requests in different browser tabs!). It will however not be recreated when you invoke any ajax requests or submit the form in the same view. A request scoped one would be recreated everytime. That's the core point/advantage of a view scoped bean.


Also make sure your implementing Serializable on your ViewScoped beans, just as you would with a SessionScoped bean.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜