问题描述
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(JavaServer Faces)是Java平台上用于构建Web应用程序的一种技术。它提供了一种组件模型,使得开发人员可以通过声明式的方式创建用户界面。在JSF中,HTML标签被扩展为JSF标签,提供了更丰富的功能和更强的数据...
### JSF标签库详解 #### 一、JSF概述与标签使用 JavaServer Faces(简称JSF)是一种基于Java EE的标准技术,它主要用于构建企业级Web应用。JSF提供了丰富的功能,包括表单处理、验证、国际化等,并通过一套强大的...
- `readonlyInput`: 是否禁用文本输入框。 **3. 配合日期转换器** JSF提供`<f:convertDateTime>`标签来处理日期的格式化和解析,确保前端显示和后端存储的日期格式一致。 ```html ``` **4. 自定义日历样式**...
JSF(JavaServer Faces)是一种Java Web开发框架,它提供了丰富的组件库,使得开发者能够创建用户界面更加便捷。本文档主要介绍了JSF中的一些常见标签及其用途,这对于JSF初学者或是有经验的开发者在日常开发中查找...
<h:inputText value="#{bean.property}" size="5" readonly="true" maxlength="6" style="color:yellow;background:Teal;" /> ``` - **value**:绑定到后端bean中的属性。 - **size**:文本框的宽度,单位为字符。 -...
在JSF(JavaServer Faces)框架中,标签是构建用户界面的重要组成部分,它们提供了一种声明式的方式来创建和管理Web应用程序的UI组件。以下是对学习JSF标签使用文档中的主要知识点的详细说明: 1. **引入JSF核心...
JSF(JavaServer Faces)是Java的一个标准Web应用程序框架,用于简化和自动化图形用户界面(GUI)的构建。它定义了一组用于构建页面和组件的MVC(模型-视图-控制器)模式,并允许开发者通过组件来构建用户界面,而...
在JSF(JavaServer Faces)框架中,`h:selectOneMenu` 是一个用于创建下拉选择框的组件。在某些场景下,我们可能需要将这个组件设置为只读或不可编辑状态,以便用户只能查看选项,而不能进行选择。本文将详细讲解...
Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................
通过这个名称,开发人员可以在其他地方引用此组件,例如在JSF页面或EL表达式中。此外,该注解还可以用于方法级别,用于定义局部组件。 #### @Scope `@Scope`注解用于定义组件的作用域,默认情况下,组件的作用域是...
Seam 结合了 JavaServer Faces (JSF)、Java Persistence API (JPA)、Aspect-Oriented Programming (AOP) 等技术,使得开发者能够更加高效地构建高度交互式的 Web 应用。 #### 二、Seam 入门 ##### 1.1 尝试入门...
它通过整合多种技术如JSF、EJB 3.0等,提供了一种更为高效、简洁的方式来构建复杂的业务逻辑。Seam的目标是降低开发复杂度,提高开发效率,并确保应用的可维护性和扩展性。 #### 第一章:Seam入门 本章主要介绍...