Установите домашнюю страницу по умолчанию через <приветственный файл> в проекте JSF

Я не могу установить страницу по умолчанию, загружаемую в браузере, когда я запускаю проект Java EE, используя Tomcat 8.0 от Eclipse. Я пытаюсь изучить JSF, поэтому я следил за этот учебник

Все работает отлично, но я могу видеть только созданные страницы, когда я нажимаю правой кнопкой мыши на файле login.xhtml или welcome.xhtml и выбираю "Запуск от имени/запуска на сервере".

До сих пор во всех других веб-приложениях я создал загруженную страницу по умолчанию при запуске всего проекта. По умолчанию используется загрузка страницы index.html (или, может быть, index.jsp, если она есть). Поэтому я добавил страницы index.html и index.xhtml в мою папку WEB-INF в проекте, надеясь, что будет показан хотя бы один из них. Однако ничего не происходит. Браузер всегда показывает только страницу на localhost:8080/JSFFaceletsTutorial/ URL, но страница белая, даже сообщение об ошибке. Я думаю, что я получаю ошибку 404 в процессе решения этой проблемы на этом пути, однако я больше не могу воспроизвести эту ошибку, и я не помню, что вызвало ее.

Я обнаружил, что изменить начальную страницу по умолчанию

Однако для меня это тоже не работает. Независимо от того, редактирую ли файл web.xml или нет, я получаю тот же результат.

Что еще более озадачивает, так это то, что когда я пытался изменить веб-браузер: "Window/Web Browser/..." он действовал некоторое время по-разному во внешних веб-браузерах, чем во внутреннем веб-браузере Eclipse. Внутренняя всегда была пустой страницей - но внешним веб-браузерам удалось показать страницу index.html, но это была некоторая устаревшая версия. Несмотря на то, что я абсолютно уверен, что я его отредактировал, сохранил изменения, перезапустил сервер... и все же показал мне устаревшую версию страницы. И даже в этом случае он по-прежнему игнорирует изменения, внесенные в файл web.xml. Но когда я сейчас пытаюсь это сделать, он снова показывает пустую белую страницу во всех браузерах. Я не знаю никаких изменений, которые я сделал, кроме редактирования файла web.xml...

Моя догадка заключается в том, что проблема заключается в технологии JSF, которую я пока не полностью понимаю. Это связано с тем, что, когда я выбираю использовать страницы login.xhtml и welcome.xhtml, используя правый щелчок "Запуск от имени/запуска на сервере", URL-адрес этих страниц находится на localhost:8080: с помощью пути /JSFFaceletsTutorial/faces/login.xhtml и /JSFFaceletsTutorial/faces/welcome.xhtml. Это странно, потому что у меня нет никаких "лиц" в моем проекте. Ввод всех возможных перестановок:

<welcome-file-list>
    <welcome-file>faces/index.html</welcome-file>
    <welcome-file>faces/index.xhtm</welcome-file>
</welcome-file-list>

в web.xml тоже не помогло. Это не помогло, когда я набрал здесь полный адрес.

Вот предупреждения, которые я получаю в консоли (я пропустил записи журнала INFO):

"19 декабря 2014 9:39:55 org.apache.tomcat.util.digester.SetPropertiesRule begin ПРЕДУПРЕЖДЕНИЕ: [SetPropertiesRule] {Сервер/Сервис/Двигатель/Хост/Контекст} Установка свойства 'source' в 'org.eclipse.jst.jee.server: JSFFaceletsTutorial' не нашел свойство соответствия.... ПРЕДУПРЕЖДЕНИЕ: JSF1074: Управляемый bean с именем 'loginBean' уже зарегистрирован. Замена существующего управляемого типа bean класса com.tutorial.LoginBean с помощью com.tutorial.LoginBean. 19 декабря 2014 9:39:57 org.apache.coyote.AbstractProtocol start"

Я не уверен, что это полезно. Теперь я не в курсе.

