h : commandLink 대신 h : outputLink를 언제 사용해야합니까?


129

언제 <h:outputLink>대신 <h:commandLink>?를 사용해야 합니까?

나는 commandLinkHTTP 게시물을 생성 한다는 것을 이해합니다 . outputLinkHTTP 가져 오기를 생성 할 것이라고 생각합니다 . 즉, 내가 읽은 대부분의 JSF 튜토리얼 자료commandLink(거의?) 독점적으로 사용합니다.

컨텍스트 : Stack Overflow와 비슷한 사용자 페이지에 대한 헤더 링크를 보여주는 작은 데모 프로젝트를 구현하고 있습니다 ...

더 많은 jquery가 필요합니다

... 그리고 commandLink아마도 ?faces-redirect=true북마크 가능성을 위해 사용 하는지 또는 outputLink올바른 선택 인지 확실하지 않습니다 .

답변:


195

이 북마크는 북마크 가능한 GET 요청을 발생시키는 속성에 적절한 URL을 가진 <h:outputLink>완전한 HTML <a>요소를 렌더링합니다 href. 관리 Bean 조치 메소드를 직접 호출 할 수 없습니다.

<h:outputLink value="destination.xhtml">link text</h:outputLink>

은 (숨겨진) POST 양식을 제출하고 관리 Bean 조치 메소드를 호출 할 수 있는 스크립트 <h:commandLink>로 HTML <a>요소를 렌더링합니다 onclick. 또한 안에 배치해야합니다 <h:form>.

<h:form>
    <h:commandLink value="link text" action="destination" />
</h:form>

POST 후 리디렉션을 트리거하는 의 ?faces-redirect=true매개 변수 <h:commandLink>( Post-Redirect-Get 패턴에 따라)는 링크를 실제로 클릭 할 때만 대상 페이지의 책갈피 기능을 향상시킵니다 (URL은 더 이상 "뒤에 있지 않습니다"). 하지만 요소 href<a>요소를 완전한 URL로 변경하지는 않습니다 . 여전히 남아 있습니다 #.

<h:form>
    <h:commandLink value="link text" action="destination?faces-redirect=true" />
</h:form>

JSF 2.0부터는 <h:link>URL 대신보기 ID (탐색 사례 결과)를 사용할 수있는 것도 있습니다. <a>에 적절한 URL을 사용하여 HTML 요소를 생성합니다 href.

<h:link value="link text" outcome="destination" />

따라서 SO 사용자 이름 링크와 같이 순수하고 북마크 가능한 페이지 간 탐색을 위해서는 <h:outputLink>또는 을 사용하십시오 <h:link>. 봇은 일반적으로 POST 양식이나 JS 코드를 암호화하지 않기 때문에 SEO에도 더 좋습니다. 또한 페이지를 북마크 할 수 있고 URL이 더 이상 "뒤에"있지 않으므로 UX가 향상됩니다.

당신이 생성자 또는 전처리 작업을 수행 할 수 있습니다 필요한 경우 @PostConstruct(A)의 @RequestScoped또는 @ViewScoped @ManagedBean어떤 문제의 대상 페이지에 연결되어 있습니다. GET 매개 변수를 사용 @ManagedProperty하거나 <f:viewParam>Bean 특성으로 설정할 수 있습니다 .

또한보십시오:


2
아닙니다. UICommand구성 요소 만 구성 요소에 들어가면됩니다 UIForm.
BalusC

3
실제로는 없습니다. 일반적으로 때,에 충실 할 수 h:outputLink또는 h:link링크. SEO를 과소 평가해서는 안됩니다. 그건 그렇고, 여기 REST와 같은 멋진 REST 유사 URL을 보려면 PrettyFaces를 살펴 보십시오 .
BalusC

1
차이점은 h:linkJSF보기 ID (예 :) page를 값으로 사용하고 h:outputLink실제 URL (예 : /page.xhtml또는 /page.jsf, 또는 FacesServlet매핑 에 따라 기타 )을 값 으로 사용한다는 점 입니다. 어쨌든 URL 인코딩은 두 경우 모두 발생합니다. 그런데 템플릿 텍스트에서 EL의 렌더 동작 #{...}과와 는 차이가 없습니다 h:outputText. 둘 다 미리 정의 된 XML 엔터티를 이스케이프 처리합니다 (URL 인코딩과 동일하지 않음). h:outputText더 attribtues이 좋아하는 유일한 이벤트 id, styleClass등 구성 요소 및 / 또는 마크 업을 제어 할 수 있습니다.
BalusC

1
@BalusC 답의 첫 줄에 "fullworthy HTML"이 정확히 무엇을 의미합니까?
Geek

1
@Geek : HTML <a>요소 하나만으로 더 이상 아무것도,
환상

4

또한 h : link보다 h : commandLink를 사용하는 데 페이지 로딩 (성능)에 시간이 오래 걸린다는 것을 알았습니다. h : link는 h : commandLink에 비해 빠릅니다.


1
나는 그것을 믿기가 어렵다. 의견 / 자신의 일화 적 증거 외에도이를 뒷받침 할만한 것이 있습니까?
매트 볼

5
@ 매트 : 페이지의 "God"양식 안에이 POST 탐색 링크가 있으면 행당 3 개의 입력 필드를 포함하는 1000 개가 넘는 행이있는 데이터 테이블이있는 경우이 속도가 느리다는 것을 상상할 수 있습니다. 그러나 이러한 페이지는 어쨌든 다른 심각한 문제가 있습니다 :)
BalusC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.