带你吃透Servlet核心编程下篇(完整图文教程)

news/2024/5/20 7:08:39/文章来源:https://blog.csdn.net/m0_60353039/article/details/127304742

在这里插入图片描述
本文被 系统学习JavaWeb 收录点击订阅专栏


文章目录

  • 1 Http协议
    • 1.1 什么是 HTTP 协议
    • 1.2 GET请求与POST请求
    • 1.3 响应的HTTP协议格式
    • 1.4 MIME数据类型
  • 2 HttpServletRequest类
    • 2.1 HttpServletRequest说明及常用方法
    • 2.2 HttpServletRequest类演示
    • 2.3 获取请求表单中的参数值(POST请求)
    • 2.4 解决post请求中的中文乱码问题
  • 3 请求转发
  • 4 HttpServletResponse类
    • 4.1 两个输出流
    • 4.2 如何回传客户端数据
  • 5 请求重定向
    • 5.1 什么是请求重定向
    • 5.2 请求重定向演示
  • 写在最后


1 Http协议

1.1 什么是 HTTP 协议

协议是双方或者多方约定好需要遵守的规则。所谓HTTP协议就是指,在客户端和服务端通信时,发送的数据,需要遵守的规则。HTTP协议中的数据称为报文。

客户端给服务器发送数据叫请求,而服务器给客户端回传数据叫响应。
请求分为GET请求和POST请求。

1.2 GET请求与POST请求

GET请求的组成如下:

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

GET请求HTTP协议内容示例:
在这里插入图片描述
常用请求头的说明:

  • Accept: 告诉服务器,客户端可以接收的数据类型;
  • Accept-Language: 告诉服务器客户端而言接收的语言类型;
  • User-Agent: 浏览器的信息;
  • Accept-Encoding: 告诉服务器,客户端可以接收的数据编码(压缩)格式;
  • Host: 表示请求的服务器ip和端口号;
  • Connection: 告诉服务器请求连接如何处理
     Keep-Alive:服务器马上回传数据,不要马上关闭,保持一小会儿的连接
     Closed: 马上关闭

POST请求的组成如下:

  1. 请求行
    (1)请求的方式 GET
    (2)请求的资源路径 [+?+请求参数]
    (3)请求的协议版本号 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

1.3 响应的HTTP协议格式

响应的HTTP协议格式组成如下:

  1. 响应行
    (1)响应的协议和版本号
    (2)响应状态码
    (3)响应状态码描述符
  2. 响应头
    key:value 组成,不同的响应头,表示不同的含义。
  3. 响应体:回传给客户端的数据、

示例图如下:
在这里插入图片描述

常用的响应码:

响应码说明
200表示请求成功
302表示请求重定向
404表示请求服务器已经收到,但是需要访问的数据不存在
500表示服务器已经收到请求,但是服务器内部错误

1.4 MIME数据类型

MIME是HTTP协议中的数据类型。全称是"Multipurpose Internet Mail Extensions"多功能Internet邮件扩充服务,MIME类型的格式是"大类型/小类型",并与某一种文件的扩展名相对应。

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


2 HttpServletRequest类

2.1 HttpServletRequest说明及常用方法

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

HttpServletRequest类常用方法

方法说明
getRequestURL()获取请求的资源路径
getRequestURL()获取请求的统一资源定位符(绝对路径)
getRemoteHost()获取客户端的ip地址
getHeader()获取请求头
getParameter()获取请求的参数
getParamterValues()获取请求的参数(多个值使用)
getMethod()获取请求的方式POST或GET
setAttribute(key,value)设置域数据
getAttribute(key)获取域数据
getRequestDispatcher()获取请求转发对象

2.2 HttpServletRequest类演示

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>RequestAPIServelet</servlet-name><servlet-class>com.example.servlet_test.RequestAPIServelet</servlet-class></servlet><servlet-mapping><servlet-name>RequestAPIServelet</servlet-name><url-pattern>/requestAPIServlet</url-pattern></servlet-mapping>
</web-app>

RequestAPIServelet.java

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author 兴趣使然黄小黄* @version 1.0*/
public class RequestAPIServelet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1. 获取请求的资源路径System.out.println("URL = " + req.getRequestURI());//2. 获取绝对路径(返回值是StringBuffer)System.out.println("URL = " + req.getRequestURL());//3. 获取客户端的ip地址/** 在IDEA中,使用LocalHost访问时,得到的客户端的ip地址时127.0.0.1* IPV6表现形式则为0:0:0:0:0:0:0:1*/System.out.println("ip = " + req.getRemoteHost());//4. 获取请求头System.out.println("请求头User-Agent = " + req.getHeader("User-Agent"));//5. 获取请求方式System.out.println("请求方式 = " + req.getMethod());}
}

