请求对象
1. 获取请求行数据
getMethod()获取请求方式
getContextPath()获取虚拟目录
2. 获取请求头数据
getHeader(请求头) 获取指定的请求头中的数据
3. 获取请求体数据
必须是post请求才可以
getReader() 通过请求对象获取字符流对象(可以操作浏览器传过来的文本数据)
getInputStream()通过请求对象获取字节流对象(可以操作浏览器传过来的所有数据)
4. 获取表单提交的数据
常用方法
request.getParameter(name属性的值) 获取表单提交的数据(根据参数的名称获取参数的值)
request.getParameterValues(name属性的值) 根据参数的名称获取参数的值的数组(复选框)
request.getParameterMap();获取表单提交数据的map集合
封装方式
手动封装,适合少量的数据
反射封装,几乎不用
工具类封装,常用(BeanUtils)
post请求乱码问题
根源
前后编码不一致
表单提交数据:UTF-8
服务器接收到数据并转成字符串,用的默认是ISO-8859-1(不支持中文)
解决
request.setCharacterEncoding("utf-8");
5. 域对象临时存储数据
范围
时间范围:一次请求开始到结束
空间范围:当前的请求中
方法
setAttribute()
getAttribute()
removeAttribute()
6. 实现请求转发和包含
目的
一个资源需要多个servlet协同处理,就可以使用请求转发或者包含
步骤
首先获取请求的分发器
RequestDispatcher r = request.getRequestDispatcher("/路径");
转发
r.forward(request,response);
包含
r.include(request,response);
特点
浏览器的地址不会发生改变
转发 对于源组件为"留头不留体",目标组件为"留体不留头"(头:请求头 体:请求体, 作为了解)
包含 对于源组件为"留头又留体",目标组件为"留体不留头"(头:请求头 体:请求体, 作为了解)
本质都是一次请求,共享了请求和响应对象
案例改进
如果登录成功,转发到SuccessServlet,并且把用户名带过去
响应对象
1. 设置响应行
void setStatus(int sc) 设置状态码
常见的状态码描述
1XX:浏览器发送的请求不完善,需要浏览器进一步补充资料
2XX:响应正常完成
3XX:本次请求已经完成,但是需要浏览器进一步操作
4XX:请求资源错误 404:资源找不到 405:请求方式没有对应的方法
5XX:服务器范的错
2. 设置响应头
通用的方法
setHeader()
可以设置不同的头,来实现不同的功能
1,设置缓存时间
response.setDateHeader("Expires",0) 不缓存页面
2,设置定时刷新(定时跳转)
设置Refresh头
response.setHeader("Refresh","3")每3秒刷新一次(当前页面) 炒股,直播
response.setHeader("Refresh","3;url=路径")3秒之后跳转到指定页面
3,实现重定向(立即跳转)
设置location头
response.setHeader("location","路径"); response.setStatus(302)
简化写法 response.sendRedirect("路径")
和转发的区别
请求响应的次数
转发:一次请求,一次响应
重定向:两次请求,两次响应
浏览器的地址
转发:地址栏保持初值不变
重定向:改为重定向之后的地址
作用范围
转发:只能在同一个项目中
重定向:可以定位到其他项目或者其他服务器
url的路径
转发:不需要加上虚拟目录
重定向:需要加上虚拟目录
变量的作用域
转发:可以使用request域对象可以共享数据
重定向:因为重新发了一个请求,不能用request域对象可以共享数据
各自的优点
转发:相对的高效,可以共享同一个请求对象,可以隐藏实际的链接地址
重定向:能够访问其他项目或者服务器上的资源
4,实现文件下载
3. 设置响应体
response.getOutputStream()获取字节流对象,用于在页面中展示音视频,图片等
response.getWriter().获取字符流对象,用于在页面中展示文本数据
根源:前后编码不一致
服务器发送数据:UTF-8
浏览器接收数据并解析:GBK(中文的IE浏览器)
解决:response.setContentType("text/html;charset=UTF-8");
告诉浏览器,我会以utf-8的编码去发送数据,将来浏览器接收到数据之后就会使用utf-8的格式去解码
4. 文件下载
两个头
content-type : 文件类型/流的类型
content-disposition: attachment 以附件的形式下载
两个流
读服务器上的图片 输入流
把图片数据写到浏览器 输出流
一对接
循环读写
5. 路径问题
相对路径
不以/开头(相同的部分去掉)
http://localhost:8080/login.html 访问登录页面
http://localhost:8080/LoginServlet 访问LoginServlet
跳转路径:LoginServlet(相当于他俩在同一个目录)
http://localhost:8080/user/login.html 访问登录页面
http://localhost:8080/LoginServlet 访问LoginServlet
跳转路径:../LoginServlet(LoginServlet相当于在login.html的上一层)
不建议使用相对路径,总是要确定他俩的相对位置,比较麻烦
绝对路径
以/开头(省略了协议和ip和端口号)
/LoginServlet(前面省略了http://localhost:8080)
研究什么时候需要加上虚拟目录
给客户端使用(从客户端跳到服务器端)
需要加上虚拟目录(超链接,form表单,img标签的src属性,重定向,刷新)
给服务器端使用(在当前项目内跳转)
不需要加上虚拟目录(请求转发,包含)