五. 实例验证

下面使用GlassFish v3来测试JSF2.0 RI的ViewState情况。

JSF2.0规范中提供了三个上下文参数来指定应用的ViewState策略,可在web.xml文件中使用context-param元素来配置。第一个是从JSF1.2就流传下来的[b]javax.faces.STATE_SAVING_METHOD[/b],取值为server或client,用于配置把视图状态数据放在服务器端还是传递到客户端,默认为server。第二个是[b]javax.faces.PARTIAL_STATE_SAVING[/b],取值为true或false,用于配置是否在应用范围内启用或禁用增量视图状态,默认为true。第三个是[b]javax.faces.FULL_STATE_SAVING_VIEW_IDS[/b],取值为一系列用逗号分隔的ViewId,用于配置当增量视图状态开启时,需要强制保存完全视图状态的页面,默认为空。

首先使用一个简单的页面测试:

<?xml version="1.0" encoding="UTF-8" ?>

<html xmlns="http://www.w3.org/1999/xhtml"      xmlns:h="http://java.sun.com/jsf/html">

    <h:body>        <h:form>            <h:outputLabel>name</h:outputLabel>            <h:inputText/>            <h:commandButton value="submit"/>        </h:form>    </h:body></html>  

修改web.xml为

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

    <context-param>        <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>        <param-value>false</param-value>    </context-param>

表示把视图状态传递到客户端,并且使用完全视图状态。访问该页面后,在浏览器中使用“查看源代码”功能来查看响应内容。可以发现其中包括这样的视图状态隐藏域:

<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="H4sIAAAAAAAAAL1WTWwbRRSerJ3/pDRJVYSgURERpJBsYjl2nKa0cdKELHF+VLuBwMEdryfxhv1jdtZZ9xDRCxy4VGo5IAXBgQOHcuLGAQQckJCKBBIXTghxBC6A+LnAm1mvf4TdVXroSDua2Zn33rz3vm/e3PkFdboUjbyc2cdlLOvY3JM3C/tEZfM3v37x3ZPOOV1CyLMRQl0ORXHVMmTHNeVdrBJHxrataypmmmXKWYYZWccm3iNUMWx9LEcJ2bCK5Pfdjz/5cPq5Twe4noNJxNtZbs2ragGdtmUSk8lXlW2NHFyxLIY69/NaMeY5r6JDJB1MCKnRdlKbLrNdhrq4DJsJhGIg0oGeaC1UYoYur0K3YlGjKpkIJFMgKaGnQyR9qxlcIHpVQTJQkBQKxkMUKCbI54gXnDwViJ8X4hMh4kuWYWCzuOgyZplVFXOey1XwJrUYddnQarP+Q4rkdjFdCsZjW9SyCWWVNVJxULUNQzIpOlEHzbLpGo2LNkMDlJhFQgnNVWxSpihatrQiqjfPBvuTYUhoa557cQJCp1sq1gmA86Q4jcs0Xc6If4d/DV07mv77ZwlFFdRTwk5JBTxmULdquSajFYaGBeynuAdTWUY1c28+g3r41AUccwsPw/Yypho2mZh69r/QGJKuZqGDoyJ0yBdGGOr3/V3TmFJkqG81t57JL6azylKwoUvHDqzBUYfqgVNMRoAywz++9/6fN95ISahDQZ1lrLvEC1wS+zZco0Do63feOtN/+4c3A1J21HSXIV7c7qkpPhJsvEwMS/Y4XppNLlqWTrB59yx97bujf34Fky8FJm0UUK8Ok45jQKqbDx5i/sGDtC5axQqkOnE8qG1RrQxOtEj5KcwgVwWXESdXwixNSZYwcHGkDoA0pbiS0Rzm3fj2zNtf4nciPK5RR7tORNyiB1Heg9CTrU8lArhq6ZDQLC4TuvPVR8/eOrq7LiEpg3pVyKSzgY0AIn0O7CkKGYZO+6DSrKksAeDo2nVc0Mm8Z9tlvj0uSJ4Agow236a818EROb21lVGWL4fuW09fWcsr9X1PtXZlW1l+IZ/ZXErnlM2N/NryjidAMwgYrQeyhhARvlXgyjq2O7u//+yL09e+iSBpBfXpFi6uYJVZVEG9rESJU4L4ePalBR8IBz3Q8y/C1V8EjY80HojDUhCTl4ufPh+8+dvzt56RUERBXaqlu4YJ+dE1E/gZtTErVdkG6ga52jbA5rsuwNpkbDY+m0qmUjPxfHJ2LqEm4zG+dh5OkWgTPg2qlHyZ7GJXZyv+z7E0VLRKznqFmH98MLFztLC/4Jet0dbmgRyT09O3xz0BzfFaCbo3eZop09uKMrwqAWXOtaMMXw+/Gf3rhk8fD9ISE9N4AwV89PA+1TC+UENVNzFVBjd4w+JFYeKS+JP+X/olP/28X4LpUODjcvtkxXabA5ioRSdyH5fPUGPURH1u9jwiPI+EeH5sRx+Dry/E0WSi2dFk/fSohX/R+7tw+Zvigbj8KHz9IS7PxJtdTjUev8O3zJqfaVCLtCKGi0ZehDq1HczqUveOWmt+DTeVJPFoeiAxkuEbCIPFtAdsb/PgEwWSv/TCCO/XcIiz4xYMjTVFfY7PDv8DUovXIu8LAAA=" autocomplete="off" />

