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>
  • 相关阅读:
    13之容器资源需求、资源限制及Metricserver(Heapster)
    04K8S之pod控制器
    08K8S之k8s认证和serviceaccount
    07K8S之Statefulset控制器
    [Database] Mongodb 分片集群
    IIS 配置.svc的MIME映射
    当前标识(IIS APPPOOL\ASP.NET v4.0)没有对“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files”的写访问权限 解决方案
    Kubernetes Dashboard 安装
    存储服务 使用S3存储桶上传文件以及使用CLI来访问S3服务
    Django使用pdfkit生成PDF文件提供下载
  • 原文地址:https://www.cnblogs.com/dreamhome/p/11397444.html
Copyright © 2011-2022 走看看