Servlet(二):Servlet的运行原理HttpServlet、HttpServletRequest、HttpServletResponse类详解

news2024/11/15 19:27:53

Servlet运行原理

  • Servlet API详解
    • HttpServlet类
    • HttpServletRequest类
    • HttpServletResponse类

Servlet API详解

Servlet API中包含了很多的内容,但我们主要用到的是以下三个类,HttpServlet,HttpServletRequest,HttpServletResponse

HttpServlet类

在写Servlet代码的时候,第一步是创建一个类,继承HttpServlet,并重写其中的方法

【核心方法】
在这里插入图片描述
【补充】:

  • 我们实际开发的时候主要重写 doXXX 方法, 很少会重写 init / destory / service
  • destory这个方法不一定能执行到,如果Tomcat是通过8005管理端口来进行关闭,会执行destory,如果直接杀死Tomcat进程,则不会调用,且大部分情况是直接杀死Tomcat进程
  • Servlet的生命周期,上述方法的调用时机,就是Servlet的生命周期(描述了一个Servlet实例从生到死的过程) 最先执行init方法,且只执行一次,然后执行service方法(可能执行多次),最后执行destory方法
  • HttpServlet的实例只在程序启动时创建一次,而不是每次收到HTTP请求都重新创建实例

【处理GET请求】

  1. 在浏览器地址栏中填写url,默认就是通过GET方法发送请求
    在这里插入图片描述
  2. 处理GET请求的Servlet代码
    在这里插入图片描述
  3. 响应结果
    在这里插入图片描述

【处理POST请求】

通过ajax的方式构造一个POST请求,因此我们需要创建一个HTML,在HTML中创建出对应的webapp代码,HTML文件必须要放在webapp目录下
在这里插入图片描述

  1. 访问test.html,同时发送POST请求
    在这里插入图片描述

  2. 处理POST请求的代码
    在这里插入图片描述

  3. 响应结果,在success中是将返回的结果打印到控制台上的
    在这里插入图片描述

【注意】

  • 直接通过浏览器输入url得到的响应的内容就是直接被浏览器渲染到界面上的,但ajax不是,拿到的响应数据,是由回调的方法来处理的,可以显示到界面上,也可以不显示
  • ajax中url参数的写法,上面是相对路径的写法,test.html处在/servlet1/test.html中,要访问的路径是/servlet1/hello,因此url可直接写成hello,但绝对不能写成/hello,加了/就表示当前路径是绝对路径
  • 绝对路径的写法 : /servlet1/hello
  • 在WebServlet这个注解中的路径,一定要加/,如果不加/,Tomcat就会认为是无效的路径,从而不能正确启动/加载
    在这里插入图片描述

除了使用ajax构造请求,还可以使用第三方工具Postman构造请求,这种方式使用起来更方便简单

HttpServletRequest类

Http请求中包含了很多信息,例如请求方法,url,版本号,各种header,body,因此HttpServletRequest类中就提供了一组方法,让我们能够获取到Http请求中的这些信息

【核心方法】
在这里插入图片描述
上述的方法都是"读方法",而不是"写方法",因为对于服务器来说,请求对象是服务器收到的内容,不应该修改
【使用示例1】:打印请求的信息

import javax.servlet.ServletException;
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.util.Enumeration;


@WebServlet("/showRequest")
public class ShowRequest extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=utf-8");
        StringBuilder respBody = new StringBuilder();
        respBody.append(req.getProtocol());
        respBody.append("<br>");
        respBody.append(req.getMethod());
        respBody.append("<br>");
        respBody.append(req.getRequestURI());
        respBody.append("<br>");
        respBody.append(req.getContextPath());
        respBody.append("<br>");
        respBody.append(req.getQueryString());
        respBody.append("<br>");
        respBody.append("<h3>headers:</h3>");
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            respBody.append(headerName + " ");
            respBody.append(req.getHeader(headerName));
            respBody.append("<br>");
        }
        resp.getWriter().write(respBody.toString());
    }
}

在这里插入图片描述
【使用示例2】:获取GET请求中的参数
GET请求中的参数一般是通过query string传递给服务器的

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

