servlet 生命周期
创建
默认情况下:
用户第一次访问时,创建servlet,执行init 方法
修改创建时机:
<load-on-startup></load-on-startup>
正数:4-N,主要是因为 tomcat中的web.xml 里面有1-3,所以推荐4以上
负数:-1 用户第一次访问时创建
运行
用户每次访问时,都会重新开启一个线程执行 service方法
销毁
服务器正常关闭时,销毁servlet 执行destroy方法
servlet ,GenericServlet,HttpServlet
servlet 是顶级接口,提供了五个声明方法,genericServlet 是抽象类,重写了绝大多数方法,开发者只需重写service方法,httpServlet处理http协议中的交互,请求和响应 根据不同的请求方式,做出不同的处理方法
url 映射模式
精确匹配
/servletDemo
目录匹配
/aa/*
后缀匹配
*.xxx,*.do
获取请求行信息
- 获取请求方式 GET String getMethod()
- 获取项目虚拟路径 String getContextPath()
- 获取URL StringBuffer getRequestURL()
- 获取协议和版本号 String getProtoCol()
- 获取客户端ip String getRemoteAddr()
获取请求头信息
- 获取知道请求头名称对应的值 String getHeader(String name)
- 获取所有请求头的名称 "Enumeration /
getHeaderNames()"
获取请求体信息(请求参数)
API
username= jack&password=123&hobby=drink&hobby=perm
- 获取指定参数名的值 username = jack String getParamter(String name)
- 获取指定参数名的值数组 hobby = drink & hobby=perm String[] getParamterValues(String name)
-
获取所有参数名和对应值数组,参数名 name(key) ,值数组 value, 封装map集合 Map /
getParameterMap() 中文乱码 get :在tomcat8以及以上版本,内部URL编码(UTF-8) post:编码解码不一致,造成乱码现象 客户端编码 UTF-8 服务器编码 ISO-8859-1 拉丁文 指定解码 void setCharacterEncoding(String env) request.setCharacterEncoding("UTF-8");
servlet 转发
- 通过request对象,获取转发器对象 RequestDispatcher getRequestDispatcher(String path)
- 通过转发器对象,实现转发功能 void forward(ServletRequest request,ServletResponse response)
转发器特点
浏览器 发一次请求
地址栏 没有发生该表
只转发到服务器内部资源
链式编程
request.getRequestDispatcher("/bServlet").forward(request ,response)
域共享
域:共享区域
request 域: 代表一次请求的范围,一般用于一次请求中转发的多个资源中共享数据
请求转发:一种在服务器的资源跳转方式
- 设置数据 void setAttribute(String name,Object o)
- 获取数据 Object gteAttribute(String name)
- 删除数据 void removeAttribute(String name)
生命周期
- 何时创建 用户发送请求时,创建request
- 何时销毁 用户返回响应时,销毁request
- 作用范围 一次请求,包含多次转发
Response 对象
response 对象表示 web服务器给浏览器返回的响应信息。
Response 体系结构
- servletResponse 接口
- HttpServletResponse 接口
- org.apache.catalina.connector.ResponseFacade 实现类(由tomcat提供)
设置Http 响应信息
响应行
- 格式 协议/版本号 状态码 如:Http/1.1 200
void setStatus(int sc)
响应头
格式: 响应头名称:响应头的值 例如 location:http://www.hrqing.com void setHeader(String name, String value)
响应体
- 字符输出流 PrintWriter getWriter()
- 字节输出流 ServletOutputStream getOutputStream() 注意:在同一个servlet 中,二种类型的输出流不能同时存在,互斥
设置重定向
1. response.setStatus(302);
2. response.setHeader("Location","重定向网络地址")
response.sendRedirect("重定向网络地址")
重定向特点
- 地址栏会发生改变
- 重定向是二次请求
- 重定向是客户端行为,可以跳转到服务器外部资源
- 不能使用request 共享数据
响应中文
- 通过response获取字符输出流 Printwriter pw = response.getWriter()
- 通过字符输出文本 pw.writer("中文")
解决中文乱码
- 指定服务器响应编码方式 response.setCharacterEncoding("GBK")
- 统一浏览器和服务器编码 response.setContentType("text/html;charset=utf-8")
ServletContext
web容器tomcat在启动时,它会为每个web项目承建一个对应的ServletContext对象 主要作用
- 域共享(共享数据)
- 获取资源在服务器的真实地址
- 获取全局配置参数
- 获取文件MIME类型
获取ServletContext 对象
- 通过request对象获取 ServletContext sc = request.getServletContext()
- 继承HttpServlet后直接调用 ServletContext sc = this.getServletContext();
域对象
在当前项目范围中,共享数据(多个servlet都可以获取)
- 存储数据 void setAttribute(String name,Object value)
- 获取数据 Object getAttribute(String name)
- 删除数据 void removeAttribute(String name)
获取真实地址
getRealPath("/path/1.jpg")
获取全局配置参数
读取lweb.xml 配置文件中/
<context-param>
<param-name>encode<param-name>
<param-value>utf-8</param-value>
</context-param>
servletContext.getInitParamter("encode")