当前位置: 首页 > 面试题库 >

向JSF 2.0 UIInput组件添加自定义属性(HTML5)支持

尉迟宣
2023-03-14
问题内容

我正在尝试编写一个渲染器,该渲染器将处理组件placeholder上的属性<h:inputText>。在阅读了JSF2.0并去除了必需的HTML5属性之后,我走了这条路,这似乎是正确的。这是我的自定义渲染器

public class InputRenderer extends com.sun.faces.renderkit.html_basic.TextRenderer{

    @Override
    public void encodeBegin(FacesContext context, UIComponent component) 
    throws IOException {
        System.out.println("Rendering :"+component.getClientId());

        String placeholder = (String)component.getAttributes().get("placeholder");
        if(placeholder != null) { 
            ResponseWriter writer = context.getResponseWriter();
            writer.writeAttribute("placeholder", placeholder, "placeholder");
        }

        super.encodeBegin(context, component);

    }


    @Override
    public void decode(FacesContext context, UIComponent component) {
        super.decode(context, component);
    }

    @Override
    public void encodeEnd(FacesContext context, UIComponent component) 
    throws IOException {
        super.encodeEnd(context, component);
    }
}

并且此渲染器在faces config中注册为

 <render-kit>
    <renderer>
        <component-family>javax.faces.Input</component-family>
        <renderer-type>javax.faces.Text</renderer-type>
        <renderer-class>com.example.renderer.InputRenderer</renderer-class>
    </renderer>
</render-kit>

这被注册罚款,那里没有问题。

我的意图是处理该placeholder属性,将其插入,然后将处理委托给super。我上面的代码不起作用,因为我在错误的位置插入了属性。必须在writer.startElement('input')执行后将其插入。但是,startElement必须发生在super
encodeBegin()方法中的某个地方。那么,如何插入自定义属性(在这种情况下为“占位符”),然后继续执行流程

注意:上面的代码确实向placeholder我想要的输入组件添加了一个属性,但未添加属性,而是将其写入到Input的父级(因为我试图在将组件本身实际写入流中之前写一个属性,将该属性应用于当前组件)


问题答案:

这是我的方式。我添加了占位符和数据主题属性。如果要添加更多属性,则应仅将其名称添加到attribute数组。

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

import com.sun.faces.renderkit.html_basic.TextRenderer;

public class InputRender extends TextRenderer {

    @Override
    protected void getEndTextToRender(FacesContext context,
            UIComponent component,
            String currentValue)
     throws java.io.IOException{

        String [] attributes = {"placeholder","data-theme"};

        ResponseWriter writer = context.getResponseWriter();

        for(String attribute : attributes)
        {
            String value = (String)component.getAttributes().get(attribute);
            if(value != null) {                             
                writer.writeAttribute(attribute, value, attribute);
            }
        }

        super.getEndTextToRender(context, component, currentValue);

    }

}

您应该将此添加到faces-config.xml文件。

 <render-kit>
    <renderer>
        <component-family>javax.faces.Input</component-family>
        <renderer-type>javax.faces.Text</renderer-type>
        <renderer-class>your.package.InputRenderer</renderer-class>
    </renderer>
</render-kit>


 类似资料:
  • 我需要在窗格上有一个选择监听器和选择方法,以便在单击节点时能够监视并显示突出显示。 我做了以下操作: 这工作得很好 - 但是我无法再使用场景构建器,因为我的FXML引用了此而不是。我不确定如何将我的自定义窗格放入场景构建器。我已经看过其他问题,它们都是FXML和控制器的组合 - 这只是一个。 有没有人知道这样做的方法,或者在初始化时将< code>Pane换成< code > PaneWithSe

  • 1. 预置事件 预置事件是百度统计的基础代码能够获取到的基础事件,如页面浏览、元素点击等。系统为预置事件页面浏览、元素点击、session默认关联了预置属性。 这个功能支持您给页面浏览、元素点击、session添加自定义属性。 适用场景: 标识访问状态:是否为登录用户、是否为试用用户 标识访问来源:查看不同来源媒体的用户行为 标识页面分组:按网页作者分组、按页面标题分组、按网页内容分组 该功能替换

  • 1. 预置事件 预置事件是百度统计的基础代码能够获取到的基础事件,如页面浏览、元素点击等。系统为预置事件页面浏览、元素点击、session默认关联了预置属性。 这个功能支持您给页面浏览、元素点击、session添加自定义属性。 适用场景: 标识访问状态:是否为登录用户、是否为试用用户 标识访问来源:查看不同来源媒体的用户行为 标识页面分组:按网页作者分组、按页面标题分组、按网页内容分组 该功能替换

  • 我需要添加自定义数据属性来选择选项。我需要它,因为在更改时,我希望基于选定的属性(而不是值)触发操作 这是我正在使用的代码 例如,当我为数据属性提供静态值时,它可以工作,以下工作没有问题(请注意,data-isocode具有静态值) 然而,当我尝试在数据等码中使用变量时 它向我抛出以下错误 如何使用Angular传递数据属性(如jQuery),并使用FormBuilder获取值?

  • 问题内容: 我希望能够在加载Laravel / Eloquent模型时为其添加自定义属性/属性,类似于使用RedBean的 方法可以实现的那样。 例如,目前,在我的控制器中,我有: 能够省略循环并已经设置并填充了“ available”属性将是很好的选择。 我尝试使用文档中描述的一些模型事件在对象加载时附加此属性,但到目前为止还没有成功。 笔记: “可用”不是基础表中的字段。 是作为JSON对象作

  • 问题内容: 是否可以向HTML标记添加自定义属性,如下所示? 问题答案: 您可以修改!DOCTYPE声明(即DTD)以允许它,以便[XML]文档仍然有效: 表示它是可选属性,或者您可以使用,等等。