javaweb:Servlet详解

版权声明: https://blog.csdn.net/weixin_42442713/article/details/84071822

一、Servlet简介
1、Servlet定义:
Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。servlet是一个java小程序运行在web服务器。servlet接收并响应来自Web客户端的请求,通常通过HTTP,超文本传输协议。

servlet的角色:

2、Servlet实现过程:

配置Servlet路径映射配置:

l由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。

l<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name><servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。

l一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name><url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。例如:

<web-app>

  <servlet>

  <servlet-name>AnyName</servlet-name>

  <servlet-class>HelloServlet</servlet-class>

  </servlet>

  <servlet-mapping>

  <servlet-name>AnyName</servlet-name>

  <url-pattern>/demo/hello.html</url-pattern>

  </servlet-mapping>

</web-app>·

l同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。

lServlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。

<servlet-mapping>

  <servlet-name>

  AnyName

  </servlet-name>

  <url-pattern>

  *.do

  </url-pattern>

</servlet-mapping>       

                                             

<servlet-mapping>

  <servlet-name>

  AnyName

  </servlet-name>

  <url-pattern>

  /action/*

  </url-pattern>

</servlet-mapping>


(1)客户端发送请求至服务器端;

(2)服务器将请求信息发送至 Servlet;

(3)Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;

(4)服务器将响应返回给客户端。

Servlet的运行过程:

lServlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:

Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。

装载并创建该Servlet的一个实例对象。

调用Servlet实例对象的init()方法。

创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servletservice()方法并将请求和响应对象作为参数传递进去。

WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servletdestroy()方法。

servlet类之间的关系:

3、Servlet可以完成以下任务:
(1)动态生成HTML文档。

(2)将请求转发给Servlet组件。

(3)读取客户端的Cookie,以及向客户端写入Cookie。

(4)访问服务器的资源,如数据库、 XML、文件对像等。

4、Servlet的特点:
(1)Servlet对像,由Servlet容器(Tomcat)创建。

(2)Servlet是一个接口:位于javax.servlet包中。

(3)service方法用于接收用户的请求并返回响应。

(4)用户访问时多次被执行(可以统计网站的访问量)。

二、Servlet底层原理:
1、javax.servlet Interface Servlet

è¿éåå¾çæè¿°
2、javax.servlet Interface Servlet 中的method

è¿éåå¾çæè¿°
3、Servlet接口、GenericServlet类、HttpServlet类三者之间的关系

è¿éåå¾çæè¿°

servletCofig对象分析:


三、Servlet实现方式
1、Servlet的实现方式一(实现Servlet接口):

è¿éåå¾çæè¿°
Servlet接口:

package cn.hncu;

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 FirstServlet implements Servlet {
    /**init方法*/
    @Override
    public void init(ServletConfig paramServletConfig) throws ServletException {
    }

    /**getServletConfig方法*/
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**service方法*/
    @Override
    public void service(ServletRequest paramServletRequest,
            ServletResponse paramServletResponse) throws ServletException,
            IOException {
    }

    /**getServletInfo方法*/
    @Override
    public String getServletInfo() {
        return null;
    }

    /**destroy方法*/
    @Override
    public void destroy() {
    }
}

2、Servlet的实现方式二(继承GenericServlet类):


GenericServlet类:

package cn.hncu;

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**【注意】GenericServlet是抽象类,service是抽象方法*/
public class ExtendGenericServlet extends GenericServlet {

    /**service方法*/
    /**【注意】唯独service方法没有被实现,这个service方法我们自己使用*/
    @Override
    public void service(ServletRequest paramServletRequest,
            ServletResponse paramServletResponse) throws ServletException,
            IOException {
    }

    /**destroy方法*/
    /**【注意】除过service方法之外,其他方法都已经被实现了,并且这些方法都调用父接口的方法*/
    @Override
    public void destroy() {
        super.destroy();
    }

    /**getServletConfig方法*/
    @Override
    public ServletConfig getServletConfig() {
        return super.getServletConfig();
    }

    /**getServletInfo方法*/
    @Override
    public String getServletInfo() {
        return super.getServletInfo();
    }

    /**init方法*/
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }


3、Servlet的实现方式三(继承HttpServlet类):

可以在dopost中调用doget,从而简化编程:

è¿éåå¾çæè¿°
HttpServlet类:

package cn.hncu;


import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ExtendHttpServlet extends HttpServlet {

    /**service方法*/
    /**【注意】此service方法是HttpServlet类 继承 GenericServlet类 后实现的其抽象service方法的*/
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        super.service(req, resp);
    }

    /**destroy方法*/
    /**【注意】下面的这些方法全部是继承与GenericServlet类中的方法*/
    @Override
    public void destroy() {
        super.destroy();
    }

    /**getServletConfig方法*/
    @Override
    public ServletConfig getServletConfig() {
        return super.getServletConfig();
    }

    /**getServletInfo方法*/
    @Override
    public String getServletInfo() {
        return super.getServletInfo();
    }

    /**init方法*/
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }
}

四、Servlet生命周期
1、在JavaWeb项目中测试Servlet的生命周期
(1)init方法:
只会被初始化一次,由容器初始化,初始化成功后将缓存与容器中。 
它的初始时间分为两种: 
用户第一次访问时。 
服务器启动时,需要配置。

(2)service方法:
每次请求都会访问此方法。 
每次请求都会创建新的Request和Response对像。

(3)destory方法:
当服务器关闭时由容器调用并销毁。

2、JavaWeb项目—-TestServlet project
(1)、TestServlet框架:


(2)、index.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
   <title>测试Servlet的生命周期</title>
  </head>
  <body>
    <h2>测试Servlet的生命周期</h2>
    <a href="servlet/TestServlet">测试servlet的生命周期</a>
  </body>
</html>

五、配置自动加载

l如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。

  举例:

  <servlet>

  <servlet-name>invoker</servlet-name>

  <servlet-class>

  org.apache.catalina.servlets.InvokerServlet

  </servlet-class>

  <load-on-startup>2</load-on-startup>

  </servlet>

 

例如:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据

六、配置访问路径

七、编写绝对路径

ServletConfig对象:

lServlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。

lservlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servletinit方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

l阅读ServletConfig API,并举例说明该对象的作用:

获得配置文件,查看struts案例的web.xml文件

ServletContext对象:

lWEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。

lServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。

l由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context对象

l查看ServletContext API文档,了解ServletContext对象的功能。

ServletContext应用:

1.获取WEB应用的全局初始化参数

2.通过ServletContext对象实现数据共享

案例--- 统计站点访问次数

3.利用ServletContext对象读取资源文件

域对象:

关于缺省Servlet:

l如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet

l凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。

l<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServletServlet,并将这个Servlet设置为了缺省Servlet

l当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet

最后:

猜你喜欢

转载自blog.csdn.net/weixin_42442713/article/details/84071822
今日推荐