Установите домашнюю страницу по умолчанию через <приветственный файл> в проекте 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>