Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java web应用程序数据输入验证方法位置_Java_Validation - Fatal编程技术网

Java web应用程序数据输入验证方法位置

Java web应用程序数据输入验证方法位置,java,validation,Java,Validation,我应该在哪里找到验证员工ID徽章的代码,该徽章将通过我的应用程序以多个html表单输入 目前我在stkuperform.java中有它,当人们登录authenticateUser或请求他们的密码时使用它。到目前为止,这很有效。我必须向巴卢斯克致谢。到目前为止,我所做的很多工作都是基于他的DAO/Servlets博客。谢谢巴卢斯 但是现在,除了登录之外,我正在创建另一个用例,其中主管通过输入员工的徽章将任务CommitmentItemForm.java分配给员工。我不希望有朝一日复制我的业务逻辑,

我应该在哪里找到验证员工ID徽章的代码,该徽章将通过我的应用程序以多个html表单输入

目前我在stkuperform.java中有它,当人们登录authenticateUser或请求他们的密码时使用它。到目前为止,这很有效。我必须向巴卢斯克致谢。到目前为止,我所做的很多工作都是基于他的DAO/Servlets博客。谢谢巴卢斯

但是现在,除了登录之外,我正在创建另一个用例,其中主管通过输入员工的徽章将任务CommitmentItemForm.java分配给员工。我不希望有朝一日复制我的业务逻辑,因为一个有效的徽章可能有7个数字,所以我觉得我需要将其移出STKUserForm

java—由servlet从登录页面调用,上述两种方法都调用processBadge,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.");
        }
    }
}
}

那么我应该把validateEdge方法移到哪里呢??豆角??FormUtil???其他的一些实用类???我不确定,因为它打电话到了斯库塞尔道。我希望通过此应用程序和其他应用程序验证许多用例中的员工徽章。

我希望STKUserDAO.isValidEmployee提供stkuperform.validateEdge方法的所有功能,而不是在STKUserDAO.isValidEmployee中抛出异常。然后,在访问数据库的任何位置都可以进行验证。

一种解决方案是将bade 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而不是String。为了方便起见,操作表单可以有一个getBadgeId:BadgeId方法。由于BadgeId是不可变的,并且构造函数强制执行有效性,因此您不必担心无效的BadgeId对象四处飞舞

如果这听起来很疯狂,想想JDK类,比如Integer、Float等,它们不一定存在。我们可以只传递字符串对象并调用Float.validateString和Float.isValidString等。相反,创建了用于构建编程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
    }
}

也许吧,但是在我点击数据库之前,会调用FormUtil.isBadgebadge来检查它是否是一个格式良好的徽章。如果他们不小心在数字前面键入了“E”,我宁愿不打电话给数据库这里的一些传统应用程序需要E+徽章号码,但将代码放入STKUserDAO并不意味着你需要打电话给数据库。您可以在启动db连接之前调用FormUtil.isBadgebadge,如果失败,则退出方法,并出现异常,不会进行db调用。我进行了一些重构,您的建议到目前为止效果很好。谢谢,让我对您的答案进行一点消化。这似乎是对我所拥有的东西的一种改变,但我又是一个新手。我希望将ValidateEdge方法剪切粘贴到更合适的类/位置