JavaWeb-Servlet服务连接器(二)

目录

Request(获取请求信息)

1.获取请求行内容

2.解决乱码问题

 3.获取请求头部分

4.获取请求体

 5.其他功能


Request(获取请求信息)

工作流程:

1.通过请求的url的资源路径,tomcat会生成相应的Servlet实现对象。

2.tomcat服务器会创建request对象和response对象,request对象接收请求消息数据。

3.tomcat将request和response方法传递给service方法并且调用service方法

4.程序员可以通过request对象获取请求的消息数据,并且设置response的响应数据

5.服务器在给浏览器响应之前获取response

1.获取请求行内容

请求行部分获取请求行内容的方法示例代码返回值
请求方法(Method)getMethod()String method = request.getMethod();"GET"
(重点)请求       URI(URL)getRequestURI()String uri = request.getRequestURI();"/index.html"
协议版本(Protocol)getProtocol()String protocol = request.getProtocol();"HTTP/1.1"
查询字符串(Query String)getQueryString()String queryString = request.getQueryString();null (如果没有查询字符串)
(重点)上下文路径(Context Path)getContextPath()String contextPath = request.getContextPath();"" (如果没有上下文路径,则为空字符串)

 案例代码:

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/requestHang")
public class RequestHang extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        获取方法String method =req.getMethod();System.out.println("使用的方法是"+method);
//       * 获取上下文路径String contextPath = req.getContextPath();System.out.println("请求的上下文路径是"+contextPath);
//       * 获取URIString Uri = req.getRequestURI();System.out.println("请求的URI是"+Uri);
//        获取协议版本String version = req.getProtocol();System.out.println("请求的协议版本是"+version);
//        获取查询字符串String string = req.getQueryString();System.out.println("请求附带的查询字符串是"+string);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//        获取方法String method =req.getMethod();System.out.println("使用的方法是"+method);
//       * 获取上下文路径String contextPath = req.getContextPath();System.out.println("请求的上下文路径是"+contextPath);
//       * 获取URIString Uri = req.getRequestURI();System.out.println("请求的URI是"+Uri);
//        获取协议版本String version = req.getProtocol();System.out.println("请求的协议版本是"+version);
//        获取参数String username = req.getParameter("username");System.out.println("Username is "+username);}
}

index.jsp代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>测试发送消息</title></head><body><form action="/com_alphamilk_war_exploded/requestHang" method="get"><input name="username"><input type="submit" value="提交"></form></body>
</html>

通过url访问结果如下:

 可以看到请求出现了乱码,下一步就是解决请求乱码问题.


2.解决乱码问题

1.控制台输出乱码

如果tomcat的版本是在10以下的,用中文可能会出现乱码问题,这里用的是9版本,解决方法:

打开tomcat文件夹找到conf配置文件

配置文件在conf下面,将配置中的字符集改成GBK,修改后的配置如下图:

修改后重新启动结果如下:

 2.post请求方式中参数中文乱码

通过将表单提交方式改为post,再在内容输入中文,通过request方法的getParameter获取参数username

可以看到输出的结果是一串乱码。所以需要进行修补

解决方法:设置流的编码即可

//        设置流的编码req.setCharacterEncoding("utf-8");

重启服务器并再次运行:


 3.获取请求头部分

示例:请求头(Request Header):Accept-Language: en-US,en;q=0.9

请求头名称获取请求头值的方法示例代码返回值
Accept-LanguagegetHeader("Accept-Language")String acceptLanguage = request.getHeader("Accept-Language");"en-US,en;q=0.9"
所有请求头名称getHeaderNames()Enumeration<String> headerNames = request.getHeaderNames();包含所有请求头名称的枚举

案例代码:获取所有请求头信息与对应的值

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;@WebServlet("/rsHead")
public class RequestHead extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        通过迭代器Enumration遍历请求头Enumeration<String> enumeration = req.getHeaderNames();
//        开始遍历while (enumeration.hasMoreElements()){String name = enumeration.nextElement();
//            找到获取头名称的值String value = req.getHeader(name);System.out.println(name+" == " +value);}}
}

案例代码2:设置外部跳转无法访问,只能通过项目内的页面访问资源

通过请求头referer获取访问到当前页面的来源(如果是直接输入地址则referer为空)

首先桌面随便创建一个html文件,然后通过文件的超链接实行跳转到刚才页面

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>冒牌登陆系统</title></head><body><a href="http://localhost:9998/com_alphamilk_war_exploded/rsHead">访问尝试</a></body>
</html>

