JavaWeb学习总结(八)Servlet

JavaWeb学习总结(八)Servlet

一、Servlet简介

Servlet(Server Applet)是Java Servlet的简称,是运行在服务器上的一个小服务程序,也称为服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
  狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。它可以接收客户端发送过来的请求,并响应数据给客户端
  Servlet 是 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。

img

二、Servlet运行过程

在这里插入图片描述

三、手动实现Servlet程序

首先用IDEA创建一个动态WEB工程
接着
1、在src下编写一个类去实现 Servlet 接口
2、实现 service 方法,处理请求,并响应数据
3、到 web.xml 中去配置 servlet 程序的访问地址

Servlet 程序的示例代码:

import javax.servlet.*;
import java.io.IOException;

public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //service 方法是专门用来处理请求和响应的
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet 被访问了");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

web.xml中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- servlet 标签给 Tomcat 配置 Servlet 程序 -->
    <servlet>
        <!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-class 是 Servlet 程序的全类名-->
        <servlet-class>com.fox.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--servlet-mapping 标签给 servlet 程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个 Servlet 程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern 标签配置访问地址
        / 单独一个斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
        /hello 表示地址为:http://ip:port/工程路径/hello
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

运行Tomcat实例,并在地址栏输入:
在这里插入图片描述

在这里插入图片描述
常见的错误

  1. url-pattern 中配置的路径没有以斜杠打头
    在这里插入图片描述
  2. servlet-name 配置的类不存在
    在这里插入图片描述
  3. servlet-class 标签的全类名配置错误

url 地址到 Servlet 程序的访问过程:
在这里插入图片描述

四、Servlet映射路径问题

一般情况下我们都会指定一个URL , 一个URL对应一个请求。

Servlet访问URL使用*通配符映射:
  1. Servlet映射到任意路径:

*可以匹配任意的字符,所以此时可以用任意的URL去访问这个Servlet,如下图所示:

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

在这里插入图片描述

  1. Servlet映射到任意包含.do的路径:
<servlet-mapping>
        <servlet-name>servlet</servlet-name>
        <url-pattern>*.do</url-pattern>
</servlet-mapping>

在这里插入图片描述

3.Servlet映射到多级目录的路径:

<servlet-mapping>
        <servlet-name>servlet</servlet-name>
        <url-pattern>/demo1/demo2</url-pattern>
</servlet-mapping>

在这里插入图片描述

五、Servlet从创建到销毁,各方法的执行

import javax.servlet.*;
import java.io.IOException;

public class HelloServlet implements Servlet {
    public HelloServlet() {
        System.out.println("构造方法被执行了");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init初始化方法被执行了");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //service 方法是专门用来处理请求和响应的
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service方法被执行了");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("销毁方法被执行了");
    }
}

运行Tomcat实例,并且在地址栏输入工程路径:/hello
在这里插入图片描述
多次刷新浏览器页面:
在这里插入图片描述
按下Tomcat的停止按键:
在这里插入图片描述
结论

  • 执行顺序
    1.执行 Servlet 构造器方法
    2.执行 init 初始化方法
    3.执行 service 方法
    4.执行 destroy 销毁方法
  • 执行次数
    第1、2步,是在第一次访问的时候创建 Servlet 程序会调用,只执行一次。
    第3步,每次访问都会调用。
    第4步,在 web 工程停止的时候调用。

六、GET 和 POST 请求的分发处理

由于GET和POST是两种不同的请求方式,因此我们需要对不同的请求方式做不同的处理

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class HelloServlet implements Servlet {
    public HelloServlet() {
        System.out.println("构造方法被执行了");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init初始化方法被执行了");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //service 方法是专门用来处理请求和响应的
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        // ServletRequest类型转换为它的子接口HttpServletRequest(因为它有 getMethod()方法)
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        // getMethod() 获取请求的方式
        String method = httpServletRequest.getMethod();
        //判断请求是哪种方式,做不同处理
        if("GET".equals(method)){
            doGet();
        }else if("POST".equals(method)){
            doPost();
        }
    }
    public void doGet(){
        System.out.println("这是针对于Get请求的处理");
    }
    public void doPost(){
        System.out.println("这是针对于Post请求的处理");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("销毁方法被执行了");
    }
}

