Как создать ПОЛУЧИТЬ запрос с параметрами, с помощью JSF и правил перехода?

10
задан Panagiotis Korros 26 September 2008 в 10:19
поделиться

4 ответа

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

Получение правил перехода

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

Поскольку я вижу его, Вы можете:

  1. проанализируйте faces-config.xml на инициализации и сохраните правила в (легком) контексте приложения
  2. реализуйте свой собственный NavigationHandler, который игнорирует правила в faces-config.xml или добавляет их с Вашим собственным файлом правил и выставляет его ruleset так или иначе (осуществимый, но берет немного работы),
  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;
    }

}

ДОБРАТЬСЯ

Для ПОЛУЧИТЬ запроса можно использовать UIParameters, чтобы установить значения и позволить рендереру создать список параметров.

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

POST

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

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

Примечания

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

11
ответ дан 3 December 2019 в 23:15
поделиться

Вы рассмотрели форму?

<h:form>
    <h:commandLink value="Click to see the message" action="#{handler.outcome}" />
    <h:inputHidden id="msgId" value="#{bean.msgId}"/>
</h:form>
0
ответ дан 3 December 2019 в 23:15
поделиться

Вы могли использовать линию передачи команд с вложенными тегами параметрического усилителя. Это - в основном то же, как hubbardr сказал выше:

<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
ответ дан 3 December 2019 в 23:15
поделиться

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

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

3
ответ дан 3 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: