2009-10-12 8 views
2

link을 검토 한 결과 javax.faces.webapp.ValidatorTag은 더 이상 사용되지 않고 ValidatorELTag로 바뀌 었음을 알았지 만 이에 대한 좋은 정보를 찾을 수없는 것 같습니다.Facelets를 사용하여 JSF 1.2에서 사용자 정의 유효성 검사기 만들기

입력 : 정규식 및 오류 메시지를받는 정규식 검사기를 만들고 싶습니다. 나는이 같은 제어해야 할 것입니다 의미

:

<regexValidator for="myControl" check="([a-Z]^)" errorMessage="Your input contained incorrect characters" /> 

지금 위의 주어진 링크이의 작은 부분을 수행하는 방법을 보여줍니다,하지만 기록 및 방법은 이후 훨씬이 변경되었습니다 deprecated, 어떻게이 문제에 접근합니까?

답변

3

JEE5 TutorialCreating a Custom Validator을 참조하십시오. Creating a Custom Tag 섹션에서는 ValidatorELTag 클래스를 구현하는 방법에 대해 자세히 설명합니다.


for="myControl" 

난 당신이 속성을 (난 당신이 그것의 사용을 줄 방법을 잘 모르겠어요)가 필요합니다 의심한다. 유효성 검사기는 부모 컨트롤에 설정됩니다. for 속성은 일반적으로 레이블 구성 요소와 같이 하나의 컨트롤이 다른 컨트롤을 참조 할 때만 사용됩니다.


편집 : 질문을 잘못 읽었습니다. 위의 대답은 JSP에 적용됩니다 (코어 JSF 1.2의 태그 관련 클래스는 JSP 전용이며 Facelets에는 자체 태그 시스템이 있으며 좋은 소식은 태그 정의를 위해 특별히 Java 클래스가 필요 없다는 것입니다).

샘플 유효성이 검증은 다음 faces-config.xml에 등록되어

public class RegexValidator implements Validator, StateHolder { 
    private boolean isTransient; 
    private String regex; 

    public String getRegex() { return regex; } 
    public void setRegex(String regex) { this.regex = regex; } 

    public void validate(FacesContext context, UIComponent component, Object value) 
     throws ValidatorException { 
    //TODO: throw ValidatorException if not valid 
    } 

    //TODO: implement remaining StateHolder methods... 
} 

:

<validator> 
    <validator-id>regex.validator</validator-id> 
    <validator-class>val.RegexValidator</validator-class> 
    </validator> 
응용 프로그램에 다음

당신을 add a tag library (예 WEB-INF/facelets/foo.taglib.xml) :

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE facelet-taglib PUBLIC 
    "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" 
    "http://java.sun.com/dtd/facelet-taglib_1_0.dtd"> 
<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet"> 
    <namespace>http://demo</namespace> 
    <tag> 
    <tag-name>regexValidator</tag-name> 
    <validator> 
     <validator-id>regex.validator</validator-id> 
    </validator> 
    </tag> 
</facelet-taglib> 

a를 xmlns:demo="http://demo"에 대한 선언 태그 라이브러리를 사용할 Facelets 뷰. 유효성 검사기 태그는 <demo:regexValidator ... 형식으로 시작됩니다. 특성은 유효성 검사기 클래스의 내부 검사를 통해 선택됩니다. 필요가 없기 때문에

+0

regexValidator의 네임 스페이스 접두어 데모가 정의되어 있지 않습니다. 줄 30에서

+0

또한 StateHolder를 구현하는 이유는 무엇입니까? –

+0

이 오류는 XML 구문 분석 오류입니다.'demo' 네임 스페이스 접두사는'xmlns : demo = ""을 추가하여 정의됩니다. 여기서' '은 태그 라이브러리의 네임 스페이스와 일치합니다.'StateHolder'에 관해서는 뷰 구성 요소 (및 그 속성)가 요청 사이에 RAM에 저장되지 않을 수 있으므로 속성 값은 StateManager를 통해 저장해야합니다 - 데모 코드에서 regex의 값은 폼이 제출되었을 때 뷰가 복원되면 'null'이됩니다. XML 정의에서 다시 설정하지 않아도됩니다. – McDowell

0

여기에 또한 나는이 방법을 좋아 check="([a-Z]^)"

regex="..."에 변경할 수 있습니다 내가 나를 넘어 내 코드에 추가하는 것을 잊었다 조각 ...

<context-param> 
    <param-name>facelets.LIBRARIES</param-name> 
    <param-value>/WEB-INF/faces/foo.taglib.xml</param-value> 
</context-param> 

입니다 연장하려면 ValidatorELTag. 나는 facelets의 아주 큰 팬이고 이것은 하나 더 멋진 기능입니다.

관련 문제