servlet技术-01

这期主要分享Java Servlet技术的相关知识

1、Servlet是什么

Servlet是Java类编写的服务端应用程序,负责接收和响应客户端发送的请求

  1. 当做拦截器
    一般客户端发送的请求都会携带一些数据,当Servlet接收到这个请求时,可以进行拦截,获取请求中的参数值,可以做一些预处理分析(如检查访问权限,检查程序字符集、检查用户角色等)
  2. 获取客户端的隐藏数据
    比如可以处理cookie中的数据
  3. 充当中间者
    可以协调各个组件完成相应的功能,根据不同的请求做出相应的响应返回给客户端
  4. 发送响应数据
    在服务器处理请求得到结果之后,Servlet会将结果返回给客户端
    Servlet的运行流程如下:
    在这里插入图片描述

2、Servlet的技术特点

  1. 高效
    Servlet本身就是一个java类,运行于jvm中,可以快速响应客户端的请求并生成结果。
  2. 简单方便
    定义一个Servlet类,然后在web.xml进行配置发布就完成了一个web应用程序。

3、Servlet的生命周期

Servlet的生命周期有三个阶段:初始化(包括装载和初始化)、运行和销毁。

  1. 初始化阶段:首先装载:Servlet容器装载一个Servlet类加载到java内存中,Servlet容器可以创建一个Servlet类并与web.xml中的配置对应起来;在初始化:调用Servlet中的init()方法,在整个Servlet的生命周期中,init()方法只会被加载一次。
  2. 运行阶段:响应客户端的请求,此时,Servlet会创建HttPServletRequest和HttPServletResponse两个对象,调用service(HttPServletRequest req,HttPServletResponse resp)方法,req用于获取请求对象并加以处理,resp用于响应处理结果返回给客户端。
  3. 销毁阶段:当Servlet应用程序被终止后,Servlet容器会调用destroy()方法对Servlet对象进行销毁,Servlet容器会释放被他占用的资源,比如关闭数据库连接、关闭流等。在整个Servlet的生命周期中,destroy()方法只会被加载一次。

4、编写和运行Servlet

首先编写HelloServlet类继承HttpServlet

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("调用了doGet(HttpServletRequest req, HttpServletResponse resp)方法");
//        不应该调用父类的super.doGet(req, resp)方法,否则会出现HTTP 405错误
//        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost(HttpServletRequest req, HttpServletResponse resp)方法");
//        不应该调用父类的super.doPost(req, resp)方法,否则会出现HTTP 405错误
//        super.doPost(req, resp);
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("调用了protected void service(HttpServletRequest req, HttpServletResponse resp) 方法");
    }

    @Override
    public void destroy() {
        System.out.println("调用了destroy方法");
        super.destroy();
    }

    @Override
    public void init() throws ServletException {
        System.out.println("调用了init方法");
        super.init();
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("调用了 public void service 方法");
        res.setContentType("text/html;charset=utf-8");
        PrintWriter out = res.getWriter();
        out.println("收到了service(ServletRequest req, ServletResponse res)请求");
        super.service(req, res);
    }
}

然后在web.xml中进行配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">


  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
    <servlet-name>
      jspconfigdemo
    </servlet-name>

    <jsp-file>/config.jsp</jsp-file>
    <init-param>
      <param-name>url</param-name>
      <param-value>http://www.baidu.com</param-value>
    </init-param>
  </servlet>
   <servlet>
       <servlet-name>helloServlet</servlet-name>
       <servlet-class>com.wen.servlet.HelloServlet</servlet-class>
   </servlet>
  <servlet-mapping>
    <servlet-name>
      jspconfigdemo
    </servlet-name>
    <url-pattern>/config.jsp</url-pattern>
  </servlet-mapping>
    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/servlet1</url-pattern>
    </servlet-mapping>


</web-app>

在这里插入图片描述

重启Tomcat容器
在浏览器输入自定义Servlet类匹配的url
在这里插入图片描述
运行结果为:
在这里插入图片描述
idea控制台的打印结果为:
在这里插入图片描述
从运行的结果可知:当重写了service()方法后,doGet()方法和doPost()方法不会被执行,由service()方法管理转向对应的方法。
验证了Servlet的生命周期如下图所示:
在这里插入图片描述

在Servlet3.0之后可以使用注解的方式代替web.xml方式来配置Servlet

@WebServlet(
        urlPatterns = {"/servlet1"},
        name = "helloServlet"
)
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("调用了doGet(HttpServletRequest req, HttpServletResponse resp)方法");
//        不应该调用父类的super.doGet(req, resp)方法,否则会出现HTTP 405错误
//        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost(HttpServletRequest req, HttpServletResponse resp)方法");
//        不应该调用父类的super.doPost(req, resp)方法,否则会出现HTTP 405错误
//        super.doPost(req, resp);
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("调用了protected void service(HttpServletRequest req, HttpServletResponse resp) 方法");
    }

    @Override
    public void destroy() {
        System.out.println("调用了destroy方法");
        super.destroy();
    }

    @Override
    public void init() throws ServletException {
        System.out.println("调用了init方法");
        super.init();
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("调用了 public void service 方法");
        res.setContentType("text/html;charset=utf-8");
        PrintWriter out = res.getWriter();
        out.println("收到了service(ServletRequest req, ServletResponse res)请求");
        super.service(req, res);
    }
}

运行的结果是一样的。
@WebServlet注解主要属性说明
在这里插入图片描述
注意:在web.xml中的配置方式优先级要高于使用注解方式
在实际的开发中一般只会重写init()、doGet()、doPost()、destroy()这4个方法

package com.wen.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author hw
 * @version 1.0
 * @date 2021/1/8 15:27
 */
@WebServlet(
        urlPatterns = {"/servlet1"},
        name = "helloServlet"
)
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("调用了doGet(HttpServletRequest req, HttpServletResponse resp)方法");
        String servletPath = req.getServletPath();
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        out.println("收到了"+servletPath+"请求");
//        不应该调用父类的super.doGet(req, resp)方法,否则会出现HTTP 405错误
//        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost(HttpServletRequest req, HttpServletResponse resp)方法");
        doGet(req,resp);
//        不应该调用父类的super.doPost(req, resp)方法,否则会出现HTTP 405错误
//        super.doPost(req, resp);
    }

//    @Override
//    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("调用了protected void service(HttpServletRequest req, HttpServletResponse resp) 方法");
//    }

    @Override
    public void destroy() {
        System.out.println("调用了destroy方法");
        super.destroy();
    }

    @Override
    public void init() throws ServletException {
        System.out.println("调用了init方法");
        super.init();
    }

//    @Override
//    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//        System.out.println("调用了 public void service 方法");
//        res.setContentType("text/html;charset=utf-8");
//        PrintWriter out = res.getWriter();
//        out.println("收到了service(ServletRequest req, ServletResponse res)请求");
//        super.service(req, res);
//    }
}

在浏览器中输入:
在这里插入图片描述

运行的结果:
在这里插入图片描述
控制台的打印结果:
在这里插入图片描述
当关闭Tomcat web容器时:
Servlet容器会调用destroy()方法
在这里插入图片描述

5、Servlet与JSP的比较

主要区别:Servlet是java代码,jsp是页面代码
jsp主要以HTML为主,主要负责将动态数据的展示给客户
Servlet主要负责对客户端的请求进行处理和调用java bean,java bean将数据库中的数据进行映射,操作java bean就相当于操作数据库中数据,将处理好的结果返回给jsp,由jsp进行数据的动态展示。简易的MVC模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值