既然能获取到外部访问源地址,那么现在通过限制请求头的访问,外部地址的访问就会输出非法访问。

服务器Servlet类代码:

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/refererTest")
public class rsRefer extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        设置RefererString referer = req.getHeader("referer");
//        防盗链机制if (referer != null){if (referer.contains("/com_alphamilk_war_exploded")){System.out.println("正常访问");}else {System.out.println("非法访问,请从官网处进行访问");}}}
}

重启服务器后,此时再通过随便创建的html文件修改路径后访问得到:


4.获取请求体

只有post请求方式才有请求体

步骤:

1.获取流对象 BufferReader

2.从流对象中获取值 nextline();

常用方法:

方法名作用
getReader()获取请求的输入流,并返回一个BufferedReader对象,用于读取来自客户端的请求数据。
getInputStream()获取请求的输入流,并返回一个ServletInputStream对象,用于直接从客户端请求中读取字节数据。

案例代码:

html代码:

<html><head><title>测试发送消息</title></head><body><form action="http://localhost:9998/com_alphamilk_war_exploded/body" method="post"><input type="text" name="username" placeholder="用户名"><br><input type="text" name="password" placeholder="密码"><br><input type="submit"></form></body>
</html>

Servlet类代码:

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;@WebServlet("/body")
public class RequestBody extends HttpServlet{@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {BufferedReader reader = req.getReader();String line;while (reader.readLine()!=null){line = reader.readLine();System.out.println(line);}}
}

 通过输入用户名与密码再提交表单

 


 5.其他功能

1.获取参数通用方式(不管post请求还是get请求都可以用、重点):     

方法名作用
getParameter(String name)获取指定名称的请求参数的值。如果有多个同名参数,只返回第一个参数的值。
getParameterValues(String name)获取指定名称的请求参数的所有值。如果参数存在多个值,返回一个包含所有值的字符串数组。
Enumeration<String> getParameterNames()返回一个枚举对象,包含所有请求参数的名称。可以使用该枚举对象遍历所有请求参数的名称。
getParameterMap()返回一个Map对象,其中包含所有的请求参数和它们的值。键是参数名称,值是参数的值(以字符串数组形式)。

案例代码:

 服务器代码

package com.company;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;@WebServlet("/Demo3")
public class ReqOther extends HttpServlet{HttpServletRequest req;HttpServletResponse resp;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Enumeration<String> enumeration = req.getParameterNames();String names;
//        通过迭代器遍历输出所有的参数名与对应的值while (enumeration.hasMoreElements()){names = enumeration.nextElement();System.out.println(names+":"+req.getParameter(names));}}
//    由于是通用方法,所以如果有post请求则更改为Get请求流程@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        注意post方法会出现中文乱码问题,需要转为utf-8格式编码req.setCharacterEncoding("utf-8");this.req = req;this.resp = resp;this.doGet(req, resp);}
}

web代码更改路径地址后输入,并提交

 

 当一个表单中出现多个相同的名字时候就需要用getParameterValues或者getParameterMap存放。

2.请求转发(服务器内部资源的跳转方式)

方法名作用
getRequestDispatcher(String path)获取与给定相对路径(path)相关联的 RequestDispatcher 对象,用于在同一个 Web 应用程序内部的不同资源之间进行请求转发。
forward(ServletRequest request, ServletResponse response)将请求和响应对象转发给另一个资源(如 Servlet、JSP 页面),停止当前资源的执行,并将控制权交给目标资源,由目标资源负责生成响应。

案例代码:

创建一个资源类,一个访问类,通过访问类访问资源类

访问类:

package com.company;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;//资源跳转
@WebServlet("/Demo4")
public class rsPatcher extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {try {System.out.println("3s后进行跳转");
//            3秒后进行跳转TimeUnit.SECONDS.sleep(3);}catch (Exception e){e.printStackTrace();}//        定义要跳转的资源类路径RequestDispatcher requestDispatcher = req.getRequestDispatcher("/Demo5");
//        进行跳转requestDispatcher.forward(req,resp);}
}

资源类:

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/Demo5")
public class pro extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("我是资源类,我被访问了");}
}

输出:

 注意:跳转只能跳转到当前项目中的资源,如果把资源改为外部路径,比如www.baidu.com这样就无法进行跳转。并且转发知识一次的请求

3.共享数据

由于一个类中的数据往往只能该类使用,但是有些资源需要进行多个对象能共享使用,所以引入了共享数据

