Birdboot第二天 Request Response

目录

V4 HttpServletRequest保存请求内容

1.此类专门处理请求 把获取请求的readline()和拆分代码移动过来

2.ClientHandler客户端处理器实例化HttpServletRequest

3. 拆分的信息从局部变量 变成属性

4.建方法 解析请求行 消息头  消息正文

 V5 发送响应

1.在客户端处理器 测试处理请求 发送index页面

 2.发送响应

3. 根据浏览器地址栏中抽象路径定位static下对应的文件

 V6 处理请求 判断页面发送404

 V7 HttpServletResponse类保存响应

 1定义socket,构造器传参  移动println()方法  写方法respoonse()放发送响应

2. 把response里的变量定义为属性

3.在客户端处理器 解析请求时创建response

       发送响应 调response


V4 HttpServletRequest保存请求内容

创建包 放http协议

新建类 此类的实例保存浏览器发过来的请求

1.此类专门处理请求 把获取请求的readline()和拆分代码移动过来

把readline()移动过来 

此时socket报错 私有方法不能传参  所以定义一个socket属性 通过构造器传给readline方法

把ClientHandler的解析请求行请求头  移动到构造方法里面  readline方法抛异常

2.ClientHandler客户端处理器实例化HttpServletRequest

   此时ClientHandler客户端处理器里面 用来解析请求 处理请求 发送响应

   实例化HttpServletRequest

3. 拆分的信息从局部变量 变成属性

 Request里面的解析的请求部分现在是构造方法里的局部变量 要把它变成属性

初始化属性 不再是初始化变量 把String变量类型删掉  map定义删掉

ALT+INSERT对外提供Get方法 便于外界提取

给handers消息头的get方法添加map的get方法 传参String name

在客户端处理器 获取uri 检查是否输出

 

4.建方法 解析请求行 消息头  消息正文

  •  优雅代码 把构造方法里的解析请求行 请求头的代码块 放到方法里面
  • 请求头方法里面 line data因为在请求行方法里面 重新声明 加String
  • 构造方法里只需要调用方法 方法名(参)

 

 V5 发送响应

请求行(uri) 消息头 消息正文

状态行(状态代码) 响应头 响应正文

HTTP/1.1 404 NotFound(CRLF) Content-Type: text/html(CRLF)

Content-Length: 2546(CRLF)(CRLF) 1011101010101010101......

状态代码

 1xx::保留,将来使用。

 2xx:成功 - 操作被接收、理解、接受(received, understood, accepted)。

 3xx:重定向(Redirection)- 要完成请求必须进行进一步操作。

 4xx:客户端出错 - 请求有语法错误或无法实现。

 5xx:服务器端出错 - 服务器无法实现合法的请求。

	HTTP/1.0的状态代码、原因解释在下面给出。下面的原因解释只是建议采用,可任意
更改,必须是中文,而不会对协议造成影响。完整的代码定义在第9节。
       Status-Code    = "200"   ; OK
                      | "201"   ; Created
                      | "202"   ; Accepted
                      | "204"   ; No Content
                      | "301"   ; Moved Permanently 永久移动
                      | "302"   ; Moved Temporarily 临时移动
                      | "304"   ; Not Modified      未修改的
                      | "400"   ; Bad Request       错误请求
                      | "401"   ; Unauthorized
                      | "403"   ; Forbidden
                      | "404"   ; Not Found
                      | "500"   ; Internal Server Error
                      | "501"   ; Not Implemented
                      | "502"   ; Bad Gateway
                      | "503"   ; Service Unavailable
                      | extension-code

新建static页面 首页 课程表页面 rebuild

1.在客户端处理器 测试处理请求 发送index页面

类加载路径

类加载路径 开发中常用的相对路径:
写法:类名.class.getClassLoader().getResource(".")
类加载路径是那里?
当前类所在最外层包的上一级目录
例如:
当前类ClientHandler的包定义:package com.webserver.core;
意思是ClientHandler所在最外层包是com,类加载路径就是com包的上级目录
如果从源代码的角度看,这个目录是src/main/java目录

而实际JVM执行程序时,真正的类加载路径是编译后的com包所在的上级目录
在MAVEN项目中,代码编译后会放在target/classes目录下,因此这个classes目录就是真实的类加载路径

toURI() 文件转换成链接

那么为什么要使用toURI()而不是toURL()呢?因为toURL()存在bug。
在File转化成URI的时候,会将链接中的特殊字符如#或!等编码,而toURL()确不会。
如将“C:Documents and Settingstest.xsl”进行转化
toURI()得到的是:file:/C:/Documents and Settings/test.xsl
toURL()得到的是:file:/C:/Documents and Settings/test.xsl
也就是说toURI()将空格都转译成了 ,而toURL()什么都没管。sun也有人提到了这个bug(4273532,6179468)。
虽说在浏览器中没有转译不会有问题,因为有的浏览器已经自动转译了。但很多程序或者组件对于这样的路径都会抛出异常,认为是有错误的,这个bug中就有实实在在的例子。
所以要将File转换成URL的话,请使用file.toURI().toURL(),而不是file.toURL()
 

类加载路径

 2.发送响应

  • 3.1状态行 将字符串转成一组字节 line.getByte() write 方法写出去 回车换行13 10
  • 3.2 响应头 同理
  • 3.3响应正文 复制文件
  • 建立一个println方法 发送字符串 发送状态行响应头里面直接调用

3. 根据浏览器地址栏中抽象路径定位static下对应的文件

 V6 处理请求 判断页面发送404

 1.使用is,file() 不仅文件存在 也要不是目录

2.if判断两条路径没有必要重复写代码 学会加变量

 V7 HttpServletResponse类保存响应

 1定义socket,构造器传参  移动println()方法  写方法respoonse()放发送响应

注意发送响应不能放在构造方法里面 这样实例化直接发送响应

因为先解析处理请求后 才能发送响应 单独写方法respoonse()

2. 把response里的变量定义为属性

3.在客户端处理器 解析请求时创建response

       发送响应 调response

   

4.getset方法 set属性传入file.状态码,状态原因

    在response给处理请求提供改变途径 getset方法   有set方法因为需要向里面改

    在客户端处理器里面 处理请求的判断里面 set属性传入file.状态码,状态原因

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值