@WebServlet("/studentInfo")
public class StudentInfoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //假设客户端发来的请求格式形如/studentInfo?studentId=100&classId=8
        //可以通过getParameter方法拿到这两个id的值
        String queryString=req.getQueryString(); //拿到整个querystring
         String classId=req.getParameter("classId");
         String studentId=req.getParameter("studentId");
         resp.getWriter().write("classId:"+classId+" "+"studentId:"+studentId);
        //resp.getWriter().write(queryString);
    }
}

在这里插入图片描述

getParameter 的效果是拿到 query string中的键值对,根据key获取value
当没有 query string的时候, getParameter 获取的值为 null

【使用示例3】:获取POST请求中的参数
POST请求一般是通过body传递给服务器,body中的格式有很多种,如果采用form表单的形式,仍然可以通过getParameter获取参数的值

  • 通过Postman构造一个POST请求,并通过form表单的形式传参数
    在这里插入图片描述
@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf8");
        //获取body中的参数
        //约定body使用application/x-www-form-urlencoded的形式传参,也就是form表单的形式
        //形如classId=100&studentId=99,这个格式和query string相同,只是数据在body中
        String classId=req.getParameter("classId");
        String studentId=req.getParameter("studentId");
        resp.getWriter().write("classId:"+classId+" "+"studentId:"+studentId);
    }
  • 在body中通过json的形式传参
    在这里插入图片描述
    在这里插入图片描述

在服务器端不能通过getParameter的方式直接获取json形式的参数了,因为json格式解析起来,并不是特别容易,json支持一些更复杂的数据结构,也可以进行嵌套,例如某个key的value又是一个json
因此,可以使用处理json的第三方库,我们下面使用的是Jackson,在使用之前需要在项目中引入Jackson
在这里插入图片描述
【关于Jackson的使用】

  • 我们主要使用的是Jackson提供的一个类ObjectMapper
  • ObjectMapper中提供两个了两个主要的方法
  • readValue,将json字符串转换成Java对象,该方法的第一个参数是String或InputStream,第二个参数是转换的结果对应的类对象(因此需要先有一个类)
    在这里插入图片描述
  • writeValue方法,将Java对象转成json字符串
  • 通过Postman构造POST请求,并通过json格式传递参数
    在这里插入图片描述
  • 后端使用Jackson处理json格式的字符串
    在这里插入图片描述

HttpServletResponse类

【核心方法】
在这里插入图片描述

响应对象是服务器要返回给浏览器的内容, 这里的重要信息都是程序猿设置的. 因此上面的方法都是 “写” 方法.

【代码示例1】:设置状态码

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

@WebServlet("/status")
public class StatusServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置状态码
        resp.setStatus(200);
        
    }
}

在这里插入图片描述
在响应中设置状态码200,得到的抓包结果

在这里插入图片描述

在响应中设置状态码404,得到的浏览器页面和抓包结果

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

【代码示例2】:自动刷新,在响应的header中设置Refresh属性,每刷新一次都会给服务器发送一个新的请求

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

@WebServlet("/refresh")
public class RefreshServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setHeader("Refresh","1"); //value表示每隔几秒刷新一次
        resp.getWriter().write(System.currentTimeMillis()+"");//返回当前的时间戳
    }
}

页面显示效果和抓包结果

在这里插入图片描述

在这里插入图片描述

【代码示例3】:重定向,服务器返回一个重定向报文,让浏览器自动跳转到新的页面

具体做法:

  1. 设置状态码3xx(典型是302)
  2. 在响应的header中设置Location,表示要跳转的页面
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setStatus(302);
        resp.setHeader("Location","https://www.sogou.com");
       //resp.sendRedirect("https://www.sogou.com");和上面两行代码的写法等价
    }
}

页面效果和抓包结果

在这里插入图片描述

敲下回车之后,跳转到搜狗主页

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022-04-10-Docker

