Servlet

TestServlet.java

// 文件路径 D:\ApacheServer\web_java\HelloWorld\src\com\test\TestServlet.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:\ApacheServer\web_java\HelloWorld\src\com\test\TestErrorServlet.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:\ApacheServer\web_java\HelloWorld\src\com\test\TestFilter.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:\ApacheServer\web_java\HelloWorld\src\com\test\TestClass.java
package com.test;

public class TestClass {

    public void testfun(){
    
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 文件路径 D:\ApacheServer\web_java\HelloWorld\WebContent\WEB-INF\web.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>

 

posted @ 2019-08-22 23:19  风吹屁股凉冰冰  阅读(155)  评论(0编辑  收藏  举报