Servlet

作者: iDevOps | 来源:发表于2019-09-17 10:32 被阅读0次

    Servlet是一个接口,定义了java类被浏览器访问到tomcat的规则

    创建一个Servlet实现类
    • 创建JavaEE项目


      image.png
    • 依赖
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
    
    • 定义一个类,实现Servlet接口
    public class ServletDemo implements Servlet {
    
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
    
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
    • 配置Servlet

    web.xml

     <!--配置Servlet -->
    <servlet>
        <servlet-name>demo</servlet-name>
        <servlet-class>com.test.web.servlet.ServletDemo</servlet-class>
    </servlet>
            
    <servlet-mapping>
        <servlet-name>demo</servlet-name>
        <url-pattern>/demo</url-pattern>
    </servlet-mapping>
    
    执行流程
    1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
    2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
    3. 如果有,则在找到对应的<servlet-class>全类名
    4. tomcat会将字节码文件加载进内存,并且创建其对象
    5. 调用其方法
    生命周期方法
    • init
      1.被创建,只执行一次,说明Servlet使得单例的
      2.默认Servlet会在第一次访问时被创建,可以通过配置修改Servlet的创建时机,在<servlet>标签下配置<load-on-startup>的值为0或正整数
      3.Servlet是单例的,多个用户同时访问时,可能存在线程安全问题,所以尽量不要在Servlet中定义成员变量
    • 提供服务
      每次访问Servlet时,Service方法都会被调用一次
    • 被销毁
      1.执行destroy方法,只执行一次
      2.服务器正常关闭时,Servlet被销毁,会执行
      3.destroy在Servlet被销毁之前执行,一般用于释放资源
    Servlet3.0

    支持注解了,可以不创建web.xml了

    @WebServlet("/demo")
    public class ServletDemo implements Servlet
    
    Servlet常用实现类
    • GenericServlet
      抽象类
      将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象,将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
    • HttpServlet
      抽象类
      对http协议的一种封装,简化操作,定义类继承HttpServlet,复写doGet/doPost方法。
    # 可以定义多个路由地址
    @WebServlet({"/demo1", "/demo2"})
    public class ServletDemo implements HttpServlet{
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req,resp);
        }
    }
    
    HttpServletRequest 和 HttpServletResponse

    HttpServletRequest 获取请求消息
    HttpServletResponse 设置响应消息

    ServletContext

    代表整个web应用,可以和程序的容器(服务器)来通信

    • 获取
    1. 通过request对象获取
    request.getServletContext();
    2. 通过HttpServlet获取
    this.getServletContext();
    

    相关文章

      网友评论

          本文标题:Servlet

          本文链接:https://www.haomeiwen.com/subject/cgffuctx.html