在rich:tooltip
内使用f:selectItems
属性的变量时,如何将for
附加到rich:tooltip
生成的列表中。
此代码工作正常(#{prefix}
的值为theprefixvalue
<ui:composition>
<a4j:form id="#{prefix}_form">
<h:selectOneRadio style="text-align:left" id="#{prefix}_rating">
<f:selectItems value="#{test.options}"></f:selectItems>
</h:selectOneRadio>
<rich:toolTip for="theprefixvalue_form\:theprefixvalue_rating\:0">a</rich:toolTip>
</a4j:form>
</ui:composition>
但是这段代码没有:
<ui:composition>
<h:outputText value="#{prefix}" />
<a4j:form id="#{prefix}_form">
<h:selectOneRadio style="text-align:left" id="#{prefix}_rating">
<f:selectItems value="#{test.options}"></f:selectItems>
</h:selectOneRadio>
<rich:toolTip for="#{prefix}_form\:#{prefix}_rating\:0">a</rich:toolTip>
</a4j:form>
</ui:composition>
引发以下异常:
Caused by: java.lang.IllegalArgumentException: theprefixvalue_rating
at javax.faces.component.UIComponentBase.findComponent(UIComponentBase.java:612)
at org.ajax4jsf.renderkit.RendererUtils.findComponentFor(RendererUtils.java:1037)
at org.richfaces.renderkit.html.ToolTipRenderer.getTargetId(ToolTipRenderer.java:234)
at org.richfaces.renderkit.html.ToolTipRenderer.constructJSVariable(ToolTipRenderer.java:251)
...
TestBean是会话范围的,这是getOptions();
的代码public List<SelectItem> getOptions(){
List<SelectItem> options = new ArrayList<SelectItem>();
options.add(new SelectItem("a","a"));
options.add(new SelectItem("b","b"));
options.add(new SelectItem("c","c"));
return options;
}
有什么想法吗?目标是在鼠标悬停在不同选项上时提供工具提示。提前谢谢。
修改:显然HtmlSelectOneRadio
未实施NamingContainer
,因此在UIComponentBase
第611行失败:
(result
是HtmlSelectOneRadio
,length>0
和segments[1] = "theprefixvalue_rating"
的实例
if (result != null && (!(result instanceof NamingContainer)) && length > 0) {
throw new IllegalArgumentException(segments[i]);
我正在尝试使用我自己的NamedHtmlSelectOneRadio
扩展HtmlSelectOneRadio
并实现NamingContainer
,但我仍在猜测如何使用facelets注入它。有什么想法吗?
答案 0 :(得分:3)
最后我设法解决了这个问题。
我创建了自己的名为NamedHtmlSelectOneRadio
的组件,它只是HtmlSelectOneRadio
的包装,但实现了NamingContainer
。我不知道这是否会通过其余的JSF代码产生进一步的影响,但我的testcase工作正常。无论如何,如果我发现任何奇怪的行为,我会更新这个答案,以及我将在JSF的Mojarra实现中发布关于HtmlSelectOneRadi
o未实现NamingContainer
的原因。框。
以下是使用facelets创建自己的组件的步骤。
1包裹课程:
import javax.faces.component.NamingContainer; import javax.faces.component.html.HtmlSelectOneRadio;
public class NamedHtmlSelectOneRadio extends HtmlSelectOneRadio implements NamingContainer {
public NamedHtmlSelectOneRadio(){
super();
}
}
2包装Tag类并将上面的类设置为组件类型:
import com.sun.faces.taglib.html_basic.SelectOneRadioTag;
public class NamedHtmlSelectOneRadioTag extends SelectOneRadioTag {
public NamedHtmlSelectOneRadioTag(){
super();
}
@Override
public String getComponentType() {
return "javax.faces.NamedHtmlSelectOneRadio";
}
}
3将组件添加到faces-config.xml
配置中:
<component>
<component-type> com.eyeprevent.util.NamedHtmlSelectOneRadio </component-type>
<component-class> com.eyeprevent.util.NamedHtmlSelectOneRadio </component-class>
</component>
4将标记添加到taglib(我的是functions.taglib.xml)。有关创建自己的taglib here
的更多信息<tag>
<tag-name>namedSelectOneRadio</tag-name>
<component>
<component-type>com.eyeprevent.util.NamedHtmlSelectOneRadio</component-type>
</component>
</tag>`
5在.xhtml(或.jsf)页面中添加新的taglib,并将h:selectOneRadio
替换为您自己的({是fnc:namedSelectOneRadio
)
xmlns:fnc="http://eyeprevent.com/fnc"
...
<fnc:namedSelectOneRadio id="#{prefix}_rating">
<f:selectItems value="#{test.options}"></f:selectItems>
</fnc:namedSelectOneRadio>
<rich:toolTip for="#{prefix}_form\:#{prefix}_rating:0">a</rich:toolTip>
就是这样!