0

I am studying on developing JSF 2.2 component jar library. I have developed a simple MyDataTablecomponent for this purpose.

MyDataTableLib.jar contains 3 packages:

1) META-INF which contains following MyDataTableTag.taglib.xml file

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib version="2.1" 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-jsptaglibrary_2_1.xsd">

<namespace>http:java.sun.com/MyDataTableTag</namespace>
<tag>
    <tag-name>MyDataTableTag</tag-name>
    <component>
        <component-type>com.components.MyDataTable</component-type>
        <renderer-type>com.renderer.MyRenderer</renderer-type>
    </component>
    <attribute>
        <name>title</name>
        <rtexprvalue>true</rtexprvalue>
        <type>java.lang.String</type>
    </attribute>
    <attribute>
        <name>binding</name>
        <required>true</required>
        <deferred-value>com.components.MyDataTable</deferred-value>
    </attribute>
</tag>
</facelet-taglib>

2)com.componentswhich contains following MyDataTablecomponent

package com.components;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import javax.faces.component.FacesComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.context.FacesContext;


@FacesComponent(value = MyDataTable.MY_TYPE)
public class MyDataTable extends UIComponentBase {

public static final String MY_FAMILY = "com.components.MyDataTable";
public static final String MY_TYPE = "com.components.MyDataTable";
public static final String MY_RENDERER_TYPE = "com.renderer.MyRenderer";
String Title, columnnames[], data[][];
DataBaseManagement db;


@Override
public String getFamily() {
    return MY_FAMILY;
}

public MyDataTable() throws ClassNotFoundException, SQLException {
    setRendererType(MY_RENDERER_TYPE);
    db = new DataBaseManagement("jdbc:mysql://localhost:3306/fakulte", "root", "");
}

public String getTitle() {
    return Title;
}

public void setTitle(String Title) {
    this.Title = Title;
}

public String[] getColumnnames() {
    return columnnames;
}

public void setColumnnames(String[] columnnames) {
    this.columnnames = columnnames;
}

public String[][] getData() {
    return data;
}

public void setData(String[][] data) {
    this.data = data;
}

public void executeQuery(String query) throws SQLException {
    ArrayList<HashMap<String, String>> result = db.getQuery(query);
    Object cols[] = result.get(0).keySet().toArray();
    columnnames = new String[cols.length];
    data = new String[result.size()][cols.length];
    for (int c = 0; c < cols.length; c++) {
        columnnames[c] = cols[c].toString();
    }
    for (int r = 0; r < result.size(); r++) {
        for (int c = 0; c < columnnames.length; c++) {
            data[r][c] = result.get(r).get(columnnames[c]);
        }
    }
    Title = db.getLastQueryTitle();
}

@Override
public Object saveState(FacesContext context) {
    Object val[] = new Object[4];
    val[0] = super.saveState(context);
    val[1] = Title;
    val[2] = columnnames;
    val[3] = data;
    return val;
}

@Override
public void restoreState(FacesContext context, Object state) {
    Object val[] = (Object[]) state;
    super.restoreState(context, val[0]);
    Title = (String) val[1];
    columnnames = (String[]) val[2];
    data = (String[][]) val[3];
}
}

3) com.rendererwhich contains MyRendererrenderer class

package com.renderer;

import com.components.MyDataTable;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.FacesRenderer;
import javax.faces.render.Renderer;

@FacesRenderer(componentFamily = MyDataTable.MY_FAMILY, 
    rendererType = MyDataTable.MY_RENDERER_TYPE)
public class MyRenderer extends Renderer {

@Override
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
    super.encodeBegin(context, component);
    if (component != null) {
        encodeTable(context.getResponseWriter(), (MyDataTable) component);
    }
}

@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
    super.encodeEnd(context, component);
    ResponseWriter out = context.getResponseWriter();
    out.startElement("h3", component);
    out.write("Sayfa Sonu-------");
    out.endElement("h3");
}



private void encodeTable(ResponseWriter out, MyDataTable table) throws IOException {
    if (table.getTitle() != null) {
        out.startElement("h1", table);
        out.write(table.getTitle());
        out.endElement("h1");
    }
    if (table.getData() != null) {
        out.startElement("table", table);
        out.writeAttribute("border", "1", "border");
        if (table.getColumnnames() != null) {
            out.startElement("tr", table);
            String col[] = table.getColumnnames();
            for (int i = 0; i < col.length; i++) {
                out.startElement("td", table);
                out.write(col[i]);
                out.endElement("td");
            }
            out.endElement("tr");
        }

        String data[][] = table.getData();
        for (int r = 0; r < data.length; r++) {
            out.startElement("tr", table);
            for (int c = 0; c < data[r].length; c++) {
                out.startElement("td", table);
                out.write(data[r][c]);
                out.endElement("td");
            }
            out.endElement("tr");
        }
        out.endElement("table");
    }
}
}

When I include this jar library in another project as follows:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:t="http:java.sun.com/MyDataTableTag">
<head>
    <title>TODO supply a title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>
<body>
   <h:form>
        <h:inputText binding="#{Bean.input}"/>
        <h:commandButton value="Execute query" action="#{Bean.executeQuery()}"/>
        <t:MyDataTableTag title="Hello" binding="#{Bean.table}"/>
    </h:form>
</body>
</html>

Expression Error: Named Object: com.components.MyDataTable not found.error message is thrown.

I am using NetBeans 8.0. I need help.

Thank you BalusC

I put new DataBaseManagement() in try-catch but no exception was thrown. I removed <rtexprvalue>and <deferred-value>attributes from tag lib.xmland nothing changed. Stack trace is as follows:

javax.faces.FacesException: Expression Error: Named Object: com.components.MyDataTable not found.
at com.sun.faces.application.ApplicationImpl.createComponentApplyAnnotations(ApplicationImpl.java:1933)
at com.sun.faces.application.ApplicationImpl.createComponentApplyAnnotations(ApplicationImpl.java:1968)
at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:1151)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.createComponent(ComponentTagHandlerDelegateImpl.java:499)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:172)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:190)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:95)
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:87)
at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:161)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:980)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:99)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
user2972185
  • 231
  • 3
  • 12
  • 1
    Nothing in the stack trace? The constructor is at least scary. Put that `new DataBaseManagement()` in another `try-catch` and print/log the exception. By the way, please pay carefully attention that you aren't using JSP and/or JSF 1.x targeted resources when learning about Facelets and/or JSF 2.x taglibs. Those `` and `` attributes absolutely doesn't belong there. They are typical to a JSP `*.tld` file, not to a Facelets `*.taglib.xml` file. – BalusC Mar 02 '15 at 06:47
  • I forgot an empty `faces-config.xml` (containing only ) in `META-INF` package. Your another [answer](http://stackoverflow.com/questions/9017504/facelet-tag-library-mechanism-does-not-work-as-expected) was very helpful. Thank you. – user2972185 Mar 03 '15 at 01:52

1 Answers1

0

I solved the problem. Do not forget to put an empty faces-config.xml file (containing only

<?xml version="1.0" encoding="UTF-8"?>
<faces-config 
    xmlns="java.sun.com/xml/ns/javaee"; xmlns:xsi="w3.org/2001/XMLSchema-instance"; xsi:schemaLocation="java.sun.com/xml/ns/javaee java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"; 
    version="2.1">
</faces-config>

) in your META-INF package.

user2972185
  • 231
  • 3
  • 12