在这里插入图片描述

2.3 获取请求表单中的参数值(POST请求)

下面演示如何获取表单的信息,以Post请求方式为例
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>ServletRequest</servlet-name><servlet-class>com.example.servlet_test.ServletRequest</servlet-class></servlet><servlet-mapping><servlet-name>ServletRequest</servlet-name><url-pattern>/servletRequest</url-pattern></servlet-mapping>
</web-app>

html页面信息如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="http://localhost:8080/Servlet_Test/servletRequest" method="post">用户名:<input type="text" name="username"><br/>密码:<input type="password" name="password"><br/>兴趣爱好:<input type="checkbox" name="hobby" value="java">Java<input type="checkbox" name="hobby" value="python">Python<input type="checkbox" name="hobby" value="C++">C++<input type="submit">
</form>
</body>
</html>

获取请求参数的方法都写在了ServletRequest类中

ServletRequest.java:

package com.example.servlet_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;/*** @author 兴趣使然黄小黄* @version 1.0* 读取表单数据*/
public class ServletRequest extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求参数String username = req.getParameter("username");String password = req.getParameter("password");String[] hobby = req.getParameterValues("hobby");//打印System.out.println("用户名:" + username);System.out.println("密码:" + password);System.out.println("爱好:" + Arrays.asList(hobby));}
}

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

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

还是刚刚的例子,表单中的内容如下图(用户名用中文):
在这里插入图片描述
提交后,控制台获取的参数信息如下;
在这里插入图片描述
用户名中文出现了乱码!如何解决?

只需要在获取参数前设置编码格式为utf-8即可

在这里插入图片描述
req.setCharacterEncoding(“UTF-8”):设置请求体的字符集为UTF-8,从而解决post请求的中文乱码问题。
在这里插入图片描述


3 请求转发

何为请求转发?
请求转发是指当服务器接收到请求后,从一个资源跳转到另一个资源的操作。
在这里插入图片描述
请求转发的特点如下:

  • 浏览器地址不会变化
  • 仅仅是一次请求
  • 可以共享Request域的数据
  • 可以转发到 WEB-INF 目录(一般情况无法访问,可以通过请求转发访问)
  • 不可以访问到工程以外的资源

示例代码如下:(xml配置文件略,可以自己参考类名去配置)

public class Servlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求的参数String username = req.getParameter("username");System.out.println("servlet1中 username = " + username);//给材料盖章,传递到servlet2查看req.setAttribute("key1", "柜台1的章");//问路:servlet2怎么走RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");//走向Servlet2requestDispatcher.forward(req, resp);}
}public class Servlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求参数String username = req.getParameter("username");System.out.println("servlet2中 username = " + username);//查看柜台1是否有章Object key1 = req.getAttribute("key1");System.out.println("柜台1是否有章 " + key1);//处理自己的业务System.out.println("柜台二处理中");}
}

在这里插入图片描述

4 HttpServletResponse类

HttpServletResponse类与HttpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序使用。HttpServletRequest表示所有请求过来的信息,而HttpServletResponse表示所有相应的信息。

如果我们希望设置返回给客户端的信息,则可以通过HttpServletResponse对象来进行设置。

4.1 两个输出流

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

两个流只能同时使用一个

4.2 如何回传客户端数据

往客户端回传字符串数据

案例代码如下:

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;/*** @author 兴趣使然黄小黄* @version 1.0*/
public class ResponseIO extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter writer = resp.getWriter();writer.write("response's content!!!");}
}

同样,该案例中也存在响应的中文乱码问题
与post请求的中文乱码问题不同的是,不能仅仅设置服务端的编码格式,还需要将浏览器默认解析的编码格式统一!

代码如下:

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;/*** @author 兴趣使然黄小黄* @version 1.0*/
public class ResponseIO extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置服务器的字符集resp.setCharacterEncoding("UTF-8");//通过响应头,设置浏览器的字符集resp.setHeader("Content-Type", "text/html;charset=UTF-8");PrintWriter writer = resp.getWriter();writer.write("这是一段中文!");}
}

也可以在获取流对象前,通过一个方法同时设置服务端和客户端的编码集:

resp.setContentType("text/html;charset=UTF-8");

5 请求重定向

5.1 什么是请求重定向

