美文网首页
Web 基础 7 Servlet的概述与入门案例

Web 基础 7 Servlet的概述与入门案例

作者: 小熊先生很不开心 | 来源:发表于2018-03-26 09:24 被阅读27次

    1.1 Servlet入门案例

    1.1.1 Servlet简介

      Servlet是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

    • 摘自WIKI

    1.1.2 入门案例开发及其步骤

    • 开发步骤
      • 创建一个WEB项目
        • 之前已经讲过了
      • 在WEB项目中创建一个类,让该类去实现Servlet接口(继承Servlet接口的实现类)
      • 实现一个方法
    @Override
        public void service(ServletRequest req, ServletResponse res)
                throws ServletException, IOException {
            res.getWriter().println("小熊先生");
            
        }
    
    
    创建项目以及继承.png
    • 添加web.xml文件并且在文件中进行相关的配置 添加如下代码
    • 可以从其他项目先拷贝 然后修改
    配置xml文件1.png
    <servlet>
        <servlet-name>DemoServlet</servlet-name>
        <servlet-class>com.heima.servlet.DemoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DemoServlet</servlet-name>
        <url-pattern>/DemoServlet</url-pattern>
    </servlet-mapping>
    
    • 发布WEB项目至WEB服务器
    入门发布.png

    1.2 Servlet的执行过程

    1. 通过主机名查找硬件服务器
    2. 通过端口号查找WEB服务器
    3. 通过项目名称查找发布在WEB服务器的项目
    4. 通过资源名称查找映射的路径
    5. 通过映射的路径查找Servlet的name
    6. 查找相同的Servlet的name
    7. 查找到要执行的Java类
    Servlet执行过程.png

    1.3 使用Eclipse创建Servlet

    1. 创建WEB项目
    2. 创建servlet

      在src下

    创建servlet.png
    1. 创建完成

      web.xml文件已经自动创建,可以打开看看,里面的配置已经自动补全
    但是这里是重要的内容,如果你删除src中的.class文件,xml文件是无法自动删除配置的

    servlet创建完成.png

    实现其中的方法就可以

    public class Demo01 extends HttpServlet {
        private static final long serialVersionUID = 1L;
        
        public Demo01() {
            super();
        }
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().println("lalal");
        }
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request,response);
        }
    
    }
    

    1.4 Servlet补充知识

    servlet结构.png
    • 这里讲解一下上图的Httpservlet

      按住ctrl 鼠标点击Httpservlet可以跳转方法,这里我已经给大家把图截好了
    HttpServlet 中的servicr 继承了 GennericServel 在往上则是实现了 servlet 的方法

      这里和我们第一个入门案例相同了,就是都是实现了service 方法

    大家了解下

    1.5Servlet的生命周期

    servlet的方法

    方法 描述
    destroy() Called by the servlet container to indicate to a servlet that the servlet is being taken out of service.
    init(ServletConfig config) Called by the servlet container to indicate to a servlet that the servlet is being placed into service.
    service(ServletRequest req, ServletResponse res) Called by the servlet container to allow the servlet to respond to a request.
    • 出生
      • 第一次访问Servlet时由WEB服务器创建对象
      • 第一次访问Servlet时进行初始化,并调用方法init()
    • 活着
      • 每次访问Servlet都会调用他的service方法
    • 死亡
      • 当WEB服务器关闭的时候会销毁Servlet的对象
      • 当WEB服务器关闭的时候会调用destory()方法

      为了更加清晰易懂的说明,可以使用下面的自己代码调试一下

    public class Demo2Servlet extends HttpServlet {
    
        public Demo2Servlet() {
            //创建对象时调用
            System.out.println("Servlet的对象创建了");
        }
        
        @Override
        public void init() throws ServletException {
            //初始化
            System.out.println("Servlet被初始化了");
        }
       
        @Override
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
            System.out.println("Servlet被执行了");
        }
        
        
        @Override
        public void destroy() {
            //销毁
            System.out.println("Servlet被销毁了");
        }
        
    
    

    1.6 Servlet的线程安全问题

      如果有多个客户端并发的访问同一个Servlet,WEB服务器会为每一个客户端的请求创建一个线程,在线程中调用Servlet的service方法,如果多个线程并发的访问同样的数据,那这个时候就有可能会出现线程的安全问题

    • 方法1:
      • 一般情况下我们会采用多线程的中学习过的同步锁,但是同步锁会导致只能有一个线程访问,造成的最直接的结果就是,只有一个人可以访问这个网站,其他人需要等待
    • 方法2: 实现SingleThreadModel接口,这个实际的产生的结果就是每次访问都会创造一个对象 ,依然不能解决问题,是一个已经过时的接口。
    public class Demo3Servlet extends HttpServlet implements SingleThreadModel {
        
        int num = 0;
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            num++;
            
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            System.out.println(num);
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    
    
    
    • 还有最后一个比较直接的办法,减少成员变量的使用,尽可能的使用局部变量。

    1.7 Servlet的一些配置细节

    • servlet-mapping

      • 除了可以配置资源名称,也可以进行路径的配置,而且路径可以有多层
        同一个Servlet我们可以配置多个映射路径
        配置Servlet映射路径时可以使用通配符(*),使用通配符只有两种格式
        • 格式1

          • .扩展名,比如.do
            不能以正斜杠开头
        • 格式2

          • 可以使用正斜杠开头,也需要使用"/"来结尾
            不能在
            后面加上扩展名
      <servlet>
        <description></description>
        <display-name>Demo4Servlet</display-name>
        <servlet-name>Demo4Servlet</servlet-name>
        <servlet-class>com.itheima.servlet.Demo4Servlet</servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>Demo4Servlet</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
      </servlet-mapping>
    
    • load-on-startup
      • tomcat启动的时候直接创建Servlet的对象
     <servlet>
        <description></description>
        <display-name>Demo3Servlet</display-name>
        <servlet-name>Demo3Servlet</servlet-name>
        <servlet-class>com.itheima.servlet.Demo3Servlet</servlet-class>
        <load-on-startup>2</load-on-startup>
      </servlet>
    
    • 配置启动的时候加载 <load-on-startup>2</load-on-startup>
      • 如果初始化的时候做了一些耗时操作,为了防止第一个人访问的时候很慢,就可以采用这种方式
      • 传一个正整数 越小优先级越高

    相关文章

      网友评论

          本文标题:Web 基础 7 Servlet的概述与入门案例

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