JavaWeb入门:HttpResponse和HttpRequest详解

目录
  • HttpResponse 讲解
    • HttpServletResponse概述:
    • Response运行流程
    • 设置响应行
    • 设置响应头
    • 一个小demo 实现刷新 页面累加
    • 设置字符编码 解决中文乱码问题
    • 重定向 redirect
    • request转发
    • 重定向和转发的区别
      • 文件下载
  • HttpRequest 讲解
    • HttpServletRequest概述
    • Request 运行流程
    • 获取请求携带的参数
    • 获取多个参数的值
    • 获得请求行的信息
    • request实现转发
    • request是一个域对象
    • ServletContext 作用域:
    • request作用域:
  • 总结

HttpResponse 讲解

HttpServletResponse概述:

​ 在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。

Response运行流程

响应头有很多这里只介绍常用的。

在浏览器可以按F12 抓包看响应头、请求头、具体的可以再查。

设置响应行

设置响应的状态码

/**
 * @Author: crush
 * @Date: 2021-05-09 19:35
 * version 1.0
 */
@WebServlet("/test3")
public class HttpResponseTest3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("设置状态码,前台通过判断状态码,来判断请求是否成功");
        resp.setStatus(404);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

测试

设置响应头

刷新 跳转页面

/**
 * @Author: crush
 * @Date: 2021-05-09 19:35
 * version 1.0
 */
@WebServlet("/test4")
public class HttpResponseTest4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置响应头 每1秒自动刷新
        System.out.println("设置响应头 每1秒自动刷新");
        resp.setHeader("Refresh", "1");
        //定时跳转 3秒后将自动跳转
//        resp.setHeader("Refresh","3;URL=hello.jsp");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

测试

一个小demo 实现刷新 页面累加

/**
 * response
 * @author Adimi
 */
@WebServlet("/test4")
public class ResponseTest4 extends HttpServlet {
    private static Integer id=1;
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("Refresh","1");
        PrintWriter writer = response.getWriter();
        id++;
        writer.print("id==>"+id);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

设置字符编码 解决中文乱码问题

/**
 * @Author: crush
 * @Date: 2021-05-09 19:35
 * version 1.0
 */
@WebServlet("/test1")
public class HttpResponseTest1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解决中文乱码问题
        // 设置响应头
        // 设置字符编码 resp.setCharacterEncoding("UTF-8");
        // 设置响应内容以什么格式展示到页面 什么编码格式 包含了设置字符编码
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print("中国,你好!!!");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

测试

重定向 redirect

/**
 * 重定向
 * @Author: crush
 * @Date: 2021-05-09 19:35
 * version 1.0
 */
@WebServlet("/test5")
public class HttpResponseTest5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("hello.jsp");
//        resp.setHeader("location","www.baidu.com"); 通过设置响应头转发
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

request转发

/**
 * 重定向
 * @Author: crush
 * @Date: 2021-05-09 19:35
 * version 1.0
 */
@WebServlet("/test5")
public class HttpResponseTest5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.sendRedirect("hello.jsp");
        req.getRequestDispatcher("hello.jsp").forward(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

重定向和转发的区别

文件下载

获取路径资源

String path=this.getServletContext().getRealPath("WEB-INF\\classes\\8.jpg");

读取资源

FileInputStream fileInputStream=new FileInputStream(path);

获取到文件名,路径在电脑上保存的形式是 \ \

String fileName=path.substring(path.lastIndexOf("\\")+1);

设置消息头告诉浏览器,我要下载1.png这个图片 设置编码

resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));

把读取到的内容回送给浏览器

 int len=0;
byte[] bytes=new byte[1024];
// ServletOutputStream 提供用于将二进制数据发送到客户端的输出流
ServletOutputStream servletOutputStream=resp.getOutputStream();
while((len=fileInputStream.read(bytes))>0) {
    servletOutputStream.write(bytes,0,len);
}

关闭资源

servletOutputStream.close();
        fileInputStream.close();

注:8.jpg 放在我的resources 文件夹下 但是这里需要写的是编译完8.jpg存放的位置

具体代码

/**
 * @Author: crush
 * @Date: 2021-05-09 19:40
 * version 1.0
 */
@WebServlet("/down")
public class ResponseDownFile extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取路径资源
        String path=this.getServletContext().getRealPath("WEB-INF\\classes\\8.jpg");
        //读取资源
        FileInputStream fileInputStream=new FileInputStream(path);
        //获取到文件名,路径在电脑上保存的形式是\\
        String fileName=path.substring(path.lastIndexOf("\\")+1);
        //设置消息头告诉浏览器,我要下载1.png这个图片
        // 该方式文件名为中文时会乱码
        //防止中文乱码
        resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
        //把读取到的内容回送给浏览器
        int len=0;
        byte[] bytes=new byte[1024];
        ServletOutputStream servletOutputStream=resp.getOutputStream();
        while((len=fileInputStream.read(bytes))>0) {
            servletOutputStream.write(bytes,0,len);
        }
        // 关闭资源
        servletOutputStream.close();
        fileInputStream.close();
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

