ViewScoped 的工作方式与 RequestScoped 类似 - 为什么?

2023-12-07

我编写了一个 ViewScoped Managed-Bean,每次刷新 Web 浏览器中的页面时,该 Managed-Bean 似乎都被重新创建,文章为空,它加载一个新的文章对象等等。对我来说,它看起来与 RequestScoped 的行为相同。

我使用面向 Java EE 开发人员的 Eclipse IDE、最新的 JDK、Apache Tomcat 7.0.8 和 Mojarra 2.0.3。

怎么了?

托管 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";
    }

}

创建文章.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">
                <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>

这是预期的行为。当您通过刷新浏览器中的页面来触发全新的 HTTP GET 请求时,它肯定会被重新创建。否则它会像一个会话作用域的 bean 一样,并且会使视图作用域变得无用(想想不同浏览器选项卡中的新 GET 请求!)。然而它会not当您调用任何 ajax 请求或在同一视图中提交表单时,将重新创建。每次都会重新创建范围内的请求。这是视图作用域 bean 的核心点/优点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ViewScoped 的工作方式与 RequestScoped 类似 - 为什么? 的相关文章

随机推荐

  • PyQt4 - 将文件拖放到 QPushButton 中

    我认为标题是相当不言自明的 我正在努力创建一个小型独立应用程序 要求用户将音频文件拖放到按钮上 然后使用文件路径等将文件与硬件上的相应按钮关联起来 我已经遵循了大量的小部件拖放教程 我的朋友也遵循了列表的拖放教程 但是我开始相信这不能为按钮
  • 在单个链表中的任意索引处插入新节点

    我将如何创建一个函数 允许我在链表中 的任何索引处插入新节点 这是结构 struct node int data struct node next 这是函数 注意只有一个双指针 索引和数据参数 void insertN struct nod
  • “填充无效且无法删除”-这段代码有什么问题吗?

    每次我运行这个并加密时 输出都是可变的 当我尝试解密时 我收到 填充无效且无法删除 已经和这个斗争了一两天了 我很茫然 private static string strIV abcdefghijklmnmo The initializat
  • Break D3 每个循环没有标志

    考虑以下代码 circle each function d code 我怎样才能打破循环 是否有一种自然的 D3 方法可以打破 every 循环 我的意思是没有标志如下 var flag false circle each function
  • 如何在 dplyr 中对将 NA 放在第一位进行排序? [复制]

    这个问题在这里已经有答案了 考虑以下示例 require tibble require dplyr set seed 42 tbl lt data frame id letters 1 10 val c runif 5 NA runif 4
  • 致命错误:找不到“Google_Auth_AssertionCredentials”类

    我正在尝试将旧的 google api 迁移到新的 api 这样我就可以获取 google 分析数据 我正在尝试与this示例 但它会引发此错误 致命错误 找不到类 Google Auth AssertionCredentials 示例 p
  • ReactJS中的渲染函数

    快问 我正在学习react js 当我们创建组件时 我们在渲染函数中提供要渲染的组件的 html 模板 到目前为止 我只看到了带有非常小的 html 片段的小组件 但我只是想知道如果我们有一个带有巨大 html 模板的组件会发生什么 有没有
  • Core 3.0 更新后 Azure 函数停止工作

    该代码在 Core 3 0 Preview7 版本中工作 但更新到 3 0 Azure 函数后开始出现错误 如果我尝试访问构建器服务对象 则会出现错误 也无法调试问题 还尝试更新 Microsoft Extensions Dependenc
  • 等待 HTML5 视频加载

    我有一个视频标签 当我让用户从数据库中的多个视频中进行选择时 我会动态更改其来源 问题是 当我更改 src 属性时 即使我告诉它 视频也不会加载 这是我的代码 video attr src my video value ogg video
  • 更改我的 jquery mobile 主题会更改我的 css 样式

    我在网站上创建了一个可折叠集 看起来与此类似 div style margin auto padding top 50px padding bottom 20px div h2 span style font size 16px font
  • BSD 套接字 - 如何使用非阻塞套接字?

    我正在尝试使用非阻塞 TCP 套接字 问题是他们仍然在阻止 代码如下 服务器代码 struct sockaddr name char buf 80 void set nonblock int socket int flags flags f
  • 如何从 (SQLite) 数据库加载的 JTable 中插入、更新和删除项目

    我目前有 2 个类 一类显示 GUI 一类是从数据库获取项目 我的代码如下 此代码用于在我的 GUI 中显示 JTable public void table if SOMR tableCall true this columnNames
  • 迭代对象时如何断言匹配类型?

    以下代码块会产生打字稿错误 因为尽管we我知道foo k and bar k 是同一类型 TS 无法知道 好吧 也许通过某种魔法它可以 但显然它不知道 interface IMixed a number b string c boolean
  • 从 Web 服务访问 FacesContext

    我正在开发一个 Web 服务 该服务将由我编写的客户端调用 在 Web 服务中 我需要使用应用程序范围的对象 以减轻系统上应用程序的负载 我已经实现了我的应用程序范围的对象 如下所示这个问题 我可以在 jsf 页面中使用我的对象 没有任何问
  • 有 GZIP J2ME 库吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有适用于 J2ME 的 gzip 压缩库 Try Jazzlib 虽然是GPL 而且好像已经有一段时间没有更新了 另一种选择是尝试从libgcj
  • XSLT 模板中的超链接

    我正在尝试使用 XML 信息和 XSLT 模板创建超链接 这是 XML 源
  • php preg_replace 特定 html 注释标签之间的所有内容

    我检查了其他答案 但似乎无法执行以下操作 请帮助别人 我想删除中间的所有内容 包括特定的 html 注释 HTML Some HTML that must stay some html that must go Some more HTML
  • 将 opencv 重映射代码从 c++ 转换为 python

    我正在尝试将 c opencv cv2 remap 代码转换为 python 我没有收到任何错误 但结果不符合预期 我得到了缩放图像 c code int main Mat img imread captcha1 jpg float pha
  • Angular:ng-repeat 不起作用

    这是我的代码 我从 w3school 获取的
  • ViewScoped 的工作方式与 RequestScoped 类似 - 为什么?

    我编写了一个 ViewScoped Managed Bean 每次刷新 Web 浏览器中的页面时 该 Managed Bean 似乎都被重新创建 文章为空 它加载一个新的文章对象等等 对我来说 它看起来与 RequestScoped 的行为