`
kidneyball
  • 浏览: 328992 次
  • 性别: Icon_minigender_1
  • 来自: 南太平洋
社区版块
存档分类
最新评论

JSF 2.0阅读笔记:视图状态 (四)

阅读更多
五. 实例验证

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

JSF2.0规范中提供了三个上下文参数来指定应用的ViewState策略,可在web.xml文件中使用context-param元素来配置。第一个是从JSF1.2就流传下来的javax.faces.STATE_SAVING_METHOD,取值为server或client,用于配置把视图状态数据放在服务器端还是传递到客户端,默认为server。第二个是javax.faces.PARTIAL_STATE_SAVING,取值为true或false,用于配置是否在应用范围内启用或禁用增量视图状态,默认为true。第三个是javax.faces.FULL_STATE_SAVING_VIEW_IDS,取值为一系列用逗号分隔的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" />


其中视图状态信息是1636字节(1.6k)。现在把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" />

其中视图状态信息是696字节(0.7k),减少了57%

如果把其中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> 


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

下面测试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")
@RequestScoped
public 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;
    }
}


增量视图状态尺寸为1068字节

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

<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")
@RequestScoped
public 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 + 输入框 + 按钮。增量视图状态为2124字节。可以看出,通过编程方式动态创建的组件,视图状态与完全视图状态类似。而通过Facelet的ui:repeat等特性创建的组件,则可享受到增量视图状态的优化。
2
0
分享到:
评论

相关推荐

    一个简单的jsf例子------JSF2学习笔记1

    **JSF2学习笔记1——理解JavaServer Faces 2.0框架** JavaServer Faces (JSF) 是一种基于组件的Web应用程序开发框架,由Sun Microsystems(现为Oracle Corporation的一部分)开发,旨在简化用户界面构建。JSF2是该...

    良葛格_JSF学习笔记.rar

    `FacesContext`是JSF框架的核心上下文对象,它在JSF生命周期中贯穿始终,提供了对请求、响应和应用程序状态的访问。Managed Beans是JSF中的业务逻辑组件,通过`@ManagedBean`和`@RequestScoped`等注解来声明和管理。...

    《JSF入门》简体中文版.rar

    而《Garfield的SCJP阅读笔记》.rar文件可能是关于Sun Certified Programmer for the Java SE Platform(SCJP)考试的学习资料,SCJP是Java开发者的基础认证,对于深化Java语言的理解大有裨益,但与JSF主题不直接相关...

    JavaEE5实战笔记04JSF的一些补充

    本篇实战笔记主要补充了在JavaEE5中使用JSF的一些关键点,特别是关于流程转向和界面参数传递。 1. **流程转向**: 在JSF中,流程转向通常通过`faces-config.xml`文件中的`&lt;navigation-rule&gt;`元素来定义。例如,当...

    jee6 学习笔记 5 - Struggling with JSF2 binding GET params

    在Java企业版(Java EE)6的开发过程中,JSF(JavaServer Faces)2.0是用于构建用户界面的重要组件。这篇"jee6 学习笔记 5 - Struggling with JSF2 binding GET params"主要探讨了开发者在使用JSF2绑定GET参数时可能...

    JSF+Spring+Hibernate相关技术文档

    JSF 2.0规范(其中包含的JSF_20规范.pdf和JSF.pdf文档可能详细阐述了这一版本的特性)引入了许多改进,如异步处理、更强大的Facelets视图技术以及对CDI(Contexts and Dependency Injection)的支持,使得开发者可以...

    【读书笔记】Java参考大全-J2EE5版本

    JSF2.0在J2EE5中引入,进一步增强了其功能,如Facelets视图技术、复合组件支持和AJAX集成。 5. **持久化API (JPA)**:JPA是Java Persistence API,它是J2EE5的一部分,提供了一种标准的方式来管理和持久化Java对象...

    清晰的技术资料学习笔记

    文件可能包含了SQL的基本语法、查询操作、数据更新、表的创建与修改、视图、存储过程等内容,对于初学者和数据库管理员非常有用。 2. **IT日本語.doc**:这可能是关于IT相关的日语词汇或术语文档,适合那些需要在...

    j2ee体系chm帮助文档大全

    这个压缩包里涵盖了从基础到高级的各种主题,包括Hibernate学习笔记、J2EE全实例教程、JSF中文教程、Java设计模式、XML指南以及Struts2.0中文帮助手册等,对于想要深入理解J2EE框架和技术的开发者来说,无疑是一份...

    appfuse 学习笔记

    AppFuse 是一个开源项目,旨在加速和简化J2EE应用程序的开发流程。由Matt Raible设计,它作为一...通过深入阅读和实践AppFuse的学习笔记,开发者可以逐步掌握其核心功能,并将其应用到实际项目中,提升开发质量和效率。

    SCWCD-083资料

    3. **EL(Expression Language)**:EL是JSP 2.0引入的简洁表达式语言,用于访问JavaBean属性和执行基本操作。掌握EL变量,操作符,函数和上下文对象的使用。 4. **JSTL(JavaServer Pages Standard Tag Library)*...

Global site tag (gtag.js) - Google Analytics