请求重定向是指客户端给服务端发请求,然后服务器给客户端提供了一个新的地址去访问。可以简单理解为:呼叫转移~

需要注意请求重定向与请求转发的区别!
请求重定向的特点如下:

  • 不共享Request域的数据
  • 两次请求
  • 浏览器地址栏会发生变化
  • 不能访问到WEB-INF目录下的资源
  • 可以访问到工程外的资源

在这里插入图片描述

5.2 请求重定向演示

Response1.java

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author 兴趣使然黄小黄* @version 1.0* 演示请求重定向*/
public class Response1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("----------Response1---------");//设置状态码302 表示重定向resp.setStatus(302);resp.setHeader("Location", "http://localhost:8080/Servlet_Test/response2");}
}

Response2.java

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author 兴趣使然黄小黄* @version 1.0* 演示请求重定向*/
public class Response2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("----------Response2---------");resp.getWriter().write("response2");}
}

在这里插入图片描述
补充
请求重定向也有一种简便的实现方式:

resp.sendRedirect("http://xxxx/xxx/xxx...");

写在最后

 本文部分内容参考:尚硅谷JavaWeb课程。好了,本文内容到这里就告一段落了,欢迎大家订阅专栏,加入JavaWeb学习!点击订阅

 如果你有任何问题,欢迎私信,感谢您的支持!
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_24041.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车车基础知识扫盲

排量 排量是指发动机气缸工作容积之和。所谓工作容积就是活塞在一个冲程内经过的区域的体积。气缸的总容积减去活塞的工作容积&#xff0c;剩下的就是压缩容积&#xff0c;压缩容积是用来燃烧的。 排量的单位是升(L)&#xff0c;常见的排量的标识有三种&#xff0c;T&#xff…

SpringMvc模块

SpingMVC 模块 简介 Spring MVC是一种基于MVC架构模式的轻量级Web框架。 SpringMVC处理过程 Spring MVC的处理过程&#xff1a; DispatcherServlet 接收用户的请求找到用于处理request的 handler 和Interceptors&#xff0c;构造成 HandlerExecutionChain执行链找到 handle…

宏任务与微任务

