Request&Response

Posted 贝贝子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Request&Response相关的知识,希望对你有一定的参考价值。

HttpServletResponse

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

  • 如果要获取客户端请求过来的参数:找HttpServletRequest
  • 如果要给客户端响应一些信息:找HttpServletResponse

简单分类

负责向浏览器发送数据的方法

ServletoutputStream getoutputStream() throws IOException;
PrintWriter getWriter() throws IOException;(中文最好用这个)

负责向浏览器发送响应头的方法

void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String name, long date);
void addDateHeader(String name, long date);
void setHeader(String name, String value);
void addHeader(String name, String value);
void setIntHeader(String name, int value);
void addIntHeader(String name, int value);

常见应用

1.向浏览器输出消息

2.下载文件

​ 1.要获取下载文件的路径

​ 2.下载的文件名是啥?

​ 3.设置想办法让浏览器能够支持下载我们需要的东西

​ 4.获取下载文件的输入流

​ 5.创建缓冲区

​ 6.获取OutputStream对象

​ 7.将FileOutputStream流写入到buffer缓冲区

​ 8.使用OutputStream将缓冲区的数据输出到客户端

通过response.getOutputStream的方式下载文件,为文件设置文件名:

//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型  
response.setContentType("multipart/form-data");  
//2.设置文件头:最后一个参数是设置下载文件名(假如我们叫a.pdf)  
response.setHeader("Content-Disposition", "attachment;fileName="+"a.pdf");  
public class FileServlet extends HttpServlet 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        // 1.要获取下载文件的路径
        String realPath = "D:\\\\java_work\\\\javaweb-test\\\\response\\\\src\\\\main\\\\resources\\\\贝贝子.png";
        System.out.println("下载文件的路径"+realPath);
        // 2.下载的文件名是啥?
        String filename = realPath.substring(realPath.lastIndexOf("\\\\") + 1);
        //3.设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西(中文文件名需要使用:URLEncoder.encode(filename,"UTF-8"),否则可能乱码或出现编码问题)
        resp.setHeader("Content-Disposition", "attachment;fileName="+ URLEncoder.encode(filename,"UTF-8"));
        // 4.获取下校文件的输入流
        FileInputStream in = new FileInputStream(realPath);
        // 5.创建缓冲区
        int len=0;
        byte[] buffer = new byte[1024];
        // 6.获取Outputstream对象
        ServletOutputStream out = resp.getOutputStream();
        //7.将FiLeoutputstream流写入到buffer缓冲区,使用outputStream将缓冲区中的数擦输出到客户端!
        while((in.read(buffer))>0)
            out.write(buffer,0,len);
        
      in.close();
      out.close();
    
	@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        doGet(req, resp);
    


3、验证码功能

验证怎么来的?

  • 前端实现
  • 后端实现,需要用到Java的图片类,生成一个图片
package com.bbz.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class ImageServlet extends HttpServlet 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        //如何让浏览器5秒自动刷新一次
        resp.setHeader("refresh","3");
        //在内存中创建一个图片
        BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
        //得到图片
        Graphics2D g=(Graphics2D) bufferedImage.getGraphics();
        //设置图片背景颜色
        g.setColor(Color.yellow);
        g.fillRect(0,0,80,20);
        //给图片写数据
        g.setColor(Color.BLUE);
        g.setFont(new Font(null,1,20));
        g.drawString(makeNum(),0,20);
        //告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("image/png");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");

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

    
    //生成随机数
    private String makeNum()
        Random random=new Random();
        String num = random.nextInt(9999999) + "";
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<7- num.length();i++)
            sb.append("0");
        	//保证验证码一定是7位数
        num = sb.toString() + num;
        return num;
    

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


4.重定向

一个web资源B收到客户端A请求后,通知客户端A访问另一个web资源C,该过程叫重定向。
常见场景:用户登录;

	public void sendRedirect(String location) throws IOException;

重定向:

public class RedirectServlet extends HttpServlet 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        /*重定向原理
        resp.setHeader("Location","/resp/img");
        resp.setStatus(302);
         */
        resp.sendRedirect("/resp/img");//重定向
    

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

重定向与转发的异同点:

  • 相同:
    • 页面都会跳转
  • 不同:
    • 请求转发的时候,URL不会产生变化 307
    • 重定向的时候,URL地址栏会发生变化 302

登录重定向的小demo:
创建处理登录重定向的Servlet:

public class RequestTes extends HttpServlet 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        //处理请求
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        System.out.println(username+":"+password);

        //重定向的时候一定要注意路径问题
        resp.sendRedirect("/resp/success.jsp");

    

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

在index.jsp中添加登录提交:

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<html>
<body>
<h2>Hello World!</h2>

    <%-- 这里提交的路径,需要寻找到项目的路径 --%>
    <%-- $pageContext.request.contextPath代表当前项目 --%>
    <form action="$pageContext.request.contextPath/request" method="get">
        用户名: <input type="text" name="username" /> <br/>
        密  码: <input type="password" name="password" /> <br/>
        <input type="submit">
    </form>

</body>
</html>

注:在jsp中指定编码格式可以防止中文乱码。

HttpServletRequest

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,可以获取请求的信息

  • getContextPath() 获取当前路径
  • getHeader() 获取头信息
  • getHttpServletMapping() 获取请求的路径
  • getRequestURL() 获取请求的URL

获取前端传递的参数及请求转发:

	request.getParameter(String s) //取单个值
	request.getParameterValues(String s) //取多个值

接受登录信息的servlet文件:

package com.bbz.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 LoginServlet 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[] hobbys = req.getParameterValues("hobbys");

        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbys));

        // 重定向
        // resp.sendRedirect("/resuest-01/success.jsp");
        // 通过请求转发, 此处的 / 就是当前web应用,不需要在多写了。
        req.getRequestDispatcher("/success.jsp").forward(req, resp);

    

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

登录的jsp页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Login</title>
</head>
<body>

    <h1>登录</h1>
    <div style="text-align: center">
<%-- 这里表单表示的意思:以post方式提交表单,提交到我们的login请求       --%>
        <form action="$pageContext.request.contextPath/login" method="post">
            用户名:<input type="text" 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>
    </div>
</body>
</html>

以上是关于Request&Response的主要内容,如果未能解决你的问题,请参考以下文章

Request & Response

request&response

11-Request&Response

request&response笔记

Request & response

Request&Response