http的request对象和response对象
概念:Hyper Text Transfer Protocol 超文本传输协议
特点:
1.基于TCP/IP的高级协议
2.默认端口号8080
3.基于请求/相应模型:一次请求对应一次相应
4.无状态的:每次请求直接相互独立
请求消息的数据格式
1.请求行
请求方式 请求url 请求协议/版本 请求方式: GET 1.请求参数在请求行中,在url后面 2.请求url的长度有限 3.不太安全 POST 1.请求参数在请求体中 2.请求url长度没有限制 3.相对安全2.请求头
3.请求空行
4.请求体
请求消息数据格式
Request
request和response对象的原理
1.request和response对象由服务器创建,我蛮来使用他们 2.request对象是来获取请求消息,response是来设置相应消息
request获取请求消息
获取请求行的数据
GET /test/demo1?name=zhangsan HTTP/1.1 1.获取请求方式 GET String getMethod() 2.获取虚拟目录 /test String getContextPath() 3.获取Servlet路径 /demo1 String getServletPath() 4.获取get方式请求传参 name=zhangsan String getQueryString() 5.获取URI /test/demo1 String getRequestURI() 6.获取协议及版本 HTTP/1.1 String getProtocol() 7.获取客户机的ip地址 String getRemoteAddr()获取请求头的方法
String getHeader(String name)通过获取请求头的名称,获取请求头的值获取请求体数据
只有post请求方式,才有请求体,在请求体中封装了post请求的请求参数步骤:
1.获取流对象
BufferedReader getReader():获取字符输入流 ServletInputStream getInputStream():获取字节输入流2.再从流对象中拿数据
获取请求参数的通用方法
1.String getParameter(String name):根据参数名称获取参数值 2.String[] getParameterValues(String name):根据参数名称获取参数值的数组 3.Enumeration<String> getParameterNames():获取所有请参数的名称 4.Map<String,String[]> getParameterMap():获取参数的所有Map集合1
2//设置流的编码 防止乱码
req.setCharacterEncoding("utf-8");
请求转发:一种在服务器内部资源的跳转方式
步骤:
1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path) 2.使用RequestDispatcher对象进行转发,forword(ServletRequest req,ServletRespnonse resp)特点:
1.浏览器地址栏不发生变化 2.只能转发到当前服务器内部资源中 3.转发是一次请求
数据共享
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用域请求转发的多个资源中共享数据
方法:
1.void setAttribute(String name,Object obj):存储数据
2.Object getAttribute(String name):通过键获取值
3.void removeAttribute(String name):通过键来移除键值对获取ServletContext对象
ServletContext getServletContext()响应消息
相应消息的数据格式
1.相应行
组成:协议/版本 相应状态码 状态码描述 状态码分类: 1.1XX:服务器接收客户端消息,但没有接收完全,等待一段时间后,发送1XX 2.2XX:成功。200 3.3XX:重定向 302(重定向) 304(访问缓存) 4.4XX:客户端错误 404(请求路径没有对应的资源) 405(请求方式没有对应的doXXX方法) 5.5XX:服务器端错误 500(服务器内部出现异常)2.相应头
1.格式:头名称:值 2.常见的相应头: 1.Content-Type:服务器告诉客户端本次相应体数据格式以及编码格式 2.Content-disposition:服务器告诉客户端以什么格式打开相应数据3.相应空行
4.相应体
Response对象
功能:设置相应消息
设置相应行
设置状态码:setStatus(int sc)设置相应头
setHeader(String name,string value)设置相应体
使用步骤: 1.获取输出流 字符输出流:PrintWriter getWriter() 字节输出流:ServletOutputStream getOutputStream() 2.使用输出流,将数据输出到客户端浏览器
完成重定向
代码实现
1 | //简单的重定向的方法 |
特点:
- 1.地址栏发生变化
- 2.重定向可以访问其他站点
- 3.重定向是两次请求,不能使用request对象来共享数据
路径的写法
相对路径:不可以确定唯一资源
规则:.开头 找到当前资源和目标资源之间的相对位置关系据对路径:可以确定唯一资源
服务器输出字符数据到浏览器
步骤:
1.获取字符输出流
2.输出数据防止乱码
1 | resp.setHeader("content-type","text/html;charset=utf-8"); |
ServletContext对象
1.概念:代表整个web应用,可以和程序的容器(服务器)通信
2.获取:
- 1.通过request对象获取
request.getServletContext() - 2.通过HttpServlet获取
this.getServletContext
3.功能:
1.获取MIME类型
MIME类型:在互联网通信过程中定义的一种文件类型 格式:大类型/小类型 text/html 获取: `String getMineType(String file)` 代码示例1
2
3
4
5
6
7
8ServletContext context = this.getServletContext();
//定义文件名称
String filename = "a.jpg";
//获取MIME类型
String MimeType = context.getMimeType(filename);
System.out.println(MimeType);2.域对象:共享数据
1.setAttribute(String name,String value) 2.getAttribute(String name) 3.removeAttribute(String name) ServletContext对象范围:所有用户请求的数据3.获取文件的真实服务器路径
1.方法:String getRealPath()
案例
文件下载需求:
- 1.页面显示超链接
- 2.点击链接后弹出下载提示框
- 3.完成图片文件下载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求参数 文件名称
String filename = req.getParameter("filename");
//使用字节输入流,加载文件进内存
ServletContext context = this.getServletContext();
String realPath = context.getRealPath("/img/"+filename);//获取文件真实路径
FileInputStream fis = new FileInputStream(realPath);
//设置Response的相应头
String mineType = context.getMimeType(filename);//获取文件的MIME类型
resp.setHeader("content-type",mineType);
resp.setHeader("content-disposition","attachment;filename="+filename);
//将输入流的数据写出到输出流
ServletOutputStream sos = resp.getOutputStream();
byte[] bytes = new byte[1024];
int len = 0;
while ((len=fis.read(bytes))!=-1){
sos.write(bytes,0,len);
}
fis.close();
}
