我正在尝试在JSF 1.2中开发自定义控件(使用facelets)。
我按照不同教程中的步骤(定义.tld,taglib.xml,faces-config.xml中的注册组件和实现UIComponent(组件呈现本身)和UIComponentELTag类)并且我的组件被渲染,我有值绑定它,但我忽略了为该标签定义的属性。我在Tag类中记录了各种方法,并注意到没有调用任何方法。
我错过了什么?是否有原因永远不会调用Tag处理程序类?
提前致谢。
我的taglib.xml文件是:
<?xml version="1.0"?>
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>dynamissoft.com/entities/ui</namespace>
<tag>
<tag-name>legalEntityView</tag-name>
<component>
<component-type>rs.bozic.wastemanager.LegalEntityView</component-type>
</component>
</tag>
</facelet-taglib>
答案 0 :(得分:3)
您是否尝试过使用facelets创建自定义组件(仅限xml)。这是最简单的方法,通常使用facelets,不再需要不同的java类。
非常粗略概述:
您可以使用常规标记参数将值/ bean传递给组件:
使用该组件
组件内部
Param1刚刚打印出来:#{myParam2} Param2用作表的值 ...
如果可能,请考虑使用JSF 2.0。 Facelets已集成,您可以更灵活地创建自定义组件。我刚刚创建了一篇博文:http://blog.whitehorses.nl/2010/02/08/jsf-2-0/(或Google自己)
答案 1 :(得分:2)
只是为了扩展Gerbrand的答案,这里是一个简单的Facelets兼容组件的过程。它会呈现一个span
标记,用于包装通过组件text
属性指定的文本。
首先创建组件类(在我们的例子中,它只是一种风格
UIOutput
):
package sample.mytag;
import java.io.IOException;
import javax.faces.component.UIOutput;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
public class SpanComponent extends UIOutput{
private String text;
@Override
public Object saveState(FacesContext context) {
Object values[] = new Object[2];
values[0] = super.saveState(context);
values[1] = target;
return ((Object) (values));
}
@Override
public void restoreState(FacesContext context, Object state) {
Object values[] = (Object[])state;
super.restoreState(context, values[0]);
target = (String)values[1];
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
ResponseWriter writer=context.getResponseWriter();
writer.startElement("span", component);
writer.writeAttribute("id", id, null);
writer.writeText(text, null);
writer.endElement("span");
writer.flush();
}
@Override
public String getFamily(){
return "myTag.component";
}
@Override
public void encodeEnd(FacesContext context) throws IOException {
return;
}
@Override
public void decode(FacesContext context) {
return;
}
}
接下来,我们需要一个taglib XML文件,让我们将其称为mytag.taglib.xml
并将其放在WEB-INF
目录中。
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"WEB-INF/facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://sample.tag/mytags</namespace>
<tag>
<tag-name>myspan</tag-name>
<component>
<component-type>myTag.component</component-type>
</component>
</tag>
</facelet-taglib>
请注意:
.taglib.xml
后缀是强制性的<component-type>
应该有相同的
组件&#39; getFamily()
方法WEB-INF/facelet-taglib_1_0.dtd
http://java.sun.com/dtd/facelet-taglib_1_0.dtd
现在是修改web.xml和faces-config.xml的时候了。
前者应该用
修改<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/WEB-INF/mytag.taglib.xml</param-value>
</context-param>
faces-config.xml应该
<component>
<component-type>myTag.component</component-type>
<component-class>sample.mytag.LabelComponent</component-class>
</component>
我们很高兴去!
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:sample="http://sample.tag/mytag">
<sample:myspan text="I'm inside a span!"/>
</ui:composition>