2015-03-01 2 views
0

Я изучаю разработку jar-библиотеки компонента JSF 2.2. Для этой цели я разработал простой компонент MyDataTable.jsf reusuble component jar дает ошибку выражения

MyDataTableLib.jar содержит 3 пакетов:

1) META-INF, который содержит следующие MyDataTableTag.taglib.xml файл

<?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.components, который содержит следующие компоненты MyDataTable

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.renderer который содержит MyRenderer визуализатор класс

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"); 
    } 
} 
} 

Когда я включаю эту баночку библиотеку в другом проекте следующим образом:

<?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. сообщение об ошибке брошено.

Я использую NetBeans 8.0. Мне нужна помощь.

Спасибо BalusC

Я поставил new DataBaseManagement() в try-catch, но исключение не было брошено. Я удалил <rtexprvalue> и <deferred-value> атрибуты от tag lib.xml и ничего не изменилось. Трассировка стека выглядит следующим образом:

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) 
+1

Ничего в трассе стека? Конструктор, по крайней мере, страшный. Поместите это 'new DataBaseManagement()' в другое 'try-catch' и выведите/запишите исключение. Кстати, обратите особое внимание на то, что вы не используете JSP и/или JSF 1.x целевые ресурсы, когда узнаете о Facelets и/или JSF 2.x taglib. Эти атрибуты '' и '<отложенные значения>' абсолютно не принадлежат. Они типичны для JSP '* .tld' файла, а не для файла Facelets' * .taglib.xml'. – BalusC

+0

Я забыл пустой 'faces-config.xml' (содержащий только ) в пакете« META-INF ». Ваш другой [ответ] (http://stackoverflow.com/questions/9017504/facelet-tag-library-mechanism-does-not-work-as-expected) был очень полезен. Спасибо. – user2972185

ответ

0

Я решил проблему. Не забудьте поставить пустой faces-config.xml файл (содержащий только

<?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> 

) в вашем META-INF пакете.

Смежные вопросы