学习地址:121-尚硅谷-Servlet-什么是Servlet_哔哩哔哩_bilibili

目录

1.Servlet技术

a.什么是Servlet

b.手动实现Servlet程序

c.url地址如何定位到Servlet程序去访问

d.Servlet的生命周期


1.Servlet技术

 1.是JavaEE规范之一。规范就是接口

 2.Servlet->JavaWeb三大组件之一。三大组件分别是:Servlet程序、Filter程序、Listener监听器。

 3. Servlet运行服务器上的一个java小程序,它可以(通过HTTP超文本传输协议)接收客户端发送过来的请求,并响应数据客户端


1.编写一个实现Servlet接口

2.实现service方法处理请求,并响应数据

3.到web.xml中去配置servlet程序的访问地址

<?xml version="1.0" encoding="UTF-8"?&gt;
<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"&gt;


    <!--servlet标签给Tomcat配置Servlet程序 --&gt;
    <servlet&gt;
        <!--servlet-name标签 Servlet程序起一个别名(一般是类名)--&gt;
        <servlet-name&gt;HelloServlet</servlet-name&gt;
        <!--servlet-class是Servlet程序的全类名-->
        <servlet-class>com.example.servlet.HelloServlet</servlet-class>
    </servlet>

    <!--servlet-mapping标签给servlet程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name标签告诉服务器当前配置的地址给哪个Servlet程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern标签配置访问地址(自定义访问路径)
            /    斜杠服务器解析时候表示地址为: http://ip:port/工程路径     <br/>
            /hello  表示地址为: http://ip:port/工程路径/hello   <br/>
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
</web-app>
package com.example.servlet;

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

public class HelloServlet implements Servlet{


    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    /**
     * service方法是专门用来处理请求响应的
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @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() {

    }
}



1、执行Servlet构造方法

2、执行 init 初始化方法

第一、二步,是在第一次访问的时候创建 Servlet 程序会调用

3、执行 service 方法

第三步,每次访问都会调用

4、执行 destroy 销毁方法

第四步,停止的时候才会执行


GET请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <form action="http://localhost:8080/Days2_war_exploded/hello" method="get">
    <input type="submit" >
  </form>


</body>
</html>

点击提交


POST请求

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3 service === Hello Servlet 被访问了");
        // 类型转换(因为它有getMethod()方法)
        HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
        // 获取请求的方式
        String method=httpServletRequest.getMethod();

        System.out.println(method);

//        System.out.println("get请求");
//        System.out.println("post请求");
    }

点击提交按钮之后 

这个得到请求的方式get/post都能搞

 @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3 service === Hello Servlet 被访问了");
        // 类型转换(因为它有getMethod()方法)
        HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
        // 获取请求的方式
        String method=httpServletRequest.getMethod();
        if("GET".equals(method))
        {
          doGet();
        }else if ("POST".equals(method))
        {
           doPost();
        }

    }

    /**
     * 做get请求的操作
     */
    public void doGet()
    {
        System.out.println("get请求");
    }

