为什么 JSF 将 UI 组件的状态保存在服务器上?

2024-02-14

  1. JSF 在服务器端保存 UI 组件的状态到什么时间以及 UI 组件的状态信息具体何时被删除从服务器内存?当应用程序上的登录用户浏览页面时,组件的状态是否会继续在服务器上累积?

  2. 我不明白在服务器上保持 UI 组件状态有什么好处!?直接将验证/转换的数据传递给托管 bean 还不够吗?我可以或者应该尝试避免它吗?

  3. 那不消耗too much服务器端的内存,如果有数千个并发用户会话?我有一个应用程序,用户可以在其中发布有关某些主题的博客。这个博客的规模相当大。当有回发或查看博客的请求时,这个大页面数据会被保存为组件状态的一部分吗?这会消耗太多内存。这难道不是一个问题吗?


更新1:

现在,使用 JSF 时不再需要保存状态。高性能无状态 JSF 实现可供使用。看到这个blog http://industrieit.com/blog/2011/11/stateless-jsf-high-performance-zero-per-request-memory-overhead/ & 这个问题 https://stackoverflow.com/questions/10385340/jsf-state-saving-initially-to-server-on-session-timeout-transfer-to-client相关细节和讨论。另外,还有一个开放的issue http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-1055在 JSF 规范中包含一个为 JSF 提供无状态模式的选项。 (P.S.考虑对这些问题进行投票this http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-1055 & this https://issues.apache.org/jira/browse/MYFACES-3465如果这对您来说是一个有用的功能。)


更新 2(2013 年 2 月 24 日):

一个好消息莫贾拉 2.1.19出去了无状态模式!

看这里:

http://weblogs.java.net/blog/mriem/archive/2013/02/08/jsf-going-stateless?force=255 http://weblogs.java.net/blog/mriem/archive/2013/02/08/jsf-going-stateless?force=255

http://java.net/jira/browse/JAVASERVERFACES-2731 http://java.net/jira/browse/JAVASERVERFACES-2731

http://balusc.blogspot.de/2013/02/stateless-jsf.html http://balusc.blogspot.de/2013/02/stateless-jsf.html


为什么JSF需要在服务器端保存UI组件的状态?

因为 HTTP 是无状态的,而 JSF 是有状态的。 JSF 组件树会发生动态(编程)更改。 JSF 只需要知道表单显示给最终用户时的确切状态,以便在表单提交回时,它可以根据原始 JSF 组件树提供的信息成功处理整个 JSF 生命周期。服务器。组件树提供有关请求参数名称、必要的转换器/验证器、绑定的托管 bean 属性和操作方法的信息。当例如这disabled or readonly输入组件的属性以编程方式更改为true并且这些信息保存在视图状态中,这对于防止请求被篡改起着重要的作用。


JSF 在服务器端保存 UI 组件的状态到什么时间点,以及 UI 组件的状态信息具体什么时候从服务器内存中删除?

这两个问题似乎归结为同一个问题。无论如何,这是特定于实现的,并且还取决于状态是保存在服务器还是客户端上。当它过期或队列已满时,一个适当的实现会将其删除。例如,当状态保存设置为会话时,Mojarra 的默认限制为 15 个逻辑视图。这可以使用以下上下文参数进行配置web.xml:

<context-param>
    <param-name> com.sun.faces.numberOfViewsInSession</param-name>
    <param-value>15</param-value>
</context-param>

也可以看看莫哈拉常见问题解答 https://wikis.oracle.com/display/GlassFish/JavaServerFacesRI#JavaServerFacesRI-Whatcontextparametersareavailableandwhatdotheydo%3F对于其他 Mojarra 特定参数和此相关答案com.sun.faces.numberOfViewsInSession 与 com.sun.faces.numberOfLogicalViews https://stackoverflow.com/questions/4105439/jsf-numberofviewsinsession-vs-numberoflogicalviews-and-viewexpiredexception/16050424#16050424


当应用程序上的登录用户浏览页面时,组件的状态是否会继续在服务器上累积?

从技术上讲,这取决于实施。如果您谈论的是页面到页面导航(仅 GET 请求),那么 Mojarra 不会在会话中保存任何内容。然而,如果它们是 POST 请求(带有命令链接/按钮的表单),那么 Mojarra 将保存会话中每个表单的状态,直到达到最大限制。这使最终用户能够在同一会话的不同浏览器选项卡中打开多个表单。

或者,当状态保存设置为客户端时,JSF 将不会在会话中存储任何内容。您可以通过以下上下文参数来做到这一点web.xml:

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

