学习目标:
小白起飞第47天
学习内容:
软件构成和分层
Response
Http响应消息
*格式:
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT
(空行)
hello , response
1) 响应行
1. 组成:协议/版本 响应状态码 状态码描述
2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
1. 状态码都是3位数字
2. 分类:
1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2xx:成功。代表:200
3xx:重定向。代表:302(重定向),304(访问缓存)
4xx:客户端错误。
* 代表:
* 404(请求路径没有对应的资源)
* 405:请求方式没有对应的doXxx方法
5xx:服务器端错误。代表:500(服务器内部出现异常)
2) 响应头:
1. 格式:头名称: 值
2. 常见的响应头:
1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
* 值:
* in-line:默认值,在当前页面内打开
* attachment;filename=xxx:以附件形式打开响应体。文件下载
3) 响应空行
Response对象
HttpServletResponse继承ServletResponse接口,专门封装HTTP响应消息
Response功能
1) 设置响应行
1. 格式:HTTP/1.1 200 ok
2. 设置状态码:setStatus(int sc)
2) 设置响应头:setHeader(String name, String value)
3) 设置响应体:
* 使用步骤:
1. 获取输出流
* 字符输出流:PrintWriter getWriter()
* 字节输出流:ServletOutputStream getOutputStream()
2. 使用输出流,将数据输出到客户端浏览器
response.getWriter().println(“xxxx”);
4)设置编码
response.setContentType(“text/html;charset=utf-8”);
Ajax交互
初始化数据init
Init方法,最先执行,并且执行只执行一次,默认是第一次请求的时候执行
但是可以通过load-on-startup来设置执行时机
-1 是第一次请求
0和正整数 是启动tomcat的时候执行
结合init的执行时机,所以比较适合做一些数据初始化的工作
1 初始化java中对象或其他
2 初始化xml中的数据
1 局部
2 全局
可以解决硬代码问题,一般用来指定字符编码,和filter一起使用
局部
局部参数的获取,使用config对象调用getlnitParameter(key)获取
全局
全局参数需要使用servletContext获取
作用域
getAttribute
setAttribute
removeAttribute
以上三个方法,是request,session,servletContext都有的,用来向对应的作用域中保存数据,获取数据,删除数据
Request
当前请求有效,如果向request中保存数据,那么仅在当前请求中可以获取
一般用于页面和后端交互是需要进行的数据传递
Session
当前会话有效,建立的持续通信,一般是浏览器打开到浏览器关闭,是一次会话,不过也是可以设置会话时间的
一般用于保存登陆的用户信息
会话中,数据共享
ServletContext
全局有效,只要服务器不关闭,永久存储,服务器关闭,数据消失
只要tomcat不重新启动,数据一直存在,共享
重定向和请求转发
请求转发
1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
特点:
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中。
3. 转发是一次请求
客户无感知跳转,跳转方和被跳转方数据共享(request)
重定向
response.sendRedirect("/day15/responseDemo2");
重定向的特点:redirect
1. 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源
3. 重定向是两次请求。不能使用request对象来共享数据
区别
rward 和 redirect 区别
Forward是服务器内部跳转,两个页面中数据互通,使用同一个request对象,但是地址栏中依然显示第一次请求的url地址,用户感觉不到页面进行了跳转,也只会发送一次请求。
sendRedirect是重定向,两个页面数据不互通,使用的不是同一个request对象,地址栏中显示的是第二个请求的url地址,会发送两次请求
重定向的特点:redirect
1. 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源
3. 重定向是两次请求。不能使用request对象来共享数据
转发的特点:forward
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据
应用场景
1 比如登陆失败,或者被拦截到登陆页面,只要是需要用户输入之后,进行跳转的,一般使用重定向
如果此时使用forward跳转,则地址栏不变,那么此时如果刷新页面(重新请求地址栏),就会弹框,提示是否重复发送
Get请求 不会弹框提示,但是依然会发送
2 比如去后端获取数据,一般请求转发(因为request共享)
查询相关,都是forward
比如 搜索,用户列表
搜索比较特殊,需要传递数据(提交数据),一般搜索肯定使用get请求
如果是post请求,后端大部分使用重定向(一般发送数据使用post)
如果是get请求,后端大部分使用forward(一般获取数据使用get)