User-Profile-Image
hankin
  • 5
  • 首页
  • 技术-Study
    • Java
    • Php
    • WordPress
  • Enjoy-Life
  • 随拍-Photo
  • 分享-Share
  • 关于我
  • 分类
    • 随拍-Photo
    • Enjoy-Life
    • 技术-Study
    • 所有
    • 分享-Share
    • Java
    • Wordpress
    • Php
    • SQL Server
    • Linux
  • 页面
    • 首页
    • 学习日志
    • 生活日记
    • 随手拍拍
    • 关于我
  • 友链
    • 百度一下
    • 我爱水煮鱼
    • Jay's Notes
    • 淮城一只猫
    • 雨林寒舍
    • 不败君
    • 广告联盟
    • hankin
    • Tengine
    • 寥寥尘事 尘事固已矣,秉意终不迁。
    • 友人C
    • Typecho
    • jokeWorld
    • 蓝洛水深
    • 身边的大佬
    • Duilib
    • Runoob
    • Hank
Help?

Please contact us on our email for need any support

Support
    首页   ›   技术-Study   ›   Java   ›   正文
Java

Servlet-3

2020-03-09 21:59:08
312  0 0

6.6、 HttpServletResponse

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

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

1、简单分类

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

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 var1, long var2);

    void addDateHeader(String var1, long var2);

    void setHeader(String var1, String var2);

    void addHeader(String var1, String var2);

    void setIntHeader(String var1, int var2);

    void addIntHeader(String var1, int var2);

响应的状态码,可以回顾 https://blog.edjoke.com/archives/534.html 4.4

2、常见应用-下载文件

1.向浏览器输出消息
2.下载文件
1.要获取下载文件的路径
2.下载的文件名是什么?
3.设置想办法让浏览器能够支持下载我们需要的东西
4.获取下载文件的输入流
5.创建缓冲区
6.获取OutputStream对象
7.将FileOutputStream流写入到buffer缓冲区
8.使用OutputStream将缓冲区中的数据输出到客户端!

3的疑问1
javaWeb项目-文件下载的消息头和编码问题
https://blog.csdn.net/weixin_33747129/article/details/93745005

3的疑问2
使用Content-Disposition: attachment; filename=FILENAME,在Firefox浏览器中下载文件,文件名中文乱码问题解决。
https://blog.csdn.net/Jon_Smoke/article/details/53699400?fps=1&locationNum=5

 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.要获取下载文件的路径
        //String realPath = this.getServletContext().getRealPath("/1.png");
        String realPath = "D:\\CIINTool\\CIIN_Java\\Java_Web\\javaweb-02-servlet\\response\\target\\classes\\陈爺.png";
        System.out.println("下载文件的路径:"+realPath);
        //2.下载的文件名是什么?
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
        //3.设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件名使用URLEncoder.encode编码转,否则下载的文件名会出现乱码
        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缓冲区
        while ((len=in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        //8.使用OutputStream将缓冲区中的数据输出到客户端!
        in.close();
        out.close();

    }

3、验证码功能

。前端实现

。后端实现,需要用到Java的图片类,生成一个图片

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如何让浏览器3秒自动刷新一次
        resp.setHeader("refresh","3");
        //如何在内容中创建一个图片
        BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
        //如何得到图片  getGraphics()其实是一个画笔
        Graphics2D g = (Graphics2D) image.getGraphics(); //笔
        //设置图片背景颜色
        g.setColor(Color.white);
        //填充矩形
        g.fillRect(0,0,140,20);
        //给图片写数据
        g.setColor(Color.blue);
        //设置字体
        g.setFont(new Font(null,Font.BOLD,20));
        //画字体
        g.drawString(makeNum(),0,18);

        //告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("image/jpeg");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("expires",-1); //禁止浏览器缓存
        resp.setHeader("Cache-Control","no-cache"); //缓存策略不缓存
        resp.setHeader("Pragma","no-cache");

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

    }

随机数生成

//生成随机数
    private String makeNum(){
        Random random = new Random();
        String num = random.nextInt(9999999) + "";//8位随机数 转换成字符串 + ""
        StringBuffer sb = new StringBuffer();
        for (int i=0;i<7-num.length();i++){
            sb.append("0");
        }
        num = sb.toString() + num;
        return num;
    }

4、实现重定向(需掌握)

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

常见场景:
。用户登录

void sendRedirect(String var1) throws IOException;

测试

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //resp.sendRedirect("/index.jsp"); 这个地址不一定正确
        /*
        * 重定向做了两件事
        resp.setHeader("Location","/s3/img");
        resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); //resp.setStatus(302); HttpServletResponse.SC_MOVED_TEMPORARILY ==302
        * */
        resp.sendRedirect("/s3/img");  //重定向到了/img访问地址上去了
    }

面试题:请你聊聊重定向和转发的区别
相同点
页面都会实现跳转
不同点
请求转发的时候,URL不会发生变化
重定向的时候,URL地址栏会发生编号

请求转发参考:6.5-3
ps://www.edjoke.com/archives/727.html

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        System.out.println("进入了ServletDemo04");
        //原始写法
        //RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/gp");//请求转发到/gp这个路径上
        //requestDispatcher.forward(req,resp);//调用forward实现请求转发
        //一句话的写法
        servletContext.getRequestDispatcher("/gp").forward(req,resp);
    }

5、JSP 实战表单提交 请求

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

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

pom.xml 配置依赖 jsp 页面才能调用获取当前路径的Java语法 <%–${pageContext.request.contextPath}代表当前项目的路径–%>

jsp请求提交表单 成功后跳转到success页面

配置Java后台请求路径

success 页面

页面请求效果

6.7、 HttpServletRequest

近期文章
  • Docsify 3分钟搭建博客
  • electron -v 全局安装,报错到晕厥
  • Electron-vue初始化项目时候报错:Command vue init requires a global addon to be installed.
  • 电脑重启后Visual Studio Code的快捷方式不存在?
  • 搜狗浏览器提示:您要访问的网站包含大量违法或违规内容
标签
0x800706be 18456 Apache bbr CDN CentOS command not found Dubbo GCE GCP google Google Cloud Platform IDEA K2 Memcached microsoft sql native client Mysql nano ODBC PB PHP phpstudy Powerbuilder Python shiro SQL2008 SQL Server Sqlite sqlite_master Sql server 2008 R2 sqlstate=08001 SSL ssr SyncPragma table thymeleaf Wordpress zookeeper 中石化,加油卡,百度地图 字段 客户端不支持加密 幽默 数据库 正则表达式 登录失败 腾讯CDN
Copyright © 2023 网站备案号: 苏ICP备18047535号
主页
页面
  • 首页
  • 学习日志
  • 生活日记
  • 随手拍拍
  • 关于我
博主
_陈默默 管理员
人生就是:定性,知事,选梦,遇人,择城,终老。
125 文章 1 评论 67723 浏览
测试
测试