Servlet
Servlet体系结构
- Servlet – 接口
- GenericServlet – 抽象类
- 将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
- 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
- HttpServlet – 抽象类 : 对Http协议的一种封装,简化操作
- 定义类继承HttpServlet
- 复写doGet/doPost方法
Servlet相关配置
- urlpartten : Servlet访问路径
- 一个Servlet可以定义多个访问路径 : @WebServlet({"/demo1","/demo3","/demo4"})
- 路径定义规则 : 1. /XXX, 2. /XXX/XXX, 3. *.do
HTTP
- 概念 : Hyper Text Transfer Protocol 超文本传输协议
- 传输协议 : 定义了, 客户端和服务端通信时, 发送数据的格式
- 特点 :
1. 基于TCP/IP的高级协议
2. http默认端口80
3. 基于请求/响应模型 : 一次请求对应一次响应
4. 无状态的 : 每次请求之间相互独立,不能交互数据
- 请求消息数据格式
- 请求行
- 请求方式 请求url 请求协议/版本
GET : 请求参数在请求行中,在url后;请求url长度有限制;不太安全
POST : 请求参数在请求体中;请求url长度没有限制;相对安全 - GET /Day3_S/login.html HTTP/1.1
- 请求头 : 请求头名称 : 请求头值
- User-Agent : 浏览器告诉服务器,我访问你使用的浏览器版本信息,用于解决浏览器的兼容性问题
- Referer : 告诉服务器,当前的请求从哪里来
作用: 1.防盗链 2. 统计工作
- 请求空行 : 空行(用于分割请求头和请求体)
- 请求体 : 封装POST请求消息的请求参数
- 响应消息数据格式
- 响应行
- 组成 : 协议/版本 响应状态码 状态码描述 例如:HTTP/1.1 200 OK
- 响应状态码 : 服务器告诉客户端浏览器本次请求和响应的一个状态
- 1xx : 服务器接收客户端消息,但没有接收完成,等待客户端继续发送。
- 2xx : 成功。 代表:200
- 3xx : 重定向。 代表:302(重定向),304(访问缓存)
- 4xx : 客户端错误。代表 :
- 404:请求路径没有对应的资源
- 405:请求方式没有对应的doxxx方法
- 5xx : 服务器端错误。代表 : 500(服务器内部出现异常)
- 响应头 :
- 格式 : 头名称 : 值
- 常见的响应头 :
- Content-Type : 服务器告诉客户端本次响应体数据格式以及编码格式 例如:Content-Type : text/html;charset=UTF-8
- Content-disposition : 服务器告诉客户端以什么格式打开响应体数据
- in-line : 默认值,在当前页面内打开
- attachment;filename=xxx : 以附件的形式打开响应体。文件下载
- 响应空行
- 响应体 : 传输的数据
Request :
- request对象和response对象的原理
- request和response对象是由服务器创建的。我们来使用它们
- request对象是来获取请求消息,response对象是来设置响应消息
- request : 继承体系结构
- ServletRequest – 接口
- HttpServletRequest – 接口(继承上面的接口)
- org.apache.catalina.connector.RequestFacade 类(tomcat) (实现HttpServletRequest接口)
- request功能 : 获取请求信息
- 获取请求消息数据
- 获取请求行数据
GET /day3/demo1?name=zhangsan HTTP/1.1
方法:
- 获取请求方式:String getMethod() : GET
- (*)获取虚拟目录 : String getContexPath() : /day3
- 获取Servlet路径 : String getServletPath() : /demo1
- 获取get方式请求参数 : String getQueryString() : name=zhangsan
- (*)获取请求URI : String getRequestURI() : /day3/demo1
StringBuffer getRequestURL() : http://localhost/day3/demo1 - 获取协议及版本 : HTTP/1.1 : String getProtocol()
- 获取客户机的IP地址 : String getRemoteAddr()
- 获取请求头数据
- String getHeader(String name) : 通过请求头的名称获取请求头的值
- Enumeration< String > getHeaderNames() : 获取所有的请求头名称
- 获取请求体数据 : 只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
- 获取流对象
- BufferedReader getReader() : 获取字符输入流,只能操作字符数据
- ServletInputStream getInputStream() : 获取字节输入流,可以操作所有类型数据
- 再从流对象中拿数据
- 其它功能:
- 获取请求参数通用方法
- String getParameter(String name) : 根据参数名称获取参数值 username=zhansan&password=123
- String[] getParameterValues(String name) : 根据参数名称获取参数值的数组 hobby=xx&hobby=yy
- Enumeration< String > getParameterNames() : 获取所有请求的参数名称
- Map< String,String[] > getParameterMap() : 获取所有参数的map集合
- 中文乱码:
- get方式 : tomcat 8 已经将get方式乱码问题解决了
- post方式 : 会乱码在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”)
- 请求转发 : 一种在服务器内部的资源跳转方式
- 步骤:
- 通过request对象获取请求转发器对象 : RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发 : forward(ServletRequest request, ServletResponse response)
- 特点:
- 浏览器地址路径不发生变化
- 只能转发到当前服务器的内部资源
- 转发是一次请求
- 共享数据 :
- 域对象 : 一个有作用范围的对象,可以在范围内共享数据
- request域 : 代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- setAttribute(String name,Object obj) : 存储数据
- getAttribude(String name) : 通过键获取值
- removeAttribute(String name) : 通过键移除键值对
- 获取ServletContext : ServletContext getServletContext();
BeanUtils工具类,简化数据封装
- JavaBean : 标准的Java类
- 要求:
- 类必须被public修饰
- 必须提供空参的构造器
- 成员变量必须使用private修饰
- 提供公共setter和getter方法
- 功能: 封装数据
- 概念:
- 成员变量:
- 属性 : setter和getter方法截取后的产物
- 例如 : getUsername() --> Username–>username
- 方法:
- setProperty()
- getProperty()
- populate(Object obj, Map map) : 将Map集合的键值对信息,封装到对应的JavaBean对象中
Response
- 功能 : 设置响应消息
- 设置响应行
- 格式 : HTTP/1.1 200 ok
- 设置状态码 : setStatus(int sc)
- 设置响应头 : setHeader(String name, String value)
- 设置响应体:
- 获取输出流
- 字符输出流 : PrintWriter getWriter()
- 字节输出流 : ServletOutputStream getOutputStream()
- 使用输出流 : 将数据输出到客户端浏览器
- 案例 :
- 完成重定向
- 重定向 : 资源跳转的方式
- 重定向的特点 :
1. 地址栏发生变化
2. 重定向可以访问其他站点
3. 重定向是两次请求,不能通过request对象来共享数据 - 转发的特点 :
1. 转发地址栏路径不变
2. 转发只能访问当前服务器的资源
3. 转发是一次请求,可以使用request对象来共享数据 - forward 和redirect 区别
- 路径写法:
- 相对路径 : 相对路径不可以确定唯一资源 如: ./index.html
- 以 ./ 开头路径
- 规则 : 找到当前资源和目标资源之间的相对位置关系
- ./ : 当前目录
- …/ : 后退一级目录
- 绝对路径 : 可以确定唯一资源 如:http://localhost:8080/Day3_S/response1
- 以 / 开头的路径
- 规则 : 判断定义的路径是给谁用的?判断请求从哪发出
- 给客户端浏览器使用 : 需要加虚拟目录(重定向)
- 建议虚拟目录动态获取 : req.getContextPath();
- 给服务器使用 : 不需要加虚拟目录(转发)
resp.setStatus(302);
resp.setHeader("location","/Day3_S/response2");
resp.sendRedirect("/Day3_S/response2");
- 服务器输出字符数据到浏览器
- 步骤 :
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write("<h1>hello response</h1>");
ServletOutputStream outputStream = resp.getOutputStream();
outputStream.write("hello".getBytes());
}
- 服务器输出字节数据到浏览器
- 验证码
SevletContext对象
- 概念: 代表整个Web应用,可以和程序的容器(服务器)来通信
- 获取 :
- 通过request对象获取 : request.getServletContext();
- 通过HttpServlet获取 : this.getServletContext();
- 功能 :
- 获取mime类型
- mime类型 : 在互联网通信过程定义的一种文件数据类型
- 格式 : 大类型/小类型 text/html imag/jpeg
- 获取 : String getMimeType(String file)
- 域对象 : 共享数据
- setAttribute(String name,Object obj) : 存储数据
- getAttribude(String name) : 通过键获取值
- removeAttribute(String name) : 通过键移除键值对
- ServletContext对象范围 : 所有用户所有请求的数据
- 获取文件的真实路径
- context.getRealPath(String path)