<f : metadata>, <f : viewParam> 및 <f : viewAction>을 무엇에 사용할 수 있습니까?


149

누구든지 우리가 일반적으로 또는 실제 예제 에서이 코드 조각을 어떻게 사용할 수 있는지 명확히 할 수 있습니까?

<f:metadata>
    <f:viewParam id="id" value="#{bean.id}" />
    <f:viewAction action="#{bean.init}" />
</f:metadata>

답변:


288

GET 매개 변수 처리

<f:viewParam>GET 매개 변수의 설정, 변환 및 검증을 관리합니다. 그것은 <h:inputText>이지만 GET 매개 변수와 같습니다.

다음 예

<f:metadata>
    <f:viewParam name="id" value="#{bean.id}" />
</f:metadata>

기본적으로 다음을 수행합니다.

  • name으로 요청 매개 변수 값을 가져 오십시오 id.
  • 필요한 경우 변환하고 유효성을 검사하십시오 ( required, validatorconverter속성을 사용 하고 와 같이 a <f:converter>및 중첩 할 수 <f:validator>있음 <h:inputText>)
  • 변환 및 유효성 검증에 성공하면 #{bean.id}값으로 표시되는 Bean 특성으로 설정 하거나 value속성이없는 경우 이름에서 요청 속성으로 설정 하여보기에서 id사용 가능하게 #{id}하십시오.

따라서 페이지를 열면 뷰가 렌더링되기 직전에 foo.xhtml?id=10매개 변수 값 10이이 방식으로 Bean에 설정됩니다.

유효성 검사와 관련하여 다음 예제에서는 매개 변수를 required="true"10으로 설정하고 10과 20 사이의 값만 허용합니다. 유효성 검사에 실패하면 메시지가 표시됩니다.

<f:metadata>
    <f:viewParam id="id" name="id" value="#{bean.id}" required="true">
        <f:validateLongRange minimum="10" maximum="20" />
    </f:viewParam>
</f:metadata>
<h:message for="id" />

GET 매개 변수에 대한 비즈니스 조치 수행

<f:viewAction>이것을 위해 사용할 수 있습니다 .

<f:metadata>
    <f:viewParam id="id" name="id" value="#{bean.id}" required="true">
        <f:validateLongRange minimum="10" maximum="20" />
    </f:viewParam>
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
<h:message for="id" />

public void onload() {
    // ...
}

<f:viewAction>JSF 2.2합니다 (이 때문에 새로운 <f:viewParam>이미 JSF 2.0부터 존재). 업그레이드 할 수 없다면 가장 좋은 방법은 <f:event>대신 사용하는 것입니다.

<f:event type="preRenderView" listener="#{bean.onload}" />

그러나 이것은 모든 요청에서 호출됩니다 . 요청이 포스트 백이 아닌지 명시 적으로 확인해야합니다.

public void onload() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
    }
}

"전환 / 검증 실패"사례도 건너 뛰려면 다음과 같이하십시오.

public void onload() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
        // ...
    }
}

<f:event>이 방법을 사용 하는 것은 본질적으로 해결 방법 / 해킹이므로 <f:viewAction>JSF 2.2에서 소개 된 것입니다.


다음 매개 변수에 다음 매개 변수 전달

includeViewParams속성을 설정 true하거나 includeViewParams=true요청 매개 변수 를 추가하여 탐색 링크에서보기 매개 변수를 "통과"할 수 있습니다 .

<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">

위의 <f:metadata>예제에서 기본적으로 다음 링크 를 생성 합니다.

<a href="next.xhtml?id=10">

원래 매개 변수 값으로

이 방법은 오직 요구next.xhtml또한<f:viewParam> , 바로 그 매개 변수에 그렇지 않으면 통과되지 않습니다.


JSF에서 GET 양식 사용

<f:viewParam>또한 "일반 HTML"GET 양식과 함께 사용할 수 있습니다.

<f:metadata>
    <f:viewParam id="query" name="query" value="#{bean.query}" />
    <f:viewAction action="#{bean.search}" />
</f:metadata>
...
<form>
    <label for="query">Query</label>
    <input type="text" name="query" value="#{empty bean.query ? param.query : bean.query}" />
    <input type="submit" value="Search" />
    <h:message for="query" />
</form>
...
<h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}">
     ...
</h:dataTable>

기본적 으로이 @RequestScoped콩 :

private String query;
private List<Result> results;

public void search() {
    results = service.search(query);
}

참고가 <h:message>위한 <f:viewParam>이 아닌 일반 HTML <input type="text">! 또한 유효성 검사 또는 변환 오류가있는 경우 제출 된 값이 전혀 표시되지 않으므로 입력 값 이 비어 있으면 입력 값이 표시 #{param.query}됩니다 #{bean.query}. 이 구성은 JSF 입력 컴포넌트에는 유효하지 않습니다 (이미 "커버 아래").


또한보십시오:


@BalusC faces-redirect = true와 함께 사용될 때 "bean"의 범위는 무엇이어야합니까? 범위가 "@RequestScoped"로 설정된 경우 예상대로 작동합니까?
Geek

@Geek : 리디렉션은 새로운 GET 요청을 생성합니다. 소스 및 대상 Bean의 Bean 범위는 관련이 없습니다. 그러나 요청 및보기 범위 Bean에 대해 새 GET 요청의 영향을 고려해야합니다. 또한 참조 stackoverflow.com/questions/7031885/...
BalusC

@BalusC 정확히 의미하는 것은 "하지만 요청과 뷰 범위 Bean을 위해 새로운 GET 요청의 의미를 고려해야합니다."
Geek

@Geek : 범위가 종료되고 시작되기 때문에 휴지통에 버리고 재생성됩니다.
BalusC

@BalusC. 포괄적 인 답변. "모든 요청에서 호출되지 않는 뷰 범위 Bean에 대해 '@'PostConstruct와 같은 기능을 사용해야하는 경우 요청이 포스트 백이 아닌지 확인하십시오." 모든 요청에서 호출되지 않으면 요청이 포스트 백인지 여부를 확인해야하는 이유는 무엇입니까?
Uluk Biy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.