Javaweb中的Request(请求)和Response(响应)

这篇具有很好参考价值的文章主要介绍了Javaweb中的Request(请求)和Response(响应)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、概念

二、请求(Request)

1.例子简介

2.Request继承体系

3.Request获取请求数据  

(1)请求行

(2)请求头

(3)请求体 

4.优化请求体参数的获取

5.解决请求参数乱码问题 

6.请求转发 

请求转发的特点

三、响应(Response)

1.Response继承体系

2.设置响应数据功能介绍

(1)响应行

(2)响应头

(3)响应体 

3.重定向

(1)实现方式:

(2)重定向特点 

4.资源路径问题 

(1)怎么判断谁使用?

(2)怎么使用虚拟目录呢?

5.Response响应字符数据

6.Response响应字节数据


一、概念

1.当我们用浏览器访问服务器的时候,服务器(tomcat)会用servlet方法去处理我们的请求并做出响应

二、请求(Request)

1.例子简介

用户使用get(地址栏可以看到具体信息)或者post(地址栏可以看到具体信息)请求访问时候里面都会携带很多数据,例如账户名密码这些,那么Request就会获取这些数据。

2.Request继承体系

爷爷----SevletRequest:Java对象提供的请求对象根接口

父亲----HttpServleRequest:Java提供的对Http协议封装的请求对象接口

儿子----RequestFacade:Tomcat定义的实现类 

ps:使用Request时候使用HttpServleRequest就好了

3.Request获取请求数据  

请求数据分为3部分

(1)请求行

获取请求方式(GET):getMethod

获取虚拟目录(项目访问路径):getContextPath

获取URL(统一资源定位符):getRequestURL

获取URI(统一资源标识符):getRequestURI

获取请求参数(GET方式):getQueryString

(2)请求头

获取请求头:getHeader

(3)请求体 

字节或者字符输入流读取,具体看要要求参数 

 具体代码

调用方式就是用注解调用ddd

package com.project.JavaScript;

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.BufferedReader;
import java.io.IOException;

@WebServlet("/ddd")
public class aa extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //一、获取请求行
        //1.getMethod:获取请求方式:GET
        String method = req.getMethod();
        System.out.println(method);

        //2.getContextPath:获取虚拟目录
        String contextPath = req.getContextPath();
        System.out.println(contextPath);

        //3.getRequestURL:获取URL(统一资源定位符)
        StringBuffer requestURL = req.getRequestURL();
        System.out.println(requestURL);

        //4.getRequestURI:获取统一资源标识符
        String requestURI = req.getRequestURI();
        System.out.println(requestURI);

        //5.getQueryStrin:获取请求参数(GET方式)
        String queryString = req.getQueryString();
        System.out.println(queryString);

        //二获取请求头
        // 6.获取请求头:user-agen--浏览器的版本信息
        String agent = req.getHeader("user-agent");
        System.out.println(agent);

        //三、获取请求体
        //1.获取字节输入流
        BufferedReader reader = req.getReader();
        //2.读取数据
        String line = reader.readLine();
        System.out.println(line);

    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如果有post请求就让它去doGet里面找吧
        this.doGet(req,resp);
    }
}

 如下是为了第三的请求体有东西调用而写的一个html表单

调用方式:运行的网页地址加上这个html名字(req.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <!--第一个填虚拟目录名称:/maven_java_war/ddd,第二个填的是发送的是get还是post-->
<form action="/maven_java_war/ddd" method="post">
    <!--账号输入框-->
    <input type="text" name="username">
    <!--密码输入框-->
    <input type="password" name="password">
    <!--提交按钮-->
    <input type="submit">
</form>

</body>
</html>

运行结果

POST
/maven_java_war
http://localhost:8080/maven_java_war/ddd
/maven_java_war/ddd
null


Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46


username=666&password=666666 

4.优化请求体参数的获取

上面在获取请求体的时候还不是很好,现在要优化,把请求体中的数据放到Map集合中,再通过map集合的方式获取出来

获取全部Map集合的方法:getParameterMap

获取数组Map集合的方法:getParameterValues

获取单个Map集合的方法:getParameter

被获取的HTML代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <!--第一个填虚拟目录名称:/maven_java_war/ddd,第二个填的是发送的是get还是post-->
<form action="/maven_java_war/ddd" method="post">
    <!--账号输入框-->
    <input type="text" name="username">
    <!--密码输入框-->
    <input type="password" name="password">
    <!--  选项框  -->
    <input type="checkbox" name="hobby" value="1">睡觉
    <!--提交按钮-->
    <input type="submit">
</form>

</body>
</html>

获取代码

package com.project.JavaScript;

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.Map;

@WebServlet("/ddd")
public class aa extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //一、获取全部
        //1.获取所有参数的Map集合
        Map<String,String[]> map = req.getParameterMap();
        //2.遍历快捷键:iter+回车
        for (String key : map.keySet()) {
            System.out.println("key为:"+key);

            //3.获取值
            String[] values = map.get(key);
            //4.遍历快捷键:iter+回车
            for (String value : values) {
                System.out.println("map集合的全部为:"+value);
            }
        }
        System.out.println("===========分界线===============");
        //二、根据key,也就是键获取数组
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println("这是第二种方式的运行结果"+hobby);
        }
        System.out.println("===========分界线===============");
        //三、根据key,获取单个值
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("用户名为:"+username);
        System.out.println("密码为:"+password);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如果有post请求就让它去doGet里面找吧
        this.doGet(req,resp);
    }
}

