JSF Custom Components || Unable to load tag handler class

Wutklumpen

Mitglied
Heyho!

Seit gestern versuche ich mich nun daran, eigene Komponenten für jsf 1.2 zu entwerfen. Es gibt zwar wieder ein paar Tutorials, aber die sind meißt einfach nicht detailiert genug!

Beim Seitenaufruf mit der eigenenen Komponente beomm ich dann folgende Fehlermeldung:

org.apache.jasper.JasperException - Unable to load tag handler class "wut.klumpen.outputCrapUITag" for tag "wut:eek:utputCrap"


Die Componentclass outputCrapUIC.java:
Java:
package wut.klumpen.components;

import java.io.IOException;

import javax.faces.component.UIComponentBase;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

public class outputCrapUIC extends UIComponentBase
{
	
	public void encodeBegin(FacesContext fc) throws IOException
	{
		ResponseWriter writer = fc.getResponseWriter();
		String msg = (String) getAttributes().get("msg");
		
		writer.startElement("h3", this);
			if(msg != null)
				writer.writeText(msg, "msg");
			else
				writer.writeText("Hmm, dein msg war wohl null! Schade eigentlich!", null);
		writer.endElement("h3");
		
		writer.startElement("p", this);
			writer.writeText("Dieser Text wird aus einer customcomponent generiert!", null);
		writer.endElement("p");	
	}	

	@Override
	public String getFamily()
	{
		return "wut.klumpen.components.outputCrapUIC";
	}

}


Die Tag-class ouputCrapUITag:

Java:
package wut.klumpen.components;

import javax.faces.component.UIComponent;
import javax.faces.webapp.UIComponentELTag;

public class outputCrapUITag extends UIComponentELTag
{
	public String msg = null;

	@Override
	public String getComponentType(){return "wut.klumpen.components.outputCrap";}
	
	@Override
	public String getRendererType(){return null;}
	
	
	@SuppressWarnings("unchecked")
	protected void setProperties(UIComponent comp)
	{
		super.setProperties(comp);
		comp.getAttributes().put("msg", msg);
	}
	
	public void release()
	{
		super.release();
		this.msg  = null;
	}

	public void setMsg(String msg)
	{
		this.msg = msg;
	}
}

Die .TLD:

XML:
<?xml version="1.0" encoding="UTF-8"?>

<taglib 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"
    version="2.1">
    <description>Meine Custom Components</description>
    <tlib-version>1.0</tlib-version>
	<short-name>wut</short-name>
	<uri>http://wutklump.en/custom</uri>
 	<tag>
		<name>outputCrap</name>
		<tag-class>wut.klumpen.outputCrapUITag</tag-class>
		<body-content>empty</body-content>
		
		<attribute>
			<name>binding</name>
		</attribute>
		
		<attribute>
			<name>id</name>
		</attribute>
		
		<attribute>
			<name>rendered</name>
		</attribute>
		
		<attribute>
			<name>msg</name>
		</attribute>
	</tag>	
</taglib>

und in der Faces-Config wirds so gemappt:

Code:
<component>
		<component-type>wut.klumpen.components.outputCrap</component-type>
		<component-class>wut.klumpen.components.outputCrapUIC</component-class>
	</component>

und wenn ich nun
<wut:eek:utputCrap msg="Hell World!"/>
in meiner jsp schreibe bekomm ich diese Fehlermeldung:

org.apache.jasper.JasperException - Unable to load tag handler class "wut.klumpen.outputCrapUITag" for tag "wut:eek:utputCrap"


Jmd ne Idee?


€: die .tld und die beiden outputCrap-classes liegen im web-inf/classes/wut/klumpen/components
 
Zuletzt bearbeitet von einem Moderator:
Hmm..., noch niemand eigene Komponenten entwickelt? Ich denk das is die große Stärke von JSF!?

So wie ich das bis jetzt mitbekommen habe, sind die benötigten Dateien ja alle von einander Abhängig:

Tag-Handler:
Im Tag-Handler muss die getComponentType()-Methode den exakten Pfad zur Komponenten-Klasse inklusive Packages zurückgeben, in meinem Fall sollte das hiermit getan sein:
Code:
return "wut.klumpen.components.outputCrapUIC";

Das selbe gilt für die getRenderType()-Methode, falls man einen Renderer benötigt!(oder brauch man in jedem Fall einen Renderer?Kein default?)

Die Attribute im Tag-Handler brauchen getter u. setter, auch erledigt.
-------------------

Taglib Descriptor .TLD:
Hier gibts noch so paar kleine ungereimtheiten, zB dachte ich, das die Url im uri-tag den String angibt, mit dem man die ...ich nenns mal Komponenten-Bibliothek... über <% taglib uri="%%%URI%%%" refix="bla"> in die .jsp einbindet! Ich muss hingegen den absoluten pfad der .tld benutzen!

Egal.., wichtiger scheint auf jeden Fall das tag-Tag.o0O(ein tag-Tag, na ganz prima...):
Code:
<tag>
		<name>outputCrap</name>
		<tag-class>wut.klumpen.outputCrapUITag</tag-class>
                /*snip*/
</tag>

<name> steht m.E. für den letztendlichen Komponentennamen, also <prefix:name>
<tag-class> muss den Pfad zur Tag-Handler-Klasse inklusive Packages beinhalten!
------------------
faces-config.xml:

Code:
<component>
		<component-type>wut.klumpen.components.outputCrap</component-type>
		<component-class>wut.klumpen.components.outputCrapUIC</component-class>
</component>
<component-type>: ich hab nich den blassesten schimmer! Ich versuch mich ja an zB der Tomahawk.jar zu orientieren, aber das hilft auch nich weiter.
<component-class>: Pfad inklusive packages zur Komponentenklasse
----------------
Und zuletzt noch die Komponentenklasse:

was in die getFamily-Methode rein muss/soll/kann, bin ich mir auch nich sicher!
----------------

Kann mir irgendjemand diese Aussagen bestätigen oder eben berichtigen? Das wär wirklich super!

Danke!
 
Und wenn man der Fehlermeldung auch nur mal ein Deut Aufmerksamkeit zukommen lassen würde, hätte man ganz schnell gemerkt, das in der TLD beim tag-class ein Stück Pfad fehlt -.-

Denn es müsste in meinem Fall wut.klumpen.components.outputCrapUITag heißen!
AHRG! *in Tisch beiß*
 

Neue Beiträge

Zurück