JSF commandLink, POSTing 및 뒤로 버튼
-
22-07-2019 - |
문제
저는 최근 JSF 작업을 시작했습니다. 그 전에는 항상 웹 개발에 PHP나 Python을 사용했습니다.
h:commandLink 태그가 사용될 때 JSF가 HTTP POST를 사용하여 탐색한다는 사실에 다소 놀랐습니다.
나는 JSF 앱을 빌드하는 올바른 방법인 것처럼 commandLink를 사용해 왔습니다.JSF가 탐색을 위해 POST를 사용하는 이유는 무엇입니까?GET에 무슨 문제가 있나요?onclick 이벤트에 대해 JSF가 자동으로 생성한 Javascript가 GET 요청의 최대 길이를 초과할 수 있다고 가정할 수 있습니다.
h:commandLink를 사용하여 탐색되는 페이지가 이미 많이 있습니다.이것은 브라우저의 뒤로 버튼을 사용할 때까지 잘 작동합니다.JSF에서 뒤로 버튼을 어떻게 처리해야 합니까?
JSF가 POST를 중심으로 구축된 이유를 이해하려고 애쓰고 있습니다.북마크, 백페이징 및 검색 엔진에서 페이지 색인을 생성하는 기능이 중단됩니다.
해결책
클라이언트에서 링크를 구축하는 데는 도움이 되지 않지만 다음 사항에 유의하세요. 출력링크.
일부 새로 고침 문제에 도움이 될 수 있는 탐색 규칙에 대한 리디렉션 요소가 있습니다.
<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에서 어떤 작업이 수행되었는지는 확실하지 않지만 살펴볼 가치가 있을 것입니다.
다른 팁
예.JSF는 POST를 기반으로 구축되었으며 JSF의 가장 큰 문제점 중 하나입니다.북마크 가능한 GETable 페이지를 보려면 JAX-RS/Seam 또는 Spring을 살펴보세요.
BalusC가 그의 글에서 말했듯이 블로그, 페이지 간 탐색에는 GET을 사용해야 합니다.사용 h:outputLink
탐색용.
PostRedirectGetListener를 읽으면 뒤로/새로 고침 양식 다시 제출 확인 메시지가 해결됩니다.
다음을 추가하라고 조언합니다. beforePhase
부분적인 Ajax 처리를 처리하기 위해(해당하는 경우):
if(event.getFacesContext().getPartialViewContext().isAjaxRequest())
{
return;
}