Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom Component using JSF

Tags:

java

jsf

jsf-2

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?

like image 863
Stan Kurilin Avatar asked Sep 29 '11 13:09

Stan Kurilin


People also ask

What are JSF components?

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).

Which is the base class for all custom components in Java Server Faces JSF )?

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.

What is 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.


1 Answers

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.

See also:

  • Java EE 6 Tutorial - creating Custom UI Components
    • Steps for Creating a Custom Component
    • Creating Custom Component classes
    • Delegating Rendering to a Renderer
    • Defining the Custom Component Tag in a Tag Library Descriptor <-- this one.
like image 177
BalusC Avatar answered Oct 04 '22 00:10

BalusC