    /**
     * 做post请求的操作
     */
    public void doPost()
    {
        System.out.println("post请求");
    }

一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet程序

1、编写一个类去继承 HttpServlet 类

2、根据业务需要重写 doGet 或 doPost 方法

3、到 web.xml中的配置 Servlet 程序的访问地址

package com.example.servlet;

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 {
    /**
     *doGet() 在get请求时调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet2 的doGet方法");
    }
    /**
     *doPost() 在post请求时调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet2 的doPost方法");
    }
}
 <servlet>
        <servlet-name>HelloServlet2</servlet-name>
        <servlet-class>com.example.servlet.HelloServlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet2</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
    


package com.example.servlet;

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

public class HelloServlet3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet3的doGet方法");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet3的doPost方法");
    }
}

        


类名上来看,就知道是 Servlet程序的配置信息

1、可以获取Servlet程序的别名servlet-name 的值

2、获取初始化参数 init-param

3、获取ServletContext对象

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

    }


Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建我们负责使用

Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的ServletConfig 对象。

<servlet>
        <servlet-name>HelloServlet2</servlet-name>
        <servlet-class>com.example.servlet.HelloServlet2</servlet-class>
        <!--init-param初始化参数-->
        <init-param>
            <!--是参数名-->
            <param-name>username</param-name>
            <!--是参数值-->
            <param-value>root2</param-value>
        </init-param>
    </servlet>

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

        //也可以使用
        ServletConfig servletConfig=getServletConfig();
        System.out.println(servletConfig);
        //获取初始化参数init-param
        System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));

    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("重写了init初始化方法,做了一些工作");

    }

这张图解释了写super.init(config)的原因


1、ServletContext是一个接口,它表示 Servlet 上下文对象

2、一个 web 工程,只有一个 ServletContext 对象实例

3、ServletContext 对象是一个域对象。

什么是域对象?

域对象,是可以像 Map 一样存取数据的对象,叫域对象。

这里的域指的是存取数据的操作范围

                          存数据                        取数据                                删除数据

Map                      put()                         get()                                 remove()

域对象                setAttribute()        getAttribute()                          removeAttribute()


1、获取 web.xml 中配置的上下文参数context-param

2、获取当前工程路径格式:/工程路径

3、获取工程部署后在服务器磁盘上的绝对路径

4、像 Map 一样存取数

绝对路径本质映射这个webapp目录

如果在下面创建了一个css文件可以在/后面加css->/css访问

package com.example.servlet;

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

public class ContextServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     ServletContext servletContext  =getServletContext();

        System.out.println(servletContext);
        System.out.println("保存之前: Context1 中获取域数据key1的值是:"+servletContext.getAttribute("key1"));
        servletContext.setAttribute("key1","value1");

        System.out.println("Context1 中获取域数据key1的值是:"+servletContext.getAttribute("key1"));

    }


}
package com.example.servlet;

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

public class ContextServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext  =getServletContext();
        System.out.println(servletContext);
        System.out.println("Context2 中获取域数据key1的值是:"+servletContext.getAttribute("key1"));


    }


}

只要是这个工程,这个Context就永远都是它


所谓 HTTP 协议,就是客户端服务器端发送请求的数据需要遵守的规则,叫 HTTP 协议

HTTP 协议中的数据又叫报文


客户端服务器端发送数据请求

服务器端客户端回传数据叫响应

请求又分为 GET请求,和 POST   请求两种

1.请求行

        (1) 请求的方式                                  GET

        (2)请求的资源路径[+?+请求参数]

        (3)请求的协议的版本号                    HTTP/1.1

2.请求头

       key:value 组成,不同的键值对,表示不同的含义

         

1.请求行

        (1) 请求的方式                                 POST

        (2)请求的资源路径[+?+请求参数]

        (3)请求的协议的版本号                    HTTP/1.1

2.请求头

       key:value 组成,不同的请求头,表示不同的含义

空行

3.请求体 ===>>> 就是发送给服务器的数据

        Accept:表示客户端可以接受的数据类型

        Accpet-Language:表示客户可以接受的语言类型

        User-Agent:表示客户端游览器的信息

        Host:表示请求时的服务器 ip端口号

GET请求有哪些:

        1、form标签 method=get

        2、a标签

        3、link标签引入css

        4、Script标签引入 js 文件

        5、img标签引入图片

        6、iframe 引入 html页面

        7、在游览器地址栏输入地址后敲回车

POST请求有哪些:

        8、form 标签 method=post


        1、响应

        (1)响应的协议和版本号

        (2)响应状态

        (3)响应状态描述符

        2、响应头

        (1)key:value 不同的响应头,有其不同含义

        空行

        3、响应体   —–>>>  就是回传给客户端的数据

格林时间距离北京时间差8小时


           200                   表示请求成功

           302                   表示请求重定向

           404                   表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)

           500                  表示服务器已经收到请求了,但是服务器内部错误(代码错误)



学习如逆水行舟,不进则退。摆烂的小吴!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注