I want to create my own tag, but it does not work
component:
package com; import javax.faces.component.UIOutput; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import java.io.IOException; public class Printer extends UIOutput { private String label; public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } @Override public Object saveState(FacesContext context) { Object values[] = new Object[2]; values[0] = super.saveState(context); values[1] = label; return ((Object) (values)); } @Override public void restoreState(FacesContext context, Object state) { Object values[] = (Object[]) state; super.restoreState(context, values[0]); label = (String) values[1]; } public void encodeBegin(FacesContext context) throws IOException { ResponseWriter writer = context.getResponseWriter(); writer.startElement("label", this); writer.write(label); writer.endElement("label"); writer.flush(); } public String getFamily() { return "printer"; } public void encodeEnd(FacesContext context) throws IOException { return; } public void decode(FacesContext context) { return; } }
Tag
package com; import javax.faces.component.UIComponent; import javax.faces.webapp.UIComponentELTag; public class PrinterTag extends UIComponentELTag { private String label; public PrinterTag() { int i = 10; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } @Override public String getComponentType() { return "printer"; } @Override public String getRendererType() { return null; } protected void setProperties(UIComponent component) { super.setProperties(component); ((Printer) component).setLabel(label); } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app 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-app_2_5.xsd" version="2.5"> <context-param> <description> </description> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value> /WEB-INF/faces-config.xml </param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> <jsp-config> <taglib> <taglib-uri>http://ff.com</taglib-uri> <taglib-location>/WEB-INF/ff.tld</taglib-location> </taglib> </jsp-config> <listener> <listener-class>com.sun.faces.config.ConfigureListener</listener-class> </listener> </web-app>
TLD
<?xml version="1.0" encoding="ISO-8859-1"?> <taglib xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.1"> <display-name>RichFaces</display-name> <tlib-version>3.3.3</tlib-version> <short-name>ff</short-name> <uri>http://ff.com</uri> <tag> <name>mylabel</name> <tag-class>com.PrinterTag</tag-class> <body-content>tagdependent</body-content> <attribute> <description>The attribute takes a value-binding expression for a component property of a backing bean </description> <name>label</name> <rtexprvalue>false</rtexprvalue> <type>java.lang.String</type> </attribute> </tag> </taglib>
faces configuration
<?xml version='1.0' encoding='UTF-8'?> <faces-config 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-facesconfig_2_0.xsd" version="2.0"> <component> <component-type>printer</component-type> <component-class>com.Printer</component-class> </component> </faces-config>
test.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:ff="http://ff.com"> <h:head> <title>Simple JSF Facelets page</title> </h:head> <h:body> before-<ff:mylabel label="This is my first tag"/>-after </h:body> </html>
(prints before - after)
I am using 2.0.1-FCS jsf-api / jsf.impl / jstl-1.1.0 JSP-api / servlet-api / standard
Where am I mistaken?
source share