七、GET与Post的区别

  1. form运行方式
    • 当form框里面的method为get时,执行doGet方法
    • 当form框里面的method为post时,执行doPost方法
  2. 传送的数据量
    • GET方式:数据量长度有限制,一般不超过2kb。因为是参数传递,且在地址栏中,故数据量有限制。
    • POST方式:适合大规模的数据传送。因为是以实体的方式传送的。
  3. 安全性
    • GET方式:安全性差。因为是直接将数据显示在地址栏中,浏览器有缓冲,可记录用户信息。所以安全性低。
      在这里插入图片描述
      提交输入的用户名和密码后,地址栏显示了用户名和密码的信息。在这里插入图片描述
    • POST方式:安全性高。因为post方式提交数据时是采用的HTTP post机制,是将表单中的字段与值放置在HTTP HEADER内一起传送到ACTION所指的URL中,用户是看不见的。
      在这里插入图片描述
  4. 在用户刷新时
    • GET方式:不会有任何提示。
    • POST方式:会弹出提示框,问用户是否重新提交。

在这里插入图片描述

因此,在做数据查询时,建议用GET方式;而在做数据添加、修改或删除时,建议用POST方式。

八、Servlet的实现类

Servlet接口Sun公司定义了两个默认实现类,分别为:GenericServletHttpServlet

(一)GenericServlet

  • GenericServlet 是一个抽象类,实现了 Servlet 接口,并且对其中的 init() 和 destroy() 和 service() 提供了默认实现
  • 同时还实现了ServletConfig接口,ServletConfig接口中直接提供了getServletContext()**方法,所以当我们在实现Servlet时直接继承GenericServlet这个抽象类,就可以直接使用getServletContext方法来获取**ServletContext对象了。
  • 如果继承这个类的话,我们必须重写 service() 方法来对处理请求。

(二)HttpServlet

  • HttpServlet 也是一个抽象类,它进一步继承并封装了 GenericServlet,使得使用更加简单方便。
  • HttpServlet指能够处理HTTP请求的Servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大,因此开发人员在编写Servlet 时,通常应继承HttpServlet,而避免直接去实现Servlet接口
  • HttpServlet在实现Servlet接口时,重写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为POST请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要重写doGet或doPost方法,而不要去重写service方法。
  • 一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序

(三)Servlet 类的继承体系

在这里插入图片描述

九、通过继承 HttpServlet 实现 Servlet 程序

一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序
1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写 doGet 或 doPost 方法
3、到 web.xml 中的配置 Servlet 程序的访问地址

Servlet 类的代码:

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet方法");
    }

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

web.xml里的配置:

<servlet> 
	<servlet-name>HelloServlet</servlet-name> 
	<servlet-class>com.fox.servlet.HelloServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
	<servlet-name>HelloServlet</servlet-name> 
	<url-pattern>/hello</url-pattern> 
</servlet-mapping>

十、IDEA快速创建Servlet程序

在这里插入图片描述
在这里插入图片描述

十一、ServletConfig 类

ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类。
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象。

(一)ServletConfig 类的三大作用:

  1. 可以获取 Servlet 程序的别名 servlet-name 的值
  2. 获取初始化参数 init-param
  3. 获取 ServletContext 对象

(二)在init()方法中使用ServletConfig

web.xml 中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.fox.servlet.HelloServlet</servlet-class>
        <!--init-param 是初始化参数-->
        <init-param>
            <!--是参数名-->
            <param-name>username</param-name>
            <!--是参数值-->
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123456</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

Servlet 中的代码:

