I want to create my own tag, but it doesn't 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-config
<?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'm using 2.0.1-FCS jsf-api/jsf.impl/jstl-1.1.0 jsp-api/servlet-api/standart
Where I'm wrong?
A JSF user interface component is the basic building block for creating a JSF user interface. A particular component represents a configurable and reusable element in the user interface, which may range in complexity from simple (such as a button or text field) to compound (such as a tree control or table).
JavaServer Faces technology provides the ability to create custom components by extending the UIComponent class, the base class for all standard UI components. A custom component can be used anywhere an ordinary component can be used, such as within a composite component.
A composite component is a component that consists of a collection of markups and other existing components. It is a reusable, user-created component that is capable of a customized, defined functionality and can have validators, converters and listeners attached to it like a any other JavaServer Faces component.
You've definied the tag in a JSP TLD, while you're using JSP's successor Facelets. You need to define the tag in a Facelets TLD.
When reading tutorials/books about creating custom JSF components, ensure that you're reading the JSF 2.0 targeted ones, not the JSF 1.2 targeted ones.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With