6.Servlet和Http

1.Servlet技术

1.1什么是Servlet

1.Servlet是JavaEE规范之一。规范就是接口
2.Servlet是JavaEE三大组件之一。三大组件分别是:Servlet程序,Filter过滤器,Listener监听器
3.Servlet是运行在服务器上的一个Java小程序,他可以接收客户端发送过来的请求,并响应数据给客户端

1.2手动实现Servlet程序

1.编写一个类去实现Servlet接口
2.实现Servlet方法,处理请求,并响应数据。
3.到web.xml中去配置servlet程序的访问地址
在这里插入图片描述

<!--servlet标签给Tomcat配置Servlet程序-->
    <servlet>
<!--servlet-name标签给Servlet程序起一个别名(一般是类名)-->
        <servlet-name>Test</servlet-name>
<!--servlet-class是Servlet程序的全类名-->
        <servlet-class>servletTest.Test</servlet-class>
    </servlet>
<!--servlet-mapping标签给servlet程序配置访问地址-->
    <servlet-mapping>
<!--servlet-name标签的作用是告诉浏览器,我当前配置的地址是给哪个Servlet程序使用-->
        <servlet-name>Test</servlet-name>
<!--url-pattern标签配置访问地址(自定义)-->
<!--
/ 斜杠在服务器解析时的时候,表示地址是:http://ip:端口号/工程路径
/123 表示地址为:http://ip:端口号/工程路径/123
-->
        <url-pattern>/123</url-pattern>
    </servlet-mapping>

1.3URL地址到Servlet程序的访问

在这里插入图片描述

1.4Servlet的生命周期

1.执行Servlet构造器方法
2.执行init初始化方法
         (1 2)只在第一次访问的时候创建Servlet程序时会调用
3.执行service方法
         每次访问都会调用
4.执行destroy销毁方法
         在web停止工作的时候会调用
在这里插入图片描述

1.5请求的分发处理

在这里插入图片描述

1.6通过继承HttpServlet实现Servlet程序

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

1.编写一个类去继承HttpServlet类
2.根据业务需求重写doGet()和doPost()方法
3.到web.xml中配置Servelet程序的访问地址
在这里插入图片描述

1.7IDEA菜单生成Servlet程序

在这里插入图片描述

结果
在这里插入图片描述
除了生成Servlet程序,还会在web.xml中生成以下内容

在这里插入图片描述
要把它补充完整
在这里插入图片描述

1.8Servlet类的继承体系

在这里插入图片描述

2.ServletConfig类

ServletConfig类是Servlet程序的配置信息类

Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用。
Servlet程序默认是第一次访问的时候创建的,ServletConfig是每一个Servlet程序创建时,就会创建一个对应的ServletConfig对象

2.1ServletConfig类的三大作用

1.获取Servlet程序的别名servlet-name的值
2.获取初始化参数init-param
3.获取ServletContext对象
在这里插入图片描述

3.ServletContext类

3.1概述

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

域对象

域对象是可以像map一样存取数据的对象.
域指的是存取数据的操作范围

在这里插入图片描述

3.2作用

1.获取web.xml中配置上下文参数context-param
2.获取当前工程路径:格式:/工程路径
3.获取工程部署后在服务器硬盘上的绝对路径
4.像map一样存储数据
在这里插入图片描述
在这里插入图片描述

4.Http协议

4.1概述

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

Http协议
客户端和服务端之间通信时,发送的数据,需要遵守的规则,叫Http协议.
Http协议中的数据又叫报文

4.2请求的Http协议的格式

客户端给服务器发送数据叫请求
服务器给客户端回传数据叫响应

请求分为GET和POST两种
GET
1.请求行:

  • 请求的方式 GET
  • 请求的资源路径[+?+请求参数]
  • 请求的协议的版本号 HTTP/1.1

2.请求头

  • key-value 组成 不同的键值对,表示不同的含义.
    在这里插入图片描述

POST

