快速业务通道

怀疑论者的JSF: JSF组件开发 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
   }    /**     * @param value The value to set.     */    public void setValue(String value) {       this.value = value;    } }

怀疑论者的JSF: JSF组件开发(10)

时间:2011-04-11 IBM Rick Hightower

从概念上说,在上面的代码和 Label 组件之间找不出太大区别。但是,在这个示例中, setProperties 方法有些不同:

protected void setProperties(UIComponent component) {    /* You have to call the super class */    super.setProperties(component);    ((FieldComponent)component).setLabel(label);    component.getAttributes().put("errorStyleClass",     errorStyleClass);    component.getAttributes().put("errorStyle",errorStyle);    ((FieldComponent)component).setRequired(required);

虽然 label 属性传递时的方式与前面的示例相同,但是 errorStyleClass 和 errorStyle 属性不是这样传递的。相反,它们被添加到 JSF 组件的属性映射 中。Renderer 类会使用属性映射去渲染类和样式属性。这个设置允许特定于 HTML 的代码从组件脱离。

这个修订后的 setProperties 方法实际的值绑定代码也有些不同,如下所示。

protected void setProperties(UIComponent component) {     ...      FacesContext context = FacesContext.getCurrentInstance();    Application application = context.getApplication();    ValueBinding binding = application.createValueBinding(value);    component.setValueBinding("value", binding);

这个代码允许 Field 组件的 value 属性绑定到后台 bean。出于示例的原因,我把 CDManagerBean 的 title 属性绑定到 Field 组件,像下面这样:value="# {CDManagerBean.title}。值绑定是用 Application 对象创建的。Application 对象是创建 值绑定的工厂。这个组件拥有保存值绑定的特殊方法,即 setValueBinding;可以有不止一 个值绑定。

独立渲染器

最后介绍渲染器,但并不是说它不重要。独立渲染器必须考虑的主要问题是解码(输入) 和编码(输出)。Field 组件做的编码比解码多得多,所以它的渲染器有许多编码方法,而 只有一个解码方法。在清单 8 中,可以看到 Field 组件的渲染器:

清单 8. FieldRenderer 扩展自 Renderer

package com.arcmind.jsfquickstart; import java.io.IOException; import java.util.Iterator; import java.util.Map; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.component.UIInput; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.convert.Converter; import javax.faces.convert.ConverterException; import javax.faces.el.ValueBinding; import javax.faces.render.Renderer; /** * @author Richard Hightower * */ public class FieldRenderer extends Renderer {   @Override   public Object getConvertedValue(FacesContext facesContext, UIComponent component,    Object submittedValue) throws ConverterException {    //Try to find out by value binding    ValueBinding valueBinding = component.getValueBinding("value");    if (valueBinding == null) return null;    Class valueType = valueBinding.getType(facesContext);    if (valueType == null) return null;    if (String.class.equals(valueType)) return submittedValue;    if (Object

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号