HttpRequest 讲解

HttpServletRequest概述

​ 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service()方法中写了根据请求方式的不同调用doget()和dopost().

service方法中的request的类型是ServletRequest,而doGet/doPost方法的request类型HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大.

Request 运行流程

获取请求携带的参数

/**
 * @Author: crush
 * @Date: 2021-05-11 16:52
 * version 1.0
 */
@WebServlet("/request1")
public class RequestTest1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 这里是请求的参数名  必须是同名的
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>"+username+":"+password+"</h1>");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

获取多个参数的值

  @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置请求的编码  不然会乱码
        req.setCharacterEncoding("utf-8");
        Enumeration<String>  names = req.getParameterNames();
        while (names.hasMoreElements()) {
            String name = (String) names.nextElement();
            String[]  values = req.getParameterValues(name);
            System.out.println(name+":"+ Arrays.toString(values));
        }
    }

获得请求行的信息

/**
 * @Author: crush
 * @Date: 2021-05-11 16:52
 * version 1.0
 */
@WebServlet("/request3")
public class RequestTest3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获得请求的url
        StringBuffer requestURL = req.getRequestURL();
        System.out.println("请求的URL===>"+requestURL);
        // 获得请求的Servlet的路径
        String path = req.getServletPath();
        System.out.println("请求的Servlet的路径===>"+path);
        //返回发出此请求的HTTP方法的名称,例如GET,POST或PUT
        String method = req.getMethod();
        System.out.println("返回发出此请求的HTTP方法的名称==>"+method);
        //返回发送请求的客户端或最后一个代理的Internet协议(IP)地址
        String remoteAddr = req.getRemoteAddr();
        System.out.println("remoteAddr==>"+remoteAddr);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

request实现转发

/**
 * @Author: crush
 * @Date: 2021-05-11 16:52
 * version 1.0
 */
