[jsf] ViewParam 대 @ManagedProperty (value =“# {param.id}”)

다음과 같이 View Params를 정의하는 것의 차이점은 무엇입니까?

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

다음과 같이 ManagedBean에 속성을 정의합니다.

@ManagedProperty(value = "#{param.id}")
private Integer id;



답변

<f:viewParam>:

  • 모델 값 업데이트 단계 중에 만 값을 설정합니다 (확장 이후 UIInput).

  • 에서는 설정 값을 사용할 수 @PostConstruct없으므로 설정 값을 기준으로 초기화 / 사전로드를 수행하려면 <f:event type="preRenderView" listener="#{bean.init}" />내부에 추가가 필요 <f:metadata>합니다. JSF 2.2부터 <f:viewAction>대신 사용할 수 있습니다 .

  • 중첩 <f:converter><f:validator>보다 세분화 된 변환 / 검증을 허용합니다 . A도 <h:message>부착 할 수 있습니다.

  • URL의 includeViewParams속성 <h:link>또는 includeViewParams=true요청 매개 변수를 사용하여 GET 쿼리 문자열로 포함 할 수 있습니다 .

  • @RequestScopedBean에서 사용할 수 있지만 @ViewScoped보기 매개 변수가보기에 포함 된 양식으로 인한 유효성 검증 실패에서 살아남 으려면 Bean이 있어야 합니다. 그렇지 않으면 <f:param>명령에서 후속 요청에 대한 모든 요청 매개 변수를 수동으로 보유해야합니다. 구성 요소.

:

<f:metadata>
    <f:viewParam id="user_id" name="id" value="#{bean.user}"
        required="true" requiredMessage="Invalid page access. Please use a link from within the system."
        converter="userConverter" converterMessage="Unknown user ID."
    />
</f:metadata>
<h:message for="user_id" />

private User user;

@FacesConverter("userConverter"). http://example.com/context/user.xhtml?id=123에 의한 호출 페이지 id는 변환기를 통해 매개 변수를 전달 하고 User객체를 빈 속성으로 설정합니다 .


@ManagedProperty:

  • Bean 생성 직후 값을 설정합니다.

  • 설정 값을 사용할 @PostConstruct수있어 설정 값을 기반으로 다른 속성을 쉽게 초기화 / 사전로드 할 수 있습니다.

  • 보기에서 선언적 변환 / 검증을 허용하지 않습니다.

  • 의 관리 속성은 #{param}요청 범위보다 넓은 범위의 Bean에서 허용되지 않으므로 Bean은이어야합니다 @RequestScoped.

  • #{param}후속 POST 요청에 존재 하는 관리 속성에 의존하는 경우 구성 요소 <f:param>에 포함해야합니다 UICommand.

:

@ManagedProperty("#{param.id}")
private Long id;

private User user;

@EJB
private UserService userService;

@PostConstruct
public void init() {
    user = userService.find(id);
}

하지만 당신은 할 때마다 확인을 직접 관리 할 필요가 user있다 null손보는에 의해 FacesContext#addMessage()또는 뭔가.


및 둘 다 필수 인 경우 둘 다 사용할 수 있습니다 . 더 이상 세분화 된 변환 / 검증 만 적용 할 수 없습니다.@PostConstructincludeViewParams


또한보십시오:


답변

2 가지 다른 차이점 :

  • @ManagedPropertyCDI ( @Named)가 관리하는 Bean이 아니라 JSF가 관리하는 Bean에서만 사용할 수 있습니다 .
    • <f:viewParam> GET 요청의 매개 변수에서만 작동합니다.

답변