其中视图状态信息是[color=red]1636字节(1.6k)[/color]。现在把web.xml中的javax.faces.PARTIAL_STATE_SAVING上下文参数修改为true,重启应用后刷新页面。可发现视图状态隐藏域变为:

<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="H4sIAAAAAAAAAJVSQWsTQRR+3SS1DVFqDL3ZUxEEnVAwUAxigmlocKuBrWDxoJPNtDtxdnecebvZ9FDwHwiehIpXD976C8SDICjo0f/gTe/ObGLTgx4cmLezb+a9933vfe9+QElqBRdHNKUkQS7INtXBDpWlc9/ff1h98rUAThfKIqbDLvUxVj1YxkAxHcRimMnbLbCrMl4ydsXsAsLi6DEf4o1EwaVHbp5X0OiA3B+MmI/NF18evlnRV4UDkEkT4CTP4AgK5lSSZs3/jhQQG52RfeozTfw4lHHEIiQPenf+nNf7KpZM4eQum2iYrapJreDCvPRWlIRnLyVCmSIqPkiQaW1LwozJYs7E7gWENVOT6CSaIbBWMNSk3e+7va2O6VvjHy94KAXpsH2aCOxOnettKcVkN37Kol9vr+0dt0atisUyXoNaPeVs7CFF1mFhTLIAQ2EQXN9onvzMMtOJxv91oq94apKd5WxJLiHU5rx3A4ptxTyD14xqLoC2UnTico3Z82+XX32krwuw0IOi5odsOrFx0VoTdOXvqHIi20YfTHk0ZWrv08mtl8efdxxwXFj2BdX6Hg0ZQjWXR93OqO4ZWNFB04WyNjHDPAfC6vQFj+seU5wKfkgHgjUzKVNLqJrPriatrRgnwvlcfI2b+WfzVE1Fqy2EknVvnHodKbPf9nnPfQIDAAA=" autocomplete="off" />

其中视图状态信息是[color=red]696字节(0.7k)[/color],减少了[color=red]57%[/color]。

如果把其中form中的内容重复10次

<?xml version="1.0" encoding="UTF-8" ?>

<html xmlns="http://www.w3.org/1999/xhtml"      xmlns:h="http://java.sun.com/jsf/html">

    <h:body>        <h:form>            <h:outputLabel>name</h:outputLabel>            <h:inputText/>            <h:commandButton value="submit"/>            <br/>

            <h:outputLabel>name</h:outputLabel>            <h:inputText/>            <h:commandButton value="submit"/>            <br/>

            ...重复10次        </h:form>    </h:body></html> 