@WebServlet("/request2")
public class RequestTest2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 访问request2 转发到 request4去
        req.getRequestDispatcher("/request4").forward(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

request是一个域对象

request对象也是一个存储数据的区域对象,所以也具有如下方法:

setAttribute(String name, Object o)

getAttribute(String name)

removeAttribute(String name)

ServletContext 作用域:

创建:启动web应用程序的时候创建

销毁:关闭web应用程序的时候销毁

域的作用范围:整个web应用的启动周期

request作用域:

创建:访问时创建request

销毁:响应结束request销毁

域的作用范围:一次请求中

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • JavaWeb response和request对象原理及实例解析

    HttpServletResponse: HttpServletResponse对象服务器的响应.这个对象中封装了向客户端发送数据.发送响应头,发送响应状态码的方法. 字符编码格式: 方法一: // 设置response使用的码表,控制response向浏览器写出数据的码表 response.setCharacterEncoding("UTF-8"); // 指定浏览器打开客户端发送数据的码表 response.setHeader("content-type", &

  • 关于ThreadLocal对request和response的用法说明

    记得在一篇博文中看到描述threadLocal的一句话: ThreadLocal除了适用于多线程保证每条线程都有自己的变量副本外,还适用于在线程上下文中共享某些变量值. 这两种说法是有区别的.前者强调的是,使用ThreadLocal对副本做保护,避免同步.加锁,降低效率:后者强调的是,某个变量线程上下文中,A处用到.B处用到.C处用到,先在入口处set一个值,后使用ThreadLocal的get方法直接在需要用到的地方拿这个值. 项目中,最近理由cookie存值,使用到了threadLocal这

  • SpringBoot获取Request和Response方法代码解析

    通过静态方法获取,你也可以封装一个静态方法出来 @GetMapping(value = "") public String center() { ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request = servletRequestAttrib

  • 基于@RequestBody和@ResponseBody及Stringify()的作用说明

    @RequestBody和@ResponseBody及Stringify()的作用 首先,在项目的前后交互中json数据格式比较常用,普遍认为json格式比较简单,易于解析 如果我们在前端发送一个ajax请求的话 可以看到是用json字符串格式向后台传请求参数,那么后台需要采用@RequestBody来处理请求的json格式数据,将json数据转换为java对象,否则springmvc就不能解析导致传空参的结果 一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳

  • 基于Python中request请求得到的response的属性问题

    Python中request请求得到的response,即通过request得到的数据: import requests response = requests.get(https://www.jd.com/) response 的属性 1.返回状态码 response.status_code http请求的返回状态,2XX 表示连接成功,3XX 表示跳转 ,4XX 客户端错误 , 500 服务器错误 2.返回http响应的文本内容 response.text http响应内容的字符串(str)

  • JavaWeb入门:HttpResponse和HttpRequest详解

    目录 HttpResponse 讲解 HttpServletResponse概述: Response运行流程 设置响应行 设置响应头 一个小demo 实现刷新 页面累加 设置字符编码 解决中文乱码问题 重定向 redirect request转发 重定向和转发的区别 文件下载 HttpRequest 讲解 HttpServletRequest概述 Request 运行流程 获取请求携带的参数 获取多个参数的值 获得请求行的信息 request实现转发 request是一个域对象 ServletC

  • JavaWeb之会话技术案例详解

    会话技术     1. 会话:一次会话中包含多次请求和响应.            一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止     2. 功能:在一次会话的范围内的多次请求间,共享数据     3. 方式:           1. 客户端会话技术:Cookie           2. 服务器端会话技术:Session Cookie: 1. 概念:客户端会话技术,将数据保存到客户端 2. 快速入门:             1. 创建Cookie对象,绑定数据

  • Django零基础入门之常用过滤器详解

    引言: 前面讲过了Django中使用模板变量.使用很简单,那么有没有什么关于模板变量的骚操作呢? 答案是肯定有的,这就是本文要讲的--过滤器! 1.过滤器 (1)纯干货讲解: 作用: 对变量进行过滤.在真正渲染出来之前,过滤器会根据功能处理好变量,然后得出结果后再替换掉原来的变量展示出来. 语法:{{ fruits|lower }} 管道符号进行链式调用(可以理解为嵌套使用!),比如实现一个功能,先把所有字符变成小写,再把第一个字符转换成大写. 语法:{{fruits|lower|capfirs

  • Python入门_条件控制(详解)

    条件控制其实就是if...else...(如果...条件是成立的,就做...:反之,就做...)的使用,其基本结构是: 具体看下面这个例子: def account_login(): # 定义函数 password = input('请输入密码:') # 输入密码 if password == '12345': # 如果输入密码是12345,则登录成功 print('登录成功') else: print('密码有误,请重新输入') # 否则提示密码有误,请重新输入 account_login()

  • JavaWeb框架MVC设计思想详解

    Servlet:在Servlet中拼接html内容 JSP:在html中拼接java JSP+JavaBean:利用javaBean将大量的代码提取走 Servlet+JSP+JavaBean:Servlet是控制器,javabean封装数据,jsp展示数据 javaweb的经典三层结构: dao javabean servlet ==> service jsp javabean: javabean是一个遵循特定写法的java类 1.这个java类必须有一个无参的构造函数 2.属性必须私有化 3

  • JavaWeb BeanUtils信息类原理详解

    这篇文章主要介绍了JavaWeb BeanUtils信息类原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.BeanInfo 1.BeanInfo是JavaBean类的信息类,一个javaBean的信息封装在对应beanInfo对象中 2.要获取到beanInfo,一般通过一个内省类Introspector的一个方法getBeanInfo(Class<T> beanClass),给个javaBean的类型就会返回对应的beanInf

  • C语言入门之基础知识详解

    一.思维导图 内容不限于此思维导图 二.环境搭建 对于老手,自动跳过这一趴吧,或者也可以看一下我有没有啥纰漏,毕竟小白需要这一趴. 编译器很多,大部分老师会在学生学习C语言的时候推荐使用VC,不带语言提示器的那种,说是可以提高学生的编码能力.我也不知道到底是不是这么一回事儿.我推荐使用VS,这样学的快,函数记不住的问题很严重吗?项目的车轮碾压过去,再记不住也得记住吧!!! 更何况这个系列到后面是会有需要用文本文件编程写项目的阶段. 下载VS2019社区版,不要标新立异选那些最新版的,出了问题到时

  • Python入门之基础语法详解

    一.我的经历及目标 在学习python之前:我学习过C/C++,在学校期间做过很多的项目,已经有两年多了,算是对C/C++非常的熟悉了,精通不敢说,但是对于面向过程和面向对象有很深刻的认识,做过很多的开发,学习数据库,MFC, QT, linux下利用C/C++进行服务器的开发,QT环境下进行模拟QQ的开发- 听说python挺火的,我也来尝试一门新的语言,python和c有80%的相似性,毕竟是用C来开发的语言,但是是面向过程的一门语言,有C++的继承等相似的特性,感觉更有信心学会它了,毕竟可

  • C语言入门篇--关键字static详解

    目录 1.修饰局部变量 1.1作用 1.2举例 (1)不加static (2)加static (3)静态局部变量的初始化只会进行一次 2.修饰全局变量 2.1作用 2.2举例 (1)不加static (2)加static 3.修饰函数 3.1作用 3.2举例 (1)不加static (2)加static 1.修饰局部变量 1.1作用 ststic修饰局部变量,会改变局部变量的生命周期,不改变作用域: 生命周期:和全局变量一样具有全局性,但在内存中的位置没有改变,还在在静态存储区中. 作用域:作用

  • Django零基础入门之模板变量详解

    引言: 我们在页面上会看到,谁登录的就会显示谁的信息,那么这个页面上的变量信息是怎样实现的呢? 这就是本文要讲述的内容--Django中的模板变量! 1.模板变量! 可以在前端页面中使用模板变量来取数据库中的数据,实现前端页面数据动态显示. (1)模板变量使用规则:(在HTML模板中使用!) 语法: {{ 变量名 }} 命名由字母和数字以及下划线组成,不能有空格和标点符号 可以使用字典.类对象.方法.函数.列表.字符串 不要和python或django关键字重名 注意: 如果data是一个字典,

随机推荐