• Servlet的概念问题以及相关接口


    1、Servlet

    1.1、定义:

    JavaWeb三大组件之一,用于处理请求,一般Servlet需要接收请求数据,处理请求,完成响应。

    1.2实现方式:

    1、实现javax.servlet.Servlet接口;
    2、继承javax.servlet.GenericServlet抽象类;
    3、继承javax.servlet.http.HttpServlet抽象类;

    1.3 生命周期
    1、出生:

    void init(ServletConfig);// 出生方法
    该方法是在Servlet第一次被访问的时候调用,而且Servlet一生只会调用一次该方法,所以我们可以在该方法做一些数据的初始化

    2、服务:

    void service(ServletRequest,ServletResponse);
    每次接收请求时,都会调用该方法,可以多次调用

    3、离去:

    void destroy();
    不轻易离去,只有服务器关闭的时候才会离去,在服务器关闭之前,会“临死”之前调用该方法。

    4、测试Servlet生命周期的方法:
    public class HelloServlet implements Servlet {	     
        public void init(ServletConfig config) throws ServletException {		
            System.out.println("Servlet出生了!");
        }	     
        public ServletConfig getServletConfig() {   
            return null;
        }	     
        public void destroy() {	
            System.out.println("Servlet死亡!");	
        }	     
        public String getServletInfo() {     
            return null;
        }      
        public void service(ServletRequest req, ServletResponse res)throws      ServletException, IOException {	
            System.out.println("hello servlet!");	
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这也是第一种实现方式。

    1.4、Servlet相关接口
    1、ServletRequest:

    service() 方法的参数,它表示请求对象,它封装了所有与请求相关的数据,它是由服务器创建的;

    2、ServletResponse:

    service()方法的参数,它表示响应对象,在service()方法中完成对客户端的响应需要使用这个对象;

    3、ServletConfig:

    init()方法的参数,它表示Servlet配置对象,它对应Servlet的配置信息,那对应web.xml文件中的元素。这里面有几个方法需要提一下:

    • String getServletName():获取Servlet在web.xml文件中的配置名称,即指定的名称;
    • ServletContext getServletContext():用来获取ServletContext对象,ServletContext会在后面讲解;
    • String getInitParameter(String name):用来获取在web.xml中配置的初始化参数,通过参数名来获取参数值;
    • Enumeration getInitParameterNames():用来获取在web.xml中配置的所有初始化参数名称;
    1.5、GenericServlet类

    GenericServlet是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的Servlet。
    我们可以看看它的源代码:

    public abstract class GenericServlet implements Servlet, ServletConfig,    java.io.Serializable {       
        private  static  final long serialVersionUID = 1L;       
        private  transient ServletConfig config;       
        public   GenericServlet() {} 
        @Override
        public void destroy() {}  
        @Override       
        public String getInitParameter(String name) {         
            return getServletConfig().getInitParameter(name);  
        }  
        @Override       
        public Enumeration<String> getInitParameterNames() {         
            return getServletConfig().getInitParameterNames();  
        }  
        @Override       
        public ServletConfig getServletConfig() {         
            return config;  
        }  
        @Override       
        public ServletContext getServletContext() {         
            return getServletConfig().getServletContext();  
        }
        @Override       
        public String getServletInfo() {         
            return      "";  
        }  
        @Override       
        public void init(ServletConfig config) throws ServletException {         				this.config = config;
            this.init();  
        }       
        public void init()throws ServletException {}       
        public void log(String msg) {    
            getServletContext().log(getServletName() + ": " + msg); 
        }       
        public void log(String message, Throwable t) {
            getServletContext().log(getServletName() + ": " + message, t);  
        }  
        @Override       
        public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; 
        @Override       
        public String getServletName() {         
            return config.getServletName();  
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    它有一个属于自己的方法,init()方法,注意这个是无参的,Servlet接口里面的init方法是有参数的,所以我们如果需要初始化的话只要重写这个无参数的init()方法就行,另外再重写service方法就行。

    1.6、 HttpServlet类

    是GenericServlet的子类,该类提供了对HTTP请求的特殊支持,所以一般都会通过继承HttpServlet来完成对Servlet的定义,这个类是里面有着自己的service方法,能够把ServletRequest和ServletResponse强转成HttpServletRequest和HttpServletResponse,所以我们在继承这个类的时候只需要重写他的doGet()或者doPost()就行。
    eg:

    public class AServlet extends  HttpServlet {	     
        public void doGet(HttpServletRequest request, HttpServletResponse response)		throws ServletException, IOException {	
            System.out.println("hello doGet()...");	
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
     public class BServlet extends HttpServlet {	     
         public void doPost(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {	
             System.out.println("hello doPost()...");	
         }
     } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    C&C++指针实训(国防科大)
    小程序也能是App中的引流神器?
    ubuntu | 安装NVIDIA套件:驱动、CUDA、cuDNN
    42.【vector简单列题】
    【分享】抖音在 “集简云平台“ 集成应用的常见问题与解决方案
    springCloud在pom中快速修改运行环境,让配置不再繁琐
    LeetCode 46 全排列 - Java 实现
    吃透Chisel语言.30.Chisel进阶之通信状态机(二)——FSMD:以Popcount为例
    300. 最长递增子序列
    GREASELM: GRAPH REASONING ENHANCED LANGUAGE MODELS FOR QUESTION ANSWERING
  • 原文地址:https://blog.csdn.net/weixin_54194900/article/details/127476658