import javax.servlet.*;
import java.io.IOException;

public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        // 1、可以获取 Servlet 程序的别名 servlet-name 的值
        System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
        // 2、获取初始化参数 init-param
        System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
        System.out.println("初始化参数 password 的值是;" + servletConfig.getInitParameter("password"));
        // 3、获取 ServletContext 对象
        System.out.println(servletConfig.getServletContext());
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

在这里插入图片描述
问:假设又有一个Servlet类,叫HelloServlet2,它能不能通过SevletConfig获取到HelloServlet的init-param呢?
答:不能,ServletConfig 是每个 Servlet 程序创建时才创建的,只能获取所属Servlet的信息。

(三)通过getServletConfig()方法使用ServletConfig

web.xml配置文件同上。
Servlet 中的代码:

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        // 1、可以获取 Servlet 程序的别名 servlet-name 的值
        System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
        // 2、获取初始化参数 init-param
        System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
        System.out.println("初始化参数 password 的值是;" + servletConfig.getInitParameter("password"));
        // 3、获取 ServletContext 对象
        System.out.println(servletConfig.getServletContext());
    }
}

在这里插入图片描述
这个方式也能使用ServletConfig,但是如果此时重写有参的init()方法:

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("重写了有参init方法");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        // 1、可以获取 Servlet 程序的别名 servlet-name 的值
        System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
        // 2、获取初始化参数 init-param
        System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
        System.out.println("初始化参数 password 的值是;" + servletConfig.getInitParameter("password"));
        // 3、获取 ServletContext 对象
        System.out.println(servletConfig.getServletContext());
    }
}

再重新运行会报错:
在这里插入图片描述
因为getServletConfig()是GenerciServlet类里的方法,这个方法会返回this.config
在这里插入图片描述
这个config即它自己的ServletConfig对象
在这里插入图片描述
我们查看GenerciServlet类的有参init()方法可以看到,这里将参数ServletConfig保存为this.config,而如果我们此时在自己的Servlet类中重写了该有参init()方法,父类GenerciServlet这个保存操作就不存在,this.config=null,因此会报空指针异常。
在这里插入图片描述
解决办法,如果要重写有参init()方法,记得一定要调用父类的有参init()方法

@Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("重写了有参init方法");
    }

十二、ServletContext 类

(一)什么是 ServletContext?

  1. ServletContext 是一个接口,它表示 Servlet 上下文对象
  2. 一个 web 工程,只有一个 ServletContext 对象实例
  3. ServletContext 对象是一个域对象
  4. ServletContext 是在 web 工程部署启动的时候创建(它代表当前web应用),在 web 工程停止的时候销毁

什么是域对象?
域对象,是可以像 Map 一样存取数据的对象,叫域对象。
这里的域指的是存取数据的操作范围(整个 web 工程)。

存数据取数据删除数据
Mapput()get()remove()
ServletContextsetAttribute()getAttribute()removeAttribute()

(二)ServletContext 类的四个作用

  1. 获取 web.xml 中配置的上下文参数 context-param
  2. 获取当前的工程路径,格式: /工程路径
  3. 获取工程部署后在服务器硬盘上的绝对路径
  4. 像 Map 一样存取数据

案例1
web.xml 中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--context-param 是上下文参数(它属于整个 web 工程)-->
    <context-param>
        <param-name>username</param-name>
        <param-value>context</param-value>
    </context-param>

    <context-param>
        <param-name>password</param-name>
        <param-value>root</param-value>
    </context-param>

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.fox.servlet.HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

