Request
1Request和Response对象的原理
1. Request和Response对象是由服务器创建的,我们来使用它
2. Request对象是来获取请求消息的,Response对象是用来设置响应消息的;
2 request对象继承体系结构
ServletRequest
– 接口
| 继承
HttpServletRequest
– 接口
| 实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
3 request功能
1. 获取请求消息数据
1. 获取请求行数据
* GET /day14/demo1?name=zhangsan HTTP/1.1
* 方法
1. 获取请求方式 :GET
` String getMethod() `
2. (*)获取虚拟目录:/day14
`String getContextPath()`
3. 获取Servlet路径: /demo1
`String getServletPath()`
4. 获取get方式请求参数:name=zhangsan
`String getQueryString()`
5. (*)获取请求URI:/day14/demo1
`String getRequestURI(): ` /day14/demo1
`StringBuffer getRequestURL() `:http://localhost/day14/demo1
`URL`:统一资源定位符 : http://localhost/day14/demo1 中华人民共和国
`URI:`统一资源标识符 : /day14/demo1 共和国(更大)
6. 获取协议及版本:HTTP/1.1
`String getProtocol()`
7. 获取客户机的IP地址:
`String getRemoteAddr()`
2. 获取请求头数据
- 方法
- (*)String getHeader(String name):通过请求头的名称获取请求头的值
- Enumeration getHeaderNames():获取所有的请求头名称
Enumeration<T> 相当于迭代器Iterator<T>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示获取请求头数据:referer
//如果从浏览器直接访问服务器,则referer值为空
//如果先从浏览器访问一个超链接,在通过超链接访问服务器获取资源,则referer才不为空;
String referer = request.getHeader("referer");
System.out.println(referer);//http://localhost/day14/login.html
//防盗链
if(referer != null ){
if(referer.contains("/day14")){
//正常访问
// System.out.println("播放电影....");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("播放电影....");
}else{
//盗链
//System.out.println("想看电影吗?来优酷吧...");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("想看电影吗?来优酷吧...");
}
}
}
3. 获取请求体数据
- 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
- 步骤:
1)获取流对象
BufferedReader getReader():
获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():
获取字节输入流,可以操作所有类型数据
* 在文件上传知识点后讲解
2)再从流对象中拿数据
4其他功能(常用)
4.1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
String getParameter(String name):
根据参数名称获取参数值
如:username=zs&password=123String[] getParameterValues(String name):
根据参数名称获取参数值的数组
如:hobby=xx&hobby=gameEnumeration<String> getParameterNames():
获取所有请求的参数名称Map<String,String[]> getParameterMap():
获取所有参数的map集合
* 中文乱码问题:
* get方式:tomcat 8 已经将get方式乱码问题解决了
* post方式:会乱码
* 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
4.2. 请求转发:一种在服务器内部的资源跳转方式
- 步骤:
1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
- 特点:
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中。
3. 转发是一次请求(浏览器中输入的访问请求)
4.3 共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
1.void setAttribute(String name,Object obj)
:存储数据
2.Object getAttitude(String name)
:通过键获取值
3.void removeAttribute(String name)
:通过键移除键值对
4.4 获取ServletContext
* ServletContext getServletContext()
JavaBean
- BeanUtils工具类,简化数据封装
-
JavaBean:标准的Java类
- 要求:
- 类必须被public修饰
- 必须提供空参的构造器
- 成员变量必须使用private修饰
- 提供公共setter和getter方法
- 功能:封装数据
- 要求:
-
概念:
- 成员变量:
- 属性:setter和getter方法截取后的产物
例如:getUsername() --> Username–> username
成员变量和属性不是一样的
-
方法:
- setProperty()
- getProperty()
- populate(Object obj , Map map):将map集合的键值对信息,封装到对应的JavaBean对象中
HTTP协议
- 请求消息:客户端发送给服务器端的数据
* 数据格式:
1. 请求行
2. 请求头
3. 请求空行
4. 请求体 - 响应消息:服务器端发送给客户端的数据
* 数据格式:
1. 响应行
1. 组成:协议/版本 响应状态码 状态码描述
2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
1. 状态码都是3位数字
2. 分类:
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:服务器告诉客户端以什么格式打开响应体数据
* 值:
* in-line:默认值,在当前页面内打开
* attachment;filename=xxx:以附件形式打开响应体。文件下载
3. 响应空行
4. 响应体:传输的数据
* 响应字符串格式
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT
<html>
<head>
<title>$Title$</title>
</head>
<body>
hello , response
</body>
</html>