Java web:http协议&Request&Response

HTTP

  • 传输协议:定义了,客户端和服务器端通信时,发送数据的格式
  • 特点:
    • 基于TCP/IP的高级协议
    • 默认端口号:80
    • 基于响应/请求模型:一次请求对应一次响应
    • 无状态的:每次请求之间相互独立,不能交互数据
  • 历史版本:
    • 1.0:每一次请求响应都会建立新的链接
    • 1.1:复用链接

  • 请求消息:客户端发送给服务器端的数据
    • 请求消息的数据格式;
      • 请求行:
        • 请求方式 请求URL 请求协议/版本
        • GET /login.html HTTP/1.1
        • 请求方式:
          • GET:请求参数在请求行中的URL之后,长度有限制
          • POST:请求参数在请求体中,请求的URL长度没有限制
      • 请求头:客户端浏览器告诉服务器一些信息
        • 格式:请求头名称:请求头值
        • 常见的请求头:
          • User-Agent:浏览器告诉服务器,我访问你时使用的浏览器版本信息
            • 服务器端可以获取该头的信息,解决浏览器兼容的问题
          • Referer:http://localhost/login.html
            • 告诉服务器,我(当前请求)从哪儿来
              • 作用:放盗链,统计
      • 请求空行:一个空行,用来分割POST请求的请求头和请求体的
      • 请求体:封装POST请求消息的请求参数的

  • 响应消息:服务器端发送给客户端的数据
    • 响应消息的数据格式:
      • 响应行
        • 组成:协议/版本 响应状态码 状态码描述
        • 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
          • 响应码都为3位数字
          • 分类:
            • 1xx:服务器接收客户端消息,但没有接收完成,等待一段时间后,发送1xx多状态码
            • 2xx:成功。代表:200
            • 3xx:重定向。代表:302(重定向),304(访问缓存)
            • 4xx:客户端错误。代表:404(请求路径没有对应资源),405(请求方式没有对应的doXxx方法)
            • 5xx:服务器端错误。代表:500(服务器内部出现异常)
      • 响应头:
        • 组成:头名称:值
        • 常见的响应头:
          • Content-Type:服务器告诉客户端本次响应体数据格式及编码格式
          • Content-disposition:服务器告诉客户端以什么格式打开响应体数据
            • in-line:默认值,在当前页面打开
            • attachment;filename=xxx;以附件的形式打开响应体。文件下载
      • 响应空行
      • 响应体:传输的数据(html页面的标签的全部内容)

Request对象

  • request对象和response对象的原理
    • 都是由服务器创建的,我们只管使用
    • request对象是用来获取请求消息,response对象是来设置响应消息
  • request对象继承体系:
    • ServletRequest(接口)-继承-> HttpServletRequest(接口)-实现-> org.apache.catalina.connector.RequestFacade 类(tomcat)
  • request功能:
    • 获取请求消息数据:
      • 获取请求行数据:
        • 例如:GET /day14/demo1?name=zhangsan HTTP/1.1
        • 获取虚拟目录(/day14):String getContextPath()
        • 获取请求URI(/day14/demo1):String getRequestURI()
          • URI:统一资源标识符:http://localhost/day14/demo1 中华人名共和国
          • URL:统一资源定位符:/day14/demo1 共和国
      • 获取请求头数据:
        • String getHeader(String name):通过请求头的名称获得请求头的值
        • Enumeration<String> getHeaderNames():获取所有的请求头名称
      • 获取请求体数据:
        • 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
        • 步骤:
          • 获取流对象:
            • BufferedReader getReader():获取字符输入流,只能操作字符数据
            • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据(包括文件)
          • 从流对象中拿数据
    • 获取请求消息通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
      • String getParameter(String name):根据参数名称获取参数值
      • String[] getParameterValues(String name):根据参数名称获取参数值的数组
      • Enumeration<String> getParameterNames():获取所有请求的参数名称
      • Map<String,String[]> getParameterMap():获取所有参数的map集合
      • 中文乱码问题:
        • get方式tomcat8已经解决,Post方式会乱码
        • 在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
    • 请求转发:一种在服务器内部的资源跳转方式
      • 步骤:
        • 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
        • 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
      • 特点:
        • 浏览器地址栏不发生变化
        • 只能转发到当前服务器内部资源中
        • 转发是一次请求
    • 共享数据:
      • 域对象:一个有作用范围的对象,可以在范围内共享数据
      • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
      • 方法:
        • void setAttribute(String name,Object obj):存储数据
        • Object getAttribute(String name):通过键获取值
        • void removeAttribute(String name):通过键移除键值对
    • 获取ServletContext:
      • ServletContext getServletContext()

