zoukankan      html  css  js  c++  java
  • Servlet学习

    概念:Servlet(server applet)运行在服务器端的小程序

    Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。

    简单使用步骤

    1. 创建JavaEE项目
    2. 定义一个类,实现Servlet接口
    public class ServletDemo1 implements Servlet{
    
    }
    3. 实现接口中的抽象方法
    4. 配置Servlet
    在web.xml中配置:
    <!--配置Servlet -->
    <servlet>
    <servlet-name>demo1</servlet-name>
    <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>demo1</servlet-name>
    <url-pattern>/demo1</url-pattern>
    </servlet-mapping>
    

    执行原理

    1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
    2. 查找web.xml文件,是否有对应的< url-pattern>标签体内容。
    3. 如果有,则在找到对应的< servlet-class>全类名
    4. tomcat会将字节码文件加载进内存,并且创建其对象
    5. 调用其方法

    Servlet中的生命周期

    1. 被创建:执行init方法,只执行一次。
      Servlet什么时候被创建?
      默认情况下,第一次被访问时,Servlet被创建。
      可以配置执行Servlet的创建时机。
       在< servlet>标签下配置
        1.第一次被访问时,创建Servlet
        < load-on-startup>的值为负数
        2.在服务器启动时,创建Servlet
        < load-on-startup>的值为0或正整数
       Servlet的init()方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。
        多个用户同时访问时,可能存在线程安全问题。
        解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要修改值。

    2. 提供服务:执行service方法,执行多次。
      每次访问Servlet时,Service方法都会被调用一次。

    3. 被销毁:执行destroy方法,只执行一次。
      Servlet被销毁时执行。服务器关闭时,Servlet被销毁。
      只有服务器正常关闭时,才会执行destroy方法。
      destroy方法在Servlet被销毁之前执行,一般用于释放资源

    示例:

    public class ServletDemo2 implements Servlet {
    
        /**
        * 初始化方法
        * 在Servlet被创建时执行,只会执行一次
        */
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("init 00000000000000");
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        /**
        *提供服务的方法
        * 每一次Servlet被访问时执行,可以执行多次
        */
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    
            System.out.println("service 00000000000");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        /**
        * 销毁的方法
        * 在服务器正常关闭时执行,执行一次
        */
        @Override
        public void destroy() {
            System.out.println("destory  0000000000");
    
        }
    }
    

    Servlet3.0注解

    好处:

    支持注解配置。可以不使用、配置web.xml了。

    步骤:

    1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
    2. 定义一个类,实现Servlet接口
    3. 复写方法
    4. 在类上使用@WebServlet注解,进行配置
     @WebServlet("资源路径 ---->(urlpaths)")  
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface WebServlet {
        String name() default "";//相当于< Servlet-name>
        String[] value() default {};//代表urlPatterns()属性配置
        String[] urlPatterns() default {};//相当于< url-pattern>
        int loadOnStartup() default -1;//相当于< load-on-startup>
        WebInitParam[] initParams() default {};
        boolean asyncSupported() default false;
        String smallIcon() default "";
        String largeIcon() default "";
        String description() default "";
        String displayName() default "";
    }
    

    Servlet体系结构

    Servlet -- 接口
        |
    GenericServlet -- 抽象类,继承Servlet
        |
    HttpServlet  -- 抽象类,继承GenericServlet
    
    GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
    将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
    HttpServlet:对http协议的一种封装,简化操作
    
    使用步骤:
    1. 定义类继承HttpServlet
    2. 复写doGet/doPost方法
    

    示例:

    @WebServlet("/demo4")
    public class ServletDemo4 extends GenericServlet {
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("GenericServlet service");
        }
    }
    
    @WebServlet("/demo5")
    public class ServletDemo5 extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("doGet");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("doPost");
        }
    }
    

    Servlet相关配置

    1. urlpartten:Servlet访问路径
      一个Servlet可以定义多个访问路径 :
      例如:@WebServlet({"/d4","/dd4","/ddd4"})
    2. 路径定义规则:
      2.1 /xxx:路径匹配
      2.2 /xxx/xxx:多层路径,目录结构
      2.3 .do 或者.aa等:扩展名匹配
  • 相关阅读:
    Vue路由机制
    谷歌浏览器打不开应用商店的解决方法
    Vue报错——Component template should contain exactly one root element. If you are using vif on multiple elements, use velseif to chain them instead.
    Vue.js学习之——安装
    Vue使用axios无法读取data的解决办法
    关于localstorage存储JSON对象的问题
    2013年整体计划
    个人喜欢的警语收集
    Linux防火墙的关闭和开启
    Flex修改title 转载
  • 原文地址:https://www.cnblogs.com/gujun1998/p/11340715.html
Copyright © 2011-2022 走看看