2012-03-02 2 views
1

var이 포함 된 EL 표현식 평가에 문제가 있습니다.JSF 표현식 태그 평가 표현

나는 사용자 정의 유효성 검사기를 사용하는 프로젝트가 있습니다.

<tag> 
    <name>my-validator</name> 
    <tag-class>my.packaga.MyValidatorTag</tag-class> 
    <body-content>JSP</body-content> 
    <description>This is my validator</description> 
    <attribute> 
     <name>fieldName</name> 
     <required>true</required> 
     <rtexprvalue>true</rtexprvalue> 
     <type>java.lang.String</type> 
     <description>This is some field I need</description> 
    </attribute> 
</tag> 

:

public class MyValidatorTag extends ValidatorTag

이 클래스는 태그의 적절한 tld 파일, 속성 fieldName 수 있습니다 :

public class MyValidator implements Validator, StateHolder

나는 그와 관련된 태그 클래스가 여태까지는 그런대로 잘됐다. 그러나이 설정은 속성 값에 JSF EL 표현식을 사용할 수 없습니다. 그래서 발리 클래스 (클래스에 태그를하지 않음) 나 속성 값을 평가하기 위해이 코드를 사용 :

public static String evaluateEl(String expression) { 
    String value = null; 
    if (expression == null) { 
     return ""; 
    } 
    if ((expression.indexOf("#{") != -1) 
     && (expression.indexOf("#{") < expression.indexOf('}'))) { 
     Object evaledValue = 
      FacesContext.getCurrentInstance().getApplication().createValueBinding(
       expression).getValue(FacesContext.getCurrentInstance()); 
     if (evaledValue != null) { 
      value = evaledValue.toString(); 
     } else { 
      value = null; 
     } 
    } else { 
     value = expression; 
    } 
    return value; 
} 

그것은 문자열로 제한을하고, 대부분의 EL 식 작동합니다. 표현식 Hello #{1 eq 2}을 사용하면 속성의 값이 Hello false이됩니다. 그러나 작동하지 않는 경우가 있습니다. 다른 태그에 의해 생성 된 var이 포함 된 표현식은 작동하지 않습니다. 데이터 테이블, 데이터 테스터 및 가장 중요한 것은 <f:loadBundle>입니다. 검사기를 포함하는 입력 컴포넌트 얹는

<f:loadBundle basename="mypackage.message.ui-strings" var="msgs" />

:

<cust:my-validator fieldName="#{msgs['myfield1.name']}"></cust:my-validator>

필드 명을 위 식 계산 코드를 이용하여 빈 문자열을 평가한다. #{requestScope.msgs....으로 변경해도 문제가 해결되지 않습니다. loadBundle 구현을 살펴보면 범위를 요청할 때 msgs을 추가하므로 vars가 작동하지 않는 이유는 알 수 없습니다. 제발, 누군가 내가 이해하도록 도와 줘.

+0

어떤 jsp 또는 ee 버전을 사용하고 있습니까? Jsp 2.1에는 이것을 단순화하는 통합 엘이 들어 있습니다. –

+0

버전 1.2 유감스럽게 생각합니다. –

답변

4

다른 태그로 만든 var를 포함하는 표현식이 작동하지 않습니다. 데이터 테이블, 데이터 테이터 및 특히. JSF UI 컴포넌트 트리가 생성 될 때 <f:xxx>, 일부 <ui:xxx>

태그 핸들러 (그 하지rendered 특성을 가짐), JSF 뷰 구축 시간 동안 실행된다. UI 구성 요소 트리의 일부가 아닙니다. 그들은 이미 필요한 JSF UI 구성 요소를 작성했습니다. <h:xxx> 일부 <ui:xxx>

UI 컴포넌트 (rendered 특성을 갖는 것)가 큰 HTML 문자열은 현재 HTTP 요청의 HTTP 응답을 보낼 수있는 제조 될 때, 렌더링 시간 JSF 뷰 동안 실행된다.

그래서 그들은 동기화되지 않습니다.또 다른 솔루션은 검증 대신 UIComponentBase을 확장하고있는 작업을 수행 할 수,있다, 개발자를 들어 How to set converter properties for each row of a datatable?

:

는 모두이 답변에 나와있는,이 문제를 해결 갈 발리 여러 가지 방법의 최종 사용자에 대한 있습니다 processValidators(). 상위 구성 요소는 UIComponent#getParent()에 의해 사용 가능하며 제출 된 값은 UIInput#getSubmittedValue()에 의해 차례대로 사용 가능합니다.

+1

+1 좋은 설명. –

+0

그래서 기본적으로 내 유효성 검사기를 JSF 구성 요소로 전환하는 것이 좋습니다. 그러나 흥미로운 아이디어는 내 문제를 해결할 수 없다고 생각합니다.> 추가 조사에 따르면 입력 필드의 유효성 검사 단계에서 loadbundle 태그가 아직 호출되지 않았다고합니다. –