前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HttpServletResponse

HttpServletResponse

作者头像
Albert_xiong
发布2021-06-21 17:45:01
5150
发布2021-06-21 17:45:01
举报
文章被收录于专栏:Mybatis学习

HttpServletResponse

功能:设置响应消息,由服务器创建。

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象、代表响应的一个 HttpServletResponse对象;

代码语言:javascript
复制
如果要获取客户端请求过来的参数:找request 	
如果要给客户端响应一些信息:找response

设置响应行

格式:HTTP/1.1 200 ok 1、设置状态码

代码语言:javascript
复制
setStatus(int sc)

2、设置响应头

代码语言:javascript
复制
setHeader(String name, String value)

设置响应体

1、获取字符输出流

代码语言:javascript
复制
PrintWriter getWriter()

2、字节输出流

代码语言:javascript
复制
ServletOutputStream getOutputStream()

使用输出流,将数据输出到客户端浏览器

重定向

简单方法:

代码语言:javascript
复制
// 设置状态码为302
response.setStatus(302);
// 设置响应头location
response.setHeader("location","/book/servlet2");

或者:

代码语言:javascript
复制
response.sendRedirect("/09_Response/responseServletDemo2");

web资源B收到客户端A的请求后,会通知AS客户端去访问两外一个web资源C,这个过程就叫重定向

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
@Override
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

        // 重定向
        response.setHeader("Location","/r/image");
        response.setStatus(302);
        
        // response.sendRedirect("/r/image");
    }

Rediret: 1、地址栏发生变化 2、重定向可以访问其他站点(服务器)的资源 3、重定向是两次请求。不能使用request对象来共享数据

如何解决中文乱码的问题?

代码语言:javascript
复制
//1.获取流对象,流的默认编码,ISO-8859-1 设置为:GBK
response.setCharacterEncoding("utf-8");
//2.告诉浏览器,服务器发送的消息体数据的编码 (直接写这句就行)
response.setHeader("content-type","text/html;charset=utf-8");

或者一般在开头就写好:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

设置编码的简单的写法:

代码语言:javascript
复制
response.setContentType("text/html;charset=utf-8");

路径问题

在这里插入图片描述
在这里插入图片描述

如何判断呢?判断定义的路径是给谁用的?判断请求将来从哪儿发出

在这里插入图片描述
在这里插入图片描述

几个小应用

1、浏览器输出消息 输出字节数据:

代码语言:javascript
复制
		// 设置编码的简单写法
        response.setContentType("text/html;charset=utf-8");
        // 获取字节输出流
        ServletOutputStream sos = response.getOutputStream();
        // 输出数据 (不用刷新和关闭)
        sos.write("<h1>hello RRRR</h1>".getBytes());

        sos.write("hello".getBytes());
        sos.write("你好".getBytes("utf-8"));

输出字符数据: response在一次响应完成后会自动销毁,流也会销毁

代码语言:javascript
复制
        // 设置编码的简单写法
        response.setContentType("text/html;charset=utf-8");
        // 获取字符输出流,response在一次响应完成后会自动销毁,流也会销毁
        PrintWriter pw = response.getWriter();
        // 输出数据 (不用刷新和关闭)
        pw.write("<h1>hello RRRR</h1>");
        pw.write("你好");

2、下载文件

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1、要获取下载文件的路径
        String realPath = "E:\\Data_study\\Programming_study\\javaWebMAVEN\\ServletResponse\\src\\main\\resources\\1.jpg";
        System.out.println(realPath);
        //2、下载的文件名是什么?
        String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);
        //3、设置想办法让浏览器知道能够支持我们下载的东西
        resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8"));
        //4、获取下载文件的输入流,就是把文件变成流
        FileInputStream fileInputStream = new FileInputStream(realPath);
        //5、创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];

        //6、获取OutputStream对象
        ServletOutputStream outputStream = resp.getOutputStream();
        //7、将FileOutputStream对象写在缓冲区,使用OutputStream将缓冲区中的数据输出
        while ((len = fileInputStream.read(buffer))>0){
            outputStream.write(buffer,0,len);
        }
        fileInputStream.close();
        outputStream.close();
    }

3、验证码功能

代码语言:javascript
复制
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如何让浏览器3秒刷新一次
        resp.setHeader("refresh","3");
        //在内存中创建一个图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_3BYTE_BGR);
        //得到图片
        //先有一支笔
        Graphics2D g = (Graphics2D) image.getGraphics();
        //设置图片的背景颜色
        g.setColor(Color.BLUE);
        g.fillRect(0,0,80,20);
        //给图片写数据
        g.setColor(Color.CYAN);
        g.setFont(new Font(null,Font.BOLD,20));
        g.drawString(makeNum(),0,20);

        //告诉浏览器,这个请求用图片的形式打开
        resp.setContentType("image/jpeg");

        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");

        //把图片写给浏览器
        boolean jpg = ImageIO.write(image, "jpg", resp.getOutputStream());

    }

//生成随机数
    private String makeNum(){
        Random random = new Random();
        String num = random.nextInt(99999999) + "";
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < 7 - num.length(); i++) {
            stringBuffer.append("0");
        }
        num = stringBuffer.toString()+num;
        return num;

    }

相应的web.xml配置:映射关系

代码语言:javascript
复制
  <servlet>
    <servlet-name>image_down</servlet-name>
    <servlet-class>com.xiong.servlet.ImageServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>image_down</servlet-name>
    <url-pattern>/image_down</url-pattern>
  </servlet-mapping>

重点:重定向和转发的区别

共同点是:页面都会实现跳转 特点:forward ---->这是转发

代码语言:javascript
复制
转发地址栏路径不变【307】
转发只能访问当前服务器下的资源
转发是一次请求。可以使用request对象来共享数据

特点:redirect ----->这是重定向

代码语言:javascript
复制
地址栏发生变化【302】
重定向可以访问其他站点(服务器)的资源
重定向是两次请求。不能使用request对象来共享数据
代码语言:javascript
复制
package com.xiong.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;

public class RequestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        //拿到前端的数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] parameterValues = req.getParameterValues("hobbys");
        //输出
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(parameterValues));

        resp.sendRedirect("/r/success.jsp");


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

相应的index.jsp页面 需要注意的是这个东西:action="${pageContext.request.contextPath}/login"

代码语言:javascript
复制
<%--
  Created by IntelliJ IDEA.
  User: 86152
  Date: 2021/5/26
  Time: 16:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login" method="post">
    用户名:<input type="username" name="username"> <br>
    密码:<input type="password" name="password"> <br>
    爱好:
    <input type="checkbox" name="hobbys" value="数学">数学
    <input type="checkbox" name="hobbys" value="语文">语文
    <input type="checkbox" name="hobbys" value="英语">英语
    <input type="checkbox" name="hobbys" value="地理">地理
    <br>
    登录:<input type="submit">
</form>

</body>
</html>

web.xml文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                      https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0"
         metadata-complete="true">


  <servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>com.xiong.servlet.RequestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
</web-app>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HttpServletResponse
    • 设置响应行
      • 设置响应体
        • 重定向
          • 路径问题
            • 几个小应用
              • 重点:重定向和转发的区别
              相关产品与服务
              验证码
              腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档