Servlet&HTTP&Request笔记
Servlet :
Servlet的体系结构:
Servlet – 接口 |实现 GenericServlet – 抽象类 |继承 HttpServlet – 抽象类
GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象,将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可。HttpServlet:对http协议的一种封装,简化操作
定义类继承HttpServlet复写doGet/doPost方法
Servlet相关配置
urlpartten:Servlet访问路径一个Servlet可以定义多个访问路径:
@WebServlet({"/d4","/dd4","/ddd4"})
路径定义规则:
/xxx:路径匹配/xxx/xxx:多层路径,目录结构*.do:扩展名匹配
HTTP:
概念:Hyper Text Transfer Protocol 超文本传输协议
传输协议:定义了客户端和服务器端通信时,发送数据的格式
特点:
基于TCP/IP的高级协议默认端口号:80基于请求/响应模型的:一次请求对应一次响应无状态的协议:每次请求之间相互独立,不能交互数据
历史版本:
1.0:每次请求响应都会建立新的连接1.1:复用连接
请求消息数据格式:
请求行:
请求方式 请求url 请求协议/版本 GET /login.html HTTP/1.1请求方式:HTTP协议有7种请求方式,常用的有两种GET:
请求参数在请求行中,在url后。请求的url长度是有限制的。不太安全。
POST:
请求参数在请求体中。请求的url长度是没有限制的。相对安全。 请求头:客户端浏览器告诉服务器一些信息 请求头名称: 请求值
常见的请求头:
User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息 可以在服务器端获取该头的信息,解决浏览器的兼容性问题 Referer:http://localhost/login.html
告诉服务器,我(当前请求)从哪里来作用:
防盗链统计工作 请求空行: 空行,用于分割POST请求的请求头和请求体的请求体(正文): 封装POST请求消息的请求参数的
Request:
request对象和response对象的原理
request对象和response对象是由服务器创建的。我们来使用它们request对象是来获取请求消息,response对象是来设置响应消息
request对象继承体系结构:
ServletRequest – 接口 | 继承 HTTPServletRequest – 接口 | 实现 org.apache.catalina.connector.RequestFacade 类(tomcat)
request功能:
获取请求消息数据
获取请求行数据
GET /day14/demo1?name=zhangsan HTTP/1.1方法:
获取请求方式:GET
`String
getMethod()`
(*)获取虚拟目录:/day14
String
getContextPath()
获取Servlet路径:/demo1
String
getServletPath()
获取get方式请求参数:name=zhangsan
String
getQueryString()
(*)获取请求URI:/day14/demo1
String
getRequestURI()
StringBuffer
getRequestURL()
* URL:统一资源定位符:http://localhost/day14/demo1
* URI:统一资源标识符:/day14/demo1
获取协议及版本:HTTP/1.1
String
getProtocol()
获取客户机的IP地址:
String
getRemoteAddr()
获取请求头数据
方法:
通过请求头的名称获取请求头的值:
String
getHeader(String name
)
获取所有的请求头名称:
Enumeration
<String> getHeaderNames()
获取请求体数据
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数步骤:
获取流对象: 获取字符输入流,只能操作字符数据:
BufferedReader
getReader()
获取字节输入流,可以操作所有类型数据:
ServletInputStream
getInputStream()
再从流对象中拿数据
其他功能
获取请求参数通用方式:不论是get还是post请求方式都可以使用下列方法来获取请求参数
String
getParameter(String name
)
String
[] getParameterValues(String name
)
Enumeration
<String> getParameterNames()
Map
<String
,String
[]> getParameterMap()
中文乱码问题: * get方式:tomcat8已经将get方式乱码问题解决了 * post方式:会乱码解决:在获取参数前,设置request的编码request
.setCharacterEncoding("utf-8");
请求转发:一种在服务器内部的资源跳转方式
步骤:
RequestDispatcher
getRequestDispatcher(String path
)
forward(ServletRequest request
, ServletResponse response
)
特点: 1. 浏览器地址栏路径不发生变化 2. 只能转发到当前服务器内部资源中 3. 转发是一次请求
共享数据:
域对象:一个有作用的范围的对象,可以在范围内共享数据request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
void setAttribute(String name
, Object obj
)
Object
getAttribute(String name
)
void removeAttribute(String name
)
获取ServletContext:
ServletContext
getServletContext()