TestServlet.java
// 文件路径 D:ApacheServerweb_javaHelloWorldsrccom estTestServlet.java package com.test; //====================Servlet默认导入类开始================= import java.io.IOException; //1 import javax.servlet.ServletException; //2 import javax.servlet.annotation.WebServlet; //3 import javax.servlet.http.HttpServlet; //4 import javax.servlet.http.HttpServletRequest; //5 import javax.servlet.http.HttpServletResponse; //6 //====================Servlet默认导入类结束================= // 由于 web.xml 里配置的 url-pattern = /TomcatTest/TestServlet ,所以该 Servlet 浏览地址可以是 http://localhost:8080/TomcatTest/TestServlet // 下面的注解 @WebServlet 功能和 web.xml 配置 url-pattern 类似,所以该 Servlet 浏览地址也可以是 http://localhost:8080/TestServlet // 注解浏览地址和 web.xml 里配置的 url-pattern 地址不能一样,要么只配置其中一项(删除注解,或者删除web.xml中对应Servlet的<servlet-mapping>...</servlet-mapping>项),要么两者配置地址不能相同 @WebServlet("/TestServlet") public class TestServlet extends HttpServlet { // Servlet创建后默认存在项及值实际作用不明 private static final long serialVersionUID = 1L; public TestServlet() { super(); } public void init() throws ServletException { // 创建 Servlet 时只执行一次的 init } public void destroy() { // 销毁 Servlet 时只执行一次的 destroy // destroy 方法被调用后,servlet 被销毁,但是并没有立即被回收,再次请求时,并没有重新初始化。 } // post 请求会被 doPost 处理 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 转移到 doGet 函数处理信息 doGet(request, response); // 或者 this.doGet(request, response); 均可 } // get 请求会被 doGet 处理 // response.getWriter()有可能抛出异常,要么代码中在try中执行,要么所在的方法抛出 throws ServletException, IOException protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置返回响应内容类型及编码,否则返回输出中文会乱码 //response.setContentType("text/html;charset=UTF-8"); // 配合测试异常处理 Servlet (这里是 TestErrorServlet )捕获处理 web 容器抛出的异常 //test_error(response); // 测试调用其他类 TestClass testClass = new TestClass(); testClass.testfun(); //response.getWriter().append("Served at1: ").append(request.getContextPath()); } // 自建方法,测试异常 Servlet public void test_error(HttpServletResponse response) throws ServletException { response.setContentType("text/html;charset=UTF-8"); throw new ServletException("这是测试异常信息"); } }
TestErrorServlet.java
// 文件路径 D:ApacheServerweb_javaHelloWorldsrccom estTestErrorServlet.java package com.test; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/TestErrorServlet") public class TestErrorServlet extends HttpServlet { private static final long serialVersionUID = 1L; public TestErrorServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //response.getWriter().append("Served at: ").append(request.getContextPath()); // javax.servlet.error.status_code 该属性给出状态码,状态码可被存储,并在存储为 java.lang.Integer 数据类型后可被分析 Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); // javax.servlet.error.request_uri 该属性给出报错页面的请求地址,可被存储,并在存储为 java.lang.String 数据类型后可被分析 String requestUri = (String) request.getAttribute("javax.servlet.error.request_uri"); // javax.servlet.error.message 该属性给出确切错误消息信息,信息可被存储,并在存储为 java.lang.String 数据类型后可被分析 String message = (String) request.getAttribute("javax.servlet.error.message"); // javax.servlet.error.servlet_name 该属性给出报错的 Servlet 类名,可被存储,并在存储为 java.lang.String 数据类型后可被分析 String servletName = (String) request.getAttribute("javax.servlet.error.servlet_name"); // javax.servlet.error.exception_type 该属性给出异常的类型,异常类型可被存储,并在存储为 java.lang.Class 数据类型后可被分析 Object exceptionType = request.getAttribute("javax.servlet.error.exception_type"); // javax.servlet.error.exception 该属性给出异常的相关信息,信息可被存储,并在存储为 java.lang.Throwable 数据类型后可被分析 Throwable exception = (Throwable) request.getAttribute("javax.servlet.error.exception"); // 设置返回响应内容类型及编码 response.setContentType("text/html;charset=UTF-8"); // 以下项是抛出异常或报 404 等错误码时均有返回信息 response.getWriter().append("<br/> 访问报错 Servlet 页面返回的错误码 : " + statusCode + " 这里显示内容为 404 或 500 "); response.getWriter().append("<br/> 访问报错 Servlet 页面的请求地址 : " + requestUri + " 这里显示内容为 /HelloWorld/TomcatTest/TestServlet "); response.getWriter().append("<br/> 访问报错 Servlet 页面返回的错误信息 : " + message + " 404 错误时这里显示内容为 test response status 异常错误时显示内容为 这是测试异常信息"); response.getWriter().append("<br/> 访问报错 Servlet 页面返回的报错的 Servlet 类名 : " + servletName + " 这里显示内容为 TestServlet "); // 以下项是只有抛出异常才有值,报 404 等错误码时无返回值 response.getWriter().append("<br/> 访问报错 Servlet 页面返回的异常类型 : " + exceptionType.toString() + " 这里显示内容为 class javax.servlet.ServletException "); response.getWriter().append("<br/> 访问报错 Servlet 页面返回的异常类型 : " + exception.getClass().getName() + " 这里显示内容为 class javax.servlet.ServletException "); response.getWriter().append("<br/> 访问报错 Servlet 页面返回的异常信息 : " + exception.getMessage() + " 这里显示内容为 这是测试异常信息 "); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
TestFilter.java
// 文件路径 D:ApacheServerweb_javaHelloWorldsrccom estTestFilter.java package com.test; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; // 浏览器暂不能通过 http://localhost:8080/HelloWorld/TestFilter 访问页面 @WebFilter("/TestFilter") //实现 Filter 类 public class TestFilter implements Filter { public TestFilter() { } // Servlet容器在销毁 Filter 实例前调用该方法,在该方法中释放 Filter 实例占用的资源。 public void destroy() { // TODO Auto-generated method stub } // 该方法完成实际的过滤操作,当客户端请求过滤器设置的 URL 时,Servlet 容器将先调用过滤器的 doFilter 方法。FilterChain 用户访问后续过滤器。 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 这里的 request 和 response 对象与 Servlet 类中一样可获取用户请求信息及直接返回响应信息 // pass the request along the filter chain // 把请求传回过滤链 chain.doFilter(request, response); } // web 容器启动时,web 服务器将创建 Filter 的实例对象,并调用其 init 方法,读取 web.xml 配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作( filter 对象只会创建一次,init 方法也只会执行一次)。开发人员通过 init 方法的参数,可获得代表当前 filter 配置信息的 FilterConfig 对象。 public void init(FilterConfig fConfig) throws ServletException { // 获取初始化参数 String testParam = fConfig.getInitParameter("testParam"); // 输出初始化参数 System.out.println("web.xml 配置 测试参数 testParam 值为 : " + testParam); } } // Console 信息界面会出现 web.xml 配置 测试参数 testParam 值为 : 测试配置参数值 信息
TestClass.java
// 文件路径 D:ApacheServerweb_javaHelloWorldsrccom estTestClass.java package com.test; public class TestClass { public void testfun(){ } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- 文件路径 D:ApacheServerweb_javaHelloWorldWebContentWEB-INFweb.xml --> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 注册一个过滤器 --> <filter> <!-- 注册一个过滤器名称 --> <filter-name>TestFilter</filter-name> <!-- 该注册名对应的实际 Filter 类的完整的包及类名 --> <filter-class>com.test.TestFilter</filter-class> <!-- 为过滤器指定初始化参数,它的子元素 <param-name> 指定参数的名字,<param-value> 指定参数的值 --> <init-param> <param-name>testParam</param-name> <param-value>测试配置参数值</param-value> </init-param> </filter> <!-- 方便测试,再注册一个 filter --> <filter> <filter-name>TestFilter2</filter-name> <filter-class>com.test.TestFilter</filter-class> <init-param> <param-name>testParam2</param-name> <param-value>测试配置参数值2</param-value> </init-param> </filter> <!-- web.xml 中的 filter-mapping 元素的顺序决定了某个请求时 Web 容器调用 filter 的顺序 --> <!-- <filter-mapping> 元素用于设置一个 Filter 所负责拦截的资源。一个 Filter 拦截的资源可通过两种方式来指定:资源访问的请求路径和 Servlet 名称 --> <filter-mapping> <!-- 设置负责此次过滤功能的 Filter 的注册名称即该值必须是在<filter>元素中声明过的过滤器的名字 --> <filter-name>TestFilter</filter-name> <!-- 设置该 Filter 所拦截的请求路径。此处的 /* 表示该过滤器适用于所有的 Servlet和请求路径 --> <url-pattern>/*</url-pattern> <!-- 也可以指定特定的 Servlet 注册名,在访问指定 Servlet 上应用该过滤器 --> <servlet-name>TestServlet</servlet-name> <!-- dispatcher 访问指定资源时,调用该过滤器的条件,可以是 REQUEST,,INCLUDE,,FORWARD 和 ERROR 之一,默认 REQUEST。用户可以设置一个或多个 <dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。该参数可不写 --> <dispatcher>REQUEST</dispatcher> <!-- 当用户直接访问时,Web 容器将会调用过滤器。如果目标资源是通过 RequestDispatcher 的 include() 或 forward() 方法访问时,那么该过滤器就不会被调用 --> <dispatcher>INCLUDE</dispatcher> <!-- 如果目标资源是通过 RequestDispatcher 的 include() 方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用 --> <dispatcher>FORWARD</dispatcher> <!-- 如果目标资源是通过 RequestDispatcher 的 forward() 方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用 --> <dispatcher>ERROR</dispatcher> <!-- 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用 --> </filter-mapping> <!-- 如果拦截的请求相同,则先执行上一个 filter-mapping 中指定的 Filter --> <filter-mapping> <filter-name>TestFilter2</filter-name> <url-pattern>/TomcatTest/TestServlet</url-pattern> </filter-mapping> <servlet> <!-- Servlet 在此 xml 里的注册名 --> <servlet-name>TestServlet</servlet-name> <!-- 该注册名对应的实际 Servlet 类的完整包名类名 --> <servlet-class>com.test.TestServlet</servlet-class> </servlet> <servlet-mapping> <!-- 指定一个 Servlet 注册名 --> <servlet-name>TestServlet</servlet-name> <!-- 外部访问的网址 --> <url-pattern>/TomcatTest/TestServlet</url-pattern> </servlet-mapping> <servlet> <servlet-name>TestErrorServlet</servlet-name> <servlet-class>com.test.TestErrorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestErrorServlet</servlet-name> <url-pattern>/TomcatTest/TestErrorServlet</url-pattern> </servlet-mapping> <!-- 当请求的路径报错时指定一个 Servlet 来处理及返回相应信息,但用户请求的 url 未重定向跳转 --> <error-page> <!-- 当客户端请求 web 容器返回指定错误状态代码时(示例是404,也可是403等)调用指定的 Servlet 页面 --> <error-code>404</error-code> <location>/TomcatTest/TestErrorServlet</location> </error-page> <error-page> <!-- 当客户端请求 web 容器抛出异常时调用指定的 Servlet 页面,示例的 java.lang.Throwable 对应所有web容器抛出的异常,也可换成 javax.servlet.ServletException 或 java.io.IOException 等抛出指定异常时才调用设置的 Servlet 页面 --> <exception-type>java.lang.Throwable</exception-type > <location>/TomcatTest/TestErrorServlet</location> </error-page> <!-- 设置 session 超时时间,单位分钟,该设置将覆盖 Tomcat 默认的 30 分钟超时时间 --> <session-config> <session-timeout>15</session-timeout> </session-config> </web-app>