如何通过检查 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
});