原文:http://zetcode.com/java/validationfilter/

    在本教程中,我们将展示如何验证用户在 Web 应用中输入的数据。 验证是一项常见的任务,并包含在 Java Web 框架(如 Stripes,Ninja 框架或 Play 框架)中。 在本教程中,我们将使用简单的自定义验证过滤器来验证数据。 来源可从作者的 Github 仓库中获得。

    过滤器是一个对象,它对对资源的请求或对资源的响应(或两者)执行过滤任务。 过滤器以doFilter()方法执行过滤。

    过滤器可用于各种任务,例如认证,日志记录,数据压缩,图像转换或加密。 在我们的示例中,我们使用过滤器来验证输入数据。

    在我们的应用中,我们有一个 HTML 表单,该表单接受用户的输入。 该表单具有两个输入标签:用户名和电子邮件。 输入正在使用过滤器进行验证。 为了验证电子邮件格式,我们使用 Apache Commons Validator。 该项目是使用 NetBeans IDE 中的 Maven 构建的。 我们将应用部署在 Tomcat 上。

    Java 验证过滤器 - 图1

    图:结构

    该图显示了 NetBeans 中的项目结构。 我们有三个 JSP 页面,两个 Java 类和两个 XML 配置文件。

    pom.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
    6. <modelVersion>4.0.0</modelVersion>
    7. <groupId>com.zetcode</groupId>
    8. <artifactId>Validation</artifactId>
    9. <version>1.0-SNAPSHOT</version>
    10. <packaging>war</packaging>
    11. <name>Validation</name>
    12. <dependencies>
    13. <dependency>
    14. <groupId>javax</groupId>
    15. <artifactId>javaee-web-api</artifactId>
    16. <version>7.0</version>
    17. <scope>provided</scope>
    18. </dependency>
    19. <dependency>
    20. <groupId>jstl</groupId>
    21. <artifactId>jstl</artifactId>
    22. <version>1.2</version>
    23. </dependency>
    24. <dependency>
    25. <groupId>commons-validator</groupId>
    26. <artifactId>commons-validator</artifactId>
    27. <version>1.5.1</version>
    28. </dependency>
    29. </dependencies>
    30. <build>
    31. <plugins>
    32. <plugin>
    33. <groupId>org.apache.maven.plugins</groupId>
    34. <artifactId>maven-compiler-plugin</artifactId>
    35. <version>3.1</version>
    36. <configuration>
    37. <source>1.8</source>
    38. <target>1.8</target>
    39. <compilerArguments>
    40. <endorseddirs>${endorsed.dir}</endorseddirs>
    41. </compilerArguments>
    42. </configuration>
    43. </plugin>
    44. <plugin>
    45. <groupId>org.apache.maven.plugins</groupId>
    46. <artifactId>maven-war-plugin</artifactId>
    47. <version>2.3</version>
    48. <configuration>
    49. <failOnMissingWebXml>false</failOnMissingWebXml>
    50. </configuration>
    51. </plugin>
    52. </plugins>
    53. </build>
    54. </project>

    这是pom.xml构建文件。 它包含 JSTL 和 Apache Commons Validator 依赖关系的依赖关系。

    context.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <Context path="/Validation"/>

    context.xml文件中,我们指定应用的上下文路径。 它用于唯一标识应用。

    index.jsp

    1. <%@page contentType="text/html" pageEncoding="UTF-8"%>
    2. <!DOCTYPE html>
    3. <html>
    4. <head>
    5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    6. <title>Validation</title>
    7. </head>
    8. <body>
    9. <p>
    10. Enter your name and email:
    11. </p>
    12. <form method="post" action="Greet">
    13. Name: <input type="text" name="username"> <br>
    14. Email: <input type="text" name="email"> <br>
    15. <input type="submit" value="Submit">
    16. </form>
    17. </body>
    18. </html>

    index.jsp是应用的入口点。 它具有带有两个字段的 HTML 表单。 在这些字段中输入的值将由应用验证。

    1. <form method="post" action="Greet">
    2. ...
    3. </form>

    提交表单后,将调用Greet Servlet。 在到达 Servlet 之前,过滤器将处理请求。

    hello.jsp

    1. <%@page contentType="text/html" pageEncoding="UTF-8"%>
    2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    3. <!DOCTYPE html>
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>Greeting</title>
    8. </head>
    9. <body>
    10. Hello <c:out value="${param.username}"/>! <br>
    11. Your email is <c:out value="${param.email}"/>.
    12. </body>
    13. </html>

    当输入数据通过验证测试时,将显示hello.jsp页面。 显示输入的数据。

    valError.jsp

    1. <%@page contentType="text/html" pageEncoding="UTF-8"%>
    2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    3. <!DOCTYPE html>
    4. <html>
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    7. <title>Error</title>
    8. </head>
    9. <body>
    10. <p>
    11. <c:out value="${errMsg}"/>
    12. </p>
    13. </body>
    14. </html>

    如果验证失败,则显示valError.jsp。 它显示了存储在errMsg属性中的错误消息。 该属性在验证过滤器中设置。

    ValidationFilter.java

    1. package com.zetcode.web;
    2. import java.io.IOException;
    3. import javax.servlet.Filter;
    4. import javax.servlet.FilterChain;
    5. import javax.servlet.FilterConfig;
    6. import javax.servlet.RequestDispatcher;
    7. import javax.servlet.ServletException;
    8. import javax.servlet.ServletRequest;
    9. import javax.servlet.ServletResponse;
    10. import javax.servlet.annotation.WebFilter;
    11. import org.apache.commons.validator.routines.EmailValidator;
    12. @WebFilter(filterName = "ValidationFilter", urlPatterns = {"/Greet"})
    13. public class ValidationFilter implements Filter {
    14. public ValidationFilter() { }
    15. @Override
    16. public void doFilter(ServletRequest request, ServletResponse response,
    17. FilterChain chain)
    18. throws IOException, ServletException {
    19. String erpg = "valError.jsp";
    20. String userName = request.getParameter("username");
    21. String email = request.getParameter("email");
    22. boolean valid = EmailValidator.getInstance().isValid(email);
    23. if (userName == null || "".equals(userName)
    24. || email == null || "".equals(email)) {
    25. request.setAttribute("errMsg", "One or both fields are empty");
    26. RequestDispatcher rd = request.getRequestDispatcher(erpg);
    27. rd.include(request, response);
    28. } else if (!valid) {
    29. request.setAttribute("errMsg", "Email format not valid");
    30. RequestDispatcher rd = request.getRequestDispatcher(erpg);
    31. rd.include(request, response);
    32. } else {
    33. chain.doFilter(request, response);
    34. }
    35. }
    36. @Override
    37. public void destroy() { }
    38. @Override
    39. public void init(FilterConfig filterConfig) { }
    40. }

    数据验证在ValidationFilter类中执行。

    1. @WebFilter(filterName = "ValidationFilter", urlPatterns = {"/Greet"})

    @WebFilter注解声明一个 servlet 过滤器。 过滤器将应用于指定的 URL 模式。 在我们的例子中,它在Greet servlet 调用之前被调用。

    1. public class ValidationFilter implements Filter {

    过滤器实现Filter接口。

    1. @Override
    2. public void doFilter(ServletRequest request, ServletResponse response,
    3. FilterChain chain)
    4. throws IOException, ServletException {
    5. ...
    6. }

    实际工作以doFilter()方法完成。

    1. String userName = request.getParameter("username");
    2. String email = request.getParameter("email");

    通过getParameter()方法,我们获得了 HTML 表单发送的数据。

    1. boolean valid = EmailValidator.getInstance().isValid(email);

    使用 Apache Commons Validator 的EmailValidator,我们检查电子邮件格式的有效性。

    1. if (userName == null || "".equals(userName)
    2. || email == null || "".equals(email)) {
    3. request.setAttribute("errMsg", "One or both fields are empty");
    4. RequestDispatcher rd = request.getRequestDispatcher(erpg);
    5. rd.include(request, response);
    6. } else if (!valid) {
    7. request.setAttribute("errMsg", "Email format not valid");
    8. RequestDispatcher rd = request.getRequestDispatcher(erpg);
    9. rd.include(request, response);
    10. } else {
    11. chain.doFilter(request, response);
    12. }

    如果数据未能通过验证,则使用RequestDispatcher将处理分派到错误页面。 否则,请求将继续其行进到目的地 servlet。

    Greeting.java

    1. package com.zetcode.web;
    2. import java.io.IOException;
    3. import javax.servlet.RequestDispatcher;
    4. import javax.servlet.ServletException;
    5. import javax.servlet.annotation.WebServlet;
    6. import javax.servlet.http.HttpServlet;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. @WebServlet(name = "Greeting", urlPatterns = {"/Greet"})
    10. public class Greeting extends HttpServlet {
    11. @Override
    12. protected void doPost(HttpServletRequest request, HttpServletResponse response)
    13. throws ServletException, IOException {
    14. response.setContentType("text/html;charset=UTF-8");
    15. String page = "/hello.jsp";
    16. RequestDispatcher disp = getServletContext().getRequestDispatcher(page);
    17. disp.forward(request, response);
    18. }
    19. }

    Greeting servlet 仅将请求与RequestDispatcher一起调度到hello.jsp页面。

    Java 验证过滤器 - 图2

    图:错误消息

    如果电子邮件格式不正确,则应用将以错误消息响应。

    这是验证过滤器教程。 我们已经使用 JSTL,JSP,Apache Commons Validator,Tomcat 和 Maven 构建了一个 Web 应用。 您可能还需要查看一些相关的教程: SQL 查询标记教程Java 教程读取 WAR 中的 CSV 文件Stripes 教程