Как создать запрос GET с параметрами, используя JSF и навигационные правила? - PullRequest
10 голосов
/ 26 сентября 2008

Есть ли способ создать ссылку html, используя h: outputLink, другой тег JSF или код для создания запроса без лиц (HTTP GET) с параметрами запроса?

Например, у меня есть следующее правило навигации

<navigation-rule>
    <navigation-case>
        <from-outcome>showMessage</from-outcome>
        <to-view-id>/showMessage.jsf</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

На моей странице я хотел бы вывести следующий HTML-код:

<a href="/showMessage.jsf?msg=23">click to see the message</a>

Я мог бы просто написать HTML-код на странице, но я хочу использовать правило навигации, чтобы все URL-адреса были определены в одном настраиваемом файле.

Ответы [ 4 ]

11 голосов
/ 26 сентября 2008

Это интересная идея. Мне было бы интересно узнать, как это получается на практике.

Получение правил навигации

Навигация обрабатывается NavigationHandler . Завладеть NavigationHandler не сложно, но API не раскрывает используемые им правила.

Как я понимаю, вы можете:

  1. При инициализации анализирует face-config.xml и сохраняет правила в контексте приложения ( easy )
  2. реализует свой собственный NavigationHandler, который игнорирует правила вface-config.xml или дополняет их собственным файлом правил и каким-то образом предоставляет свой набор правил ( работоспособный, но требует немного работы )
  3. смоделируйте ваш собственный FacesContext и передайте его в существующий обработчик навигации ( действительно трудно заставить два объекта FacesContext сосуществовать в одном потоке и крайне неэффективно )

Теперь у вас есть и другая проблема. Где вы собираетесь хранить сопоставления для просмотра представлений? Жесткий код их в бобах?

Использование правил навигации

Я могу подумать о двух способах создания URL-адресов, содержащих параметры, из серверной части. И то, и другое подразумевает определение какого-либо компонента.

<managed-bean>
    <managed-bean-name>navBean</managed-bean-name>
    <managed-bean-class>foo.NavBean</managed-bean-class>
    <managed-bean-scope>application</managed-bean-scope>
</managed-bean>

Источник:

package foo;

import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

public class NavBean implements Serializable {

    private String getView() {
        String viewId = "/showMessage.faces"; // or look this up somewhere
        return viewId;
    }

    /**
     * Regular link to page
     */
    public String getUrlLink() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext extContext = context.getExternalContext();
        String viewId = getView();
        String navUrl = context.getExternalContext().encodeActionURL(
                extContext.getRequestContextPath() + viewId);
        return navUrl;
    }

    /**
     * Just some value
     */
    public String getValue() {
        return "" + System.currentTimeMillis();
    }

    /**
     * Invoked by action
     */
    public String invokeRedirect() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext extContext = context.getExternalContext();
        String viewId = getView();
        try {
            String charEncoding = extContext.getRequestCharacterEncoding();
            String name = URLEncoder.encode("foo", charEncoding);
            String value = URLEncoder.encode(getValue(), charEncoding);
            viewId = extContext.getRequestContextPath() + viewId + '?' + name
                    + "=" + value;
            String urlLink = context.getExternalContext().encodeActionURL(
                    viewId);
            extContext.redirect(urlLink);
        } catch (IOException e) {
            extContext.log(getClass().getName() + ".invokeRedirect", e);
        }
        return null;
    }

}

GET

Для запроса GET вы можете использовать параметры UIP, чтобы установить значения и позволить средству визуализации построить список параметров.

<h:outputLink value="#{navBean.urlLink}">
    <f:param name="foo" value="#{navBean.value}" />
    <h:outputText value="get" />
</h:outputLink>

POST

Если вы хотите установить URL-адрес для представления во время действия POST, вы можете сделать это, используя перенаправление в действии (вызывается кнопкой или commandLink).

<h:commandLink id="myCommandLink" action="#{navBean.invokeRedirect}">
    <h:outputText value="post" />
</h:commandLink>

Примечания

Обратите внимание, что ExternalContext.encodeActionURL используется для кодирования строки. Это хорошая практика для создания кода, переносимого между контекстами (портлеты и т. Д.). Вы бы использовали encodeResourceURL , если бы вы кодировали ссылку на изображение или файл загрузки.

3 голосов
/ 03 ноября 2009

Пробовал с помощью PrettyFaces? Это расширение JSF с открытым исходным кодом, специально разработанное для создания закладок JSF-страниц / JSF с возможными запросами GET.

PrettyFaces - SEO, динамические параметры, закладки и навигация для JSF / JSF2

0 голосов
/ 02 октября 2008

Вы можете использовать commandLink с вложенными тегами param. Это в основном то же самое, что сказал Хаббардр выше:

<h:form>
  <h:commandLink value="click here" action="${handler.outcome}">
    <f:param name="msgId" value="${bean.id}" />
  </h:commandLink>
</h:form>

Тогда в вашем бобе вам нужно сделать:

Map requestMap = FacesContext.getCurrentInstance()
                 .getExternalContext().getRequestParameterMap();
String msgId = (String) requestMap.get("msgId");

А потом делай все, что тебе нужно.

0 голосов
/ 26 сентября 2008

Рассматривали ли вы форму?

<h:form>
    <h:commandLink value="Click to see the message" action="#{handler.outcome}" />
    <h:inputHidden id="msgId" value="#{bean.msgId}"/>
</h:form>
...