用户登录案例

  • 需求:
    • 编写login.html登录页面,username & password 两个输入框
    • 使用Druid数据库连接池技术,操作mysql,day08数据库中user表
    • 使用JdbcTemplate技术封装JDBC
    • 登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
    • 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误
  • 步骤:
    • 创建项目,导入html页面,配置文件,jar包
    • 创建数据库环境(数据库和表)
    • 创建包cn.itcast.domain,创建类User
    • 创建包cn.itcast.util,编写工具类JDBCUtils
    • 创建包cn.itcast.dao,创建类UserDao,提供login方法
    • 编写cn.itcast.web.servlet.LoginServlet类,编写FailServlet和SuccessServlet类
  • 注意:
    • login.html中form表单的action路径的写法:虚拟目录+Servlet的资源路径
  • BeanUtils工具类,简化数据封装(用于封装JavaBean)
    • JavaBean:标准的Java类
      • 要求:
        • 类被public修饰
        • 有无参构造方法
        • 成员变量使用private修饰
        • 提供public的getter和setter方法
      • 功能:封装数据
    • 概念:
      • 成员变量:就是成员变量
      • 属性:setter和getter方法截取后的产物
    • 方法:
      • setProperty()
      • getProperty()
      • populate(Object obj,Map map):将map集合的键值对信息,封装到对应的JavaBean对象中

在BeanUtils封装数据前,从Request.getParameterMap()方法的返回值中得到String形式的日期,转换为Date的方法(不转换会报错,因为得到的String类型的日期,不能存储到MySql中的Date数据类型的属性中)

//BeanUtils 日期转换(本地格式yyyy-MM-dd)转换成date
        ConvertUtils.register(new Converter() {
            @Override
            public Object convert(Class type, Object value) {//注册一个日期转换器
                Date date1 = null;
                if (value instanceof String){
                    String date = (String) value;
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    try {
                        date1 = sdf.parse(date);
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                }
                return date1;
            }
        },Date.class);
        ConvertUtils.register(new DateLocaleConverter(),Date.class);

Response对象

  • 功能
    • 设置响应消息
      • 设置响应行
        • 格式:HTTP/1.1 200 OK
        • 设置状态码:setStatus(int sc)
      • 设置响应头:setHeader(String name,String value)
      • 设置响应体:步骤
        • 获取输出流:
          • 字符输出流:PrintWriter getWriter()
          • 字节输出流:ServletOutputStream getOutputStream()
        • 使用输出流,将数据输出到客户端浏览器
  • 案例:
    • 完成重定向
      • 重定向:资源跳转的方式
      • 代码实现:
        response.sendRedirect("/day08/respnseDemo2");
      • 重定向特点:redirect
        • 地址栏发生变化
        • 重定向可以访问其他站点(服务器)的资源
        • 重定向是两次请求,不能使用request对象来共享数据
      • 转发的特点:forward
        • 转发地址栏路径不变
        • 转发只能访问当前站点(服务器)下的资源
        • 转发是一次请求,可以使用request对象来共享数据
    • 路径的写法:
      • 相对路径:相对路径不可确定唯一资源
        • 如:./index.html(不以/开头,以.开头路径)
        • 规则 :找到当前路径和目标资源路径之间的相对位置关系
        • ./:当前目录 ../:后退一级目录
      • 绝对路径:通过绝对路径可以确定唯一资源
        • 如:http://localhost:8080/day08/responseDemo or /day08/responseDemo(以/开头的路径)
        • 规则:判断定义的目录是给谁用的
          • 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
            • 建议虚拟目录动态获取:request.getContextPath()
            • 例如:<a> <form>,重定向
          • 给服务器使用:不需要加虚拟目录
            • 例如:转发路径
    • 服务器输出字符数据到浏览器:(字节数据同理)
      • 步骤:
        • 设置编码(要在获取流之前设置):response.setContentType("text/html;charset=utf-8");
        • 获取字符输出流:PrintWriter pw = response.getWriter();
        • 输出数据

ServletContext对象

  • 代表整个web应用,可以和程序的容器(服务器)通信
  • 获取:
    • 通过request对象:request.getServletContext();
    • 通过HttpServlet获取:this.getServletContext();
  • 功能:
    • 获取MIME类型
      • MIME类型:或联网通信过程中定义的一种文件数据类型
        • 格式:大类型/小类型 text/html image/jpeg
        • 获取:String getMimeType(String file)
    • 域对象:共享数据
      • setAttribute(String name,Object value)
      • getAttribute(String name)
      • removeAttribute(String name)
      • 注意:ServletContext对象范围:所有用户所有请求的数据(范围最大)
    • 获取文件的真实(服务器)路径:
      • 方法:String getRealPath(String Path)
      • web目录下的资源路径:String a = context.getRealPath("/a.txt");
      • WEB-INF目录下的资源路径:String b = context.getRealPath("/WEB-INF/b.txt");
      • src目录下的资源路径:String c = context.getRealPath(/WEB-INF/classes/c.txt);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值