ServletContext 演示代码:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //ServletConfig可以获取ServletContext对象
        ServletContext servletContext = getServletConfig().getServletContext();
        //1、获取 web.xml 中配置的上下文参数 context-param
        System.out.println("context-param的username的值是:"+servletContext.getInitParameter("username"));
        System.out.println("context-param的password的值是:"+servletContext.getInitParameter("password"));

        //2、获取当前的工程路径,格式: /工程路径
        System.out.println( "当前工程路径:" + servletContext.getContextPath() );

        // 3、获取工程部署后在服务器硬盘上的绝对路径
        // 一根斜杠 被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA 代码的 web 目录
        System.out.println("工程部署的路径是:" + servletContext.getRealPath("/"));
        System.out.println("工程下web.xml的绝对路径是:" + servletContext.getRealPath("/WEB-INF/web.xml"));
    }
}

在这里插入图片描述在这里插入图片描述
案例2:ServletContext 像 Map 一样存取数据,实现多个Servlet之间数据共享
web.xml 中的配置:

在这里插入代码片

HelloServlet演示代码:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //GenericServlet中的getServletContext()方法可以直接获取ServletContext对象
        ServletContext servletContext = getServletContext();
        System.out.println("存数据前,HelloServlet获取key的值:"+servletContext.getAttribute("key"));
        servletContext.setAttribute("key","value");
        System.out.println("存数据后,HelloServlet获取key的值:"+servletContext.getAttribute("key"));
    }
}

HelloServlet2演示代码:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //GenericServlet中的getServletContext()方法可以直接获取ServletContext对象
        ServletContext servletContext = getServletContext();
        System.out.println("HelloServlet2获取key的值:"+servletContext.getAttribute("key"));
    }
}

先在地址栏输入http://localhost:8080/WebStudy/hello:
在这里插入图片描述
再输入http://localhost:8080/WebStudy/hello2:
在这里插入图片描述
因为ServletContext表示整个web工程的Servlet 上下文对象,因此HelloServlet2也能取到HelloServlet存放的ServletContext数据
在这里插入图片描述
案例3:通过servletContext对象读取网站配置文件

  1. 新建一个properties文件
    在这里插入图片描述
  2. 编写properties文件
driver=com.mysql.jdbc.Driver
username=root
password=123456
url=jdbc:mysql://localhost:3306/smbms
  1. 编写Servlet类
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class TestServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //读取配置文件

        //1.获得配置文件的路径
        String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/resources/database.properties");
        System.out.println("取得的路径为:"+realPath);

        Properties properties = new Properties();
        FileInputStream fis = new FileInputStream(realPath);

        properties.load(fis);//把文件流加载到配置文件的对象中;

        String driver = properties.getProperty("driver");
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");

        //响应到网页
        response.getWriter().println(driver);
        response.getWriter().println(username);
        response.getWriter().println(password);
        response.getWriter().println(url);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}
  1. 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>Demo01</servlet-name>
        <servlet-class>com.fox.servlet.TestServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>Demo01</servlet-name>
        <url-pattern>/q1</url-pattern>
    </servlet-mapping>
</web-app> 
  1. 访问查看
    在这里插入图片描述

十三、HTTP 协议

(一)什么是协议?

协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。

(二)什么是 HTTP 协议?

所谓 HTTP 协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫 HTTP 协议。 HTTP 协议中的数据又叫报文。

(三)请求的 HTTP 协议格式

客户端给服务器发送数据叫请求。
请求又分为 GET 请求,和 POST 请求两种

1.GET 请求

  1. 请求行
    (1) 请求的方式 GET
    (2) 请求的资源路径[+?+请求参数]
    (3) 请求的协议的版本号 (HTTP/1.1 )
  2. 请求头
    key : value 组成不同的键值对,表示不同的含义。
    在这里插入图片描述

2.POST 请求

  1. 请求行
    (1) 请求的方式 POST
    (2) 请求的资源路径[+?+请求参数]
    (3) 请求的协议的版本号 (HTTP/1.1 )
  2. 请求头
    key : value 不同的请求头,有不同的含义
  3. 空行
  4. 请求体
    就是发送给服务器的数据
    在这里插入图片描述

3.常用请求头的说明

