Java-Servlet技术入门笔记-3

简介: 五、HttpServletResponse类1、作用HttpServletResponse类和HttpServletRequest类一样,每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息。我们如果需要设置返回给客户端的信息,都可以通过它来设置。

五、HttpServletResponse类

1、作用

HttpServletResponse类和HttpServletRequest类一样,每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息。我们如果需要设置返回给客户端的信息,都可以通过它来设置。

2、两个输出流的说明

  • 字节流:getOutputStream()——常用于下载(传递二进制数据)
  • 字符流:getWrite()——常用于回传字符串(常用)

两个流同时只能使用一个,否则会报错

3、如何往客户端回传数据

回传字符串

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置服务器字符集
        response.setCharacterEncoding("UTF-8");
        //设置浏览器字符集
        response.setHeader("Content-Type","text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        writer.write("哈哈");
    }

设置字符集也可以使用以下方法

response.setContent-Type("text/html;charset=UTF-8")

此法会同时设置服务器和浏览器的字符集,并设置响应头

以上方法都应该在获取输出流之前调用

通过字节流回传字符串

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("txt/html;charset=utf-8")
        PrintWriter writer = response.getOutputStream();
        //获取字符串的字节数组
        writer.write("哈哈".getBytes("utf-8"));
        //默认编码是本机编码,也可以自己设置编码
    }

4、请求重定向

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aBJZQXEi-1636276443285)(C:\Users\Ken-Chy\Desktop\大二临时\00自学部分\后端\笔记\请求重定向.png)]

public class Response1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //第一种方法
        /*
            System.out.println("我曾来过");
            //设置状态码302,表示重定向(已搬迁)
            response.setStatus(302);
            //设置响应头,说明新的地址在哪
            response.setHeader("Location","http://localhost:8080/myfirst/response2");
        */
        //第二种方法(推荐使用)
        response.sendRedirect("https://www.baidu.com");
    }
}
public class Response2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("Content-Type","text/html;charset=UTF-8");
        response.getWriter().write("欢迎您的到来");
    }
}

请求重定向的特点

1.浏览器地址栏会发生变化

2.两次请求

3.不共享Request域中的数据

4.不能访问WEB-INF下的资源

5.可以访问工程外的数据

六、乱码问题详解

1、乱码原因

服务器编码和浏览器端解码使用的字符集不一致


浏览器端默认使用的编码和当前操作系统的语言环境有关,如果是中文的windows系统则默认是GBK或gb2312


如果服务器中字符流是自己new创建出来的,则也是与本机字符集一致,不会乱码


而当服务器通过response.getWriter()获取字符输出流,这个输出流是通过tomcat返回的,tomcat使用的编码是ISO-8859-1

2、解决方法

获取流对象之前,设置流的默认编码

response.setCharacterEncoding("utf-8");


告诉浏览器服务器发送的消息体数据的编码,建议浏览器使用该编码解码


response.setHeader("context-type", "txt/html;charset=utf-8")


简单形式


response.setContentType(“txt/html;charset=utf-8”);

七、验证码的实现

本质:图片

目的:防止恶意表单注册

步骤:

1.创建一个对象,在内存中生成图片(验证码图片对象)

2.美化图片

3.将图片输出到页面展示

@WebServlet("/checkcode")
public class CheckCode extends HttpServlet {
    int width = 100;
    int height = 50;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建验证码图片对象
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        //美化图片
        //填充背景色
        Graphics g = image.getGraphics();//画笔对象
        g.setColor(Color.PINK);//设置画笔颜色
        g.fillRect(0,0,width,height);
        //画边框
        g.setColor(Color.BLUE);
        g.drawRect(0,0,width-1,height-1);
        String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
        Random random = new Random();
        for(int i = 1; i <= 4; i++){
            int index = random.nextInt(str.length());
            //获取随机字符
            char ch = str.charAt(index);
            //生成验证码
            g.drawString(ch+"",width/5*i,height/2);
        }
        //画干扰线
        for(int i = 0; i < 6; i++){
            int x1 = random.nextInt(width);
            int x2 = random.nextInt(width);
            int y1 = random.nextInt(height);
            int y2 = random.nextInt(height);
            g.drawLine(x1,y1,x2,y2);
        }
        //将图片输出到页面展示
        ImageIO.write(image,"jpg",resp.getOutputStream());
    }
}

八、文件下载的实现

1、需求

1.页面显示超链接

2.点击超链接后弹出下载提示框或直接下载(取决于浏览器)

3.完成图片文件下载

2、分析

1.默认情况下:超链接指向的资源如果能被浏览器解析(如图片),则直接在浏览器中展示,如果不能解析(如视频),则弹出下载提示框(有的浏览器不会弹出,自动下载)

2.我们想要实现任何资源都弹出下载提示框

3.使用响应头设置资源的打开方式:content-disposition:attachment;filename=xxx(有的浏览器处理attachment不一定会弹出提示框)

attachment表示以附件的形式,filename表示文件名称

3、步骤


1.定义页面,编辑超链接href属性,指向servlet,传递资源名称filename

2.定义servlet

  1.获取文件名称

  2.使用字节输入流加载文件进内存

          1.找到文件的服务器路径

          2.用字节流关联

  3.指定response的响应头

           1.设置响应头类型

           2.设置响应头打开方式

   4.将数据写出到response输出流

@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求参数,文件名称
        String filename = req.getParameter("filename");
        //获取servletContext对象以获取文件的真实路径
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/jpg/" + filename);
        //用字节流关联文件
        FileInputStream in = new FileInputStream(realPath);
        //获取文件对应的MIME类型以设置响应头类型
        String mimeType = servletContext.getMimeType(filename);
        resp.setHeader("content-type",mimeType);
        //设置响应头的打开方式
        resp.setHeader("content-disposition","attachment;filename=" + filename);
        //将输入流的数据写出到输出流中
        ServletOutputStream outputStream = resp.getOutputStream();
        byte[] buff = new byte[1024 * 8];
        int len = 0;
        //read()读取一个字节,read(byte b[])读取b.length个字节的数据到b数组中,并返回读取到的字节数,如果没有字节可读了,即read()督导文件末尾了,则返回-1
        while((len = in.read(buff)) != -1){
            //public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流
            outputStream.write(buff,0,len);
        }
        in.close();
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <a href="/myfirst/jpg/11.jpg">查看图片嗷</a>
  <br>
  <a href="/myfirst/download?filename=11.jpg">下载图片嗷</a>
</body>
</html>
相关文章
|
16天前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
45 11
|
26天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
60 7
|
8天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
55 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
27天前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
|
29天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
29天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
26天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
34 2
|
2月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。