方法名作用
setAttribute(String name, Object value)将一个数据对象(value)与给定的名称(name)关联起来,将其存储在 ServletContext、HttpSession 或 HttpServletRequest 中,以便多个对象之间共享使用。
getAttribute(String name)根据给定的名称(name),从 ServletContext、HttpSession 或 HttpServletRequest 中获取与之关联的数据对象。
removeAttribute(String name)根据给定的名称(name),从 ServletContext、HttpSession 或 HttpServletRequest 中删除关联的数据对象。

案例代码:

设置一个运输物资类,一个资源类

运输物资类:

package com.company;import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/Demo6")
public class Demo6 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        设置共享资源,格式为   键值->对象req.setAttribute("msg","物资");System.out.println("当前为跳转类进行运输:"+req.getAttribute("msg"));RequestDispatcher requestDispatcher  = req.getRequestDispatcher("/Demo7");
//        进行跳转requestDispatcher.forward(req,resp);}
}

资源类

package com.company;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/Demo7")
public class Demo7 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("资源类获取到"+req.getAttribute("msg"));}
}


下一篇JavaWeb-Servlet服务连接器(三)_Alphamilk的博客-CSDN博客

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

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

相关文章

【单片机】DS2431,STM32,EEPROM读取与写入

芯片介绍&#xff1a; https://qq742971636.blog.csdn.net/article/details/132164189 接线 串口结果&#xff1a; 部分代码&#xff1a; #include "sys.h" #include "DS2431.h"unsigned char serialNb[8]; unsigned char write_data[128]; unsigned cha…

STM32入门学习之定时器输入捕获

1.定时器的输入捕获可以用来测量脉冲宽度或者测量频率。输入捕获的原理图如下&#xff1a; 假设定时器是向上计数。在图中&#xff0c;t1~t2之间的便是我们要测量的高电平的时间(脉冲宽度)。首先&#xff0c;设置定时器为上升沿捕获&#xff0c;如此一来&#xff0c;在t1时刻可…

AI 绘画Stable Diffusion 研究(九)sd图生图功能详解-老照片高清修复放大

大家好&#xff0c;我是风雨无阻。 通过前面几篇文章的介绍&#xff0c;相信各位小伙伴&#xff0c;对 Stable Diffusion 这款强大的AI 绘图系统有了全新的认知。我们见识到了借助 Stable Diffusion的文生图功能&#xff0c;利用简单的几个单词&#xff0c;就可以生成完美的图片…

阿里云OSS对象存储的核心概念与购买应用

文章目录 1.OSS对象存储基本介绍1.1.OSS对象存储概念1.2.NAS与OSS存储的不同1.3.OSS的应用场景1.4.OSS术语对应表 2.购买OSS存储资源包3.KodCloud云盘接入OSS对象存储3.1.创建Bucket存储空间3.2.创建子用户用于管理Bucket3.3.获取用户的AccessKey3.3.为用户设置权限3.4.将Bucke…

MySQL和Redis如何保证数据一致性

MySQL与Redis都是常用的数据存储和缓存系统。为了提高应用程序的性能和可伸缩性&#xff0c;很多应用程序将MySQL和Redis一起使用&#xff0c;其中MySQL作为主要的持久存储&#xff0c;而Redis作为主要的缓存。在这种情况下&#xff0c;应用程序需要确保MySQL和Redis中的数据是…

软件测试常用工具总结(测试管理、单元测试、接口测试、自动化测试、性能测试、负载测试等)

前言 在软件测试的过程中&#xff0c;多多少少都是会接触到一些测试工具&#xff0c;作为辅助测试用的&#xff0c;以提高测试工作的效率&#xff0c;使用好了测试工具&#xff0c;能对测试起到一个很好的作用&#xff0c;同时&#xff0c;有些公司&#xff0c;也会要求掌握一…

__ob__: Observer 后缀的数组的取值方式

开发中&#xff0c;经常从接口、父组件中&#xff0c;拿到数组然后给新的数组使用&#xff0c; 但是&#xff0c;有时候会发现带有 __ob__: Observer 后缀的数组&#xff0c;对这种数组来说&#xff0c;你是无法取到这个数组的值的&#xff0c; 而且&#xff0c;离谱的是consol…

【深度学习--RNN 循环神经网络--附LSTM情感文本分类】

deep learning 系列 --RNN 循环神经网络 什么是序列模型 包括了RNN LSTM GRU等网络模型&#xff0c;主要用途是自然语言处理、语音识别等方面&#xff0c;比如生成乐曲&#xff0c;音频转换为文字&#xff0c;文本情感分类&#xff0c;机器翻译等等 标准模型的缺陷 以往的标…

flutter 常见的状态管理器