在完全视图状态下,视图状态尺寸是[color=red]2248字节[/color](为节省篇幅,不再贴出视图状态原文)。在增量视图状态下,视图状态尺寸是[color=red]752字节[/color],减少约[color=red]66%[/color]。不难算出,在完全视图状态下,重复部分的单位视图状态尺寸是(2248-1636) / (10 - 1) = [color=red]68字节[/color]。而在增量视图状态下,重复部分的单位视图状态尺寸是 (752-696) / (10 - 1) = [color=red]6字节[/color]。随着组件数目的增多,增量视图状态的优势将更为明显。

下面测试Facelet动态页面与编程方式动态页面增量视图状态尺寸差别。

如果使用ui:repeat标签来动态创建组件,如下:

页面

<html xmlns="http://www.w3.org/1999/xhtml"      xmlns:h="http://java.sun.com/jsf/html"      xmlns:ui="http://java.sun.com/jsf/facelets">

    <h:body>        <h:form>            <ui:repeat value="#{viewStateBean.range}" var="idx">                <h:outputLabel>name#{idx}</h:outputLabel>                <h:inputText/>                <h:commandButton value="submit"/>                <br/>            </ui:repeat>        </h:form>    </h:body></html> 

Bean:

@ManagedBean(name = "viewStateBean")@RequestScopedpublic class ViewStateDemoBean {    private List<Integer> range = new AbstractList() {        @Override        public Object get(int index) {            return index;        }

        @Override        public int size() {            return 10;        }    };

    public List<Integer> getRange() {        return this.range;    }}

增量视图状态尺寸为[color=red]1068字节[/color]。

如果使用编程方式来动态创建组件,如下:

<html xmlns="http://www.w3.org/1999/xhtml"      xmlns:h="http://java.sun.com/jsf/html"      xmlns:ui="http://java.sun.com/jsf/facelets">

    <h:body>        <h:form binding="#{viewStateBean.form}">            <h:commandButton actionListener="#{viewStateBean.populateForm}" value="populate"/>        </h:form>    </h:body></html>  
@ManagedBean(name = "viewStateBean")@RequestScopedpublic class ViewStateDemoBean {    private UIComponent form;

    public void setForm(UIComponent form) {        this.form = form;    }

    public UIComponent getForm() {        return this.form;    }

    public void populateForm(ActionEvent e) {        List<UIComponent> children = form.getChildren();        Application app = FacesContext.getCurrentInstance().getApplication();        children.clear();        UIComponent c;        for (int i = 0; i < 10; i++) {            c = app.createComponent(HtmlOutputLabel.COMPONENT_TYPE);            c.getAttributes().put("value", String.format("name%s", i));            children.add(c);

            c = app.createComponent(HtmlInputText.COMPONENT_TYPE);            children.add(c);

            c = app.createComponent(HtmlCommandButton.COMPONENT_TYPE);            c.getAttributes().put("value", "submit");            children.add(c);

            c = app.createComponent(HtmlOutputText.COMPONENT_TYPE);            c.getAttributes().put("value", "<br/>");            c.getAttributes().put("escape", false);            children.add(c);        }    }}

访问页面,点populate按钮后,动态创建出10组Label + 输入框 + 按钮。增量视图状态为[color=red]2124字节[/color]。可以看出,通过编程方式动态创建的组件,视图状态与完全视图状态类似。而通过Facelet的ui:repeat等特性创建的组件,则可享受到增量视图状态的优化。

