Как использовать ExternalContext.redirect () в JSF2.0? - PullRequest
3 голосов
/ 16 сентября 2010

Рассмотрим страницу webapp / myPage.xhtml :

...
<h:form id="myForm">
    ...
    <h:selectOneMenu id="..." required="true" value="#{myController.aValue}">
       <f:selectItems value="#{...}" var="..." itemValue="#{...}" itemLabel="#{...}"/>
    </h:selectOneMenu>
    ...
    <h:commandButton value="Go for it!" action="#{myController.goForIt(...)}"/>
    ...
</h:form>
...

Действие кнопки привязано к методу контроллера MyController.goForIt () :

@ManagedBean(name = "myController")
@RequestScoped
public class MyController {
   public String goForIt(...){
      if (myCondition){
         try {
            FacesContext.getCurrentInstance().getExternalContext()
                        .redirect("http://www.myTarget.com/thePage.html");
         } catch (IOException e) {
           ...
         }
      }
      return "myPage.xhtml"   
   }
}

Мой первый вопрос: Имеет ли смысл вышесказанное?Это правильный способ использования redirect ()?

Я хочу перенаправить пользователя на http://www.myTarget.com/thePage.html в случае, если myCondition имеет значение true.Если myCondition ложно, ему придется остаться на myPage.xhtml.

Если так, я бы хотел лучше понять, что происходит ... При использовании Live HTTP Headers в FirefoxЯ заметил, что при нажатии кнопки

  1. a POST для webapp / myPage.xhtml
  2. сервер отвечает с 302 Перемещено временно - Местоположение: www.myTarget.com/thePage.html
  3. браузер ПОЛУЧИТ www.myTarget.com / thePage.html

Пока что Это ожидаемое поведение?

Что меня сейчас раздражает, так это то, что вызывается webapp / myPage.xhtml .Точнее говоря, preRenderView -event вызывается здесь снова.(У меня есть немного кода в слушателе preRenderView, который должен быть выполнен только один раз.)

Имеет ли смысл приведенное выше?Кто-нибудь видит способ улучшить это?

Спасибо!J.

1 Ответ

8 голосов
/ 16 сентября 2010

Пока это ожидаемое поведение?

Перенаправление в основном предписывает клиенту запустить новый HTTP-запрос по URL-адресу, как указано в заголовке ответа Location. Так что да, поведение, как вы видите, является правильным.

Однако ваш URL неверен. Это относительно текущего URL запроса. Так, если текущий URL-адрес, например, http://example.com/context/page.jsf,, то это перенаправление будет в основном указывать на http://example.com/context/www.myTarget.com/thePage.html, что, очевидно, неправильно. Когда новый URL касается другого домена, вы должны перенаправить на absolute URL. Другими словами, добавьте префикс к схеме http: //.

Что меня сейчас раздражает, так это то, что webapp / myPage.xhtml называется.

Теоретически этого не должно происходить, когда происходит перенаправление. Попробуйте добавить return null в блок try.

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