最近在做项目的时候,碰到了一个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页面中嵌入组件,并设置各种属性如数据绑定、事件处理器等。 - **组件(Component)**:组件是JSF的核心部分,负责处理用户的输入和输出。它实现了与用户的交互逻辑,如接收输入、触发事件、...
下面将详细解释如何创建一个自定义JSF组件,包括组件的组成部分、标签库描述、属性处理类和组件类的创建。 一、自定义组件组成 一个完整的自定义JSF组件通常包括以下几个部分: 1. **标签库描述文件(TLD)**:...
6. **组件的使用**:在JSF页面中,通过 `<cc:component>` 或 `<mynamespace:componentName>` 标签引用自定义组件,并设置相应的属性值。 7. **测试和调试**:创建自定义组件后,需要在实际应用中测试其功能,确保...
在JSF中,我们可以使用各种分页组件来实现这一功能。本文将深入探讨JSF分页组件2的相关知识点,包括其原理、使用方法和最佳实践。 ### 1. 分页组件的基本概念 分页组件允许用户以有限的数量逐页查看数据,而不是一...
在"jsf组件开发源码"中,我们很可能是要探讨如何创建自定义的JSF组件,以及源码背后的实现逻辑。 首先,JSF组件是由UIComponent类及其子类构成的。每个组件都是一个独立的UI元素,具有渲染、属性和事件处理能力。...
在"JsfInAction"这个文档中,你将找到有关如何使用JSF标签和组件的详细示例,以及如何在后台处理用户输入和执行业务逻辑的方法。对于Java、J2EE开发者来说,深入理解这些概念和实践将有助于提升开发效率并创建出更...
组件树中的组件可以与JavaBean的属性进行数据绑定,通过`value`属性实现。例如,`<h:inputText value="#{bean.property}" />`将组件的值与bean的`property`属性关联。当JSF更新模型值时,会自动同步组件和bean之间的...
复合组件定义在一个XML文件(.cc.xml)中,通常包含一个或多个子组件,以及它们的属性和事件处理。 接下来,**打包到JAR文件**是为了方便管理和分发组件。在Java项目中,JAR(Java Archive)文件是一种标准的归档...
IDE通常会提供一个可视化的界面,其中包含各种JSF组件,只需通过简单的操作即可完成组件的添加和属性设置。 #### 四、标准输出组件 1. **HtmlOutputText**:用于显示静态文本,可以使用CSS对其进行格式化。 2. **...
3. **组件属性**:JSF组件可以有各种属性,如`value`表示组件的当前值,`converter`用于转换用户输入,以及`rendered`决定组件是否应在页面上渲染。日历组件可能包含`date`属性,用于存储选择的日期,以及`...
自定义组件可以定义自己的属性,这些属性在JSF EL表达式中可以访问。例如,添加一个名为`myAttr`的属性: ```java @ManagedProperty(value="#{bean.myValue}") private String myAttr; // getter and setter `...
在JSF 2.0版本中,它引入了许多改进和新特性,其中包括对自定义组件的强大支持。自定义组件允许开发人员根据特定需求创建自己的UI组件,这些组件可以扩展和定制,以满足应用程序的独特功能。 自定义组件的核心概念...
- **组件(Component)**:这是JSF框架的核心部分,负责处理用户的输入和输出。组件通过监听事件、进行数据验证等方式参与JSF生命周期的不同阶段。 - **渲染器(Renderer)**:渲染器负责将组件转换成客户端可以...
**数据绑定** 是JSF的一个关键特性,它将组件的值与后台bean的属性直接关联。这使得界面的更改能够直接影响到模型,反之亦然。**Managed Beans** 是JSF中的业务逻辑载体,它们负责处理应用的业务规则和数据管理。 *...
本文将引导你逐步了解如何在JSF中实现一个自定义组件,从基础开始,一步步构建一个简单的组件,最后达到能够开发复杂组件的能力。 ### 自定义组件的组成部分 一个完整的自定义JSF组件通常包含以下几个关键部分: ...
2. **UI组件**:JSF提供了丰富的内置UI组件,如`h:inputText`用于文本输入,`h:commandButton`用于提交表单等。这些组件可以通过属性和事件进行定制,以满足不同需求。 3. **Facelets**:Facelets是JSF推荐的视图...
在JavaServer Faces (JSF) 中,用户输入验证是一项重要的功能,用于确保客户端提交的数据满足特定的要求。这不仅可以提升应用程序的安全性,还可以提高用户体验,通过及时反馈错误信息让用户能够更正输入。 #### 二...
在JSF中,自定义组件是扩展其功能的关键部分,允许开发者根据特定需求创建自己的UI元素。本篇文章将深入探讨JSF自定义组件的开发,包括组件的创建、注册、使用和自定义行为。 1. **组件结构** JSF组件由两个主要...
本教程将深入探讨如何在JSF环境中创建自定义组件。 ### 1. 自定义组件概述 在JSF中,组件是UI的基本构建块,可以是简单的HTML元素,如按钮或输入框,也可以是复杂的组件,如表格或下拉菜单。自定义组件允许开发者...
在JSF页面中,通过XML标签引入组件并配置相关属性,如当前页数、总页数、每页显示数量等。例如: ```xml <!-- 表格列定义 --> ``` **5. 数据源与分页组件的交互** JSF分页组件需要一个数据源来提供分页数据。...