Accept: 表示客户端可以接收的数据类型
Accpet-Languege: 表示客户端可以接收的语言类型
User-Agent: 表示客户端浏览器的信息
Host: 表示请求时的服务器 ip 和端口号

4. 哪些是 GET 请求,哪些是 POST 请求

①GET 请求有哪些:
  • form 标签 method=get
  • a 标签
  • link 标签引入 css
  • Script 标签引入 js 文件
  • img 标签引入图片
  • iframe 引入 html 页面
  • 在浏览器地址栏中输入地址后敲回车
② POST 请求有哪些:
  • form 标签 method=post

(四)响应的 HTTP 协议格式

  1. 响应行
    (1) 响应的协议和版本号
    (2) 响应状态码
    (3) 响应状态描述符
  2. 响应头
    key : value 不同的响应头,有其不同含义
  3. 空行
  4. 响应体
    就是回传给客户端的数据
    在这里插入图片描述

(五)常用的响应码说明

  • 200 表示请求成功
  • 302 表示请求重定向(后面讲)
  • 404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
  • 500 表示服务器已经收到请求,但是服务器内部错误(代码错误)

(六)MIME 类型说明

MIME 是 HTTP 协议中的数据类型。

MIME 的英文全称是"Multipurpose Internet Mail Extensions" ——多功能 Internet 邮件扩充服务。 MIME 类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应。

常见的 MIME 类型
在这里插入图片描述

(七)谷歌浏览器如何查看 HTTP 协议

按F12,找到Network
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet 是 JavaEE 规范中的一部分,是处理 Web 请求的组件。Servlet 运行在服务器端,能够接收客户端发来的请求,并给客户端响应结果。下面我们来看看 Servlet 的基本概念和使用方法。 ## 一、Servlet 的基本概念 ### 1.1 Servlet 的生命周期 Servlet 的生命周期包含以下三个阶段: - 初始化阶段(init):当 Servlet 实例化后,Web 容器会调用其 init() 方法进行初始化操作。在此阶段,Servlet 可以执行一些初始化操作,例如读取配置信息、建立数据库连接等。 - 请求处理阶段(service):当客户端发来请求时,Web 容器会创建一个线程调用 Servlet 的 service() 方法处理请求。在此阶段,Servlet 可以获取请求参数、处理请求并生成响应数据。 - 销毁阶段(destroy):当 Web 应用停止或 Servlet 被卸载时,Web 容器会调用 Servlet 的 destroy() 方法进行清理工作。在此阶段,Servlet 可以释放资源、关闭数据库连接等。 ### 1.2 Servlet 的配置 在使用 Servlet 时,需要在 web.xml 文件中进行配置。以下是一个 Servlet 的基本配置: ```xml <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> ``` 其中,servlet-name 表示 Servlet 的名称,servlet-class 表示 Servlet 的类名,url-pattern 表示请求的 URL 匹配规则。 ## 二、Servlet 的使用方法 ### 2.1 编写 Servlet 编写 Servlet 有两种方法:一种是继承 HttpServlet 类,另一种是实现 Servlet 接口。这里以继承 HttpServlet 类为例: ```java public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 GET 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 POST 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } } ``` 在 Servlet 中,doGet() 方法用于处理 GET 请求,doPost() 方法用于处理 POST 请求。通过调用 HttpServletResponse 对象的 getWriter() 方法可以向客户端返回响应数据。 ### 2.2 部署 Servlet 将编写好的 Servlet 部署到 Web 容器中,有两种方法:一种是将 Servlet 类打成 war 包放到 Web 容器的 webapps 目录下,另一种是通过 Eclipse 等开发工具将 Servlet 部署到 Web 容器中。部署完成后,可以通过访问 Servlet 的 URL 来测试 Servlet 是否正常工作。 ## 三、总结 本文介绍了 Servlet 的基本概念和使用方法。Servlet 是 Java Web 开发中非常重要的组件,掌握 Servlet 的使用方法对于 Java Web 开发人员来说是必不可少的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值