2010-08-05 70 views
0

我應該在哪裏找到用於驗證將通過我的應用程序輸入多個HTML表單的員工ID(徽章)的代碼?Java Web應用程序數據輸入驗證方法位置

目前我在STKUserForm.java中使用它,當人們登錄(authenticateUser)或請求他們的密碼(requestPassword)時使用它。迄今爲止,這很有效。我必須非常感謝BalusC。到目前爲止,我的許多工作都是基於他的DAO/Servlets博客。感謝BalusC !!!!!!!!!!

但是現在,除了登錄之外,我還創建了另一個用例,其中主管通過輸入員工的徽章來爲任務分配任務(CommitmentItemForm.java)。我寧願不復制我的業務邏輯(有一天有效的徽章可能有7位數字),所以我覺得我需要將它移出STKUserForm。

STKUserForm.java - 從登錄頁面(通過servlet)調用,上面提到的兩個方法調用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

我會讓STKUserDAO.isValidEmployee()提供STKUserForm.validateBadge()方法的所有功能,而不是在STKUserDAO.isValidEmployee()中引發異常。然後,只要您訪問數據庫,您的驗證就可以使用。

+0

也許,但是在我擊中​​數據庫之前調用FormUtil.isBadge(徽章)來檢查它是否形成了良好的徽章。如果他們在數字前面意外地鍵入了'E'(我們寧願不打電話給數據庫)(這裏的一些傳統應用程序需要E +徽章號碼) – jeff 2010-08-05 16:33:10

+0

只需將代碼放入STKUserDAO並不意味着您需要撥打數據庫。您可以在啓動數據庫連接之前進行FormUtil.isBadge(徽章)調用,如果失敗,則退出帶有例外的方法,並且不會創建數據庫調用。 – BruteForce 2010-08-06 08:39:07

+0

我做了一些重構,到目前爲止你的建議工作還不錯。 – jeff 2010-08-09 19:17:19

0

一種解決方案是使八德ID域值對象:

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。爲了方便起見,Action表單可以有一個getBadgeId():BadgeId方法。由於BadgeId是不可變的,並且構造函數執行有效性,所以您不必擔心無效的BadgeId對象四處飛散。

如果這聽起來很瘋狂,請考慮一下JDK類,如Integer,Float等。它們不一定存在。我們只需傳遞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 2010-08-05 17:03:03