Получить ViewID в JSF при использовании шаблонов - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь получить свои RequestID или RequestURI в JSF, как только я нажимаю кнопку.Я попробовал это:

    FacesContext context = FacesContext.getCurrentInstance();
    ExternalContext exContext = context.getExternalContext();
    Map<String, String> x = exContext.getRequestHeaderMap();
    System.out.println(x.get("request"));
    System.out.println(context.getViewRoot().getViewId());
    System.out.println(exContext.getRequestContextPath());

Проблема в том, что моя страница представляет собой шаблон, который перезагружает части стороны с новым XHTML.Основная сторона - home.xhtml, и я все время получаю именно этот идентификатор.

Но мне нужен XHTML, который включен, например, view1.xhtml (загружен в home.xhtml).

Это возможно?Мне нужно это, чтобы сохранить запрашивающее представление в моей базе данных для моего небольшого приложения для перевода.

РЕДАКТИРОВАТЬ: Мой WebApp должен отслеживать, какое представление вызвало специальный тег перевода из моего пакета ресурсов и записать представление (view1.xthml, а не home.xhtml) и тег вбаза данных.Может быть, также можно получить идентификатор элемента html (но это не важно)?В каждом представлении есть несколько включений!

Пример: login.xhtml включено в home.xhtml

<p:panel header="#{translations['titel']}">

Теперь приложение должно сохранять (login.xhtml, titel).

Спасибо!

РЕДАКТИРОВАТЬ2:

XHTML:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head>
    <title>example</title>
    <link rel="shortcut icon" type="image/x-icon"
          href="#{request.contextPath}/resources/images/logo/example.ico"/>
</h:head>

<h:body>
    <h:form id="menubar">
        <p:menubar>
            <p:submenu label="#{translations['language']}" icon="fa fa-language">
                <p:menuitem value="German" action="#{language.setLocale(de)}"/>
                <p:menuitem value="English" action="#{language.setLocale(en)}"/>
            </p:submenu>
        </p:menubar>
    </h:form>
</h:body>

Face-config.xml запись для пакета ресурсов:

<resource-bundle>
    <base-name>example.i18n.resourcebundle.DBResourceBundle</base-name>
    <var>translations</var>
</resource-bundle>

Функция перевода-компонента:

public String test() {
    FacesContext fCtx = FacesContext.getCurrentInstance();
    UIComponent currentComponent = UIComponent.getCurrentComponent(fCtx);
    if (null != currentComponent) {
        Location location = (Location) currentComponent.getAttributes().get(UIComponent.VIEW_LOCATION_KEY);
        if (null != location) {
            System.out.println(location);
            System.out.println(location.getPath());
            return location.getPath();
        }
    }
    return null;
}

Теперь я хочу сохранить все запросы label="#{translations['language']}" на карте.Эта карта должна иметь « language » в качестве ключа и запрашивающий XHTML (например, « login.xhtml ») в качестве значения.Translations содержит большинство нужных мне переводов, если их нет внутри, я также хочу запись, как и раньше.

В этом случае достаточно, если запрос вызывает функцию test().

1 Ответ

0 голосов
/ 15 октября 2018

Оценивая #{translations['titel']}, вы хотите узнать физическое местоположение этого выражения в файле XHTML.

После копания я обнаружил, как получить местоположение отображаемого в данный момент тега:

Описание связанных API см.

javax.faces.view.Location
UIComponent.VIEW_LOCATION_KEY
javax.faces.component.UIComponent.getCurrentComponent(FacesContext)

. Вы можете использовать эту часть кода для получения имени файла XHTML:

public String getCurrentComponentPath() {
        FacesContext fCtx = FacesContext.getCurrentInstance();
        UIComponent currentComponent = UIComponent.getCurrentComponent(fCtx);
        if (null != currentComponent) {
            Location location = (Location) currentComponent.getAttributes().get(UIComponent.VIEW_LOCATION_KEY);
            if (null != location) {
                return location.getPath();
            }
        }
        return null;
    }

Протестировано с JSF 2.3 (Mojarra).

Примечание : Если ваше EL-выражение не находится в компоненте в текущем шаблоне, вы не получите текущее имя файла XHTML, так как UIComponent.getCurrentComponent возвращает компонент из parent шаблон XHTML , который включает текущий XHTML.

Например, это не будет работать должным образом:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

<ui:composition>

    #{translations['titel']}

</ui:composition>
</html>

В то время как это происходит:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

<ui:composition>

    <h:outputText value="#{translations['titel']}"/>

</ui:composition>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...