2010-08-05 2 views
0

내 응용 프로그램을 통해 여러 html 양식에 입력되는 직원 ID (배지)의 유효성을 검사하는 코드는 어디에 있습니까?Java 웹 응용 프로그램 데이터 입력 유효성 검사 방법 위치

현재 사람들이 로그인 (authenticateUser)하거나 비밀번호 (requestPassword)를 요청할 때 사용되는 STKUserForm.java에 있습니다. 이것은 지금까지 훌륭하게 작동합니다. BalusC에게 많은 감사를 보내야합니다. 내가 지금까지 작업 한 많은 것들이 DAO/Servlets 블로그를 기반으로합니다. 감사합니다 BalusC !!!!!!!!!!

하지만 관리자가 배지를 입력하여 직원에게 작업 (CommitmentItemForm.java)을 할당하는 로그인 외에도 다른 사용 사례를 만들고 있습니다. 오히려 내 비즈니스 로직을 복제하지 않을 것입니다. 언젠가 유효한 배지는 7 자리를 가질 수 있습니다. 그래서 STKUserForm 밖으로 이동해야합니다.

STKUserForm.java - 서블릿에 의해 로그인 페이지에서 호출되며 위에서 언급 한 두 메소드 모두 processBadge를 호출 한 다음 validateBadge 메소드를 호출합니다.

public final class STKUserForm extends Form { 
    public STKUser authenticateUser(STKUser LoginUser) { 
     <snip> 
      processBadge(LoginUser.getBadge()); 
     <snip> 
     return authenticatedUser; 
    } 
    public void requestPassword(STKUser loginUser) { 
     <snip> 
      processBadge(LoginUser.getBadge()); 
     <snip> 
    } 

public void processBadge(String badge) throws DAOException { 
    try { 
     validateBadge(badge); 
    } catch (ValidatorException e) { 
     setError(FIELD_USERBADGE, e.getMessage()); 
    } 
} 

public void validateBadge(String badge) throws ValidatorException, DAOException { 
    if (badge != null) { 
     if (!FormUtil.isBadge(badge)) { 
      throw new ValidatorException("Please enter valid badge (6 digits, numbers only, and no 'E')."); 
     } else if (!STKUserDAO.isValidEmployee(badge)) { 
      throw new ValidatorException("This is not a valid badge of any EB Employee."); 
     } 
    } 
} 
} 

그렇다면 어디에서 validateBadge 메서드를 이동해야합니까 ?? STKUser bean ?? FormUtil ??? 다른 유틸리티 클래스 ??? 나는 그것이 STKUserDAO에 전화를 걸기 때문에 확신 할 수 없다. 이 애플리케이션과 다른 애플리케이션을 통해 많은 유스 케이스에 대한 직원 배지를 검증하고 싶습니다.

답변

0

STKUserDA.isValidEmployee()는 STKUserForm.validateBadge() 메소드의 모든 기능을 제공하고 STKUserDAO.isValidEmployee() 내에 예외를 던져야합니다. 그런 다음 DB에 액세스하는 위치에서 유효성 검사를 사용할 수 있습니다.

public final class BadgeId { 
    private final String value; 
    public BadgeId(String value) { 
     if(value not valid badge id) throw IllegalArgumentException("invalid: " + value); 
     this.value = value; 
    } 
    public String getValue() { 
     return value; 
    } 
    // equals and hashcode 
} 

지금 당신은 당신의 모든 방법 대신 문자열의 BadgeId를 사용할 수 있습니다

+0

을 아마도,하지만 FormUtil.isBadge (배지)는 데이터베이스에 히트하기 전에 잘 구성된 배지인지 확인하기 위해 호출됩니다. 실수로 숫자 앞에 'E'를 입력하면 데이터베이스에 대한 호출을하지 않을 것입니다. (일부 레거시 응용 프로그램은 여기에 E + 배지 번호가 필요합니다) – jeff

+0

STKUserDAO에 코드를 넣는 것만으로 꼭 필요한 것은 아닙니다. DB에 전화 해. db 연결을 시작하기 전에 FormUtil.isBadge (badge) 호출을 가질 수 있습니다. 실패 할 경우 예외가 발생하고 db 호출이 수행되지 않습니다. – BruteForce

+0

저는 리팩토링을했는데 당신의 제안은 지금까지 꽤 잘 작동하고 있습니다. – jeff

0

하나의 솔루션은 바데 ID를 도메인 값 개체를 만드는 것입니다. 액션 폼은 편의상 getBadgeId() : BadgeId 메소드를 가질 수 있습니다. BadgeId가 변경되지 않고 생성자가 유효성을 적용하기 때문에 유효하지 않은 BadgeId 객체에 대해 걱정할 필요가 없습니다.

미친 듯이 들리면 Integer, Float 등과 같은 JDK 클래스에 대해 생각해보십시오. 존재하지 않아도됩니다. String 객체를 전달하고 Float.validate (String) 및 Float.isValid (String) 등을 호출 할 수 있습니다. 대신 프로그래밍 프로그래밍을위한 도메인 객체 (Float, Double 등)가 만들어졌습니다.

BadgeId 클래스의 또 다른 유용한 방법이 될 수 있습니다

public static BadgeId toBadgeId(String value) { ... } 

당신이 다른 유효성 검사 규칙 모든, 당신은 같은 것을 사용할 수 BadgeId 객체의 많은 종류가 기대하는 경우 :

public abstract class BadgeId { 
    ... same constructs/methods as before except ... 

    protected abstract boolean isValid(String value); 
} 

public final class NumericBadgeId extends BadgeId { 
    public NumericBadgeId(String value) { 
     super(value); 
    } 
    protected boolean isValid(String value) { 
     return true if value contains all numbers; false otherwise 
    } 
} 
+0

감사합니다. 조금 대답 해주세요. 그것은 내가 가지고있는 것에 대한 그런 변화처럼 보이지만, 다시 나는 이것에 대해 새로운 것입니다. 좀 더 적절한 클래스/위치에 내 validateBadge 메서드를 잘라 붙여 넣기를 원했습니다. – jeff