2009-08-04 1 views
5

Я недавно начал выполнять JSF-работу - до этого я всегда использовал PHP или Python для веб-разработки.JSF commandLink, POSTing и обратная кнопка

Я был несколько удивлен, обнаружив, что JSF использует HTTP POST для навигации, когда используется тег h: commandLink.

Я использую commandLink, поскольку это, по-видимому, правильный способ создания приложений JSF. Почему JSF использует POST для навигации? Что случилось с GET? Я могу только предположить, что Javascript, который автоматически генерируется JSF для событий onclick, может превышать максимальную длину для запроса GET.

У меня уже есть несколько страниц, которые перемещаются с помощью h: commandLink. Это работает колодцы, пока я не использую кнопку возврата браузера. Как мне обращаться с обратной кнопкой в ​​JSF?

Я пытаюсь понять, почему JSF строился вокруг POST. Это ломает закладки, обратную подкачку и возможность индексировать вашу страницу в поисковых системах.

ответ

4

Это не поможет вам создать ссылку на клиента, но будьте в курсе outputLink.

Существует элемент перенаправления правил навигации, который может помочь в некоторых проблемах с обновлением.

<navigation-rule> 
    <display-name>navBack</display-name> 
    <from-view-id>/navBack.jsp</from-view-id> 
    <navigation-case> 
    <from-outcome>navTo</from-outcome> 
    <to-view-id>/navTo.jsp</to-view-id> 
    <redirect /> 
    </navigation-case> 
</navigation-rule> 

Если все остальное терпит неудачу, то вы можете сделать URL перенаправления самостоятельно, так как в этом действии:

public String doAction() { 
    System.out.println("Did some non-idempotent operation"); 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ExternalContext extContext = context.getExternalContext(); 
    Application app = context.getApplication(); 
    ViewHandler viewHandler = app.getViewHandler(); 
    String url = viewHandler.getActionURL(context, "/navTo.jsp"); 
    url = url + (url.indexOf('?') < 0 ? '?' : '+') + "foo=bar"; 
    url = extContext.encodeResourceURL(url); 
    try { 
    extContext.redirect(url); 
    } catch (IOException e) { 
    throw new FacesException(e); 
    } 
    return null; 
} 

Предостережение: Я не могу вспомнить, если я правильно кодирующую URL.

Различные сторонние библиотеки добавляют различные особенности. Я не уверен, что в JSF 2.0 в этой области было что-то сделано, но, возможно, стоит посмотреть.

+0

Кажется, что JSF 2.X имеет гораздо лучшую поддержку для ГЭТ и REST –

1

Yup. JSF построен вокруг POST, и это одна из самых больших точек крепления JSF. Взгляните на JAX-RS/Seam или Spring для закладок GETable.

1

Как сказал BalusC на своем blog, GET следует использовать для навигации между страницами. Используйте h:outputLink для навигации.

Вы можете прочитать его PostRedirectGetListener, и он решит обратное/обновить форму для подтверждения подтверждения.

Я совет вам добавить следующее beforePhase для того, чтобы справиться с частичной обработки Ajax (если применимо):

if(event.getFacesContext().getPartialViewContext().isAjaxRequest()) 
{ 
    return; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^