Java web应用程序数据输入验证方法位置
我应该在哪里找到验证员工ID徽章的代码,该徽章将通过我的应用程序以多个html表单输入 目前我在stkuperform.java中有它,当人们登录authenticateUser或请求他们的密码时使用它。到目前为止,这很有效。我必须向巴卢斯克致谢。到目前为止,我所做的很多工作都是基于他的DAO/Servlets博客。谢谢巴卢斯 但是现在,除了登录之外,我正在创建另一个用例,其中主管通过输入员工的徽章将任务CommitmentItemForm.java分配给员工。我不希望有朝一日复制我的业务逻辑,因为一个有效的徽章可能有7个数字,所以我觉得我需要将其移出STKUserForm java—由servlet从登录页面调用,上述两种方法都调用processBadge,processBadge随后调用validateBadge方法Java web应用程序数据输入验证方法位置,java,validation,Java,Validation,我应该在哪里找到验证员工ID徽章的代码,该徽章将通过我的应用程序以多个html表单输入 目前我在stkuperform.java中有它,当人们登录authenticateUser或请求他们的密码时使用它。到目前为止,这很有效。我必须向巴卢斯克致谢。到目前为止,我所做的很多工作都是基于他的DAO/Servlets博客。谢谢巴卢斯 但是现在,除了登录之外,我正在创建另一个用例,其中主管通过输入员工的徽章将任务CommitmentItemForm.java分配给员工。我不希望有朝一日复制我的业务逻辑,
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方法剪切粘贴到更合适的类/位置