如何通过检查 ArrayList 中是否存在元素来验证 Jquery 表单字段?
How to Validate Jquery Form fields with checking if element exists in ArrayList?
我正在尝试验证包含几个字段的表单。在一个字段中,如果电子邮件 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>
我可以看到以下错误消息,但我也想看到 "Email already exist"。
现在,当我像这样更改上面的代码(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");
现在 "Email already exist" 消息总是显示,即使它不存在。连留言都进了一个字母:
这里是 HTML 片段:
<input type="email" id="Email" name="Email"class="required emailExist form-control">
问题:
您正在混合使用客户端和服务器端代码。 JavaScript 和 JavaServer Pages 是分开执行的。
- JSP代码在服务器上编译,
- 结果是 HTML,传送到浏览器
- 在浏览器中执行JavaScript
所以 JSP 相关的东西,例如:
- JSTL,JSP 标准标签库(像
<jsp:something>
<c:something>
这样的标签)
- JSP-EL,表达式语言(字符串如
${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 数组,然后在客户端使用 Javascript 进行验证。但这会很脏!
当您拥有数千或数百万注册用户时会发生什么?!会很乱。以及隐私曝光。
实际解决方案:
更好的验证方法可能是发出 AJAX 验证请求,并让服务器决定电子邮件是否已被接收。
您可以在这里阅读更多内容:
How to use Servlets and Ajax?
正如@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
});
我正在尝试验证包含几个字段的表单。在一个字段中,如果电子邮件 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>
我可以看到以下错误消息,但我也想看到 "Email already exist"。
现在,当我像这样更改上面的代码(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");
现在 "Email already exist" 消息总是显示,即使它不存在。连留言都进了一个字母:
这里是 HTML 片段:
<input type="email" id="Email" name="Email"class="required emailExist form-control">
问题:
您正在混合使用客户端和服务器端代码。 JavaScript 和 JavaServer Pages 是分开执行的。
- JSP代码在服务器上编译,
- 结果是 HTML,传送到浏览器
- 在浏览器中执行JavaScript
所以 JSP 相关的东西,例如:
- JSTL,JSP 标准标签库(像
<jsp:something>
<c:something>
这样的标签) - JSP-EL,表达式语言(字符串如
${something}
)
在服务器上处理。
您可以在 Firefox/Chrome 中按 Ctrl+U
查看浏览器收到的 HTML 代码。
所以你可以检查生成的 HTML 和 JavaScript.
在代码的第二行中,您尝试使用服务器端表达式语言 ${value}
:
value
$.validator.addMethod('emailExist', function (value, element) {
<c:set var="userEmail" value="${value}"/>
<c:forEach var="email" items="${userEmails}">
这行不通。
理论解(但请不要这样做):
理论上,您可以在服务器端生成一个 Javascript 数组,然后在客户端使用 Javascript 进行验证。但这会很脏!
当您拥有数千或数百万注册用户时会发生什么?!会很乱。以及隐私曝光。
实际解决方案:
更好的验证方法可能是发出 AJAX 验证请求,并让服务器决定电子邮件是否已被接收。
您可以在这里阅读更多内容: How to use Servlets and Ajax?
正如@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
});