2012-09-26 22 views
5

Estoy manteniendo una aplicación Ajax JSF2 y estamos utilizando en gran medida las etiquetas h:commandLinks y f:ajax para todas las acciones, siempre solo reordenando lo que se necesita.Cómo cambiar el atributo href = "#" estándar de h: commandLink?

Esto, por supuesto, romper el comportamiento esperado para el usuario al realizar un clic derecho en los enlaces y seleccionando "Abrir vínculo en una pestaña nueva", etc.

entiendo que f: ajax fuerzas del atributo href del El elemento a resultante es # y hace todo el truco mágico de la solicitud de publicación en la función onclick. Ahora deseo proporcionar soporte alternativo para la acción "Abrir enlace ..." poniendo un enlace significativo en el atributo href de la etiqueta resultante <a> .

Esto no rompería el comportamiento onclick "normal" ya que el javascript generado siempre termina con return false; pero me permitiría enviar a mis usuarios a alguna página utilizando una solicitud GET normal en caso de que deseen abrir el enlace en una nueva ventana .

¿Hay una compilación en la forma de hacer esto? ¿O podría alguien señalarme en la dirección correcta sobre en qué parte del ciclo de vida JSF tendría que saltar para hacer esto tal vez usando un detector de fase?

Respuesta

2

El más simple sería ampliar com.sun.faces.renderkit.html_basic.CommandLinkRenderer y anular el método renderAsActive() en consecuencia. Mojarra es de código abierto, simplemente copie el método y edite la línea donde dice writer.write("href", "#", "href"). Reemplace la cadena "#" de acuerdo con su visión.

public class MyCommandLinkRenderer extends CommandLinkRenderer { 

    @Override 
    protected void renderAsActive(FacesContext context, UIComponent command) throws IOException { 
     // ... 
    } 

} 

Para conseguir que se ejecute, registrarlo como sigue en faces-config.xml:

<render-kit> 
    <renderer> 
     <component-family>javax.faces.Command</component-family> 
     <renderer-type>javax.faces.Link</renderer-type> 
     <renderer-class>com.example.MyCommandLinkRenderer</renderer-class> 
    </renderer> 
</render-kit> 

Nota que las parejas esta ajustados a su procesador de Mojarra. Para ser independiente de la implementación de JSF, necesitaría crear un renderizador completamente nuevo en lugar de extender una clase de procesador específica de Mojarra.


Sin relación al problema concreto, considere leer When should I use h:outputLink instead of h:commandLink?

+0

gracias BalusC, extendiendo el CommandLinkRenderer funcionó a la perfección para lograr el resultado deseado. – bxr

+0

De nada. – BalusC

Cuestiones relacionadas