美文网首页
Servlet一——概述

Servlet一——概述

作者: 嗷老板 | 来源:发表于2018-03-30 08:47 被阅读0次

      Servlet是Java所提供的一门用于开发动态WEB资源的技术,也是JavaEE的规范之一

    一、Servlet的入门案例

      首先我们来做一个Servlet的入门案例:向用户的客户端(浏览器)输出一些内容

    1、开发步骤:

    (1)创建一个WEB项目

    (2)在WEB项目中创建一个类,让该类去实现Servlet接口或者继承Servlet接口的实现类

    import java.io.IOException;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class Demo1 implements Servlet{
        //摧毁Servlet对象,WEB服务器关闭时会调用destroy方法
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
            
        }
        
        //获取ServletConfig对象
        @Override
        public ServletConfig getServletConfig() {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public String getServletInfo() {
            // TODO Auto-generated method stub
            return null;
        }
    
        //第一次访问Servlet时进行初始化,并调用方法init()
        @Override
        public void init(ServletConfig arg0) throws ServletException {
            // TODO Auto-generated method stub
            
        }
    
        //Servlet的核心方法,访问Servlet对象都会调用service方法
        @Override
        public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
            arg1.getWriter().println("hello");
            
        }
    
    }
    

      类中的五个方法,都是接口中的抽象方法,需要进行重写。

    (3)在web.xml文件中进行相关的配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>web06</display-name>
      <servlet>
        <servlet-name>Demo1</servlet-name>
        <servlet-class>com.itheima.servlet.Demo1</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>Demo1</servlet-name>
        <url-pattern>/Demo1</url-pattern>
      </servlet-mapping>
    </web-app>
    

    Servlet配置的细节:

      servlet-mapping:对资源的映射路径进行配置,“/”代表当前项目
        除了可以配置资源名称,也可以进行路径的配置,而且路径可以有多层,但是在访问的时候,必须输入配置文件中完整的路径。
        同一个Servlet可以配置多个应映射路径,都可以对文件进行访问。
        配置Servlet映射路径时可以使用通配符(),使用通配符只有两种格式:
          格式1:
    .扩展名,比如*.do,但是不能以正斜杠开头,可以使用任意资源名称.do访问

          <servlet-mapping>
            <servlet-name>Demo1</servlet-name>
            <url-pattern>*.do</url-pattern>
          </servlet-mapping>
    

          格式2:如果以正斜杠开头,也必须使用"/"来结尾,资源名称可以任意写,也可以不写,访问时可以加扩展名也可以不加,但是配置的时候不能再后面加上扩展名。

          <servlet-mapping>
            <servlet-name>Demo1</servlet-name>
            <url-pattern>/Demo1/*</url-pattern>
          </servlet-mapping>
    

      load-on-startup:配置创建Servlet对象的时间,属性值为正整数,数值越小,优先级越高。如果对这个属性进行配置,tomcat启动的时候会直接创建Servlet的对象

    (4)发布WEB项目到WEB服务器

    2、案例的改进

      操作步骤中的第二步可以使用Eclipse直接创建Servlet,用Eclipse生成的Servlet不用进行配置,Eclipse直接就帮我们配置好了。

    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class Demo
     */
    public class Demo extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public Demo() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            response.getWriter().println("hello");
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    

    二、Servlet的执行过程

    Servlet的执行过程.png

    三、Servlet的体系结构

    Servlet的体系结构.png

    四、Servlet的生命周期

      出生:
        第一次访问Servlet时由WEB服务器创建对象,并调用init方法
      活着:
        每次访问Servlet都会调用他的service方法,在service方法中,根据请求方式的不同执行不同的doXXX方法。
      死亡:
        当服务器关闭的时候,会销毁Servlet对象,这个时候destroy方法就会被调用

    五、Servlet的线程安全问题

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

    解决方法:
      1、把有可能会出现问题的代码扔进同步代码块里面,但是会影响网站的反应速度
      2、让Servlet去实现一个接口SingleThreadModel,每次访问服务器,都会创建一个Servlet对象,但是多个对象中的数据都不一样,线程安全问题就不存在了。这个接口已经过时了
      3、尽量减少使用成员变量

    相关文章

      网友评论

          本文标题:Servlet一——概述

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