Servlet生命周期

目录

1.什么时servlet

1.servlet体系结构

2.servlet接口 

3.servlet继承关系

4.GenerlcServlet

2.Servlet访问

1.在WEB-INF文件下的web.xml中配置路径映射

2.在类的中加注解

3.servlet生命周期

1.servlet工作原理

2.servlet工作流程 

3.servlet生命周期

4.实例化

5.初始化

1.配置初始化参数

2.获取初始化参数

6.service方法处理请求响应

1.HttpServlet中service方法

2.HttpServletRequest常用方法

7.转发和重定向的区别


1.什么是servlet

和applet相对应,是运行在服务器端的小程序,用来处理客户端的请求并给予响应的java类,继承了HttpServlet类。

1.servlet体系结构

2.servlet接口 

Servlet的框架是由两个Java包组成的:javax.servlet与javax.servlet.http。在 javax.servlet包中定义了所有的Servlet类都必须实现或者扩展的通用接口和类。在 javax.servlet.http包中定义了采用Http协议通信的HttpServlet类。Servlet的框架的核心 是javax.servlet.Servlet接口,所有的Servlet都必须实现这个接口

3.servlet继承关系

4.GenerlcServlet

编写Servlet需要通过实现Servlet接口来编写Servlet,但是我们每次都必须为Servlet中 的所有方法都提供实现,还需要将ServletConfig对象保存到一个类级别的变量中, GenericServlet抽象类就是为了为我们省略一些模板代码,实现了Servlet和 ServletConfig

2.Servlet访问

无法通过类名直接访问Servlet,需要通过映射的路径去访问url

两种访问方式:

1.在WEB-INF文件下的web.xml中配置路径映射

  <servlet>
        名字一般和类名一致
        <servlet-name>TestServlet</servlet-name>
        servlet对应的类,完全限定的类名
        <servlet-class>com.yzh.servlet.TestServlet</servlet-class>
        初始化配置信息
        <init-param>
            <param-name>aaa</param-name>
            <param-value>1000</param-value>
        </init-param>
        <init-param>
            <param-name>bbb</param-name>
            <param-value>2000</param-value>
        </init-param>
        饿汉模式,项目启动时就要创建servlet
        <load-on-startup>1</load-on-startup>
    </servlet>


    <servlet-mapping>
        名字要和前面一致
        <servlet-name>TestServlet</servlet-name>
        映射路径,当访问该路径是会访问servlet实例,提供服务
        <url-pattern>/TestServlet</url-pattern>

    </servlet-mapping>

 oad-on-start标签的作用:

1.load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方 法)。 2.它的值必须是一个整数,表示servlet应该被载入的顺序。;

3.当值为0或者大于0时,表示容器在启动时就加载并初始化这个servlet。

4.当值小于0或者没有指定时,则表示容器在该Servlet被请求时,才会去加载。

5.正数的值越小,该Servlet的优先级就越高,应用启动时就优先加载。

6.当值相同的时候,容器就会自己选择优先加载。 所以,x中x的取值1,2,3,4,5代表的是优先级,而非 启动延迟时间。

2.在类的中加注解

