zoukankan      html  css  js  c++  java
  • Servlet

    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>
  • 相关阅读:
    LeetCode Merge Two Sorted Lists 归并排序
    LeetCode Add Binary 两个二进制数相加
    LeetCode Climbing Stairs 爬楼梯
    034 Search for a Range 搜索范围
    033 Search in Rotated Sorted Array 搜索旋转排序数组
    032 Longest Valid Parentheses 最长有效括号
    031 Next Permutation 下一个排列
    030 Substring with Concatenation of All Words 与所有单词相关联的字串
    029 Divide Two Integers 两数相除
    028 Implement strStr() 实现 strStr()
  • 原文地址:https://www.cnblogs.com/dreamhome/p/11397444.html
Copyright © 2011-2022 走看看