layout: post #标题配置 title: Docker #时间配置 date: 2022-04-10 22:50:00 0800 #目录配置 categories: Docker #标签配置 tag: 学习笔记 content {:toc} Docker 1.初识 Docker 1.1 docker概念 我们写的代码会接触到好几个环境&#xff1a;开发环境、测试环境以及生产环…

祖师爷香农,到底有多神?

1916年&#xff0c;第一次世界大战激战正酣。在这一年的4月30日&#xff0c;远离战场的美国密歇根州佩托斯基&#xff08;Petoskey&#xff09;&#xff0c;一个男婴呱呱坠地。这个男婴&#xff0c;就是我们这篇文章的主角——香农。香农的全名&#xff0c;叫做克劳德艾尔伍德香…

Alvas.Audio专门为C#和VB.Net程序员设计

Alvas.Audio专门为C#和VB.Net程序员设计 Alvas.Audio库使C#和VB.Net程序员能够创建执行(包括混合声音信息)、捕获、转换和编辑音频的应用程序。 Alvas.Audio音频是C#音乐库。Web程序员。 这使您能够生产。NET程序&#xff0c;例如Winforms/WPF/Windows服务/控制台录音机、Inter…

steam搬砖项目,新手也能月入8000+(详细教程)

大家好&#xff0c;我是阿阳 这个项目很早之前就有了&#xff0c;而且这么久以来一直非常稳定。 作为一名没有任何经验却想通过低成本投入来赚钱的小白&#xff0c;做steam搬砖项目真的可以实现财富自由 0成本&#xff0c;操作简单&#xff0c;有手机就能做&#xff01;真的…

【Golang】欲入此Go先看Go的基本语法

&#x1f4d3;推荐网站(不断完善中)&#xff1a;个人博客 &#x1f4cc;个人主页&#xff1a;个人主页 &#x1f449;相关专栏&#xff1a;CSDN专栏、个人专栏 &#x1f3dd;立志赚钱&#xff0c;干活想躺&#xff0c;瞎分享的摸鱼工程师一枚 &#x1f34a;前言 完成了我们众多…

OpenAI 最强对话模型 ChatGPT 注册使用笔记

2022年12月5日OpenAI 发布了对话语言模型 ChatGPT&#xff0c;并开放了免费试用。ChatGPT 是一款基于GPT3模型的聊天机器人&#xff0c;该聊天机器人可以在模仿人类说话风格的同时回答大量的问题。在现实世界之中&#xff0c;例如数字营销、线上内容创作、回答客户服务查询&…

Python使用Opencv图像处理方法完成手势识别(一)

Opencv完成手势识别HSV的提取特征提取轮廓绘制完整代码由于是使用Opencv完成手势识别&#xff0c;所以首先利用颜色特征是对手的颜色进行提取&#xff0c;获得HSV的最小值与最大值。HSV的提取 HSV颜色空间阈值主要是靠Trackbar调节阈值和cv2.inRange来生成掩膜来提取。 这是我…

外汇天眼:外汇市场上不得不说的两大类庄家!

前一阵子&#xff0c;天眼君跟好友讨论外汇市场上有没有庄家&#xff0c;今天天眼君就跟大家探讨下这个问题。我们都知道股票交易中是有所谓的庄家的&#xff0c;散户必须要猜测庄家的做法&#xff0c;否则很有可能变成待割的韭菜。 而我们常见的对外宣传中&#xff0c;基本上…

R语言对推特twitter数据进行文本情感分析

原文链接&#xff1a;http://tecdat.cn/?p4012我们以R语言抓取的推特数据为例&#xff0c;对数据进行文本挖掘&#xff0c;进一步进行情感分析&#xff0c;从而得到很多有趣的信息&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。找到推特来源是苹果手机或者安…

