Servlet 知识总结
servlet是一段运行在服务器上的程序,没有main方法,需要通过servlet容器(例如 Tomcat)来调用他的方法
servlet容器主要负责管服务器机器,比如端口,接收http请求,发送http响应等,具体的业务流程将会调用servlet的方法(doGet,doPost 。。。)
在一个JVM中,servlet一般只有一个实例。对于一个请求的到来, 容器会分配一个servlet线程进行处理
Servlet事实上是一个接口,HttpServlet继承了GenericServlet,后者是实现Servlet的一个抽象类,这两个类都是抽象类。
servlet 生命周期
- servlet 类的加载
- servlet 实例化
- 调用init方法
- 调用service方法(负责调用doPost,doGet 等方法)
- 调用destroy方法
ServletConfig 是一个存有servlet的配置信息的对象,每一个servlet都有。
ServletContext 则是一个存有应用配置信息的对象,包含Servlet运行时的环境,一个应用只有一个,每个servlet都能访问
在servlet初始化之前不能使用servlet初始化参数。容器首先读取web.xml,然后根据内容生成一个servletConfig,然后调用servlet的init,传入ServletConfig
context初始化需要使用ServletContextListener接口进行监听
完整的过程
容器读取web.xml配置文件
容器获得context初始化参数,创建ServletContext,把参数放入context中
容器创建ServletContextListener的一个实例,调用contextInitialized,传入ServletContextEvent。执行一系列context初始化代码。可以将需要与servlet共享的对象setAttribute
- 之后就是servlet自己的初始化了
在Web应用中,属性有三个作用域,分别为context,request,httpsession。
context,httpsession中的属性不是线程安全的,修改的时候需要加锁
一个servlet要么转发请求,要么响应请求
session存在与服务器上
cookie存在于客户端上
sessionId 经常借用cookie头部进行传递而已
对于每个应用的一个SessionId,只有一个HttpSession对象,如果容器发现sessionId不在同一vm中 httpSession对象会发生迁移
jsp实际上是一个servlet,只不过是由容器生成的
<%@ page import=”xxx,xxxx”%> 指令 用于向容器提供特殊的指示
<% %> Scriptlet 普通Java代码,会原样放在servlet的服务方法中
<%= %> 表达式,会成为out.print()参数, 不需要参数
<%! %> 声明 用于声明所生成的servlet类成员
所有scriptlet中声明的变量总是局部变量
jsp:useBean中的scope
- page: 当前jsp页面有效 对象储存在pagecontext中
- request: 当前请求有效 对象储存在servletrequest中
- session: 当前会话有效 对象储存在httpsession中
- application:所有用户都可以使用 储存在servletcontext中
bean法则
- 必须有一个无参数的公共构造函数
- get,set,方法
- set的参数与get返回值 类型必须一样
- set和get方法决定了性质名(set,get后面的名字)和类型
- 结合jsp,性质类型必须为string或者基本类型
过滤器
重要方法:init(), doFilter(), destory()
过滤器可入栈,通过filterchain.doFilter调用下一个filter,该filter执行完后回到当前函数
匹配的过滤器会按照DD中声明的顺序组成一个链
请求过滤器,响应过滤器
响应过滤器需要传入一个定制的响应对象HttpServletResponse(包含定制输出流),防止容器直接获得servlet的响应而略过了过滤器要做的处理。主要使用使用xxxxxWrapper,包装类。继承它,覆盖对应的方法
图片来自《Head First Servlets and JSP 中文版 第2版》