Servlet一——概述

2018-03-30  本文已影响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、尽量减少使用成员变量

上一篇下一篇

猜你喜欢

热点阅读