C++ Reference: Standard C++ Library reference: Containers: list: list: assign

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/assign/ 公有成员函数 <list> std::list::assign C98 范围 (1) template <class InputIterator> void assign (InputIterator first, InputIterator last); 填充 (2) void assign (…

字符串处理【AC自动机】 - 原理 AC自动机详解

字符串处理【AC自动机】 - 原理 AC自动机详解 AC自动机&#xff08;Aho-Corasick automaton&#xff09;在1975年产生于贝尔实验室&#xff0c;是著名的多模匹配算法。 学习AC自动机&#xff0c;要有KMP和Trie&#xff08;字典树&#xff09;的基础知识。 KMP是单模匹配算法&a…

三代全长16s助攻,轻松搞定水体研究领域10+文章

基于PacBio三代测序平台&#xff0c;可高效获得16s rRNA全长序列&#xff0c;同时不必纠结引物选择带来的结果偏差&#xff0c;令物种分类更多更精准——到达“种”水平。Pacbio平台同时兼具时间短&#xff0c;无需扩增等优势&#xff0c;伴随着三代测序成本的下降&#xff0c;…

<VSCode下载、安装、配置以及连接云服务器进行Linux开发>

目录 1.下载、安装VSCode 2.配置环境及插件 2.1 实用插件安装 2.1.1 中文汉化插件 2.1.2 Remote-ssh插件​ 连接远程云服务器&#xff1a; 远程云服务器开发&#xff1a; Xshell界面与VSCode界面对比&#xff1a; 2.1.3 C/C Extension Pack&#xff08;C/C扩展包&#xff0…

Java实现后端跨域的常见解决方式

目录一、搭建服务&#xff08;cross-server&#xff09;1.1、maven依赖1.2、接口1.3、配置二、搭建服务&#xff08;cross-web&#xff09;2.1、maven依赖2.2、接口2.3、页面2.4、配置2.5、跨域请求结果2.6、常见跨域情况三、解决方案3.1、通过 CrossOrigin 注解3.2、通过配置类…

Kafka高级特性解析之主题

1、管理 使用kafka-topics.sh脚本&#xff1a; 选项说明--config <String: namevalue>为创建的或修改的主题指定配置信息。支持下述配置条目&#xff1a; cleanup.policycompression.typedelete.retention.msfile.delete.delay.msflush.messagesflush.msfollower.repli…

不影响1,4丁炔二醇(BYD)的情况下去除铜离子的工艺

1,4-丁炔二醇BYD&#xff08;but-2-yne-1,4-diol&#xff09;是一种重要的中间体化工原料&#xff0c;广泛应用于生产丁二醇及其下游产品、维生素B6的主要原料&#xff0c;还可以用于镀镍的增亮剂、防腐抑制剂等领域。 1,4&#xff0d;丁二醇&#xff08;BDO&#xff09;是一种…

(附源码)ssm人才市场招聘信息系统 毕业设计 271621

基于jsp的人才市场招聘信息系统的设计与实现 摘 要 人才市场招聘信息系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员、用户、两部分&#xff0c;管理员管理主要功能包括&#xff1a;首页&#xff0c;站点管理&#xff08;轮播图、公告栏&#xf…

实验(七):串行口实验

一、实验目的与任务 实验目的&#xff1a; 1&#xff0e;运行Keil开发环境&#xff0c;完成串行口通信软件编程&#xff1b; 2&#xff0e;利用单片机串行口方式1与主机通信&#xff0c;建立Proteus仿真模型。 3&#xff0e;完成系统仿真与调试。。 任务&#xff1a; 1.根据要求…

mongodb 存引擎及配置

上次我们分享到了 wiredTiger 引擎以及他对于以前默认的 MMAPV1 引擎的优势 关于 wiredTiger 引擎 配置这里补充一下&#xff1a; storage:journal:enabled: truedbPath: /data/xiaomotong/mongo1/directoryPerDB: trueengine: wiredTigerwiredTiger:engineConfig:cacheSizeGB:…

Kotlin 开发Android app(二十):悬浮框WindowManager和动画AnimationDrawable

安卓的悬浮框&#xff0c;悬浮框相当于对桌面的一种控制&#xff0c;在安卓中是允许这样的自定义的小窗体出现在桌面的&#xff0c;其实这种小桌面可以使某些应用调用起来非常的方便&#xff0c;而动画的展现使得程序看起来更加有爱。 悬浮框 悬浮框的使用&#xff0c;通常是跟…