如何通过检查ArrayList中是否存在元素来验证Jquery Form字段?

时间:2016-12-16 17:25:20

标签: javascript jquery validation jsp jstl

我正在尝试验证包含几个字段的表单。如果存在电子邮件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>

我可以看到以下错误消息,但我也希望看到“电子邮件已存在”。

Message for invalid email Message for empty field

现在,当我更改上面的代码(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甚至输入了一封信:

always shows exist message

以下是HTML代码段:

<input type="email" id="Email" name="Email"class="required emailExist form-control">

2 个答案:

答案 0 :(得分:1)

问题:

您正在混合客户端和服务器端代码。 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-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
});