然后,它将被序列化为隐藏输入字段中的加密字符串,名称为javax.faces.ViewState的形式。


我不明白将 UI 组件的状态保留在服务器端有什么好处。直接将验证/转换的数据传递给托管 bean 还不够吗?我可以/应该尝试避免它吗?

这还不足以确保 JSF 的完整性和稳健性。 JSF 是一个具有单一控制入口点的动态框架。如果没有状态管理,人们就能够以某种方式欺骗/破解 HTTP 请求(例如,操纵disabled, readonly and rendered属性),让 JSF 做不同的并且有潜在危险的事情。它甚至容易受到 CSRF 攻击和网络钓鱼。


如果有数千个并发用户会话,这不会在服务器端消耗太多内存吗?我有一个应用程序,用户可以在其中发布有关某些主题的博客。这个博客的规模相当大。当有回发或请求查看博客时,大型博客将被保存为组件状态的一部分。这会消耗太多内存。这难道不是一个问题吗?

内存特别便宜。只需给应用程序服务器足够的内存即可。或者,如果网络带宽对您来说更便宜,只需将状态保存切换到客户端即可。要找到最佳匹配,只需对您的 Web 应用程序进行压力测试并使用预期的最大并发用户数进行分析,然后为应用程序服务器提供最大测量内存的 125% ~ 150%。

请注意,JSF 2.0 在状态管理方面有了很大改进。可以保存部分状态(例如only the <h:form>将被保存而不是全部内容<html>一直到最后)。例如,Mojarra 就是这么做的。具有 10 个输入字段(每个字段都有标签和消息)和 2 个按钮的平均表单占用的空间不超过 1KB。如果会话中有 15 个视图,则每个会话不应超过 15KB。对于大约 1000 个并发用户会话,该大小不应超过 15MB。

您应该更关注会话或应用程序范围中的真实对象(托管 bean 和/或什至数据库实体)。我见过很多代码和项目,它们不必要地将整个数据库表复制到 Java 内存中,就像会话作用域 bean 一样,其中使用 Java 而不是 SQL 来过滤/分组/排列记录。大约有 1000 条记录,很容易就会超过 10MB每个用户会话。还有当binding用于视图或会话范围的 bean,那么您基本上就没有必要在服务器内存中保留整个 JSF 组件树的深层副本。

也可以看看:

  • JSF 是否阻止通过篡改请求调用未呈现的托管 Bean 操作 https://stackoverflow.com/questions/31978113/does-jsf-prevent-calls-to-unrendered-managed-bean-actions-by-tampered-requests/
  • 没有 @ViewScoped 的 JSF https://stackoverflow.com/questions/61621240/jsf-without-viewscoped/
  • 视图构建时间是多少? https://stackoverflow.com/questions/31890433/whats-the-view-build-time/
  • JSF 中的“绑定”属性如何工作?何时以及如何使用它? https://stackoverflow.com/questions/14911158/how-does-the-binding-attribute-work-in-jsf-when-and-how-should-it-be-used
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 JSF 将 UI 组件的状态保存在服务器上? 的相关文章

