怀旧网个人博客网站地址:怀旧网,博客详情:Response 和 Request 介绍

1、HttpServletResponse
1、简单分类


2、文件下载

通过Response下载文件数据
放一个文件到resources目录

编写下载文件Servlet文件
public class FileDownServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 1.获取要下载文件的路径
        String filePath = "D:\\Java Web\\JavaWebDemo\\ServletDemo\\src\\main\\resources\\1.png";
        // 2.获取文件的下载名(客户端下载保存的时候的名字)
        String downFileName = filePath.substring(filePath.lastIndexOf("\\")+1);
        // 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码
        resp.setHeader("Content-Disposition", "attachment;filename=" + downFileName);
        // 4.获取下载文件的输入流
        FileInputStream fis = new FileInputStream(filePath);
        // 5.创建缓冲区
        int len;
        byte[] buffer = new byte[1024];
        // 6.获取OutputStream对象
        ServletOutputStream sos = resp.getOutputStream();
        // 7.将文件流输出到ServletOutputStream中
        while((len = fis.read(buffer)) != -1){
            // 8.将数据输出到客户端
            sos.write(buffer, 0, len);
        }
        // 9.关闭文件的输入输出流
        sos.close();
        fis.close();
    }
}	
 
编写下载映射xml
<servlet>
    <servlet-name>downFile</servlet-name>
    <servlet-class>com.huaijiuwang.servlet.FileDownServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>downFile</servlet-name>
    <url-pattern>/downFile</url-pattern>
</servlet-mapping>
 
访问测试:localhost:8080/downFile

下载成功(再次测试下载文件名为中文情况)
修改代码
// 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码
resp.setHeader("Content-Disposition", "attachment;filename=" + "怀旧.png");
 
访问测试:

文件名输出失败,修改代码,设置下载文件的编码
// 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("怀旧.png", "utf-8"));
 
再次测试:

显示成功!
3、验证码功能
实现目的:在浏览器端创建一个图片生成验证码,让图片3秒刷新一次:
编写Servlet:
public class ToImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 设置浏览器3秒刷新一次
        resp.setHeader("refresh", "3");
        // 在内存中创建一个图片对象 · 参数(1.图片宽度 2. 图片长度 3.图片颜色渲染类型)
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
        // 得到图片对象
        Graphics2D graphics = (Graphics2D) image.getGraphics();
        // 设置图片的背景颜色
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, 80, 20);
        // 给图片写入数据
        // 设置当前画笔颜色
        graphics.setColor(Color.GREEN);
        // 设置当前画笔字体
        graphics.setFont(new Font(null, Font.BOLD, 20));
        // 设置当前的内容
        graphics.drawString(getData(), 0, 20);
        // 响应浏览器,当前界面以图片形式打开
        resp.setContentType("image/jpeg");
        // 将当前图片输出到前端
        ImageIO.write(image, "jpg", resp.getOutputStream());
    }
    public static String getData(){
        Random random = new Random();
        return String.format("%06d", random.nextInt(999999));
    }
}
 
编写访问映射xml
<servlet>
    <servlet-name>image</servlet-name>
    <servlet-class>com.huaijiuwang.servlet.ToImageServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>image</servlet-name>
    <url-pattern>/image</url-pattern>
</servlet-mapping>
 
访问测试:


格3秒就自动刷新
4、实现重定向


编写代码实现重定向:
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect("/image");
    }
}
 
编写访问映射文件
<servlet>
    <servlet-name>Redirect</servlet-name>
    <servlet-class>com.huaijiuwang.servlet.RedirectServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Redirect</servlet-name>
    <url-pattern>/red</url-pattern>
</servlet-mapping>
 
访问测试:


自动重定向到了image路径
修改tomcat配置


添加一个前缀
重新测试重定向
访问路径:localhost:8080/hj/red 结果如下,重定向的地址没有带hj前缀,所以找不到

因为访问image需要带上hj前缀

这样就可以访问了,所以在重定向的时候,我们需要加上前面的前缀才可以,修改代码
public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.sendRedirect(this.getServletContext().getContextPath() + "/image");
    }
}
 
再次访问localhost:8080/hj/red,得到结果如下

重定向成功,并且带上了前缀
并且状态为302代表重定向,并且url也改变了

2、HttpServletRequest
1、HttpServletRequest 介绍
-  
HttpServletRequest 对象代表客户端的请求
 -  
当客户端/浏览器通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中
 -  
通过这个对象的方法,可以获得客户端这些信息
 