JSF 2.0阅读笔记:视图状态 (四)相关推荐

  1. Hadoop阅读笔记(四)——一幅图看透MapReduce机制

    时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样"有口无心"的学习方式是不奏效的,或者是收效甚微的.如 ...

  2. 深入理解 C 指针阅读笔记 -- 第四章

    Chapter4.h #ifndef __CHAPTER_4_ #define __CHAPTER_4_/*<深入理解C指针>学习笔记 -- 第四章*//*指针数组 -- 意思就是这是一个 ...

  3. Hive-1.2.0学习笔记(四)Hive表管理

    鲁春利的工作笔记,谁说程序员不能有文艺范? Hive默认只有一个数据库default,并且默认的文件存储路径由配置文件hive-default.xml文件指定. <property>< ...

  4. Live555源码阅读笔记(四):groupsock 目录详解

    一.groupsock 目录介绍 groupsock 目录总共有16个源码文件,编译后生成 libgroupsock.a,这个库中的类封装了网络接口和套接字,特别是"Groupsock&qu ...

  5. PREMIS元数据字典3.0阅读笔记(一)

    一.3.0版本与之前版本区别 将知识实体重新定位为对象类别,以便在 PREMIS 中进行附加描述并链接到相关 PREMIS 实体. 重新定位环境(即使用数字对象所需的硬件和软件),以便可以重复使用对象 ...

  6. [iOS开发]——系统框架(effectiveOC2.0阅读笔记)

    系统框架 第47条:熟悉系统框架 要点 第48条:多用块枚举,少用for循环 for循环 使用 Objective-C 1.0的 NSEnumerator 来遍历 快速遍历 基于块的遍历方式 要点 第 ...

  7. 【蓝牙sbc协议】sbc源码阅读笔记(四)——sbc_encode函数详解

    sbc_encode函数详解 函数定义: // sbc.c SBC_EXPORT ssize_t sbc_encode(sbc_t *sbc, const void *input, size_t in ...

  8. 《西瓜书》阅读笔记——第四章

    <第四章>决策树 1. 基本流程 决策树(decision tree):从给定训练数据集学得一个模型用以对新示例进行分类. 决策树模型是基于树模型进行决策的,与人类在面临决策时的机制相似. ...

  9. Solr入门之官方文档6.0阅读笔记系列(八) 相关过滤器

    第三部分 :   Understanding Analyzers, Tokenizers, and Filters Filter Descriptions You configure each fil ...

最新文章

  1. 贝叶斯分类器(Normal Bayes 分类器)
  2. linux下改变python的版本
  3. Codeforces 1205C Palindromic Paths (交互题、DP)
  4. mysql1215_MySQL全面瓦解15:视图
  5. 使用pipenv建立虚拟环境解决python打包exe文件过大的问题(附打包带图标,多个py文件打包exe)
  6. ThinkPHP中的display()和fetch()的区别
  7. 给商品评分效果,CSS技巧
  8. windows下JDK版本之间的切换
  9. ASCII、Unicode、UTF、base64
  10. 后期强蒙版大师破解版
  11. 测试管理工具的基本功能有哪些?
  12. 7.基础查询(select from)
  13. 网易游戏 Flink SQL 平台化实践
  14. comsol函数的使用(入门级教程)
  15. Using Sketch with Framer 使用Sketch与Framer Lynda课程中文字幕
  16. DirectX12的初始化
  17. 20220517 Python 制作一个儿童学习软件 (附源码和软件下载) 包含语音合成 视频播放 pyqt pptsx3 Qmovie request pygame 音频播放
  18. java 将字符串数组清空_在Java中如何将字符串集转换为字符串数组
  19. java编写圆的半径和周长,编写程序,其中用户将圆的半径作为整数并打印圆的直径,周长和面积...
  20. 进销存帮助企业解决财务难题

热门文章

  1. 60_n个骰子的点数概率
  2. LaTeX非主流技巧集锦
  3. [remote rejected] master->master (unpacker error)
  4. 新职业英语计算机unit5,新职业英语--IT英语_Unit_5[精选].ppt
  5. fpga python_PYNQ:使用Python进行FPGA开发
  6. 华为 MateBook E GO 二合一笔记本评测
  7. cadence安装pdk之后无法运行仿真问题
  8. ATool软件使用实验(22)
  9. 原来手游里的游戏模型制作这么简单,小白也能拿高薪啦!速看!
  10. Mixly 自定有OLED