servlet


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

获取请求行信息

  1. 获取请求方式 GET String getMethod()
  2. 获取项目虚拟路径 String getContextPath()
  3. 获取URL StringBuffer getRequestURL()
  4. 获取协议和版本号 String getProtoCol()
  5. 获取客户端ip String getRemoteAddr()

获取请求头信息

  1. 获取知道请求头名称对应的值 String getHeader(String name)
  2. 获取所有请求头的名称 "Enumeration / getHeaderNames()"

获取请求体信息(请求参数)

API

username= jack&password=123&hobby=drink&hobby=perm

  1. 获取指定参数名的值 username = jack String getParamter(String name)
  2. 获取指定参数名的值数组 hobby = drink & hobby=perm String[] getParamterValues(String name)
  3. 获取所有参数名和对应值数组,参数名 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 转发

  1. 通过request对象,获取转发器对象 RequestDispatcher getRequestDispatcher(String path)
  2. 通过转发器对象,实现转发功能 void forward(ServletRequest request,ServletResponse response)

转发器特点

浏览器 发一次请求
地址栏 没有发生该表
只转发到服务器内部资源

链式编程

request.getRequestDispatcher("/bServlet").forward(request ,response)

域共享

域:共享区域

request 域: 代表一次请求的范围,一般用于一次请求中转发的多个资源中共享数据

请求转发:一种在服务器的资源跳转方式

  1. 设置数据 void setAttribute(String name,Object o)
  2. 获取数据 Object gteAttribute(String name)
  3. 删除数据 void removeAttribute(String name)

生命周期

  1. 何时创建 用户发送请求时,创建request
  2. 何时销毁 用户返回响应时,销毁request
  3. 作用范围 一次请求,包含多次转发

Response 对象

response 对象表示 web服务器给浏览器返回的响应信息。

Response 体系结构

  1. servletResponse 接口
  2. HttpServletResponse 接口
  3. org.apache.catalina.connector.ResponseFacade 实现类(由tomcat提供)

设置Http 响应信息

响应行

  1. 格式 协议/版本号 状态码 如:Http/1.1 200
    void setStatus(int sc)

响应头

格式: 响应头名称:响应头的值 例如 location:http://www.hrqing.com void setHeader(String name, String value)

响应体

  1. 字符输出流 PrintWriter getWriter()
  2. 字节输出流 ServletOutputStream getOutputStream() 注意:在同一个servlet 中,二种类型的输出流不能同时存在,互斥

设置重定向

1. response.setStatus(302);
2. response.setHeader("Location","重定向网络地址")
response.sendRedirect("重定向网络地址")

重定向特点

  1. 地址栏会发生改变
  2. 重定向是二次请求
  3. 重定向是客户端行为,可以跳转到服务器外部资源
  4. 不能使用request 共享数据

响应中文

  1. 通过response获取字符输出流 Printwriter pw = response.getWriter()
  2. 通过字符输出文本 pw.writer("中文")

解决中文乱码

  1. 指定服务器响应编码方式 response.setCharacterEncoding("GBK")
  2. 统一浏览器和服务器编码 response.setContentType("text/html;charset=utf-8")

ServletContext

web容器tomcat在启动时,它会为每个web项目承建一个对应的ServletContext对象 主要作用

  1. 域共享(共享数据)
  2. 获取资源在服务器的真实地址
  3. 获取全局配置参数
  4. 获取文件MIME类型

获取ServletContext 对象

  1. 通过request对象获取 ServletContext sc = request.getServletContext()
  2. 继承HttpServlet后直接调用 ServletContext sc = this.getServletContext();

域对象

在当前项目范围中,共享数据(多个servlet都可以获取)

  1. 存储数据 void setAttribute(String name,Object value)
  2. 获取数据 Object getAttribute(String name)
  3. 删除数据 void removeAttribute(String name)

获取真实地址

getRealPath("/path/1.jpg")

获取全局配置参数

读取lweb.xml 配置文件中/标签信息。可以实现参数和代码的解耦,多个servlet 都可以获取

<context-param>
<param-name>encode<param-name>
<param-value>utf-8</param-value>
</context-param>

servletContext.getInitParamter("encode")