2、HttpServletRequest 常用方法
-  
getRequestURI() 获取请求的资源路径
 -  
getRequestURL()获取请求的统一资源定位符(绝对路径)
 -  
getRemoteHost() 获取客户端的 主机, getRemoteAddr()
 -  
getHeader() 获取请求头
 -  
getParameter() 获取请求的参数
 -  
getParameterValues() 获取请求的参数(多个值的时候使用), 比如 checkbox, 返回的数组
 -  
getMethod() 获取请求的方式 GET 或 POST
 -  
setAttribute(key, value); 设置域数据
 -  
getAttribute(key); 获取域数据
 -  
getRequestDispatcher() 获取请求转发对象, 请求转发的核心对象
 
3、测试Request获取前端数据
编写处理登录请求的servlet
public class RequestTestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取用户输入的数据
        String userName = req.getParameter("userName");
        String passWord = req.getParameter("passWord");
        // 判断用户输入
        if("huaijiu".equals(userName) && "123456".equals(passWord)){
            // 登录成功重定向success地址
            resp.sendRedirect(this.getServletContext().getContextPath() + "/success.jsp");
        }else{
            // 登录失败重定向error地址
            resp.sendRedirect(this.getServletContext().getContextPath() + "/error.jsp");
        }
    }
}
 
编写重定向成功或者失败地址:



添加jsp所需maven依赖
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2</version>
</dependency>
 
编写发起请求的jsp代码 (index.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>登录</title>
  </head>
  <body>
<%--  "${pageContext.request.contextPath} 获取前缀访问路径/hj--%>
    <form action="${pageContext.request.contextPath}/login" method="get">
      <input style="font-size: 20px;" type="text" name="userName" /><br />
      <input style="font-size: 20px;" type="password" name="passWord" /><br />
      <input type="submit" value="登录" />
    </form>
  </body>
</html>
 
访问测试:
输入错误的用户名或密码


成功重定向到了登录失败界面
输入正确的用户名密码


返回到登录成功的界面。
4 、HttpServletRequest 获取参数,请求转发


和对应的response基本就是相对的
获取参数:

常用的就两个:
- getParameter() 获取一个参数数据
 - getParameterValues() 当传过来的一个数据名称但是数据多个的时候,可以用这个方法,例如前端传过来的多选框
 
4.1、测试获取参数
编写前端代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>登录</title>
  </head>
  <body>
<%--  "${pageContext.request.contextPath} 获取前缀访问路径/hj--%>
    <form action="${pageContext.request.contextPath}/login" method="post">
      用户名:<input style="font-size: 20px;" type="text" name="userName" /><br />
      密码:<input style="font-size: 20px;" type="password" name="passWord" /><br />
        爱好:<input type="checkbox" value="学习" name="hobby" />学习
        <input type="checkbox" value="唱歌" name="hobby" />唱歌
        <input type="checkbox" value="跳舞" name="hobby" />跳舞
        <input type="checkbox" value="篮球" name="hobby" />篮球<br />
      <input type="submit" value="登录" />
    </form>
  </body>
</html>
 
后台获取数据代码:
public class RequestTestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取一个数据
        String userName = req.getParameter("userName");
        String passWord = req.getParameter("passWord");
        // 获取多个值
        String[] hobbies = req.getParameterValues("hobby");
        // 打印输出结果
        System.out.println(userName + " : " + passWord);
        System.out.println(Arrays.toString(hobbies));
    }
}
 
请求前端提交输入信息:


成功请求,查看控制台的输出:

输出乱码:
解决乱码问题: 添加下面的代码到获取数据的签名
 req.setCharacterEncoding("utf-8");
 
重新访问:

成功解决乱码问题:并且获取多条数据成功。
4.2、测试请求转发
添加转发代码:
// 信息获取成功,转发到成功登录的地址
        req.getRequestDispatcher(req.getContextPath() + "/success.jsp").forward(req, resp);
 
访问/login地址

发现请求地址前缀有两个hj所以找不到界面报错404
查看原因:
修改代码
req.getRequestDispatcher("/success.jsp").forward(req, resp);
 
 

修改代码完转发
- 原因就是因为 在转发的时候默认会自己带上当前请求的前缀
 
req.getRequestDispatcher("success.jsp").forward(req, resp);
 
 

同样转发成功.
- 在重定向的时候 url地址会发生变化 请求响应为 302
 - 在转发的时候 url地址不会发生变化 请求响应为 307
 



















