`
seven0_0
  • 浏览: 27964 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JSF中输入组件的readonly属性

    博客分类:
  • Jsf
阅读更多

最近在做项目的时候,碰到了一个JSF的问题,就是输入组件设置了readonly属性之后,提交的时候就得不到该组件的值了,仔细研究了一番,才找到原因和解决方法。

具体的现象是这样的,一个输入框需要设置为不能让用户更改,但可以通过javascript改变,改变后提交,则在服务器端得到改变后的值进行处理。这种需求应该也是非常常见的,可是在用JSF实现时,却碰到了问题。具体JSF代码如下:

<h:form id="theForm">
        <h:inputText id="theValue" readonly="true" value="#{readonlyBean.theValue}"/>
      <h:commandButton value="Submit" action="#{readonlyBean.submit}"/>
        <af:outputText value="Click" onclick="editReadonly();"/>
      </h:form>

 

第一个<h:inputText>就是我们要研究的对象,第二个<h:commandButton>是提交的按钮,第三个<af:outputText>是为了有一个地方可以点击,点击后调用javascript来改变第一个组件的值,至于af是来自于ADF,ADF是Oracle的JSF实现,提供了更多的功能,为什么不用<h:outputText>呢?因为很奇怪,标准的JSF组件<h:outputText>竟然不接受onclick事件。总之,调用的editReadonly()的javascript代码如下

  function editReadonly() {
            document.getElementById('theForm:theValue').value = "ABCD";
       }

 

在服务器端,Managed Bean中的代码如下:

public class ReadonlyBean {
     private String theValue = "XYZ";
    
     public void setTheValue(String aValue) {
        this.theValue = aValue;
    }

    public String getTheValue() {
         return theValue;
     }

     public String submit() {
        System.out.println( this.getTheValue() );
         
        return null;
     }
 }

 

以上代码就是开始给theValue以初始值XYZ,然后在提交时打印出theValue的值。

运行时,首先点击"Click",看到页面上的只读输入组件的值变成了ABCD,然后提交,发现服务器端打印出来的值仍然是XYZ,没有得到该输入框的新值。

然而如果直接用HTML来完成这一功能时,页面上有一个readonly的输入框,提交到一个servlet,在servlet中从request中得到该输入框的值打印出来,那么在用javascript改变了该输入框的值后,打印出来的值是变化之后的值,说明标准的HTML的readonly的值是会提交的。

怎么会这样呢?JSF的输入组件设为readonly之后似乎不提交自己的值?为了解决这一问题,首先查看JSF最后生成的HTML页面的源代码,似乎没有任何问题,也是解析成一个标准的HTML的<input>,那说明在页面这个值是确实存在,也被提交给JSF框架,只是在后台处理时JSF忽略了该组件,这非常奇怪,为什么要采取这个和标准HTML不一致的行为?是不是当前使用的JSF的实现的问题?在换了好几个JSF的实现之后(Oracle的实现,MyFaces的实现,Sun的RI实现),结果都是一样,看来只有看看实现的源代码才能找到原因了。

下载了MyFaces 1.2的源代码,然后首先找到HtmlInputText的renderer:HtmlTextRenderer,因为提交时首先调用组件的renderer的docode方法来解析request的参数。然后发现该类是扩展了HtmlTextRendererBase,之后发现是调用了HtmlRendererUtils.decodeUIInput()来解析的,在该方法的一开始,就发现如下语句:

 if(isDisabledOrReadOnly(component))
            return;

 这里充分说明了在JSF中readonly和disable一样,都是不会将参数提交给后台的。

原因找到了,那为什么JSF会采用这种方式。解释可能要回到JSF是一个组件的框架这一点上来。因为<h:inputText>是一个组件,那一个只读的组件是不是就应该不能改变其值呢?

最后则说一下怎么绕过这一限制,从而实现我们一开始想要的功能。实现的方法则只能是加一个隐藏的输入组件,在javascript改变只读输入框时,也同时改变该隐藏的输入组件的值,那么提交后就能得到这个隐藏输入组件的值。

分享到:
评论

相关推荐

    《JSF自定义组件》

    这些标签被用来在JSF页面中嵌入组件,并设置各种属性如数据绑定、事件处理器等。 - **组件(Component)**:组件是JSF的核心部分,负责处理用户的输入和输出。它实现了与用户的交互逻辑,如接收输入、触发事件、...

    JSF创建自定义组件

    下面将详细解释如何创建一个自定义JSF组件,包括组件的组成部分、标签库描述、属性处理类和组件类的创建。 一、自定义组件组成 一个完整的自定义JSF组件通常包括以下几个部分: 1. **标签库描述文件(TLD)**:...

    编写JSF用户自定义UI组件(之五)

    6. **组件的使用**:在JSF页面中,通过 `&lt;cc:component&gt;` 或 `&lt;mynamespace:componentName&gt;` 标签引用自定义组件,并设置相应的属性值。 7. **测试和调试**:创建自定义组件后,需要在实际应用中测试其功能,确保...

    JSF分页组件2

    在JSF中,我们可以使用各种分页组件来实现这一功能。本文将深入探讨JSF分页组件2的相关知识点,包括其原理、使用方法和最佳实践。 ### 1. 分页组件的基本概念 分页组件允许用户以有限的数量逐页查看数据,而不是一...

    jsf组件开发源码

    在"jsf组件开发源码"中,我们很可能是要探讨如何创建自定义的JSF组件,以及源码背后的实现逻辑。 首先,JSF组件是由UIComponent类及其子类构成的。每个组件都是一个独立的UI元素,具有渲染、属性和事件处理能力。...

    jsf实战附录,JSF标签,组件详细介绍

    在"JsfInAction"这个文档中,你将找到有关如何使用JSF标签和组件的详细示例,以及如何在后台处理用户输入和执行业务逻辑的方法。对于Java、J2EE开发者来说,深入理解这些概念和实践将有助于提升开发效率并创建出更...

    jsf组件树相关资料

    组件树中的组件可以与JavaBean的属性进行数据绑定,通过`value`属性实现。例如,`&lt;h:inputText value="#{bean.property}" /&gt;`将组件的值与bean的`property`属性关联。当JSF更新模型值时,会自动同步组件和bean之间的...

    JSF2自定义组件编程系列 第五部分 源代码

    复合组件定义在一个XML文件(.cc.xml)中,通常包含一个或多个子组件,以及它们的属性和事件处理。 接下来,**打包到JAR文件**是为了方便管理和分发组件。在Java项目中,JAR(Java Archive)文件是一种标准的归档...

    JSF UI 组件详解

    IDE通常会提供一个可视化的界面,其中包含各种JSF组件,只需通过简单的操作即可完成组件的添加和属性设置。 #### 四、标准输出组件 1. **HtmlOutputText**:用于显示静态文本,可以使用CSS对其进行格式化。 2. **...

    JSF1.2日历组件

    3. **组件属性**:JSF组件可以有各种属性,如`value`表示组件的当前值,`converter`用于转换用户输入,以及`rendered`决定组件是否应在页面上渲染。日历组件可能包含`date`属性,用于存储选择的日期,以及`...

    JSF2.0实战 - 4、自定义组件

    自定义组件可以定义自己的属性,这些属性在JSF EL表达式中可以访问。例如,添加一个名为`myAttr`的属性: ```java @ManagedProperty(value="#{bean.myValue}") private String myAttr; // getter and setter `...

    jsf2.0 自定义组件

    在JSF 2.0版本中,它引入了许多改进和新特性,其中包括对自定义组件的强大支持。自定义组件允许开发人员根据特定需求创建自己的UI组件,这些组件可以扩展和定制,以满足应用程序的独特功能。 自定义组件的核心概念...

    jsf自定义组件.pdf

    - **组件(Component)**:这是JSF框架的核心部分,负责处理用户的输入和输出。组件通过监听事件、进行数据验证等方式参与JSF生命周期的不同阶段。 - **渲染器(Renderer)**:渲染器负责将组件转换成客户端可以...

    JSF中文教程jsf

    **数据绑定** 是JSF的一个关键特性,它将组件的值与后台bean的属性直接关联。这使得界面的更改能够直接影响到模型,反之亦然。**Managed Beans** 是JSF中的业务逻辑载体,它们负责处理应用的业务规则和数据管理。 *...

    jsf自定义组件的实现

    本文将引导你逐步了解如何在JSF中实现一个自定义组件,从基础开始,一步步构建一个简单的组件,最后达到能够开发复杂组件的能力。 ### 自定义组件的组成部分 一个完整的自定义JSF组件通常包含以下几个关键部分: ...

    JSF中文教程.zip

    2. **UI组件**:JSF提供了丰富的内置UI组件,如`h:inputText`用于文本输入,`h:commandButton`用于提交表单等。这些组件可以通过属性和事件进行定制,以满足不同需求。 3. **Facelets**:Facelets是JSF推荐的视图...

    jsf用户输入验证

    在JavaServer Faces (JSF) 中,用户输入验证是一项重要的功能,用于确保客户端提交的数据满足特定的要求。这不仅可以提升应用程序的安全性,还可以提高用户体验,通过及时反馈错误信息让用户能够更正输入。 #### 二...

    jsf 自定义组件开发

    在JSF中,自定义组件是扩展其功能的关键部分,允许开发者根据特定需求创建自己的UI元素。本篇文章将深入探讨JSF自定义组件的开发,包括组件的创建、注册、使用和自定义行为。 1. **组件结构** JSF组件由两个主要...

    创建JSF自定义组件

    本教程将深入探讨如何在JSF环境中创建自定义组件。 ### 1. 自定义组件概述 在JSF中,组件是UI的基本构建块,可以是简单的HTML元素,如按钮或输入框,也可以是复杂的组件,如表格或下拉菜单。自定义组件允许开发者...

    JSF分页组件

    在JSF页面中,通过XML标签引入组件并配置相关属性,如当前页数、总页数、每页显示数量等。例如: ```xml &lt;!-- 表格列定义 --&gt; ``` **5. 数据源与分页组件的交互** JSF分页组件需要一个数据源来提供分页数据。...

Global site tag (gtag.js) - Google Analytics