运行结果

key为:username
map集合的全部为:zhangsan
key为:password
map集合的全部为:1433223dadqw
key为:hobby
map集合的全部为:1
===========分界线===============
这是第二种方式的运行结果1
===========分界线===============
用户名为:zhangsan
密码为:1433223dadqw

 

5.解决请求参数乱码问题 

解决请求参数中文乱码(post和get)_云边的快乐猫的博客-CSDN博客

 

6.请求转发 

请求转发(forward):一种在服务器内部的资源跳转方式。当访问了资源A,资源A处理了一部分,然后在转发给资源B处理。

请求转发的特点

(1)浏览器地址栏路径不发生变化

(2)只能转发到当前服务器的内部资源

(3)一次请求,可以在转发的资源使用request共享数据

转发的代码

//tt是下一步要转到的目标类的注解

request.getRequestDispatcher("tt").forward(request,response);

 其他方法

void setAttribute(String name,Object o);//储存数据到request域中

Object getAttribute(String name);//根据key,获取值

void removeAttribute(String name);//根据key,删除键值对

三、响应(Response)

1.Response继承体系

爷爷----SevletResponse:Java对象提供的请求对象根接口

父亲----HttpServleResponse:Java提供的对Http协议封装的请求对象接口

儿子----ResponseFacade:Tomcat定义的实现类 

ps:使用Request时候使用ttpServleResponse就好了

2.设置响应数据功能介绍

(1)响应行

例子:HTTP/1.1 200 OK 

ps:HTTP/1.1是服务器版本,200是响应状态码,OK就是没问题

设置响应状态码:void setStatus(int sc);

(2)响应头

例子:Content-Type:text/html

设置响应头键值对:void setHeads(String name,String value);

(3)响应体 

例子:<html><head>head><body><body></html>

获取字符输出流:PrintWriter  getWriter();

获取字节输出流:ServletOutputStream();

3.重定向

一种资源跳转方式(例如访问资源A,A说我处理不了,我告诉你资源B的地址,你去找它处理吧)。那怎么处理不了怎么通知对方呢,就是用状态码302代表说我处理不了,对方地址是:响应头location:xxxxxx 

(1)实现方式:

resp.setStatus(302);

resp.setHeader("location","资源B的路径"); 

这是简写方式 

        //重定向
        //设置响应头:baidu是跳转目标类的注解
        response.sendRedirect("baidu");

(2)重定向特点 

浏览器地址栏路径发生变化

可以重定向到任意位置的资源(服务器内外部都可以)

两次请求,不能在多个资源使用request共享数据 

4.资源路径问题 

浏览器使用:需要加虚拟目录(项目访问路径)

服务端使用:不需要加虚拟目录

(1)怎么判断谁使用?

有请求(request)或者响应(response)这些都是服务端使用。但是转发是个例外。其余的都是浏览器使用(标签什么的)

(2)怎么使用虚拟目录呢?

一般在pom.xml文件配置的path里面可以设置,但是一般不建议,这样耦合度太高

java httpservletresponse 怎么获取请求头和返回参数,# JavaWeb,servlet,服务器,response,request,请求响应

所以要把里面我的默认访问/a删掉。 然后在要访问的类里面设置一个动态虚拟访问路径语句

        //重定向
        //动态获取虚拟目录
        String contextPath = request.getContextPath();
        //设置响应头:baidu是跳转目标类的注解。然后动态虚拟目录+注解
        response.sendRedirect(contextPath+"/baidu");

5.Response响应字符数据

        //1.设置字符集编码解析
        response.setContentType("text/html;charset=utf-8");
        //2.获取字符输入流
        PrintWriter writer = response.getWriter();

        //写入中文
        writer.write("你好");
        //写入标签
        writer.write("<h1>aa</h1>");

6.Response响应字节数据

(1) 相对复杂写法

        //1.字节输入流读取文件
        FileInputStream fis = new FileInputStream("D:\\图片\\个人\\杂物\\小图片.png");

        //2.获取response字节输出流
        ServletOutputStream os = response.getOutputStream();

        //3.完成流的复制
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = fis.read(bytes))!=-1){
            os.write(bytes,0,len);
        }

