仅供参考
1 servlet简介
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
当然,这些都是百度上给的定义;个人还是把servlet看成是符合一定规范的Java类,它继承自 java.servlet.http.HttpServlet 类(当然,HttpServlet又继承了 GenericServlet 等等),一般在使用它时,需要重写其中的 doGet() 或者 doPost() 方法(即service方法)。
servlet 的工作流程:
- 1.客户端(简述就是前端)发送请求到服务器
- 2.服务器接收请求并调用servlet,servlet根据接收的请求做出响应并传递给服务器
- 3.服务器将响应返回给客户端
如下图:
2 servlet的生命周期
现在很多人认为servlet的生命周期只有三个阶段;其实不然,servlet的生命周期有五个阶段:
- 加载。当服务器第一次访问该servlet时,servlet容器会自动加载该servlet.
- 初始化。当servlet被实例化后,servlet会调用
init()
方法初始化这个servlet. - 服务。当浏览器访问servlet的时候,servlet会调用
service()
方法处理请求并做出响应. - 销毁。当服务器关闭时或者检测到servlet要从服务器删除的时候会自动调用
destroy()
方法,让该servlet实例释放掉它所占的资源。一个servlet如果长时间不被使用的话,也会被服务器自动销毁. - 卸载。当servlet调用完
destroy()
方法后,等待垃圾回收,servlet容器会自动处理该卸载。
以上服务器都指的是Tomcat。
下面通过一个简单实例认识一下servlet的出生到死亡:
历程:
1.start Tomcat后,控制台没有来自servlet的任何输出。
2.从浏览器中访问该servlet:
前端显示:
控制台输出:
可见,客户端访问该servlet(第一次访问),服务器实例化该servlet,调用init()
初始化该servlet,同时调用service()
方法提供服务。
3.再次访问该servlet(从浏览器再次访问):
前端显示不变;
控制台输出:
显然,再次访问该servlet时,只调用了 service()
方法。
4.以后访问该servlet都只调用service()
对请求进行处理。
5.直到关闭服务器(关闭Tomcat)时:
可见,当关闭服务器时,servlet调用destroy()
方法销毁该servlet.
以上就是servlet的一个完整的生命周期。
ServletConfig对象
ServletConfig对象主要用于加载servlet的初始化参数,在一个web应用中可以存在多个ServletConfig对象(一个servlet对应一个ServletConfig对象)。
简单来说ServletConfig对象的作用就是 通过此对象读取web.xml中配置的初始化参数。通过web.xml存取初始化参数可以提高程序的灵活性【如果需要更变servlet的初始化参数,只需要更改web.xml文件即可】
1.看看servlet是如何创建和获得这个ServletConfig对象:
创建:在实例化该servlet时创建
看看之前的init()
方法,是不是有一个ServletConfig config
参数呢!一般来说,init()
是继承GenericServlet得到的(GenericServlet是HttpServlet的父类):如图
ServletConfig对象在GenericServlet中的init()
方法中创建。
获得:直接从继承自GenericServlet直接获取ServletConfig对象,即this.config
或者getServletConfig()
2.那么我们如何来使用它呢??!!
使用(此处需要注意区分配置驱动和注解驱动,这里我使用的是配置驱动):
web.xml文件:添加了两个参数,修改了驱动方式
服务器(Tomcat)加载程序时读取web.xml配置文件时把<init-param>
中的参数封装到ServletConfig对象中,然后调用init方法传给ServletConfig对象。
servlet:需要注意的是,去除注解。
结果:控制台输出(在浏览器访问该servlet之后)
3.ServletConfig对象常用API:
- getServletConfig() 获取ServletConfig对象
- getInitParameter(String name) 根据参数名获取参数值
- getInitParameterNames() 获取在web.xml文件配置的全部参数
- getServletName() 获得该servlet的名称
- getServletContext() 获取servlet上下文对象
ServletContext对象
ServletContext对象,也叫做servlet的上下文对象。代表当前的web站点。一个web程序中只能有一个ServletContext对象。
ServletContext对象的作用:
- ServletContext对象代表着当前web站点,所有servlet都共享着一个ServletContext对象,所以servlet之间可以通过ServletContext对象进行通讯。
- ServletConfig对象获取的是配置的是单个servlet的参数信息,ServletContext对象获取的是配置整个web站点的参数信息。
- 利用ServletContext对象读取web站点的资源文件。
- 实现servlet的转发【用ServletContext对象转发不多,主要使用request/response转发】
1.看看是如何创建和获取ServletContext对象!!
创建:加载web程序时创建ServletContext对象(即服务器启动开始就会创建一个唯一的ServletContext对象)。
获得:从ServletConfig对象的getServletContext()
方法可以获得ServletContext对象。
2.ServletContext对象的使用
注:设置ServletContext对象域的参数需要在web.xml重新设置
获取ServletContext对象域的参数和转发:
web.xml修改:
服务器(Tomcat)加载程序时创建ServletContext对象并读取web.xml配置文件时把<context-param>
中的参数封装到ServletContext对象中。
servlet:
Test03Servlet:
Test02Servlet:
结果:控制台输出
浏览器显示:
访问的Test03Servlet,经过Test03Servlet的context.getRequestDispatcher("/Test02Servlet").forward(request, response);;
转发到Test02Servlet。
实现servlet之间的通信:
Test03Servlet:
//通信
String value = "asd";
context.setAttribute("name", value);
Test02Servlet:
//通信
String name = (String) context.getAttribute("name");
System.out.println(name);
结果:控制台输出
读取资源文件:
Test03Servlet:
//读取web程序上的资源
InputStream in = context.getResourceAsStream("1.jpg");
System.out.println(in);
结果:控制台输出
表示流得到了资源。
注:读取资源时特别需要注意的是资源在web项目中放置的路径:该path默认WebContent为其读取的根目录。
3.ServletContext对象常用API
- getContextPath() 获得当前web程序的路径
- getInitParameter(String name) 根据参数名获取参数值
- getInitParameterNames() 获取在web.xml文件配置的全部参数
- setAttribute(String name,Object object) 创建ServletContext对象域的参数,第一个参数是关键字,第二个参数是你要存储的对象
- getAttribute(String name) 根据关键字获取ServletContext对象域对应的参数
- removeAttribute(String name) 删除该关键字的ServletContext对象域对应的参数
- getRealPath(String path) 获取当前web程序的资源
- getResourceAsStream(String path) 以流的形式获取当前web程序的资源
- getRequestDispather(String path) 转发(和请求转发类似)