FacesServlet и URL Mapping в Web.xml - PullRequest
       13

FacesServlet и URL Mapping в Web.xml

3 голосов
/ 27 января 2011

HI

Мы объявляем FacesServlet и его сопоставление URL в Web.xml. Из моего понимания

FacesServlet загружается только один раз при запуске сервера. Отображение URL используется только при первом обращении к приложению JSP из внешнего контекста.

Один из новых учеников JSF задал мне вопросы, эти две вещи используются приложением только один раз. Это правда? Также есть ли другой способ, не включая в web.xml?

Что я должен ответить?

Обновлено

Например, я обращаюсь к приложению по URL http://localhost:8080/webapp/index.jsf. Когда мы обращаемся к этому URL, FacesServlet вызывается и представление отображается. Вот мой вопрос:

  • В JSF мы никогда не видели изменения URL в адресной строке. В таком случае, как он обрабатывает новый запрос с тем же URL-адресом?
  • В файле face-config.xml мы приводим варианты навигации следующим образом:

    to-view-id> fault.jsp / to-view-id>

    • Почему нам не нужно давать имя представления как fail.jsf? Мы просто даем * .jsp в faces-config.xml. Как это обрабатывается внутри?

Ответы [ 2 ]

3 голосов
/ 27 января 2011

FacesServlet загружается только один раз при запуске сервера.

Correct.

Отображение URL используется только при первом обращении к приложению JSP из внешнего контекста.

Неправильно. Он был проверен на каждый входящий HttpServletRequest. Как еще контейнер должен знать, какой сервлет вызывать?

Также есть ли другой способ, не включенный в web.xml?

Если вы используете сервлет-контейнер, который поддерживает Servlet 3.0, вы также можете сделать это с помощью аннотации @WebServlet. JSF 2.0, однако, разработан для обратной совместимости с Servlet 2.5, поэтому он не поставляется с этой аннотацией, и вам необходимо явно объявить его в web.xml.

Смотри также:


Обновление в соответствии с новой серией вопросов (каждый из которых должен принадлежать отдельному вопросу, но все же)

В JSF мы никогда не видели изменения URL в адресной строке. В таком случае, как он обрабатывает новый запрос с тем же URL?

Это происходит только в том случае, если под прикрытием происходит форвард на RequestDispatcher#forward(). В дальнейшем сервлет-контейнер в основном повторно использует тот же тот же HTTP-запрос / ответ для представления (страница JSP / XHTML). Это не заставляет / не дает указание веб-браузеру отправлять новый запрос. С другой стороны, HttpServletResponse#sendRedirect() будет предписывать клиенту (веб-браузеру) выполнить запрос new GET, и, таким образом, URL изменится. Вы можете форсировать это в JSF, добавив <redirect/> к <navigation-case>. Обратите внимание, что, поскольку это вызывает новый запрос, все bean-объекты области запроса начального запроса будут потеряны.

Почему нам не нужно давать имя представления как fail.jsf? Мы просто даем * .jsp в face-config.xml. Как это обрабатывается внутри?

FacesServlet знает свой url-pattern.

2 голосов
/ 27 января 2011

Да.во время загрузки вашего приложения контейнер загрузит web.xml и извлечет данные для

определенного шаблона URL в сервлет.когда приходит запрос, он проверяет из памяти, что для этого шаблона какой сервлет вызывать, а затем, если сервлет уже загружен, он возьмет его из памяти, в противном случае он создаст экземпляр сервлета и вызовет doGet() или doPost() в зависимости оттип запроса.

и существует другой способ сопоставления URL delcare, начиная с JAVAEE-6, с помощью аннотации

что-то вроде

import javax.servlet.annotation.InitParam;
import javax.servlet.annotation.WebServlet;

@WebServlet(
    name = "SimpleServlet", 
    urlPatterns = {"/login"}, 
    initParams = {
        @InitParam(name = "param1", value = "value1"),
        @InitParam(name = "param2", value = "value2")}
)
public class SimpleServlet {
}

в Face-Configuration.xml мы приводим варианты навигации следующим образом:

<to-view-id>failure.jsp </to-view-id>

Почему нам не нужно указывать имя представления как fail.jsf?Мы просто даем * .jsp в face-config.xml.Как это обрабатывается внутри?

это view identifier, а не URL FacesServlet загрузит это представление при вызове этого навигационного случая.

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