我正在尝试验证包含几个字段的表单。如果存在电子邮件ArrayList的元素,我必须在一个字段中验证电子邮件ID。谁能告诉我我做错了什么?任何解决方案或其他方式?谢谢。
这是JSP片段,我将所有元素都放入ArrayList。
<%
ArrayList userEmails = getAllEmails();
//For test only. Its printing all Emails
for(Object email : userEmails)
System.out.println("Email: " + email);
request.setAttribute("userEmails", userEmails);
%>
以下是JavaScript代码段:
<script type="text/javascript">
$.validator.addMethod('emailExist', function (value, element) {
<c:forEach var="email" items="${userEmails}">
return this.optional(element) || ${email}.test(value);
</c:forEach>
}, "Email already exist");
var validator = $('#EditUser').validate({
rules: {
Email: {
required: true,
email: true
},
... more fields
</script>
我可以看到以下错误消息,但我也希望看到“电子邮件已存在”。
现在,当我更改上面的代码(emailExist方法)时:
$.validator.addMethod('emailExist', function (value, element) {
<c:set var="userEmail" value="${value}"/>
<c:forEach var="email" items="${userEmails}">
<c:if test="${email eq userEmail}">
return this.optional(element) || ${email}.test(value);
</c:if>
</c:forEach>
}, "Email already exist");
现在,“电子邮件已存在”消息始终显示,即使它不存在。即使是消息chages甚至输入了一封信:
以下是HTML代码段:
<input type="email" id="Email" name="Email"class="required emailExist form-control">
答案 0 :(得分:1)
问题:
您正在混合客户端和服务器端代码。 JavaScript和JavaServer Pages分开执行。
所以JSP相关的东西如:
<jsp:something>
<c:something>
)${something}
的字符串)在服务器上处理。
您可以在Firefox / Chrome中按Ctrl+U
来查看浏览器中收到的HTML代码
因此,您可以检查生成的HTML和JavaScript。
在代码的第二行,您尝试使用服务器端表达式语言value
访问JavaScript参数${value}
:
$.validator.addMethod('emailExist', function (value, element) {
<c:set var="userEmail" value="${value}"/>
<c:forEach var="email" items="${userEmails}">
这不起作用。
理论解决方案(但请不要这样做):
理论上,您可以在服务器端生成Javascript-Array,然后使用Javascript在客户端进行验证。但这会很脏!
当您拥有数千或数百万注册用户时会发生什么?!这将是凌乱的。隐私曝光。
实用解决方案:
更好的验证方法可能是制作AJAX验证请求,让服务器决定是否已经收到电子邮件。
您可以在这里阅读更多内容: How to use Servlets and Ajax?
答案 1 :(得分:0)
正如@code_angel提到的实用解决方案。如果有人需要它,这是经过测试的工作解决方案:
在Servlet页面上:
private void isEmailExists(String checkEmail, String userStatus, String dbUID, HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
ArrayList userEmails = getAllEmails();
boolean emailNotExists = true;
if(userStatus.contains("Edit")){
Hashtable userHash = getSystemUserDetails(dbUID);
String userEmail = cvtStr(userHash.get("LoginEmail"));
if(userEmail.equals(checkEmail)) {
response.getWriter().write(String.valueOf(emailNotExists));
return;
}
}
for(Object email : userEmails){
if(email.equals(checkEmail)){
emailNotExists = false;
break;
}
}
response.getWriter().write(String.valueOf(emailNotExists));
}
在JavaScript上:
var validator = $('#EditUser').validate({
rules: {
LoginEmail: {
required: true,
email: true,
remote: {
url: "/servlet/UserServlet",
type: "POST",
data: {
dbUIDEdit: function() {return $("#dbUID").val();}
}
}
},
//More fields
},
messages: {
LoginEmail: {
required: 'Email address is required',
email: 'Please enter a valid email address',
remote: 'Email already exists'
}
//More messages
});