随机推荐

  • 在贝塞尔曲线路径上移动对象

    我想在贝塞尔曲线路径上从上到下移动图像 但我不知道如何计算该路径的 x y 点和斜率 该路径如下图所示 我有起点 终点和两个控制点 Path path new Path Point s new Point 150 5 Point cp1 n
  • 如何让puppeteer浏览器保持在后台运行而不跳转到前台?

    使用时puppeteer通过a抓取一堆网站for loop 每当创建一个新页面时 浏览器就会跳转到前台 这妨碍了我在计算机上做其他事情 即使我设置了以下参数 它仍然不起作用 那么我怎样才能让浏览器安静地运行而不跳到前台并打断我呢 我需要跑进
  • 如何在 mPDF 中设置自定义页面尺寸?

    我需要一些有关 mPDF 的帮助 我想设置我的自定义页面尺寸 确切地说 宽度 49 毫米 高度 200 毫米 但我找不到解决方案 我找到了 mPDF 手册 http mpdf1 com manual index php tid 184 ht
  • Pyside安装错误

    我有 32 位 Windows 7 操作系统 今天 我尝试下载 PySide 安装程序 但是 在我尝试运行下载的文件后 出现以下错误 PySide 安装程序无效或损坏 为什么我会得到这个 我最近开始了一门关于使用 Qt 框架使用 Pytho
  • Matplotlib 添加默认水印

    我在用着matplotlib对于工作和公司来说 政策是在我们制作的每个图上都包含水印 有没有办法设置matplotlib默认情况下执行此操作 我目前正在通过每个Axes对象到辅助函数中 该函数在左下角添加水印 import matplotl
  • 如何隐藏/显示UIimageview?

    void viewDidAppear BOOL animated super viewDidAppear animated CGRect viewRect CGRectMake 250 100 30 30 as UIImageView al
  • “政党模式”背后的原则和好处是什么?

    派对模型 是关系数据库设计的一种 模式 它至少有一部分涉及找到许多实体 例如客户 员工 合作伙伴等 之间的共性 并将其分解到一些更 抽象 的数据库表中 我想了解您对以下问题的想法 政党模式背后的核心原则和动力是什么 它规定您对数据模型做什么
  • hadoop pagerank运行时出现错误

    我已经在我的 vmware 上安装了 hadoop 并设计了我的 jar 文件 pagerank 运行以下命令 hadoop jar PageRank 1 0 0 jar PageRankDriver init 输入输出 2 出现以下错误
  • R 如何在另一个函数中将函数作为字符串传递

    对于这个小难题的任何帮助将不胜感激 我正在尝试向tq transmute函数从tidyquant包裹 参数的值是一个函数 但是我想将其作为字符串传递 在下面示例的范围内 我将通过 Shiny 传递它 selectInput 我已经尝试了所有
  • 如何检测地址/坐标中是否可以使用 Google 街景

    我正在制作一个使用 Google 街景图像 API 的应用程序 我可以毫无问题地根据地址 坐标获取街景图像 但是 我想检测特定地址是否有可用的街景图像 以便为没有街景图像的地址显示不同的行为 到目前为止我唯一的想法是读取返回图像的像素并检测
  • java: R 无法解析为变量

    我知道这个问题以前已经被问过 但我对此无能为力 我刚刚创建了一个新项目并收到此错误 当然 R java 文件没有被生成 我正在使用 JRE7 android 4 2 2 package com example myfirstapp impo
  • TensorFlow 中张量值的条件分配

    我想复制以下内容numpy代码在tensorflow 例如 我想分配一个0到先前值为的所有张量索引1 a np array 1 2 3 1 a a 1 0 a should be 0 2 3 0 如果我写类似的代码tensorflow我收到
  • 如何在Windows服务器上运行solr使其自动启动?

    如何在 Windows 服务器上运行 solr 使其自动启动 我运行它 java jar start jar 但我需要服务器自动执行此操作 使用您需要的命令创建一个批处理文件并在启动时运行它 一些these http windowsxp m
  • 场景生成器中的自定义控件 ClassNotFoundException

    我通过扩展现有控件创建了一个新控件 并且我想在我的 JavaFX 场景中使用这个新控件 我希望能够使用场景生成器编辑场景 但是将新控件添加到 FXML 文件后 我遇到了ClassNotFoundException打开场景生成器时 例如 这是
  • 为什么这段代码不会抛出 StackOverflow 异常

    在 clojure v1 6 0 中 这段代码会永远运行并消耗 100 的一个核心 defn average x y x y 2 defn improve guess x average guess x guess defn sqrt it
  • Spotify API - 在 Google Apps 脚本中检索有效访问令牌

    以下是 Spotify API 的文档 我使用的是隐式授权流程 https beta developer spotify com documentation general guides authorization guide implic
  • IntelliJ 中的 Cucumber.js 调试

    IntelliJ 有一个 Cucumber js 插件 这假设可以在 IDE 内启用运行和调试 cucumber js 的运行配置有效 但调试模式已停用 无法单击 调试 按钮 还有其他人有同样的问题并设法解决它吗 调试对我来说非常重要 谢谢
  • Python3 TypeError:列表索引必须是整数或切片,而不是 str

    我的任务是获取字符串 AAAABBBCCDAABBB 放入这样的列表中 A B C D A B 我现在已经为此工作了 2 个小时 但无法找到解决方案 到目前为止 这是我的代码 list string AAAABBBCCDAABBB i 1
  • 阅读 Facebook 中的消息

    我一直在尝试阅读来自特定用户 朋友 的消息 我在图形 API 中找不到有关查询 Facebook 消息中的消息或线程的正确文档 谁能帮帮我吗 您只能为使用您的应用程序的用户阅读消息 而不能为他的朋友阅读消息 这是一件好事 要为当前用户执行此
  • 为什么 JSF 将 UI 组件的状态保存在服务器上?

    JSF 在服务器端保存 UI 组件的状态到什么时间以及 UI 组件的状态信息具体何时被删除从服务器内存 当应用程序上的登录用户浏览页面时 组件的状态是否会继续在服务器上累积 我不明白在服务器上保持 UI 组件状态有什么好处 直接将验证 转换