request&response
一 写在前面
这个文集用来记录我学习javaweb基础的内容,主要包括javaweb最基础、最底层的知识,所涉及的内容有三个大块:浏览器,服务器,数据库。浏览器的内容包括:html、css、js、jquery、bootstrap;数据库包含:jdbc、数据库基本操作curd,连接池,dbutils等;服务器包含:servlet、request&resqonse,jsp/el/jstl等。由于进入简书较晚,故从当下request&response开始,之前的数据库和浏览器的内容日后整理一并补上。
本着记录和复习的目的,我开始记录我javaweb的学习路程,希望自己可以坚持下去!就酱~
request&response,分别对应请求和响应,浏览器与服务器的运行模式基于请求和响应机制,其依靠中间商(暂时这么理解~)servlet(这方面的内容以后会补上,可以理解为运行在服务器的小程序)完成。
二 request
2.1 request 组成部分
请求(request)由三部分组成:请求行,请求头,请求体 ,作用就是往服务器写入。
2.1.1 请求行
请求行:请求信息的第一行,格式为:请求方式 访问资源 协议/版本
请求方式描述的是页面将以什么样的形式加载。主要有两种方式:post与get。post对应的是向服务器传送数据,get则是从指定的资源请求数据。区别主要有三个:1.
get会把参数放在url的后面 post不会。如图所示。
get请求post请求
2.get参数大小有限制,post请求却没有限制;
3.get请求没有请求体,而post请求有请求体,请求参数放在请求体中。
2.1.2 请求头
请求头:请求信息的第二行到空行结束,格式为:key/value (value可以是多个值)。常见的请求头有:Accept:text/html,image/bmp ——支持数据类型; Accept-Charset:ISO-8859-1 ——字符集;Accept-Encoding: gzip ——支持压缩;Accept-Language:zh-cn ——语言环境;Host:www.baidu.com:——访问主机;If-Modified-Since:Tue, 11 Jul 2000 18:23:51 GMT --缓存文件的最后修改时间;Referer:http://www.baidu.com/index.jsp --来自哪个页面、防盗链。
2.1.3 请求体
只有post才有请求体,包含的参数和值,格式为key:value的形式。
2.2 常用方法
2.2.1 关于请求行的方法(HttpServletRequest)
String getMethod():获取请求方式
String getRemoteAddr():获取ip地址
String getContextPath() :在java中获取项目名称 (/day10)
getRequestURI():获取的是 从项目名到参数之前的内容 /day10/regist
getRequestURL():获取的带协议的完整路径 http://localhost/day10/regist
String getQueryString():get请求的所有参数 username=tom&password=123
String getProtocol():获取协议和版本
主要方法代码及运行结果
2.2.2 关于请求头的方法
String getHeader(String key):通过key获取指定的value (一个),这是最重要,最常用的方法。
Enumeration getHeaders(String name) :通过key获取指定的value(多个)
Enumeration getHeaderNames() :获取所有的请求头的名称
int getIntHeader(String key) :获取整型的请求头
long getDateHeader(String key) :获取时间的请求头
主要代码与运行结果
三 response
3.1 response组成部分
响应(response)由三部分组成:响应行,响应头,响应体 ,作用就是响应来自浏览器的请求。
3.1.1 响应行
响应行:响应的第一行,格式:协议/版本 状态码 状态码说明。协议/版本不再赘述,主要讨论一下状态码及状态码说明。状态码(state code)用以表示网页服务器超文本传输协议响应状态的3位数字代码,可以通俗的理解为服务器和浏览器的工作状态,以下是状态码的类型与说明:
状态码:
1xx:已发送请求
2xx:已完成响应
如200:正常响应
3xx:还需浏览器进一步操作
如302:重定向 配合响应头:location,304:读缓存
4xx:用户操作错误
如404:用户操作错误.,405:访问的方法不存在
5xx:服务器错误
如500:内部异常
3.1.2 响应头
响应头:响应的第二行。格式:key/value(value可以是多个值)。常用的响应头:location:重定向;refresh:定时刷新;content-type:设置文件的mime类型,设置响应流的编码及告诉浏览器用什么编码打开;content-disposition:文件下载。
3.1.3 响应体
响应体:就是页面上要展示的内容。
3.2 常用方法
3.2.1 关于响应行的方法
setStatus(int 状态码):针对于 1 2 3;
sendError(int 状态码):针对于 4xx和5xx。
以上两个方法没用过,感觉没啥用hhhh
3.2.2 关于响应头的方法
setHeader(String key,String value):设置字符串形式的响应头;
了解:setIntHeader(String key,int value):设值整形的响应头;
了解:setDateHeader(String key,long value):设值时间的响应头。
3.2.2.1 重定向
这里有两个重要的应用,就是通过设置响应头实现的。一个是重定向,一个是定时刷新。重定向指的就是一个页面1访问页面2,页面2去访问页面3,就好比你去找a借钱,a没有去找b借了钱给你(很通俗,但是实用hhhh)。实现重定向有两种方式:一是配合状态码(没错就是我说的没啥用的那个...),再配合setHeader(String key,String value)方法实现重定向,另一个方法通过respose里的方法sendRedirect(String path),其基本原理就是第一种方法,只不过给封装起来了。下面是代码:
重定向的两种方法代码及结果被重定向的oc2什么都不需要做~~
3.2.2.2 定时刷新
定时刷新就是跳转,常见的就是该页面将在几秒后跳转~~实现定时刷新也有两种方法,一种是设置头信息: respooen.setHeader("refresh","秒数;url=跳转的路径");另一种通过修改http的meta标签:<meta http-equiv="refresh" content="3;url=/day10/refresh2.html">,然后在html页面添加一个定时器即可。注意这个定时刷新需要设置两个html,一个展示几秒后跳转,一个展示“欢迎回来”,就酱,下面贴代码:
方法1 代码方法1登录失败时运行结果 方法2代码
3.2.3 关于响应体的方法
Writer getWriter():字符流,ServletOutputStream getOutputStream() :字节流。自己写东西都用字符流,其他就用字节流。关于请求中会中文乱码,response.setContentType("text/html;charset=utf-8")就搞定了,写在项目开头就ok,防止乱码。啊啊啊好累,不想写了o(╥﹏╥)o
四 总结
关于request&response我学的稀里糊涂的,东西不多,结构也很清晰,但是要注意的细节很多,比如response、request中的乱码问题,重定向和请求转发的区别,域对象是什么(我这个笔记里没有涉及,因为懒...可能自己也没搞清楚),应用主要包括文件下载(其中也会出现乱码问题),用户注册(连接数据库插入记录),验证码怎么实现(这个网上很多代码可以直接copy~)。总结的话代码还是要多敲敲,好多学了又忘了,关于请求转发和重定向的内容我已经明白了,都是a找b,b找c,区别在于重定向发了两次请求,而请求转发只请求一次(重定向有点像甩锅,而请求转发真的是在“帮忙”),还有其他的区别就是重定向是response里方法,而请求转发是requset里的方法,其你去转发利用到了域对象的概念(hhhh没交代大家自己百度一下~)重定向没有用到,还有就是重定向地址栏变化(因为“甩锅给别人了”),请求转发没有(自己从别人那里借好了钱送给你),最后重定向可以请求站外资源(这个很好理解吧),而请求转发不可以。
明天元旦,然而一个人过,没人跨年,快哭了,大家元旦快乐~新年新气象~~恰饭去了。