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{
    @Override
    protected 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);
//       * 获取URI
        String Uri = req.getRequestURI();
        System.out.println("请求的URI是"+Uri);
//        获取协议版本
        String version = req.getProtocol();
        System.out.println("请求的协议版本是"+version);
//        获取查询字符串
        String string = req.getQueryString();
        System.out.println("请求附带的查询字符串是"+string);
    }

    @Override
    protected 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);
//       * 获取URI
        String 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{
    @Override
    protected 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{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        设置Referer
        String 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{
    @Override
    protected 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;

    @Override
    protected 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请求流程
    @Override
    protected 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{

    @Override
    protected 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{
    @Override
    protected 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{
    @Override
    protected 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{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("资源类获取到"+req.getAttribute("msg"));
    }
}


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

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

相关文章

Mysql:Access denied for user ‘root‘@‘localhost‘ (using password:YES)解决方案

最近在配置Maven以及Mybatis时&#xff0c;连接localhost数据库时出现无法连接&#xff0c;用cmd测试时报错&#xff1a;Access denied for user ‘ODBC’‘localhost’ (using password: NO)&#xff0c;这个意思就是不允许远程访问&#xff0c;一开始笔者进入mysql试了一下是…

由于找不到d3dx9_42.dll,无法继续执行代码。重新安装程序可能会解决此问题

d3dx9_42.dll是一个动态链接库文件&#xff0c;它是Microsoft DirectX 9的一部分。这个文件包含了DirectX 9的一些函数和资源&#xff0c;用于支持计算机上运行基于DirectX 9的应用程序和游戏。它通常用于提供图形、音频和输入设备的支持&#xff0c;以及其他与图形和游戏相关的…

Playable 动画系统

Playable 基本用法 Playable意思是可播放的&#xff0c;可运行的。Playable整体是树形结构&#xff0c;PlayableGraph相当于一个容器&#xff0c;所有元素都被包含在里面&#xff0c;图中的每个节点都是Playable&#xff0c;叶子节点的Playable包裹原始数据&#xff0c;相当于输…

Vue+SpringBoot后台管理系统:Vue3+TypeScript项目搭建(一)

写在开始:一个搬砖程序员的随缘记录文章目录 一、Node安装二、Vue CLI安装三、相关的版本四、创建Vue3TypeScript项目五、Vue项目初始化六、项目启动 一、Node安装 查看Note版本 node -v查看npm版本 npm -v然后将npm升级至最新版本 npm -g install npm将npm下载源换至http:…

RS-232标准

目录 1、概述2、RS-232接口的特点3、RS-232接口协议【仿真】 1、概述 RS-232接口是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换…

C语言 二级指针和多级指针

什么是二级指针&#xff1f; 假设&#xff1a; int a 10;int * p &a;如上&#xff0c;p是指针变量&#xff0c;寄存的是a的地址&#xff0c;指向的是元素a 那么&#xff0c;指针变量p有地址吗&#xff1f;指针变量p的指针指向的是&#xff1f; int * * pp &p; …

【Spring Boot 源码学习】自动装配流程源码解析(上)

自动装配流程源码解析&#xff08;上&#xff09; 引言往期内容主要内容1. 自动配置开关2. 加载自动配置组件3. 自动配置组件去重 总结 引言 上篇博文&#xff0c;笔者带大家从整体上了解了AutoConfigurationImportSelector 自动装配逻辑的核心功能及流程&#xff0c;由于篇幅…

Visual Studio 2022安装教程(英文版)

文章目录 1.下载安装 1.下载 官网地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/ 选择第一个社区版本&#xff1a;Community 2022 安装 1.将下载好的文件保存到桌面&#xff0c;双击点开 2.等待visual studio installer配置好 3.点击安装后会来到配件选…

KeePass CVE-2023-32784:进程内存转储检测

KeePass CVE-2023-32784&#xff1a;进程内存转储检测 KeePass 是一种流行的开源密码管理器&#xff0c;可以在 Windows、Mac 或 Linux 上运行。该漏洞允许从正在运行的进程的内存中以明文形式提取主密钥。主密钥将允许攻击者访问所有存储的凭据 强烈建议更新到KeePass 2.54以…

机器学习基础之《特征工程(4)—特征降维》

一、什么是特征降维 降维是指在某些限定条件下&#xff0c;降低随机变量&#xff08;特征&#xff09;个数&#xff0c;得到一组“不相关”主变量的过程 1、降维 降低维度 ndarry 维数&#xff1a;嵌套的层数 0维&#xff1a;标量&#xff0c;具体的数0 1 2 3... …

认识http的方法、Header、状态码以及简单实现一个http的业务逻辑

文章目录 http的方法http状态码http重定向http常见Header实现简单业务逻辑Protocol.hppUtil.hppServer.hppServer.cc 效果 http的方法 方法说明支持的HTTP版本GET获取资源1.0/1.1POST传输实体主体1.0/1.1PUT传输文件1.0/1.1HEAD获得报文首部1.0/1.1DELETE删除文件1.0/1.1OPTIO…

【将回声引入信号中】在语音或音频文件中引入混响或简单回声,以研究回声延迟和回波幅度对生成的回波信号感知的影响(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【杨辉三角的两种解法——(超级详细)】

杨辉三角 1.杨辉三角简介&#x1f575;️ 杨辉三角&#xff0c;是二项式系数在三角形中的一种几何排列。在欧洲&#xff0c;这个表叫做帕斯卡三角形。帕斯卡&#xff08;1623----1662&#xff09;是在1654年发现这一规律的&#xff0c;比杨辉要迟393年&#xff0c;比贾宪迟600…

分布式 - 消息队列Kafka:Kafka消费者的分区分配策略

文章目录 1. 环境准备2. range 范围分区策略介绍3. round-robin 轮询分区策略4. sticky 粘性分区策略5. 自定义分区分配策略 1. 环境准备 创建主题 test 有5个分区&#xff0c;准备 3 个消费者并进行消费&#xff0c;观察消费分配情况。然后再停止其中一个消费者&#xff0c;再…

fastadmin 自定义搜索分类和时间范围

1.分类搜索&#xff0c;分类信息获取----php 2.对应html页面&#xff0c;页面底部加搜索提交代码&#xff08;这里需要注意&#xff1a;红框内容&#xff09; 图上代码----方便直接复制使用 <script id"countrySearch" type"text/html"><!--form…

python之matplotlib入门初体验:使用Matplotlib进行简单的图形绘制

目录 绘制简单的折线图1.1 修改标签文字和线条粗细1.2 校正图形1.3 使用内置样式1.4 使用scatter()绘制散点图并设置样式1.5 使用scatter()绘制一系列点1.6 python循环自动计算数据1.7 自定义颜色1.8 使用颜色映射1.9 自动保存图表练习题 绘制简单的折线图 绘制一个简单折线图…

GPT-3.5 人工智能还是人工智障?——西红柿炒钢丝球!!

人工智能还是人工智障&#xff1f;——西红柿炒钢丝球 西红柿炒钢丝球的 基本信息西红柿炒钢丝球的 详细制作方法材料步骤 备注幕后花絮。。。。。。。。。关于GPT-3.5&#xff0c;你的看法&#xff1a; 西红柿炒钢丝球的 基本信息 西红柿炒钢丝球是一道具有悠久历史的传统中式…

springboot汽车租赁后台java出租客户管理jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 springboot汽车租赁后台 系统有1权限&#xff1a;管理…

阿里巴巴面试题---考察对底层源代码的熟悉程度

题目如图所示: 很多人可能会觉得两个输出都会是false,因为我们都会觉得""比较的是引用类型的地址,虽然放入的值都一样但是重新创造了新对象,地址不一样,所以结果都是false. 然而,当我们运行程序会发现结果都是false. 下面,我们来分析为什么是这样的结果. 我们知道…

OneFlow 中的 Softmax

Softmax 是深度学习模型中的常见算子。PyTorch 的 Softmax 算子直接调用 cuDNN 的接口。而 OneFlow 内部针对输入数据的类别数量&#xff0c;采用3个 kernel 来分别处理&#xff0c;在多数情况下都可以获得比 cuDNN 更优的性能表现。测试结果可见 如何实现一个高效的Softmax CU…