Servlet对象由web服务器创建,Servlet方法由web服务器调用
一,Servlet对象的生命周期
Servlet运行在servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
1、加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建servlet对象
2、初始化:在Servlet实例化之后,容器将调用Servlet的linit()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
3、请求处理:每次请求Servlet时,Servlet容器都会调用servlet的service()方法对请求进行处理。
4、服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成
资源的释放。在destroy()方法调用之后,容器会释放这个servlet实例,该实例随后会被Java的垃圾收集器所回收
二,体系结构
1、Servlet继承体系
GenericServlet是Servlet的实现类,是个抽象类
HttpServlet继承GenericServlet,对HTTP协议封装的Servlet实现类
2、Request继承体系
Request用于获取请求数据
Request继承体系
ServletRequest,java提供的请求对象根接口
HttpServletRequest,java提供的对HTTP协议封装的请求对象接口,继承了ServletRequest
RequestFacade,Tomcat定义的实现类
Request获取请求数据
获取请求行数据:
方法 | 作用 |
String getMethod() | 获取请求方式:GET或者POST |
StringBuffer getRequestURL() | 获取URL(统一资源定位符) |
String getRequestURI() | 获取URI(统一资源标识符) |
String getQueryString() | 获取请求参数(GET方式) |
(之前已经知道了POST的请求参数在请求体中,所以获取POST的请求参数应该用请求体的方法)
获取请求头
String getHeader(String name):根据请求头名称,获取值
获取请求体
ServletInputStream getInputStream():获取字节输入流
BufferedReader getReader():获取字符输入流
如此一来GET与POST获取请求参数就得用两个办法比较麻烦,所以有了新方法,以后可以用下面的方法获得请求参数
方法 | 作用 |
Map<String,String[]> getParameterMap() | 获取所有参数Map集合 |
String[] getParameterValues(String name) | 根据名称获取参数值(数组) |
String getParameter(String name) | 根据名称获取参数值(单个值) |
3、Response继承体系
Response用来设置相应对象
继承体系
ServletResponse:java提供的请求对象根接口
HttpServletResponse:java提供的对Http协议封装的请求对象
ResponseFacade:Tomcat定义的实现类
设置响应行
void setStatus(int sc):设置响应状态码
响应头
void setHeader(String name, String value):设置响应头键值对
响应体
PrintWriter getWriter():获取字符输出流
ServletOutputStream getOutputStream():获取字节输出流
三、重定向与请求转发
1、重定向
resp.setStatus(302);
resp.setHeader("location","资源B的路径")
或者用简化:resp.sendRedirect("资源B的路径")
2、请求转发
一种在服务器内部资源跳转方式
res.getRequestDispatcher("资源B路径").forword(req,resp)
请求转发资源间共享数据:使用Request对象
方法 | 作用 |
void setAttribute(String name, Object o) | 存储数据到request域中 |
Object getAttribute(String name) | 根据key,获取值 |
void removeAttribute(String name) | 根据key,删除该键值对 |
3、差异
重定向:
浏览器地址栏路径发生变化
可以重定向到任意位置的资源(服务器内部、外部均可)
两次请求,不能在多个资源使用request共享数据
请求转发:
浏览器地址栏路径不发生变化
只能转发到当前服务器的内部资源
一次请求,可以在转发的资源间使用request共享数据
浏览器使用需要加虚拟目录如重定向,而服务端使用则需要加虚拟目录如请求转发