HTTP:Hyper Text Transfer Protocol超文本传输协议
1. 传输协议:
定义了客户端和服务器端通信时发送数据的格式
2. 特点:
a. 基于TCP/ IP的高级协议
b. 默认端口号:80
c. 基于请求/ 响应模型 -- 一次请求对应一次响应
d. 无状态的:即每次请求之间相互独立,不能交互数据
3. 历史版本:
1.0 :每一次请求/ 响应都会建立新的连接
-- 每个图片,js,css等都会建立新的连接
-- 耗费资源与时间
1.1 :传输完数据后会等待一会,如果还有数据需要传输,则复用当前连接,如果没有则断开
4. URL和URI:
* URL:统一资源定位符 -- http: / / localhost/ Project_name/ demo1
* URI:统一资源标识符 -- / Project_name/ demo1
请求消息的数据格式:
1. 请求行
a. 格式:
请求方式 请求url 请求协议/ 版本
b. 例如:
GET / login. html HTTP/ 1.1
c. HTTP有7 中请求方式,常用2 种:
GET:
1. 请求参数在请求行中url后
2. 请求的url长度有限制
POST:
1. 请求参数在请求体中
2. 请求头
a. 格式:
请求头名称: 请求值
b. 例如:
Host: localhost
User- Agent: Mozilla/ 5.0 . . . -- 通过该值可以在服务器判定,用来实现对不同版本浏览器的兼容
Referer: http: / / localhost/ xxx. html
-- 该属性表示:当前的请求是来自哪里
-- 通过对请求头中Referer属性值的判断,可以防止盗链( 即其他人非法访问我独有的资源)
-- 判断该属性值符合要求再加载资源页面,否则执行其他操作
-- 还可以判定不同的来源用作统计工作
3. 请求空行
在请求头和请求体中需要一行空行来分隔两种信息
4. 请求体
用来封装POST请求参数
Request对象与Response对象
1. 在Servlet接口的service方法中,带有两个参数,其表示的就是Request对象与Response对象
a. 在浏览器中输入url回车后,tomcat服务器会依据url中的资源路径创建对应的Servlet对象
b. tomcat然后创建Request对象与Response对象,将浏览器提交的请求消息数据封装到Request对象中
c. 然后将Request对象与Response对象作为参数传递个service方法,接着调用该方法
2. 因此,在service方法在我们书写获取Request对象数据的逻辑和设置Response对象数据的逻辑
request对象:获取请求消息
1. request对象体系结构:
a. 在Servlet接口的service方法中有一个ServletRequest对象
b. 在HttpServlet抽象类的doGet方法中有一个HttpServletRequest对象
c. 在打印获取到的HttpServletRequest对象的信息时,提示对象信息为
org. apache. catalina. connector. RequestFacade
查看API文档可知关系:
ServletRequest:接口
HttpServletRequest:接口 -- 继承自ServletRequest接口
RequestFacade:类 -- HttpServletRequest的实现类,该实现类由tomcat编写创建
2. 获取请求消息数据:
a. 获取请求行:
* 获取请求方式:GET/ POST/ . . .
String getMethod ( )
* 获取虚拟目录:/ Project_name
String getContextPath ( )
* 获取Servlet路径:/ demo1
String getServletPath ( )
* 获取get方式请求参数:name属性名称= 属性值
String getQueryString ( ) -- 获取所有的在URL中的参数,每对& 分隔
* 获取请求URI:/ Project_name/ demo1
String getRequestURI ( ) -- / Project_name/ demo1
StringBuffer getRequestURL ( ) -- http: / / localhost/ Project_name/ demo1
* 获取协议和版本:HTTP/ 1.1
String getProtocol ( ) -- 该方法继承自父类ServletRequest
* 获取客户机的IP地址:
String getRemoteAddr ( ) -- 该方法继承自父类ServletRequest
b. 获取请求头:
* 通过请求头的属性获取属性值:User- Agent: Xxxxx
String getHeader ( String name) -- getHeader ( "User-Agent" )
-- 可以使用获取到的agent字符串判定属于哪种浏览器:
-- if ( agent. contain ( "Chrome" ) ) { } else if ( agent. contain ( "Firefox" ) ) { }
-- 可以获取referer属性值来防止盗链
* 获取所有请求头名称:{ host, connection, user- agent, . . . }
Enumeration< String> getHeaderNames ( ) -- 返回值可以用nextElement ( ) 获取元素
c. 获取请求体:
* 请求体:只有POST请求才有请求体存在,其中封装了POST请求的参数
* 使用步骤:
1. 获取请求的流对象:
* BufferedReader getReader ( ) :获取字符输入流,只能操作字符
* ServletInputStream getInputStream ( ) :获取字节输入流,可以操作所有类型数据
-- 常用与上传文件操作
2. 再从流中获取数据
* 使用流对象的成员方法获取数据
3. 其他功能:
a. 获取请求参数的通用方式:不论GET/ POST都可以使用
1. String getParameter ( String name)
-- 根据参数名称获取参数值:username= xxx& password= xxx
2. String[ ] getParameterValues ( String name)
-- 根据参数名获取参数值列表:hobby= xxx1& hobby= xxx2
-- 多用于复选框
3. Enumeration< String> getParameterNames ( )
-- 返回参数名称的枚举集合
4. Map< String, String[ ] > getParameterMap ( )
-- 返回所有请求参数的map集合
中文乱码问题:
* 对于GET请求,tomcat 8.0 + 已经解决了乱码问题
* 对于POST请求,需要在doPost方法中对HttpServletRequest对象设置字符集
request. setCharacterEncoding ( "html页面的字符集" )
b. 请求转发:服务器内部资源跳转的方式
a. 内部资源跳转:
某个Servlet提供一部分服务后,由另一个Servlet提供剩余的服务
b. 成员方法:
1. 获取资源调度对象RequestDispatcher对象,传入下一个提供服务的Servlet的urlPattern
RequestDispatcher rd = request. getRequestDispatcher ( "Next_Servlet_urlPattern" ) ;
2. 调用RequestDispatcher对象的成员方法forward,传入当前的request和response对象
rd. forward ( request, response) ;
3. 链式编程简化,同时使用匿名对象:
request. getRequestDispatcher ( "Next_Servlet_urlPattern" ) . forward ( request, response) ;
特点:
1. 浏览器地址栏没有因为内部资源跳转而发生变化
2. 由于是内部资源跳转,所以只能转发跳转到该web项目内的资源,urlPattern不能是外部资源
3. 在浏览器的开发者工具中查看,请求转发的请求只发出一次请求,即原始的请求
c. 数据共享:
1. 域对象:一个有作用范围的对象,可以在范围内共享数据
2. request域:代表一次request请求的范围
* 由于多个Servlet对象在内部请求转发时,浏览器只发送一个request请求
* 即该次请求中的多个资源跳转的Servlet可以使用同一个request域来共享数据
存储数据:
request成员方法:void setAttribute ( String name, Object obj) ;
获取数据:
request成员方法:Object getAttribute ( String name) ;
移除数据:
request成员方法:void removeAttribute ( String name) ;
3. request域仅用于一次request请求
d. 获取ServletContext对象:
1. 成员方法:
ServletContext getServletContext ( ) -- HttpServletRequest继承ServletRequest类成员方法
使用BeanUtils工具包简化对象封装
1. 在获取request请求来的额数据时,如果键值对过多,逐个由键取值getParameter ( key) 太过繁琐
2. 我们将请求过来的数据键属性封装称一个独立的类,然后通过getParameterMap ( ) 方法返回键值对的集合
3. 使用BeanUtils工具包,将键值对的map集合直接封装成类对象,就不用我们逐个去setXxx
4. 使用步骤:
a. 导包:
commons- beanutils- 1.8 .0 . jar
b. 获取所有请求参数,返回map集合:
Map< String, String[ ] > map = req. gerParameterMap ( ) ;
c. 创建一个封装类对象
Xxx new_obj = new Xxx ( ) ;
d. 调用成员方法populate -- 注意,使用apache的BeanUtils工具类
BeanUtils. populate ( new_obj, map) ;
e. 封装完毕,直接通过封装类的getXxx获取成员变量值
5. BeanUtils工具包的其他功能:
a. 用于封装JavaBean的
1. JavaBean:标准的Java类
* 类必须被public 修饰
* 必须提供空参的构造器
* 成员变量必须使用private 修饰
* 必须提供公共的setter和getter方法
2. JavaBean类功能:封装数据
b. 实现细节:
对于setXxx方法,会截取Xxx,然后首字母小写xxx -- > 使用xxx作为属性名
在BeanUtils工具包中,操作的是属性,而非成员变量,由于自动生成的setter和getter方法符合这一要求
特例:如果非要set方法与成员变量名不一致,则以set方法的属性名为准
private String name;
public void setHehe ( String name) {
this . name = name;
}
此时必须设置属性名hehe才能设置name成员变量的值,即
BeanUtils. setProperty ( user, "hehe" , "zhangsan" ) ;
c. 常用成员方法:
* setProperty ( Object obj, String name, String value) :设置属性值
* getProperty ( Object obj, String name) :获取属性值
* populate ( Object obj, Map< K, V> map) :封装对象