gpt4 book ai didi

jsf - 在 JSF 中向 Primefaces 自动完成组件添加自定义属性

转载 作者:行者123 更新时间:2023-12-04 13:14:28 24 4
gpt4 key购买 nike

我询问了 different question 中的传递属性发现我可以为 <p:autocomplete> 创建一个自定义渲染器组件,但问题是我的自定义渲染器将用于我的项目(站点范围)中的每个 p:autocomplete。因此,我选择创建一个扩展 org.primefaces.component.autocomplete.AutoComplete 的自定义组件。并将必要的属性添加到文本框中。

我最初的想法是添加一个构造函数,但它似乎不起作用,因为此时属性映射为空:

@FacesComponent("com.mycomponents.SiteSearch")
public class SiteSearch extends AutoComplete {

public SiteSearch() {
Map<String,Object> attrs = getAttributes();
attrs.put("x-webkit-speech", null);
attrs.put("x-webkit-grammer", "builtin:search");
attrs.put("onwebkitspeechchange", "this.form.submit();");
attrs.put("placeholder", "Enter a Search Term");
}
}

我的另一个想法是让这个自定义组件为空(空类),然后指定一个扩展 org.primefaces.component.autocomplete.AutoCompleteRenderer 的自定义渲染器。并在那里修改属性。

毕竟,我只需要一种方法将这些属性与这个文本框分开,所以仅仅在 p:autoComplete 上放置一个自定义渲染器是行不通的(除非我可以为这个使用 renderType= 属性p:自动完成?)。

最佳答案

如果您需要使用不同于 <p:autoComplete> 的渲染器的特定组件那么您真的无法创建具有自己的系列和组件类型的自定义组件。您仍然可以扩展 PrimeFaces AutoComplete (及其渲染器)来保存一些样板代码。

在自定义组件中,您需要为这些属性提供 getter。您也可以指定 setter ,这样您就可以始终覆盖 View 端的默认值。这些 getter/setter 应依次委托(delegate)给 StateHelper .
x-webkit-* 有一点小问题属性。 -是 Java 标识符中的非法字符。因此,您必须重命名 getter/setter 并稍微更改渲染器,因为标准渲染器依赖于组件属性名称与标签属性名称完全相同。 更新 : 我明白x-webkit-speech应该按原样呈现(因此,不需要 getter/setter)并且 x-webkit-grammer其实是笔误,应该是x-webkit-grammar .
SiteSearch 的方法如下组件可能如下所示:

@FacesComponent(SiteSearch.COMPONENT_TYPE)
public class SiteSearch extends AutoComplete {

public static final String COMPONENT_FAMILY = "com.example";
public static final String COMPONENT_TYPE = "com.example.SiteSearch";

private enum PropertyKeys {
grammar, onspeechchange, placeholder
}

@Override
public String getFamily() {
return COMPONENT_FAMILY;
}

@Override
public String getRendererType() {
return SiteSearchRenderer.RENDERER_TYPE;
}

public String getGrammar() {
return (String) getStateHelper().eval(PropertyKeys.grammar, "builtin:search");
}

public void setGrammar(String grammar) {
getStateHelper().put(PropertyKeys.grammar, grammar);
}

public String getOnspeechchange() {
return (String) getStateHelper().eval(PropertyKeys.onspeechchange, "submit()");
}

public void setOnspeechchange(String onspeechchange) {
getStateHelper().put(PropertyKeys.onspeechchange, onspeechchange);
}

public String getPlaceholder() {
return (String) getStateHelper().eval(PropertyKeys.placeholder, "Enter a Search Term");
}

public void setPlaceholder(String placeholder) {
getStateHelper().put(PropertyKeys.placeholder, placeholder);
}

}

请注意,getter 具有指定的所有默认值。如果 eval()返回 null ,则将返回默认值。我还对属性名称进行了一定程度的中和,以便只需相应地修改渲染器,就可以将其用于任何 future 的非 webkit 浏览器。

这就是 SiteSearchRenderer渲染器应该看起来像上面的组件:
@FacesRenderer(
componentFamily=SiteSearch.COMPONENT_FAMILY,
rendererType=SiteSearchRenderer.RENDERER_TYPE
)
public class SiteSearchRenderer extends AutoCompleteRenderer {

public static final String RENDERER_TYPE = "com.example.SiteSearchRenderer";

@Override
protected void renderPassThruAttributes(FacesContext facesContext, UIComponent component, String[] attrs) throws IOException {
ResponseWriter writer = facesContext.getResponseWriter();
writer.writeAttribute("x-webkit-speech", "x-webkit-speech", null);
writer.writeAttribute("x-webkit-grammar", component.getAttributes().get("grammar"), "grammar");
writer.writeAttribute("onwebkitspeechchange", component.getAttributes().get("onspeechchange"), "onspeechchange");
writer.writeAttribute("placeholder", component.getAttributes().get("placeholder"), "placeholder");
super.renderPassThruAttributes(facesContext, component, attrs);
}

}

要在 View 中使用它,我们当然需要将其注册为标签。创建 /WEB-INF/my.taglib.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0"
>
<namespace>http://example.com/ui</namespace>

<tag>
<tag-name>siteSearch</tag-name>
<component>
<component-type>com.example.SiteSearch</component-type>
<renderer-type>com.example.SiteSearchRenderer</renderer-type>
</component>
</tag>
</facelet-taglib>

请注意,您不需要 <renderer>faces-config.xml对于这个了。 @FacesRenderer注释可以在真正的自定义组件上完成它的工作。所以删除 <renderer>进入 faces-config.xml您根据之前的问题创建的。

现在通过 web.xml 中的以下上下文参数告诉 JSF 你有一个自定义标记库。 :
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/my.taglib.xml</param-value>
</context-param>

最后,您可以按如下方式使用它:
<html ... xmlns:my="http://example.com/ui">
...
<my:siteSearch />

您甚至可以指定其他属性,这些属性将覆盖组件中设置的默认值:
<my:siteSearch grammar="builtin:language" onspeechchange="alert('peek-a-boo')" placeholder="Search" />

对于属性的 IDE 自动完成,您需要将每个属性指定为单独的 <attribute><tag> my.taglib.xml 中的声明.

关于jsf - 在 JSF 中向 Primefaces 自动完成组件添加自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10568633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com