flutter 常见的状态管理器 前言一、Provider二、Bloc三、Redux四、GetX总结 前言 当我们构建复杂的移动应用时&#xff0c;有效的状态管理是至关重要的&#xff0c;因为应用的不同部分可能需要共享数据、相应用户交互并保持一致的状态。Flutter 中有多种状态管理解决方案&#…

0143 串

目录 4.串 4.1串的定义和实现 4.2串的模式匹配 部分习题 4.串 4.1串的定义和实现 4.2串的模式匹配 部分习题 1.设有两个串S1和S2&#xff0c;求S2在S1中首次出现的位置的运算称为&#xff08;&#xff09; A.求字串 B.判断是否相等 C.模式匹配 D.连…

Vue2(组件开发)

目录 前言一&#xff0c;组件的使用二&#xff0c;插槽slot三&#xff0c;refs和parent四&#xff0c;父子组件间的通信4.1&#xff0c;父传子 &#xff1a;父传子的时候&#xff0c;通过属性传递4.2&#xff0c;父组件监听自定义事件 五&#xff0c;非父子组件的通信六&#x…

麦肯锡发布《2023年度科技报告》!

在经历了 2022 年技术投资和人才的动荡之后&#xff0c;2023 年上半年&#xff0c;人们对技术促进商业和社会进步的潜力重新燃起了热情。生成式人工智能&#xff08;Generative AI&#xff09;在这一复兴过程中功不可没&#xff0c;但它只是众多进步中的一个&#xff0c;可以推…

总说绿幕直播抠像抠不干净?很有可能是你不知道这个神器!

在绿幕直播的时候&#xff0c;你是不是座位、绿幕、灯光都摆对了&#xff0c;但主播轮廓仍然有绿边和虚化的情况发生&#xff1f;这种很大可能就是你使用的直播抠像软件有问题。今天小编把市面上的常见直播软件来和vLive虚拟直播的抠像做一个对比&#xff0c;让你直观感受下他们…

机器学习笔记 - 基于PyTorch + 类似ResNet的单目标检测

一、获取并了解数据 我们将处理年龄相关性黄斑变性 (AMD) 患者的眼部图像。 数据集下载地址,从下面的地址中,找到iChallenge-AMD,然后下载。 Baidu Research Open-Access Dataset - DownloadDownload Baidu Research Open-Access Datasethttps://ai.baidu.com/bro…

基于ACF,AMDF算法的语音编码matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .......................................................................... plotFlag …

函数递归专题(案例超详解一篇讲通透)

函数递归 前言1.递归案例:案例一&#xff1a;取球问题案例二&#xff1a;求斐波那契额数列案例三&#xff1a;函数实现n的k次方案例四&#xff1a;输入一个非负整数&#xff0c;返回组成它的数字之和案例五&#xff1a;元素逆置案例六&#xff1a;实现strlen案例七&#xff1a;…

服务器遭受攻击之后的常见思路

哈喽大家好&#xff0c;我是咸鱼 不知道大家有没有看过这么一部电影&#xff1a; 这部电影讲述了男主是一个电脑极客&#xff0c;在计算机方面有着不可思议的天赋&#xff0c;男主所在的黑客组织凭借着超高的黑客技术去入侵各种国家机构的系统&#xff0c;并引起了德国秘密警察…

Mac如何打开隐藏文件中Redis的配置文件redis.conf

Redis下载(通过⬇️博客下载的Redis默认路径为&#xff1a;/usr/local/etc) Redis下载 1.打开终端进入/usr文件夹 cd /usr 2.打开/local/文件夹 open local 3.找到redis.conf并打开,即可修改配置信息

讯飞星火认知大模型全新升级,全新版本、多模交互—测评结果超预期

写在前面 版本新功能 1 体验介绍 登录注册 申请体验 2 具体使用 2.1 多模态能力 2.1.1 多模理解 2.1.2 视觉问答 2.1.3 多模生成 2.2 代码能力 2.2.1 代码生成 2.2.2 代码解释 2.2.3 代码纠错 2.2.4 单元测试 2.3 插件功能 2.3.1 PPT生成 2.3.2 简历生成 2.3.4 文档问答 3 其他…

Android学习之路(3) 布局

线性布局LinearLayout 前几个小节的例程中&#xff0c;XML文件用到了LinearLayout布局&#xff0c;它的学名为线性布局。顾名思义&#xff0c;线性布局 像是用一根线把它的内部视图串起来&#xff0c;故而内部视图之间的排列顺序是固定的&#xff0c;要么从左到右排列&#xf…