1.请求行:

  • 请求的方式 POST
  • 请求的资源路径[+?+请求参数]
  • 请求的协议的版本号 HTTP/1.1

2.请求头

  • key-value 组成 不同的键值对,表示不同的含义.

空行
3.请求体 ----->就是发送给服务器的数据
在这里插入图片描述

常用的请求头
在这里插入图片描述
区分GET和POST请求
GET请求
1.form标签 method=get
2.a标签
3.link标签引入css
4.Script标签引入js文件
5.img标签引入图片
6.iframe引入html页面
7.在浏览器地址栏中输入地址后敲回车

POST请求
1.form标签 method=post

4.3响应的Http协议格式

1.响应行

  • 响应的协议和版本号
  • 响应的状态码
  • 响应的状态描述符

2.响应头

  • key-value 不同的响应头,有不同的含义

空行
3.响应体

  • 就是回传客户端的数据

在这里插入图片描述

4.4常用的响应码说明

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

4.5MIME类型说明

在这里插入图片描述

4.6谷歌浏览器如何查看HTTP协议

按Fn+F12出现以下界面
在这里插入图片描述

5.HttpServletRequest

5.1作用

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析封装到Request对象中.
然后传递到service方法(doGet()和doPost())中给我们使用,我们可以通过HttpServletRequest对象,获取到所有请求到的信息

5.2常用方法

1.getRequestURI() 获取请求的资源路径
2.getRequestURL() 获取请求的统一资源定位符(绝对路径)
3.getRemoteHost() 获取客户端的ip地址
4.getHeader() 获取请求头
5.getParameter() 获取请求参数
6.getParameterValues() 获取请求参数(多个值的时候使用)
7.getMethod() 获取请求的方式GET或POST
8.setAttribute(key,value); 设置域数据
9.getAttribute(key); 获取域数据
10.getRequestDispatcher() 获取请求转发对象

package Test;

import sun.management.Agent;

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

public class ServletTest01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        1.getRequestURI()   获取请求的资源路径
        System.out.println("请求的资源路径:" + request.getRequestURI());
//        2.getRequestURL()    获取请求的统一资源定位符(绝对路径)
        System.out.println("请求的统一资源定位符(绝对路径):" + request.getRequestURL());

//        3.getRemoteHost()     获取客户端的ip地址
        /*
        在IDEA中,使用localhost访问时,得到的客户端ip地址,127.0.0.1
        在IDEA中,使用127.0.0.1访问时,得到的客户端ip地址,127.0.0.1
        在IDEA中,使用真实ip地址访问时,得到的客户端ip地址,真实ip地址

         */
        System.out.println("客户端的ip地址:" + request.getRemoteHost());
//        4.getHeader()   获取请求头
        System.out.println("请求头:User-Agent" + request.getHeader("User-Agent"));

//        7.getMethod()   获取请求的方式GET或POST
        System.out.println("请求的方式GET或POST:" + request.getMethod());
    }

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

    }
}

获取请求的参数值

package Test;

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

public class Test02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求参数
        String name = req.getParameter("name");
        String password = req.getParameter("password");
        String[] goddes = req.getParameterValues("goddes");
        System.out.println("用户名:" + name);
        System.out.println("密码:" + password);
        System.out.println("女神:" + Arrays.asList(goddes));
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/demo01/Test02" method="get">
用户名:<input type="text" name="name"> <br>
密码:  <input type="password" name="password"> <br>
女神:<input type="checkbox" name="goddes" value="金智秀">金智秀
<input type="checkbox" name="goddes" value="裴秀智">裴秀智
<input type="checkbox" name="goddes" value="李知恩">李知恩 <br>
<input type="submit">
</form>
</body>
</html>

解决post的请求中文乱码问题

package Test;

import org.omg.CORBA.ARG_OUT;

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

