Как изменить стандартный атрибут href=# для h:commandLink?

Я поддерживаю приложение JSF2 Ajax, и мы активно используем теги h:commandLinks и f:ajax для всех действий - всегда перерисовываем только то, что необходимо.

Это, конечно, нарушает ожидаемое поведение пользователя при щелчке правой кнопкой мыши по ссылкам и выборе «Открыть ссылку в новой вкладке» и т. д.

Я понимаю, что f: ajax заставляет атрибут href результирующего элемента a быть # и выполняет все трюки с волшебным пост-запросом в функции onclick. Теперь я хочу обеспечить резервную поддержку для действия «Открыть ссылку ...», поместив какая-то значимая ссылка в атрибуте href результирующего тега <a>.

Это не нарушило бы «нормальное» поведение при нажатии, поскольку сгенерированный javascript всегда заканчивается return false;, но позволило бы мне отправлять моих пользователей на какую-либо страницу с помощью обычного запроса GET, если они хотят открыть ссылку в новом окне.

Есть ли способ сделать это? Или может кто-нибудь указать мне правильное направление в том, где в жизненном цикле JSF мне нужно будет прыгнуть, чтобы сделать это, возможно, используя прослушиватель фазы?


person bxr    schedule 26.09.2012    source источник


Ответы (1)


Проще всего было бы расширить com.sun.faces.renderkit.html_basic.CommandLinkRenderer и переопределите renderAsActive() соответственно. Mojarra имеет открытый исходный код, просто скопируйте метод и отредактируйте строку, где написано writer.write("href", "#", "href"). Замените строку "#" в соответствии с вашим пониманием.

public class MyCommandLinkRenderer extends CommandLinkRenderer {

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

}

Чтобы запустить его, зарегистрируйте его следующим образом в 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>

Обратите внимание, что это тесно связывает ваш рендерер с Mojarra. Чтобы быть независимым от реализации JSF, вам нужно создать совершенно новый модуль визуализации вместо расширения класса модуля визуализации, специфичного для Mojarra.


Не связанный с конкретной проблемой, рекомендуем прочитать Когда следует ли использовать h:outputLink вместо h:commandLink?

person BalusC    schedule 26.09.2012
comment
спасибо BalusC, расширение CommandLinkRenderer отлично сработало для достижения желаемого результата. - person bxr; 26.09.2012