JSF Custom Component! ActionListener wird nicht aufgerufen!

larlib

Grünschnabel
Hallo,
ich versuche gerade eine eigene JSF-Komponente zu bauen und diese mit einem ActionListener auszustatten. Die Komponente erbt von UICommand.
In den encode-Methoden wird nur ein Div-Element gerendert. Ziel ist es, mit einem Klick auf das Div-Element den ActionListener aufzurufen.

Leider wird dieser nicht aufgerufen und ich habe keine Ahnung warum!


Hier der Taghandler der Komponente:
Code:
public class ActionTag extends UIComponentELTag {

	private javax.el.MethodExpression actionListener = null;

	@Override
	public String getComponentType() {
		return "components.UIAction";
	}

	@Override
	public String getRendererType() {
		return null;
	}

	public void setActionListener(MethodExpression actionListener) {
		this.actionListener = actionListener;
	}
	 
	protected void setProperties(UIComponent component) {
		super.setProperties(component);
		UIAction action = null;
		try {
			action = (UIAction) component;
		} catch (ClassCastException cce) {
			throw new IllegalStateException(
					"Component "
							+ component.toString()
							+ " ist nicht der erwartete Typ");
		}
		if (actionListener != null) {
			action.addActionListener(new MethodExpressionActionListener(
					actionListener));
		}
	}
}

Hier die Komponente:
Code:
public class UIAction extends UICommand implements MyListener {

	public UIAction() {
		super();
		setRendererType(null);
	}
	
	public void encodeBegin(FacesContext context) throws IOException {
		if (context == null)
			throw new NullPointerException();
		ResponseWriter writer = context.getResponseWriter();
		writer.startElement("div", this);
		writer.writeAttribute("onclick", "alert('test');", null);
	}

	

	public void encodeEnd(FacesContext context) throws IOException {
		if (context == null)
			throw new NullPointerException();

		ResponseWriter writer = context.getResponseWriter();
		writer.endElement("div");
	}

	@Override
	public void decode(FacesContext context) {
		if (context == null) {
			throw new NullPointerException();
		}
		MyEvent event = new MyEvent(this);
		event.queue();
	}

	public void processAction(MyEvent event) {
		System.out.println("processAction(MyEvent event)");

	}

}

Hier der Eintrag in der faces-config Datei:
Code:
...
<component>
		<component-type>components.UIAction</component-type>
		<component-class>components.UIAction</component-class>
</component>
...

die das Tag in der tld-datei:
Code:
<tag>
		<name>actionComp</name>
		<tag-class>components.ActionTag</tag-class>
		<body-content>JSP</body-content>
		<!--  Attribute -->
		<attribute>
			<name>id</name>
			<required>false</required>
		</attribute>
	    <attribute>
      		<name>actionListener</name>
      			<required>false</required>
      			<deferred-method>
         			<method-signature>void   actionListener(javax.faces.event.ActionEvent)</method-signature>
      			</deferred-method>
    	</attribute>
</tag>

Hier meine Eventklasse:
Code:
public class MyEvent extends FacesEvent {
	private static final long serialVersionUID = 5009099988768540892L;

	public MyEvent(UIComponent source) {
		super(source);
	}
	@Override
	public boolean isAppropriateListener(FacesListener listener) {
		return (listener instanceof MyListener);	
	}
	@Override
	public void processListener(FacesListener listener) {
		((MyListener)listener).processAction(this);
	}
}
Hier mein listenerinterface:
Code:
public interface MyListener extends FacesListener{	
	public void processAction(MyEvent event);
}

Aufgerufen wird die Komponente in der .jsp wie folgt:
Code:
...
<test:actionComp actionListener="#{testBean.test}">actionTest</test:actionComp>
...

hier noch die BeanMethode:
Code:
...
public void test(MyEvent event)
	{
		System.out.println("test");
	}
...


Falls jemand helfen kann, wäre ich sehr dankbar :confused:

gruß
larlib
 
Zuletzt bearbeitet:
Zurück