Nano Hash - криптовалюты, майнинг, программирование

JSF - Получить параметр URL и выбрать страницу - Сервлет?

Мне нужно изменить контекст моего сайта, используя параметр, отправленный клиентом.

Например, если я вызываю http://localhost:8084/JSF/, я загружаю обычный index.xhtml со страницей «Домашняя страница» в шаблоне content (по умолчанию). Но, если я позвоню http://localhost:8084/JSF/index.xhtml?page=profile, мне нужен своего рода переключатель в index.xhtml и включить/вставить шаблон профиля (или страницу, определяющую профиль) в мою область content.

Я думаю, что для этого мне нужно управлять сервлетом, потому что я не думаю, что смогу создать своего рода переключатель в своем index.xhtml. Поэтому я думаю, что мне нужно загрузить какой-то шаблон вместо другого.

Какой сервлет мне нужно использовать? Или мне нужно создать свой собственный сервлет для этого?

Ваше здоровье

ОБНОВЛЕНИЕ (добавлено по предложению BalusC)

package Beans;

import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ManagedBean;

@ManagedBean(name="selector")
@ManagedProperty(value="#{param.page}")
public class Selector {
    private String page;

    public String getPage() {
        return page;
    }

    public void setPage(String page) {
        this.page = page;
    }

}

template.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:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html">

    <h:head>
        <title><ui:insert name="title">Facelets Template</ui:insert></title>
    </h:head>

    <h:body>
        <ui:insert name="login_homepage">Box Content Here</ui:insert>

        <ui:insert name="content_homepage">Box Content Here</ui:insert>
    </h:body>
</html>

index.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">

<ui:composition template="./template.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:f="http://java.sun.com/jsf/core">
    <ui:define name="title">
        // title
    </ui:define>

    <ui:define name="login_homepage">
        // login
    </ui:define>

    <ui:include src="#{selector.page}.xhtml" />

    <ui:define name="content_homepage">
        // content
    </ui:define>
</ui:composition>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

profile.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">
<ui:composition
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <h2>PROFILE</h2>
</ui:composition>
24.11.2010

  • Я добавил jsf-2.0 и facelets в качестве тегов, потому что на основании ваших предыдущих вопросов знаю, что вы их используете. В будущем, пожалуйста, добавляйте их самостоятельно, когда это применимо, потому что ответ будет совершенно другим, если вы используете старый JSF 1.x и/или JSP вместо Facelets. 24.11.2010

Ответы:


1

Параметры запроса устанавливаются в JSF-бине с помощью @ManagedProperty. .

@ManagedProperty(value="#{param.page}")
private String page;

(в основном это bean.setPage(request.getParameter("page")) сразу после создания bean-компонента)

Вы можете использовать EL в Facelets <ui:include>.

<ui:include src="#{bean.page}.xhtml" />

(если bean.getPage() возвращает profile, значение будет profile.xhtml и включено соответствующим образом)

Нет необходимости в устаревших сервлетах :)


Обновление: вы установили аннотацию не в том месте. Это должно выглядеть так, как в моем исходном ответе:

package beans;

import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class Selector {

    @ManagedProperty(value="#{param.page}")
    private String page;

    public String getPage() {
        return page;
    }

    public void setPage(String page) {
        this.page = page;
    }

}

Обратите внимание, что я пропустил имя @ManagedBean, поскольку значение по умолчанию уже является именем класса с 1-м символом в нижнем регистре (что точно такое же, как вы указали вручную). Я также добавил аннотацию @RequestScoped, чтобы указать область действия компонента. Я также написал имя пакета в нижнем регистре, так как использование верхнего регистра в имени пакета запрещено в соответствии со стандартом Java Naming. Соглашения.

Все <managed-bean> в faces-config.xml совершенно лишнее с новыми аннотациями JSF 2.0. Вы в основном дублируете это. Убери это.


Обновление 2: index.xhtml должно выглядеть так

<!DOCTYPE html>
<html lang="en"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
    <h:head>
        <title>Include demo</title>
    </h:head>
    <h:body>
        <h1>This is the index page</h1>
        <c:catch>
            <ui:include src="#{selector.page}.xhtml" />
        </c:catch>
    </h:body>
</html>

(<c:catch> используется для подавления FileNotFoundException всякий раз, когда такого файла нет)

