一、HTTP消息请求格式
(一)基本格式
<request-line>
<headers>
<blank line>
[<request-body>]
(二)格式说明
1.请求行
请求方式/请求URL 请求协议/请求版本
GET/login.html HTTP/1.1
HTTP协议有7种请求方式,常用的有2种:GET、POST
- GET:请求参数在请求行中(URL后),长度有限制(与浏览器有关),安全系数低
- POST:请求参数在请求体中,长度没有限制,安全系数高
2.请求头
通常用于浏览器向服务器传递一些信息,格式如下:
请求头名称:请求头值
常见的请求头:Accept、Accept-Charset、Accept-Encoding、Accept-Language…
https://blog.csdn.net/qq_30553235/article/details/79282113
3.请求空行
空行,用于分隔请求头和请求体
4.请求体
只有POST请求的请求方式才有请求体,封装POST请求消息的请求参数。
POST /login.html HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/login.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
username=zhangsan
二、HTTP消息响应格式
(一)基本格式
<status-line>
<headers>
<blank line>
[<response-body>]
(二)格式说明
1.响应行
响应协议/响应版本 响应状态码 状态码描述
HTTP/1.1 200 OK
响应状态码都是3位数字
- 1XX:服务器接收客户端消息,但没有接受完成,等待一段时间后,发送1XX状态码
- 2XX:成功。例如:200
- 3XX:重定向。例如:302(重定向),304(访问缓存)
- 4XX:客户端错误
例如:- 404:请求路径没有对应的资源
- 405:请求方式没有对应的doXxx方法
- 5XX:服务器端错误。例如:500(服务器内部出现异常)
2.响应头
通常用于服务器向浏览器传递一些信息,格式如下:
响应头名称:响应头值
常见的请求头:Content-Type、Content-disposition…
https://blog.csdn.net/qq_30553235/article/details/79282113
3.响应空行
空行,用于分隔响应头和响应体
4.响应体
只有POST请求的请求方式才有请求体,封装POST请求消息的请求参数。
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT
username=zhangsan
三、Request对象
Request对象及下文的Response对象均由服务器创建,分别用来获取请求消息和设置响应消息。
(一)获取请求行
// 1. 获取请求方式 :GET
String method = request.getMethod();
System.out.println("method:"+method);
// 2. 获取虚拟目录:/day21
String contextPath = request.getContextPath();
System.out.println("contextPath:"+contextPath);
//3. 获取Servlet路径: /demo1
String servletPath = request.getServletPath();
System.out.println("servletPath:"+servletPath);
//4. 获取get方式请求参数:name=zhangsan
String queryString = request.getQueryString();
System.out.println("queryString:"+queryString);
//5. 获取请求URI:/day21/demo1
String requestURI = request.getRequestURI();
System.out.println("requestURI:"+requestURI);
//6. 获取协议及版本:HTTP/1.1
String protocol = request.getProtocol();
System.out.println("protocol:"+protocol);
//7. 获取客户机的IP地址:127.0.0.1
String remoteAddr = request.getRemoteAddr();
System.out.println("remoteAddr:"+remoteAddr);
(二)获取请求头
- String getHeader(String name):通过请求头的名称获取请求头的值
- Enumeration getHeaderNames():获取所有的请求头名称
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String name = headerNames.nextElement();
String header = request.getHeader(name);
System.out.println(name+"---->"+header);
}
String agent = req.getHeader("user-agent");
if(agent.contains("Chrome")){
System.out.println("访问的是谷歌浏览器!");
}else if(agent.contains("Firefox")){
System.out.println("访问的是火狐浏览器!");
}
(三)获取请求体
- BufferedReader getReader():获取字符输入流,只能操作字符数据
- ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、获取字符输入流
BufferedReader br = req.getReader();
//2、读取字符流的内容
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
}
(四)获取请求参数
- String getParameter(String name):根据参数名称获取参数值
- String[] getParameterValues(String name):根据参数名称获取参数值的数组
- Enumeration getParameterNames():获取所有请求的参数名称
- Map<String,String[]> getParameterMap():获取所有参数的map集合
注意!中文乱码问题
- get方式:tomcat 8 已经将get方式乱码问题解决了
- post方式:会乱码
- 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
(五)其他功能
1.请求转发
转发:服务器内部进行资源跳转的方式。
- 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
转发具有以下三种特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中。
- 转发是一次请求
2.共享数据
域对象:有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,用于请求转发的多个资源中共享数据
常用方法
- void setAttribute(String name,Object obj):存储数据
- Object getAttitude(String name):通过键获取值
- void removeAttribute(String name):通过键移除键值对
四、Response对象
(一)重定向
//方法一
//1.设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/day/responseDemo");
//方法二
response.sendRedirect("/day/responseDemo");
重定向的特点:redirect
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能使用request对象来共享数据
forward 和 redirect 区别
(二)输出字符数据
- 获取字符输出流
- 输出数据
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//resp.setCharacterEncoding("GBK");//获取流之前,设置流的默认编码是GBK
//resp.setHeader("content-type","text/html;charset=utf-8");//告诉浏览器服务器发送的消息体的数据的编码
//简化版本
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.println("你好,response!!");
}
(三)输出字节数据
- 获取字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
- 输出数据
outputStream.write("你好".getBytes("utf-8"));
五、ServletContext对象
代表整个web应用,可以和程序的容器(服务器)来通信
(一)获取MIME类型
- MIME类型:在互联网通信过程中定义的一种文件数据类型
格式:大类型/小类型 text/html image/jpeg - 获取:String getMimeType(String file)
ServletContext servletContext = req.getServletContext();
ServletContext servletContext2 = this.getServletContext();
//获取:String getMimeType(String file)
String mimeType = servletContext.getMimeType("a.txt");
System.out.println("mimeType:"+mimeType);
/*
1. setAttribute(String name,Object value)
2. getAttribute(String name)
3. removeAttribute(String name)
- ServletContext对象范围:所有用户所有请求的数据
*/
servletContext.setAttribute("msg","hello,world");
(二)共享数据
ServletContext对象范围:所有用户所有请求的数据
- setAttribute(String name,Object value)
- getAttribute(String name)
- removeAttribute(String name)
(三)获取文件物理路径
获取方法:String getRealPath(String path)
String b = context.getRealPath("/b.txt");//web目录下资源访问
System.out.println(b);
String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
System.out.println(c);
String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
System.out.println(a);