HttpServletResponse

2021-06-21 17:45:01 浏览数 (1)

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>

0 人点赞