include.xhtml должно выглядеть так:

<!DOCTYPE html>
<ui:composition 
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <h2>Include page content</h2>
</ui:composition>

Предполагая, что FacesServlet прослушивает url-pattern из *.xhtml и оба файла находятся в одной папке, откройте ее с помощью index.xhtml?page=include.

24.11.2010
  • Пытался загрузить страницу с некоторым значением параметра, но все равно не работает. Кажется, что у web.xml есть некоторые проблемы... 24.11.2010
  • Вы также установили область действия bean-компонента? Должно быть @RequestScoped. Вы пропустили это в обновлении вопроса, я добавил его в своем обновлении ответа. Что касается web.xml, минимальной записью должно быть FacesServlet, но это должно быть в порядке, если другие страницы JSF работают нормально. Это будет проблематично, только если вы получите 404 Resource not found или RuntimeException: cannot find FacesContext. 24.11.2010
  • Хм, да, я добавил это. Но теперь кажется, что ничего не работает над моим проектом. Я переименовал пакет, как вы предлагаете (да, мой фалют), и теперь ничего не работает. Я попробую сделать тест... аааа 24.11.2010
  • Что такое url-pattern из FacesServlet? Это *.xhtml? Если это *.jsf, то его нужно изменить или открыть страницу по index.jsf?page=profile вместо index.xhtml?page=profile. Кроме того, щелкните правой кнопкой мыши страницу в браузере и выберите Просмотр исходного кода и убедитесь, что она не содержит НИ ОДНОЙ строки кода JSF/Facelets. Если в исходном коде в браузере есть код JSF/Facelets, это означает, что URL-адрес запроса не соответствует url-pattern из FacesServlet и, следовательно, FacesServlet не вызывается, и поэтому все теги JSF/Facelets остаются необработанными и отправляются в браузер как -является. 24.11.2010
  • Хм, да, но проблема в том, что весь проект не работает. Например, моя старая функция (login/ecc) не работает. хм... странно 24.11.2010
  • Хорошо, теперь он снова работает. Этот метод не работает... я опубликую весь код через несколько минут :) 24.11.2010
  • Возможно, ваша композиция страницы была совершенно неправильной. Я добавил пример как родительской, так и включаемой страницы. И, пожалуйста, также уточните не работает более подробно. Что именно происходит, а что именно не происходит? Работайте с точки зрения разработчика, а не с точки зрения конечного пользователя :) 24.11.2010
  • Да, ты прав. Простите меня, мой английский не настолько блестящий :) 24.11.2010
  • Я замечаю, что проблема, например, когда я вызываю главную страницу. Если я вызову localhost:8084/JSF, он загрузит мне портал. Если я вызову localhost:8084/JSF/index.xhtml, он покажет мне только ‹ui: определить содержимое name=title› (но исходный код загружен в браузере. Просто он мне не показывается). Проверьте по теме index.xhtml :) 24.11.2010
  • Тогда FacesServlet не отображается на *.xhtml. Может быть, это *.jsf. Затем вы должны заменить URL-адрес в браузере на /index.jsf или заменить url-pattern из FacesServlet в web.xml на *.xhtml. См. также 4-й комментарий. Кстати, лучше всего свести к минимуму шум в коде, который вы собираетесь опубликовать в вопросе. В вашем index.xhtml много кода, который совершенно не имеет отношения к реальному вопросу/проблеме. См., например, мои примеры xhtml для хорошего примера минимально необходимого кода, связанного с вопросом. 24.11.2010
  • Спасибо за подсказки :) Хорошо, убрал ненужный код и добавил web.xml. С ‹url-pattern›*.xhtml‹/url-pattern› я получаю ошибку 404! 24.11.2010
  • Изначально вы сопоставили FacesServlet с /faces/*. Вместо этого вам нужно открыть его с помощью /faces/index.xhtml (точно так же, как это делает <welcome-file>!). Однако это старомодный способ (стиль JSF 1.0) отображения FacesServlet. Я предлагаю использовать *.xhtml и не помещать файлы в папку /faces. Таким образом, вы никогда не столкнетесь с проблемой неразбора файлов XHTML, если они не открываются url-pattern из FacesServlet. 24.11.2010
  • Забавно: у меня их нет в папке /faces :) 24.11.2010
  • Это было необязательно. Но вы говорите о 404 на главной странице http://example.com, а не на http://example.com/index.html? Если да, обновили ли вы также <welcome-file>, чтобы удалить /faces? 24.11.2010
  • да. Ведь сейчас работа. Кажется, что NetBeans где-то разбился (после недавних обновлений). Подождите, я перезагружаю свой компьютер :) 24.11.2010
  • хорошо, теперь netbeans работает лучше, хе-хе! Прости. Итак, теперь работает, если я напишу также index.xhtml или index.xhtml?page=profile. К сожалению, он не добавляет содержимое profile.xhtml. Итак, я думаю, что в моем bean-компоненте есть проблема (на самом деле, если я вызову index.xhtml?page=profile, он должен напечатать ПРОФИЛЬ, но это не так). Я разместил профиль.xhtml 24.11.2010
  • Это работает здесь. Я запустил пример, как указано в моем ответе здесь. Ваш index.xhtml все равно выглядит немного странно. Я ожидаю, что <html> и <h:body> будут в template.xhtml. Как выглядит template.xhtml? Как выглядит сгенерированный HTML в браузере (Просмотреть исходный код)? В любом случае, попробуйте запустить точный пример, как в моем ответе. Если это работает, то на этот вопрос в основном уже дан ответ, и причина вашей текущей проблемы кроется где-то еще. 24.11.2010
  • Не знаю. Я немного упорядочил свой код, а также разместил шаблон. незнаю почему не работает.. 24.11.2010
  • Правильно, вы используете ui:include в ui:composition для template. Это не сработает. Все, что находится за пределами ui:define, будет игнорироваться. Вместо этого вам нужно поместить ui:include в ui:define или внутри template.xhtml. Между прочим, не связанные с проблемой, объявления XML-страниц только навредят MSIE (поэтому удалите их), а тип документа в настоящее время может быть лучше HTML5: <!DOCTYPE html>. См. также этот ответ. 24.11.2010
  • Оооо наконец-то это работает! Хорошо :) Последняя проблема заключается в том, что если я загружаю localhost:8084/JSF (или localhost:8084/JSF/index.xhtml) Компонент Selector не инициализирован, поэтому мне нужно установить индекс как страница по умолчанию... я думаю... 24.11.2010
  • Пожалуйста. Да, нужно предварительно настроить. Вы можете сделать это во время инициализации свойства private String page = "index"; или в конструкторе компонента this.page = "index";. Вам также необходимо проверить его, поскольку конечный пользователь может изменить его вручную путем изменения параметра запроса! В качестве альтернативы вы можете поместить <ui:include> в блок <c:catch> и проигнорировать исключение. Я обновлю пример в ответе. 24.11.2010
  • Да, я пытался. К сожалению, это не работает (или, лучше сказать, ‹ui:include src=#{selector.page}.xhtml› Неверный путь: .xhtml :)); но я думаю, что это зависит от нетерпеливого атрибута @ManagedBean? 24.11.2010
  • Отлично. Интеллектуальный обходной путь :) К сожалению, по какой-то причине мне нужно инициализировать index.xhtml как первую страницу... Я попытаюсь сделать кое-что. Еще раз спасибо за ваше время (несколько часов, чтобы решить эту проблему, хе-хе). Ты жжешь!!! 24.11.2010
  • Это было per saldo всего около 15 минут :) Но когда я приезжаю в Италию, я заслуживаю пива! 24.11.2010
  • Да, конечно :) Ха-ха! В качестве последней проблемы, все еще проблема в том, что я не могу инициализировать домашнюю страницу как страницу по умолчанию ... хм ... 24.11.2010

  • 2

    В обновленном вопросе следующие строки не по порядку:

    @ManagedBean(name="selector")
    @ManagedProperty(value="#{param.page}")
    public class Selector {
        private String page;
    

    Это должно быть так:

    @ManagedBean(name="selector")
    public class Selector {
        @ManagedProperty(value="#{param.page}")
        private String page;
    
    23.02.2011

    3

    Проблема в том, что если у вас есть commandButton в динамически подключаемом файле, commandButton не будет работать. Подпрограмма действия никогда не вызывается. Я все еще пытаюсь найти решение этой проблемы, даже с Mojarra 2.1.

    16.07.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..