(2)简单的写法

        //1.字节输入流读取文件
        FileInputStream fis = new FileInputStream("D:\\小图片.png");

        //2.获取response字节输出流
        ServletOutputStream os = response.getOutputStream();

        //3.使用便捷的方式完成流的copy
        IOUtils.copy(fis,os);
        //关闭流
        fis.close();

ps:使用这个简单的写法要pom里面导入对应的maven。要不然爆红用不了的文章来源地址https://www.toymoban.com/news/detail-721315.html

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

到了这里,关于Javaweb中的Request(请求)和Response(响应)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小黑子—JavaWeb:第四章 Request与Response

    Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中 使用request对象,查阅JavaEE API文档的 HttpServletRequest 接口 请求数据分为3部分: 1、请求行: String getMethod():获取请求方式:GET String getContextPath():获取虚拟目录(项目访问路径):/request-demo String

    2024年02月14日
    浏览(42)
  • HttpServletResponse对应postman中的响应

    代码中如图所示入参 状态码如图所示位置 个人笔记使用

    2024年02月12日
    浏览(42)
  • 【仿写tomcat】四、解析http请求信息,响应给前端,HttpServletRequest、HttpServletResponse的简单实现

    在解析请求之前我们要思考一个问题,我们解析的是其中的哪些内容? 对于最基本的实现,当然是 请求类型 , 请求的url 以及 请求参数 ,我们可以根据请求的类型作出对应的处理,通过url在我们的mapstore中找到servlet, 那么请求的参数我们是不是还没有储存的地方呢? 所以

    2024年02月12日
    浏览(40)
  • Javaweb——Request通用方式获取请求参数

    在旧的请求参数的获取方式当中,需要对两种不同的请求方式做两份不同的代码逻辑,现在就是要统一操作,比如在post里面调用get的代码   如下图的操作 先获取请求方式,对于不同的方式都先把请求参数获取出来,这里request还完成了对字符串的解析,对和=进行切割 之后将

    2024年02月13日
    浏览(52)
  • [JavaWeb]【六】web后端开发-请求响应

    目录 一  引子 二 请求 2.1 Postman 2.1.1 安装 2.1.2 创建工作空间  2.1.3 添加接口 2.2 简单参数 2.2.1 原始方式(不推荐)  2.2.2 SpringBoot方式-GET(参数名与形参变量名相同)  2.2.3 SpringBoot方式-POST(参数名与形参变量名相同) 2.2.4 SpringBoot方式-POST(参数名与形参变量名不相同) 2.2.5 @Req

    2024年02月12日
    浏览(48)
  • JavaWeb学习路线(4)——请求响应与分层解耦

    一、概述 二、请求 (一)概念: 全名为HttpServletRequest,其目标是获取请求数据。 (二)简单请求: web端发送基本数据类型数据到服务器进行处理。 1、获取方式 (1)原始方法: 通过参数HttpServletRequest获取请求数据 ** 1、服务端代码** ** 2、请求端** (2)SpringBoot接收参数:

    2024年02月09日
    浏览(39)
  • Java 中,使用 HttpServletResponse 对象将服务器上的文件响应到客户端浏览器进行下载

    在服务器端,使用 FileInputStream 打开要下载的文件,并将其读取到字节数组中。 2.设置 HttpServletResponse 的响应头信息,告诉浏览器需要下载文件,并指定文件名和文件类型 其中,Content-Type 表示响应内容的类型,这里设置为 application/octet-stream,表示二进制流。Content-Length 表示

    2024年02月13日
    浏览(68)
  • HTTP请求头响应头的Content-type和Response Type是什么?

    写代码写着写着发现这些HTTP的概念还不清楚,缕一缕。 根据MDN的解释 Content-Type 实体头部用于指示资源的 MIME 类型 MIME 类型,即媒体类型,是一种标准,用来表示文档、文件或字节流的性质和格式。 根据MDN的解释: response.type的值可以是: basic 标准值,同源响应 cors 接收到一

    2024年02月15日
    浏览(55)
  • 微信小程序封装request请求,包含请求拦截器,响应拦截器和请求重试功能

    在发送请求之前,先判断用户是否有token,没有就执行登陆请求,将token保存,然后再执行原来请求; 拥有token,就直接执行请求;但是用户的这个token可能是过期的,如果执行请求发现用户登陆过期,就统一返回40001,然后对40001的响应统一处理,执行登陆请求,再执行原来请

    2024年02月13日
    浏览(50)
  • idea 中的gitee出现 Incorrect credentials. Request response: 401 Unauthorized

    idea 中的gitee出现 Incorrect credentials. Request response: 401 Unauthorized 如图   报错信息内容,凭据不正确,请求未经授权 401 1.检查 Login:不是账号 , 一般指gitee绑定的邮箱地址  , 有人用@里面的东西不包括@符号 2.手动添加凭据如下图 :      点击添加凭据 添加凭证   注意: I

    2024年02月11日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包