public class Test02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //设置请求体的字符集UTF-8,从而解决POST请求的中文乱码问题
        req.setCharacterEncoding("UTF-8");
        System.out.println("----post------");


        //获取请求参数
        String name = req.getParameter("name");
        String password = req.getParameter("password");
        String[] goddes = req.getParameterValues("goddes");
        System.out.println("用户名:" + name);
        System.out.println("密码:" + password);
        System.out.println("女神:" + Arrays.asList(goddes));
    }
}

5.3请求的转发

请求转发是指,服务器收到请求后,从一个资源跳转到另一个资源的操作叫请求转发
在这里插入图片描述

特点

1.浏览器地址栏没有变化
2.他们是一次请求
3.他们共享请求域中的数据
4.可以转发到WEB-INF目录下(解决浏览器不能访问WEB-INF目录下的东西)
5.不能访问工程以外的资源

Servlet1

package Test;

import javax.servlet.RequestDispatcher;
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 Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //获取请求的参数(办事的材料)查看
        String username = req.getParameter("username");
        System.out.println("在Servlet1(柜台1)中查看参数(材料):" + username);

        //给材料盖个章,并传递到Servlet2去
        req.setAttribute("key","柜台1的章");

        //问路:Servlet2怎么走
        //   / 斜杠表示 地址为 http://ip:port/工程名/    映射到IDEA中web目录
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/Servlet2");

        //走向servlet2
        requestDispatcher.forward(req, resp);

    }
}

Servlet2

package Test;

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 Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //获取请求的参数(办事的材料)查看
        String username = req.getParameter("username");
        System.out.println("在Servlet2(柜台2)中查看参数(材料):" + username);

        //查看Servlet1是否盖章
        Object key1 = req.getAttribute("key");
        System.out.println("查看Servlet1是否盖章: " + key1);

        //处理自己的事情
        System.out.println("servlet2处理自己的事情");


    }
}

5.4base标签的作用

<!-- base标签设置页面工作时相对路径参考的地址
href 属性就是参数的地址值
–>
<base href=“http://localhost:8080/demo01/a/b/”>
在这里插入图片描述

在这里插入图片描述

5.5web中的相对路径和绝对路径

相对路径

. 表示当前目录
… 表示上一级目录
资源名 表示当前目录/资源名

绝对路径

http://ip:port/工程路径/资源路径

5.6web中/斜杠的不同意义

在这里插入图片描述

6HttpServletResponse类

6.1作用

HttpServletResponse类和HttpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个响应对象传递给Servlet去使用。
HttpServletResponse类表示所有的响应的信息,HttpServletRequest类表示请求的信息。
我们如果需要设置返回给客户端的消息,都可以通过HttpServletResponse对象进行设置。

6.2两个输出流的说明

  • 字节流 getOutputStream() 常用于下载(传递二进制数据)
  • 字符流 getWriter() 常用于回传字符串

两个流同时只能使用一个,否则会报错

6.3如何往客户端回传数据并解决相应的乱码

package Test;

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

public class Response1 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //ISO-8859-1默认的编码
        System.out.println(resp.getCharacterEncoding());
        //方式一
        /*
        //设置服务器字符集
        resp.setCharacterEncoding("UTF-8");
        //设置响应头,告诉浏览器也用utf-8字符集
        resp.setHeader("Content-Type","text/html;charset=UTF-8");
        */
        //方式二
        //这个方法同时设置服务器和浏览器都使用UTF-8字符集
        //此方法一定要在获取流对象之前使用才有效
        resp.setContentType("text/html;charset=UTF-8");

        //   resp.getWriter();
        //  resp.getOutputStream();

        //要求:  往客户端回传 字符串 数据
        PrintWriter writer1 = resp.getWriter();
        writer1.write("你来了!");

    }
}

6.4请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端,我给你个新地址。你去新地址访问。
在这里插入图片描述
特点
1.浏览器地址栏会发生变化
2.两次请求
3.不共享Request域中的数据
4.不能访问WEB-INF下的资源
5.可以访问工程外的资源

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值