`
yourenyouyu2008
  • 浏览: 287729 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jsf readonly解决办法

    博客分类:
  • jsf
阅读更多

问题描述

jsf对readonly的支持不够好,如下所示的使用方式会导致<h:inputText 的值不能不能被提交。

 

<h:inputText value="#{EquipmentBB.test }" readonly="#{EquipmentBB.readonly }"></h:inputText>

<h:commandButton action="#{ EquipmentBB.setReadonly(false)}" value="提交">

</h:commandButton>

 

//EquipmentBB 被定义为request作用域

public class EquipmentBB implements Serializable {
    private boolean readonly;//省略get set方法
    private String test;

 

原因分析

jsf不支持readonly组件的提交,参见HtmlBasicRenderer 的解码方法,当组件是disabled或readonly时不会获取页面提交过来的值。

public void decode(FacesContext context, UIComponent component)

    {

        if(!(component instanceof UIInput))

        {//非输入组件,忽略

            return;

        }

        if(Util.componentIsDisabledOrReadonly(component))//#{EquipmentBB.readonly }执行该表达式获取值

        {

            return;

        }

解决办法

1)将EquipmentBB的作用域换成session,这样在解码阶段#{EquipmentBB.readonly }就能返回正确的值。不建议提升作用域。增加<h:hidden value="#{EquipmentBB.test }" 也无法解决问题。

2)使用页面阶段事件,在ApplyRequest阶段前改变EquipmentBB.readonly的值,这样解码时#{EquipmentBB.readonly }就能获取正确的值了。

<f:view beforePhaseListener=”#{EquipmentBB.beforePhaseListener}”

EquipmentBB增加beforePhaseListener(PhaseEvent event)方法,在方法中将readonly设置成false,这样解码时就可以获取到值了。

问题:页面阶段事件不能被ajax4j很好的支持,如果使用了ajax4j ApplyRequest阶段的页面事件不能被激活

3)最佳解决办法

扩展jsf的作用域(只有3个作用域),增加viewscope或pagescope,viewscope被jsf2.0增加,pagescope在seam中增加,这两个作用域都能够在同一页面的显示和提交时保存bean的状态,这样显示页面时设置的readonly值,再次提交时就可以恢复出来(request作用域每次都是new新的bean,上次设置的值当然就丢失了)。pagescope比viewscope更大些,能解决viewscope的所有问题。

注意事项:由于bean需要被保存,所以必须实现Serializable接口。

这种办法最好,但要扩展jsf,如果使用了jsf2,或者seam就简单多了。

扩展jsf作用域还能带来一个明显的好处:参见pagescope相关文章介绍。

小提示

private boolean readonly;//利用默认就是false,页面就能提交,但当多次操作后可能会出现混乱

分享到:
评论

相关推荐

    JSF+HTML标签总结

    JSF(JavaServer Faces)是Java平台上用于构建Web应用程序的一种技术。它提供了一种组件模型,使得开发人员可以通过声明式的方式创建用户界面。在JSF中,HTML标签被扩展为JSF标签,提供了更丰富的功能和更强的数据...

    jsf标签使用文档

    ### JSF标签库详解 #### 一、JSF概述与标签使用 JavaServer Faces(简称JSF)是一种基于Java EE的标准技术,它主要用于构建企业级Web应用。JSF提供了丰富的功能,包括表单处理、验证、国际化等,并通过一套强大的...

    JSF日历控件

    - `readonlyInput`: 是否禁用文本输入框。 **3. 配合日期转换器** JSF提供`&lt;f:convertDateTime&gt;`标签来处理日期的格式化和解析,确保前端显示和后端存储的日期格式一致。 ```html ``` **4. 自定义日历样式**...

    jsf 标签文档

    JSF(JavaServer Faces)是一种Java Web开发框架,它提供了丰富的组件库,使得开发者能够创建用户界面更加便捷。本文档主要介绍了JSF中的一些常见标签及其用途,这对于JSF初学者或是有经验的开发者在日常开发中查找...

    各种JSF HTML标签总结.doc

    &lt;h:inputText value="#{bean.property}" size="5" readonly="true" maxlength="6" style="color:yellow;background:Teal;" /&gt; ``` - **value**:绑定到后端bean中的属性。 - **size**:文本框的宽度,单位为字符。 -...

    学习jsf标签使用文档.pdf

    在JSF(JavaServer Faces)框架中,标签是构建用户界面的重要组成部分,它们提供了一种声明式的方式来创建和管理Web应用程序的UI组件。以下是对学习JSF标签使用文档中的主要知识点的详细说明: 1. **引入JSF核心...

    jsf_标签使用文档.pdf

    JSF(JavaServer Faces)是Java的一个标准Web应用程序框架,用于简化和自动化图形用户界面(GUI)的构建。它定义了一组用于构建页面和组件的MVC(模型-视图-控制器)模式,并允许开发者通过组件来构建用户界面,而...

    设置jsf的选择框h:selectOneMenu为不可编辑状态的方法

    在JSF(JavaServer Faces)框架中,`h:selectOneMenu` 是一个用于创建下拉选择框的组件。在某些场景下,我们可能需要将这个组件设置为只读或不可编辑状态,以便用户只能查看选项,而不能进行选择。本文将详细讲解...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................

    jboss-seam 注解

    通过这个名称,开发人员可以在其他地方引用此组件,例如在JSF页面或EL表达式中。此外,该注解还可以用于方法级别,用于定义局部组件。 #### @Scope `@Scope`注解用于定义组件的作用域,默认情况下,组件的作用域是...

    jboss seam 中文文档

    Seam 结合了 JavaServer Faces (JSF)、Java Persistence API (JPA)、Aspect-Oriented Programming (AOP) 等技术,使得开发者能够更加高效地构建高度交互式的 Web 应用。 #### 二、Seam 入门 ##### 1.1 尝试入门...

    Jboss Seam中文版

    它通过整合多种技术如JSF、EJB 3.0等,提供了一种更为高效、简洁的方式来构建复杂的业务逻辑。Seam的目标是降低开发复杂度,提高开发效率,并确保应用的可维护性和扩展性。 #### 第一章:Seam入门 本章主要介绍...

Global site tag (gtag.js) - Google Analytics