注解中urlPatterns的值就是访问servlet实例的url
@WebServlet(urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {

    
}

3.servlet生命周期

1.servlet工作原理

当Web服务器接收到一个HTTP请求时,它会先判断请求内容——如果是静态网页数 据,Web服务器将会自行处理,然后产生响应信息;如果牵涉到动态数据,Web服务器 会将请求转交给Servlet容器。此时Servlet容器会找到对应的处理该请求的Servlet实例 来处理,结果会送回Web服务器,再由Web服务器传回用户端。 针对同一个Servlet,Servlet容器会在第一次收到http请求时建立一个Servlet实例,然后 启动一个线程(从容器线程池中获取一个)。第二次收到http请求时,Servlet容器无须 建立相同的Servlet实例,而是启动第二个线程来服务客户端请求。所以多线程方式不但 可以提高Web应用程序的执行效率,也可以降低Web服务器的系统负担。 Servlet是单例的。

2.servlet工作流程 

1、Web Client 向Servlet容器(Tomcat)发出Http请求

2、Servlet容器接收Web Client的请求

3、Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中

4、Servlet容器创建一个HttpResponse对象

5、Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与 HttpResponse对象作为参数传给 HttpServlet对象

6、HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息

7、HttpServlet调用HttpResponse对象的有关方法,生成响应数据

8、Servlet容器把HttpServlet的响应结果传给Web Client

3.servlet生命周期

Servlet生命周期是指Servlet从加载、初始化、处理请求、返回响应、直到销毁的过程。

Servlet中跟生命周期相关的方法:

1.init():初始化,在之前先通过构造方法创建对象

 2.service(ServletRequest,ServletResponse):服务方法,用来处理各种请求的方法

 3.destroy():销毁

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

生命周期过程

1、实例化(创建对象:调用构造方法)(只实例化一次)

2、初始化(数据的赋初值,或者获取配置信息的过程)(只初始化一次)

3、提供服务(doGet,doPost)(多次)

4、销毁(关闭容器时销毁)(一次)

4.实例化

创建servlet的时机

1. 默认情况下(懒汉模式),在Servlet容器启动后:客户首次向Servlet发出请求, Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根 据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet对象的 service方法;

2. Servlet容器启动时(饿汉模式):当web.xml文件中如果元素中指定了 子元素时,Servlet容器在启动web服务器时,将按照顺序创建 并初始化Servlet对象;

3. Servlet的类文件被更新后,重新创建Servlet。Servlet容器在启动时自动创建 Servlet,这是由在web.xml文件中为Servlet设置的属性决定 的。从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的形式存在;

销毁servlet的时机

servlet容器停止或重新启动:servlet容器调用servlet的destory方法来释放资源

5.初始化

Servlet在初始化的时候可以加载初始化参数,初始化参数是预先配置在web.xml 文件中 的或者在@WebServlet注解中设定。

1.配置初始化参数

在web.xml文件中配置初始化参数

 <servlet>
        名字一般和类名一致
        <servlet-name>TestServlet</servlet-name>
        servlet对应的类,完全限定的类名
        <servlet-class>com.yzh.servlet.TestServlet</servlet-class>
        初始化配置信息
        <init-param>
            <param-name>aaa</param-name>
            <param-value>1000</param-value>
        </init-param>
        <init-param>
            <param-name>bbb</param-name>
            <param-value>2000</param-value>
        </init-param>
        饿汉模式,项目启动时就要创建servlet
        <load-on-startup>1</load-on-startup>
    </servlet>

2.获取初始化参数

public class TestServlet extends HttpServlet {
    private ServletConfig servletConfig;

    @Override
    public void init(ServletConfig config) throws ServletException {
        this.servletConfig = config;
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String aaa = this.servletConfig.getInitParameter("aaa");
        System.out.println(aaa);
        String bbb = this.servletConfig.getInitParameter("bbb");
        System.out.println(bbb);
    }
}

6.service方法处理请求响应

对于每一个HTTP请求,servlet容器会创建一个封装了HTTP请求的ServletRequest实例 传递给servlet的service方法,ServletResponse则表示一个Servlet响应,其隐藏了将响 应发给浏览器的复杂性。 通过ServletRequest的方法你可以获取一些请求相关的参数,而ServletResponse则可 以将设置一些返回参数信息,并且设置返回内容。

1.HttpServlet中service方法

  protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader("If-Modified-Since");
                } catch (IllegalArgumentException var9) {
                    ifModifiedSince = -1L;
                }

                if (ifModifiedSince < lastModified / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

2.HttpServletRequest常用方法

getParameter(String); //根据名字获取参数的值:表单中的参数,地址栏中的参数

getParameterValues(String);//根据名字获取一组参数的值(复选框)

getParameterMap()://获得一个Map对象,所有的参数值都放在字符串数

getAttribute(String);//根据名字获取属性的值

setAttribute(String,Object);//根据属性设置值

getRequestDispatcher(String);//请求转发

setCharactorEncoding(); //设置编码方式

HttpServletResponse常用方法

sendRirect();//重定向:重新请求指定的地址

setContentType();//设置响应的编码方式;

addCookie(); //添加cookie

7.转发和重定向的区别

服务器转发:

1.地址栏不会发生改变,在服务器端完成,效率高。

2.携带数据可以在Servlet,jsp之间进行传递

3.客户端发送一次请求,服务器进行一次跳转

客户端重定向:

1.地址栏会发生改变。

2.客户端重新发送新的请求,无法用request携带数据。

3.客户端发起两次请

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值