原文:做一些动图,学习一下EventLoop (https://juejin.cn/post/6969028296893792286)一、任务队列JavaScript 是单线程执行的语言, 在同一时间只能干一件事情。如果前面的任务很耗时后面的任务就会一直等待,为了解决这个问题,js中出现了同步任务和异步任务 1.1 同步任务在主…

Linux服务器部署Mysql5.7全过程记录

1、先下载安装包文件 mysql-5.7.27-linux-glibc2.12-x86_64.tar Mysql5.7.27 Linux安装包 链接&#xff1a;https://pan.baidu.com/s/1p4KmDp5O2bGJLXUHOHMQFQ 提取码&#xff1a;4692 2、解压 cd /usr/local 切换到安装包所在目录 tar -zxvf mysql-5.7.30-l…

【数据获取】可以公开获取到的百度迁徙数据

百度迁徙数据是一种较为常用的互联网数据&#xff0c;在之前的文章里小编已经讲了百度迁徙数据是什么、怎么获取、该如何处理、怎么用它做和弦图这些内容。但是其中数据的获取部分一直没有详细讲解&#xff0c;那么该如何获取它呢&#xff1f; 今天&#xff0c;就告诉大家一个…

教学设计题-教学过程

空间中直线与平面之间的位置关系 生活中的三种位置关系的实例 直线在平面内&#xff1a;开门关门时&#xff0c;门轴所在的直线在门所在平面内 直线与平面相交&#xff1a;操场上&#xff0c;升旗的旗杆所在直线与地面所在平面相交 直线与平面平行&#xff1a;黑板的一条边所在…

护肤 第三课

皮肤的生长周期一般是1-2个月 所以护肤品想要其效果 一般就是这个周期才会有效果 外用护肤品只能渗透到表皮层或者真皮层的表层&#xff0c;只有医疗美容的方法才有机会到真皮层 黑色素 黑色素细胞在基底层 黑色素细胞能产生黑色素 黑色素的作用&#xff1a;吸收和散射紫外线…

A Survey on Big Data Market: Pricing, Trading and Protection

基于大数据市场&#xff1a;定价、交易、保护的研究 作者&#xff1a;FAN LIANG, WEI YU , DOU AN, QINGYU YANG, XINWEN FU, AND WEI ZHAO 文章目录基于大数据市场&#xff1a;定价、交易、保护的研究Abstract1.Intro2.大数据的基本概念2.1.大数据的定义2.2.大数据的好处和挑…

【23秋招c++后端面试技术突围】mysql通俗易懂的数据库连接池原理及模拟实现

什么是数据库连接池&#xff1f; 当系统使用JDBC技术访问数据库时会创建一个connection对象&#xff0c;而该对象的创建过程是非常消耗资源的&#xff0c;并且创建对象的时间也特别长&#xff0c;假设系统一天有1万次的访问量&#xff0c;那么一天就会有1万个connection对象被…

Acetal-NHS (SDMB),乙缩醛-琥珀酰亚胺酯

An English name&#xff1a;Acetal-NHS (SDMB) Chinese name&#xff1a;乙缩醛-琥珀酰亚胺酯 Item no&#xff1a;X-GF-0136 Density: PEG density is approximately 1.125 g/mL Molecular formula&#xff1a; Physical form&#xff1a;PEG products generally appear…

CMake中find_file的使用

CMake中的命令find_file用于查找指定文件(named file)的完整路径&#xff0c;其格式如下&#xff1a;将创建一个由<VAR>命名的缓存条目即cache变量&#xff0c;将<VAR>的值存入CMakeCache.txt中);或如果指定了NO_CACHE&#xff0c;由<VAR>命名的普通变量来存…

文件IO操作笔记

目录 1.文件操作 2.File类 3.流&#xff08;针对文件内容操作读写&#xff09; 3.1 InputStream 3.2 Scanner 4.练习 1.文件操作 狭义文件就是存储在硬盘上的数据&#xff0c;以“文件”为单位 广义上的文件就是操作系统负责管理硬件资源&#xff0c;操作系统&#xff08;…

按钮(Button)组件

1.按钮组件的属性 属性 说明 onPressed 必填参数&#xff0c;按下按钮时触发的回调&#xff0c;接收一个方法&#xff0c;传null表示按钮禁用&#xff0c;会显示禁用相关样式 child 子组件 style 通过ButtonStyle装饰 ButtonStylee里面的常用的参数 属性名称 值类型 …

15 个实用的 Linux find 命令示例

除了在目录结构下查找文件的基本操作外&#xff0c;我们还可以使用 find 命令执行一些实际操作&#xff0c;这将使我们的命令行之旅变得轻松。 在本文中&#xff0c;让我们回顾 15 个 Linux find 命令的实际示例&#xff0c;它们对新手和专家都非常有用。 首先&#xff0c;在…

公众号网课查题功能搭建系统使用

公众号网课查题功能搭建系统使用 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&…

图学习——02.Graph Neural Network

Graph Neural Network GCN A矩阵表示邻接矩阵&#xff0c;I矩阵表示单位阵&#xff0c;D~矩阵是对A~的矩阵按行求和后把每行的值写在对角线上&#xff08;度矩阵&#xff0c;包括自连接的度&#xff09;&#xff0c;W(l)是要学习的参数&#xff0c;H(l)是这一层的节点的特征 …

2键/双按键触摸触控检测IC ,VK3602KA抗电源电压波动干扰/超高稳定性,适用门禁、台灯,家电等电源供电的应用

型号&#xff1a;VK3602KA 品牌&#xff1a;VINKA/永嘉微电 封装形式&#xff1a;SOP8 年份&#xff1a;新年份 KPP2436 VK3602KA具有2个触摸按键&#xff0c;可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的集成度&#xff0c;仅需极少的外部组件便可实现触摸按…

Vue基础语法(二)

目录 一、条件判断 1、概念 2、v-if、v-else-if、v-else 3、v-show 4、v-show与v-if的异同 二、v-for 1、遍历数组 2、遍历对象 3、key属性 三、数据更新检测 1、末尾的添加、删除 2、前面的插入、删除 3、splice(index,length,替换内容) 4、sort()排序 5、反转&a…

谷粒商城 spu保存

主要记录一下收获 spu 一类物品 sku 具体什么物品&#xff08;由销售属性组合定义&#xff09; 写保存接口步骤 对比前端拿到的VO和实际的POJO属性有哪些差异将差异属性通过其他方式拿到&#xff0c;其余属性直接BeanUtils.copyProperties保存&#xff0c;保存时还有其他关联…

Python 装饰器进阶

一、装饰器的执行流程 上一篇文章介绍了装饰器的概念和基本使用&#xff0c;这篇我们来深入探索一下 python 的装饰器。 1.1 简单装饰器例子 我们先看一个例子&#xff0c;控制台会输出什么&#xff1f; def decorator(func):def inner():print("inner start")fu…