Ответ 1

Прежде всего, <welcome-file> не представляет путь к "домашней странице по умолчанию". Он представляет собой имя файла физического файла, содержащегося в папке, которую вы хотите использовать в качестве файла по умолчанию, когда запрашивается папка, например /, /foo/, /foo/bar/ и т.д.

Итак, в аромате JSF 2.x это будет в основном:

<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

Таким образом, если конечный пользователь запрашивает /, и у вас есть /index.xhtml, он будет обслуживаться. Или, если enduser запрашивает /foo, и у вас есть /foo/index.xhtml, тогда он будет обслуживаться и т.д. Если такого файла нет, тогда будет возвращена ошибка 404.

Теперь вы отобразили ваш FacesServlet в префиксе <url-pattern> /faces/*. Это осталось от JSF 1.0/1.1 возрастов и на самом деле не рекомендуется в наши дни. Возможно, вы читали устаревший учебник, ориентированный на JSF 1.x, или плохо поддерживаемый учебник, который был первоначально написан для JSF 1.x, а затем незаметно обновлен для JSF 2.x вместо перезаписывания с нуля.

В этом учебнике также, похоже, не объяснили вам некоторые основы сервлетов. А именно, чтобы заставить компоненты JSF на странице XHTML запускать и генерировать некоторый вывод HTML, FacesServlet должен вызываться, когда запрашивается страница XHTML. Когда вы запрашиваете страницу XHTML так /index.xhtml, а FacesServlet отображается на /faces/*, то она не будет вызываться. Затем браузер будет извлекать необработанный исходный код JSF без генерируемого вывода HTML. Вы можете увидеть его правой кнопкой мыши, View Source в webbrowser. Вы должны были запросить такую ​​страницу /faces/index.xhtml, чтобы FacesServlet мог запускать и выводить вывод HTML, который браузер может понять и представить.

Это не очень хорошо сочетается с файлами приветствия. Это полностью объясняет, почему вы получаете "чистую белую" (пустую) страницу при использовании index.xhtml в качестве файла приветствия (некоторые уступающие веб-браузеры, такие как IE, путают подсказку диалога загрузки, потому что отсутствующего/неправильного типа содержимого в ответе, содержащем исходный исходный исходный код XHTML). FacesServlet просто не вызывался. Просто избавитесь от старомодного шаблона URL /faces/* и используйте вместо него шаблон URL *.xhtml JSF 2.x.

<servlet-mapping>
    <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

Таким образом, файлы приветствия должны работать, и вы можете просто открывать страницы JSF, напрямую запрашивая его физический URL-адрес, без проблем с виртуальными URL-адресами. Это невозможно в JSF 1.x, потому что это позволяло FacesServlet запускаться в бесконечном цикле, вызывающем себя и вызывающем переполнение стека.

См. также:


Что касается этих предупреждений, они не связаны, но довольно googlable.

Ответ 2

Вы можете установить страницу по умолчанию в файле web.xml, чтобы FaceServlet вызывался в JSF двумя способами:

<web-app xmlns="http://xmlns.xyz.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.xyz.org/xml/ns/javaee http://xmlns.xyz.org/xml/ns/javaee/web-app_4_0.xsd"
     version="4.0">
    <servlet>
        <servlet-name>facesServlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>facesServlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

или вызовите FaceServlet непосредственно из файла приветствия следующим образом:

<web-app xmlns="http://xmlns.xyz.org/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://xmlns.xyz.org/xml/ns/javaee http://xmlns.xyz.org/xml/ns/javaee/web-app_4_0.xsd"
 version="4.0">
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

Надеюсь, это кому-нибудь поможет!

Ответ 3

я думаю это сработает

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.xyz.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.xyz.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <welcome-file-list>
    <welcome-file>/main/login.xhtml</welcome-file>
      </welcome-file-list>
<!--         <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.xyz.servlets.login</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping> -->

</web-app>