• 主页
  • iOS
  • Flutter
  • Java
  • Markdown
所有文章 关于我

  • 主页
  • iOS
  • Flutter
  • Java
  • Markdown

Java Web学习09---Request和Response

2016-09-10

  Request 和 Response 对象起到了服务器与客户机之间的信息传递作用。Request 对象用于接收客户端浏览器提交的数据,而 Response 对象的功能则是将服务器端的数据发送到客户端浏览器。

Response

  Response对象用于动态响应客户端请示,控制发送给用户的信息,并将动态生成响应。Response对象只提供了一个数据集合cookie,它用于在客户端写入cookie值。若指定的cookie不存在,则创建它。若存在,则将自动进行更新。结果返回给客户端浏览器。

  • Response组成

    • 响应行
      • 格式: 协议/版本 状态码 状态码说明
      • 常见状态码
        • 1xx: 已发送请求
        • 2xx: 已完成响应
          • 200: 正常响应
        • 3xx: 还需要浏览器进一步操作
          • 302: 重定向(用的多), 需要配置响应头:location
          • 304: 读缓存
        • 4xx: 用户操作错误
          • 404: 资源不存在
          • 405: 访问的方法不存在
        • 5xx: 服务器错误
          • 500: 内部异常
      • 设置状态码
        • setStatus(int 状态码): 主要用来设置1xx、2xx、3xx错误码
        • sendError(int 状态码): 主要用来设置4xx、5xx
    • 响应头

      • 设置响应头格式: set/addHeader(String key, String value)、set/addIntHeader(String key, int value)、set/addDateHeader(String key, long value)等, 其中一个key可以对应多个value.set是设置, 会覆盖之前设置的响应头; add是添加响应头, 不会覆盖.
      • 判断是否包含某个响应头: boolean containsHeader(String name)
      • 常用的响应头

        • location: 重定向

          • 方式1

            • 1、设置状态码

              response.setStatus(302);

            • 2、设置location

              response.addHeader(“location”, “https://www.baidu.com");

          • 方式2, 常用

            response.sendRedirect(“https://www.baidu.com");

        • refresh: 定时刷新
          • 方式1
            • 通过html的meta标签实现

              <meta http-equiv=”refresh” content=”3;url=/“>

          • 方式2
            • 通过response设置header实现

              response.add(/set)Header(“refresh”, “3;url=/“);

        • content-type: 设置文件mime类型, 设置响应流的编码方式,以及浏览器打开是的编码方式.
          • 方式1

            response.setContentType(“text/html;charset=utf-8”);

          • 方式2

            response.setHeader(“content-type”, “text/html;charset=utf-8”);

        • content-disposition: 文件下载使用
          • 文件下载的方式
            • 1、超链接下载(如果浏览器能处理会直接打开, 不能处理才会下载)

              <a href=”/ProjectName/download/测试.txt”>超链接下载文本</a>

            • 2、编码下载, 通过servlet完成

              //获取参数
              String fileName = request.getParameter(“name”);
              //获取文件的mime类型
              ServletContext servletContext = this.getServletContext();
              String type = servletContext.getMimeType(fileName);
              //设置mime类型
              response.setContentType(type);
              //设置下载头信息
              response.setHeader(“content-disposition”, “attachment;filename=” + fileName);
              //输入流和输出流读写
              InputStream resourceAsStream = servletContext.getResourceAsStream(“/download/“ + fileName);
              ServletOutputStream outputStream = response.getOutputStream();
              //这里也可以使用commons-io.jar进行拷贝IOUtils.copy(input, output)
              byte[] arr = new byte[1024 * 8];
              int length = -1;
              while ((length = resourceAsStream.read(arr)) != -1) {
                outputStream.write(arr, 0, length);
              }
              outputStream.close();
              resourceAsStream.close();

    • 响应体
      • 操作响应体(字符流和字节流不可以同时使用, 并且服务器会自动关流)
        • 获取字符流(测试使用)
          • PrintWriter getWriter()
        • 获取字节流(常用)
          • ServletOutputStream getOutputStream()

Request

  Request对象的作用是与客户端交互,收集客户端的Form、Cookies、超链接,或者收集服务器端的环境变量。

  • Request组成
    • 请求行
      • 格式: 请求方式 请求资源 协议/版本
      • 常用方法
        • 获取请求方式: String method = request.getMethod();
        • 获取请求者的IP地址: String getRemoteAddr()
        • 根据key获取一个请求参数值(★): String getParameter(String name)
        • 根据key获取多个请求参数值(★): String[] getParameterValues(String name)
        • 获取所有请求参数的键和值, 返回集合(★): Map(String, String[]) getParameterMap()
        • 在Java中获取项目名称(★): String getContextPath()
        • 获取完整的请求路径(不带参数): StringBuffer getRequestURL()
        • 获取从项目名开始到参数之前的内容: String getRequestURI()
        • 获取get请求的所有参数: String getQueryString()
        • 获取协议: String getProtocol()
    • 请求头
      • 格式: key/value的形式,(value可以是多个)
      • 常用请求头
        • user-agent: 浏览器内核
          • msie: IE浏览器
          • firefox: 火狐浏览器
          • chrome: 谷歌浏览器
        • referer: 页面从哪里来(防止倒链)
      • 常用方法
        • 获取指定key的header值(一个): String getHeader(String key);
        • 获取指定key的所有header值(多个): Enumeration getHeaders(String name)
    • 请求体
      • 只有post请求才会有请求体
  • 中文乱码问题
    • 获取请求参数时中文乱码
      • get请求: 参数会拼接到地址栏, 使用utf-8编码, 服务器收到参数后使用iso-8859-1编码, 所有会出现乱码
      • post请求: 参数放在请求体中, 服务器收到请求体后使用iso-8859-1编码, 也会出现乱码
      • 解决方法
        • 通用方法: new String(参数.getBytes("iso-8859-1"), "utf-8");, 服务器获取到参数后先使用iso-8859-1解码转为Byte数组, 然后再使用utf-8编码成字符串.

          String username = new String(request.getParameter(“username”).getBytes(“iso-8859-1”), “utf-8”)

        • 对于post请求, 只需要将请求流的编码设置为utf-8即可.

          request.setCharacterEncoding(“utf-8”);

    • 文件下载时, 文件名中文乱码问题
      • 常见浏览需要使用utf-8编码的文件名, IE浏览器文件名如果有空格它会使用+代替

        response.setHeader(“content-disposition”, “attachment;filename=” + URLEncoder.encode(fileName, “utf-8”));

      • 火狐浏览器需要使用base64编码的文件名
      • 其他方式
        • 使用封装的工具类
        • 大部分浏览器都OK: response.setHeader("content-disposition", "attachment;filename=" + new String(filename.getBytes("gbk"), "iso-8859-1"));
        • 如果使用Tomcat、JBoos也可以设置URLEncoding="UTF-8"
    • 编码

      String URLEncoder.encode(String, 编码方式);

    • 解码

      String URLDecoder.decode(String, 编码方式);

  • 请求转发
    • request对象也是域对象, 它在一个请求来的时候创建, 在响应生成时销毁.
    • 请求转发方法

      request.getRequestDispatcher(“web.xml中配置的url-pattern路径“).forward(request, response);

    • 设置参数

      public void setAttribute(String name, Object o);

    • 获取参数

      public Object getAttribute(String name);

    • 获取所有参数

      public Enumeration getAttributeNames();

    • 移除参数

      public void removeAttribute(String name);

  • 请求转发如果是表单时, 重复提交问题
    • 请求转发之后刷新网页会提示重复提交, 解决办法有
      • 使用重定向
      • 使用令牌机制
  • BeanUtils的使用
    • BeanUtils是Apache提供的一个工具类, 它可以快速封装一个对象
    • 使用步骤
      • 导入commons-beanutils-xxx.jar和commons-logging-xxx.jar包
      • 使用BeanUtils.populate(Object bean, Map<> map)即可.
  • 请求转发和重定向的区别
    • 重定向发送两次请求, 请求转发只发送一次请求
    • 重定向地址发起变化, 请求转发地址不会变化
    • 重定向是客户端发送, 请求转发是服务器内部发送
    • 重定向不存在域对象, 请求转发可以使用request域对象
    • 重定向是Response的方法, 请求转发是Request的方法.
    • 重定向可以访问站外资源, 请求转发只能访问服务器内部资源
  • Java
  • HTTP
  • Request
  • Response
iOS 10的一些权限设置
简单实现导航栏透明
© 2023 coppco
Hexo Theme Yilia by Litten
  • 所有文章
  • 关于我

tag:

  • Shadowsocks
  • VPS
  • 翻墙
  • First
  • 杂谈
  • 新尝试
  • Java
  • Flutter
  • Dart
  • Elicpse
  • IDE
  • Shell
  • Linux
  • Markdown
  • 资料整理
  • iOS
  • Android
  • CentOS
  • GitLab
  • git
  • 持续集成
  • Intellij IDEA
  • JavaScript跨域
  • Jsonp
  • Dubbo
  • 分布式服务架构
  • HTML
  • JavaScript
  • jQuery
  • BootStrap
  • CSS
  • JDBC
  • MySQL
  • 数据库
  • XML
  • Tomcat
  • HTTP
  • Servlet
  • Request
  • Response
  • JSP
  • Cookie
  • Session
  • 事务
  • JavaBean
  • AJAX
  • JSON
  • Listener
  • Filter
  • 注解
  • Servlet3.0
  • RPM
  • nginx
  • JDK
  • Oracle
  • Hibernate
  • Struts2
  • Spring
  • SSM
  • MyBatis
  • SSH
  • Spring MVC
  • MQ
  • Redis
  • 策略模式
  • 全文搜索技术
  • Lucene
  • Solr
  • mirror
  • 镜像站
  • ruby
  • npm
  • Freemaker
  • 坑点
  • Cocoapods
  • Objective-C
  • Xcode
  • Swift
  • SwiftUI
  • Spring Boot
  • WebSocket
  • GCD
  • Swift3.0
  • App瘦身
  • iOS和JavaScript交互
  • iOS应用跳转
  • math
  • AutoLayout
  • Masonry
  • SnapKit
  • 三方框架的使用
  • Gitlab
  • 编程思想
  • 逆向工程
  • Delphi

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

iOS、Objective-C、Swift、Java、Flutter