Java Servlet 是和平台无关的服务器端组件, 它运行在 Servlet 容器中。
Servlet 容器负责 Servlet 和客户的通信以及调用 Servlet 的方法, Servlet
和 客户通信采用“请求/响应”的模式。
Servlet 容器为 JavaWeb 应用提供运行时环境,它负责管理 Servlet 和 JSP 的生命周期,以及管理它们的共享数据。
Servlet 容器也称为 JavaWeb 应用容器,或者 Servlet/JSP 容器。
目前最流行的 Servlet 容器软件括:
Tomcat
Resin
J2EE 服务器(如Weblogic)中也提供了内置的 Servlet 容器
Tomcat 是一个免费的开放源代码的 Servlet 容器,它是 Apache 软件基金会的一个顶级项目,
由 Apache,Sun和其他一些公司及个人共同开发而成。由于有了 Sun 的参与与支持,
最新的 Servlet 和 JSP 规范总是能在 Tomcat 中的到体现。
Servlet 可完成如下功能:
1)、创建并返回基于客户请求的动态 HTML 页面。
2)、创建可嵌入到现有 HTML 页面中的部分 HTML页面 (HTML片段)。
3)、与其它服务器资源(如数据库或基于 Java 的应用程序) 进行通信。
注:Servlet 本质上讲就是一个 Java 类,只不过它部署在 Servlet 容器里面。
1、Servlet 容器响应客户请求的过程
请求 ServletRequest
客户 ——> Servlet容器 ——> Servlet
<—— <——
响应 ServletResponse
2、Servlet 的 HelloWorld
1)、创建一个 Servlets 的接口的实现类
public class HelloServlet implements Servlet
2)、在 web.xml 文件中配置和映射这个 Servlet
<!-- 配置和映射 Servlet -->
<servlet>
<!-- Servlet 注册的名字 -->
<servlet-name>HelloServlet</servlet-name>
<!-- Servlet 的全类名。HelloServlet.java 文件最好放在包内,可以通过 ctrl 检查该全类名是否正确-->
<servlet-class>web.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 需要和某一个 servlet 节点的 serlver-name 子节点的文本节点一致 -->
<servlet-name>HelloServlet</servlet-name>
<!-- 映射具体的访问路径:/ 代表当前 WEB 应用的根目录。 -->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3、Servlet容器 : 运行 Servlet、 JSP、 Filter 等软件环境。
1)、可以来创建 Servlet, 并调用 Servlet 的相关生命周期方法。
2)、JSP, Filter, Listener, Tag ...
!!!(重点)
4、Servlet 生命周期的方法: 以下方法都由 Serlvet 容器调用。
1)、构造器:当且仅当第一次请求 Servlet 时, 创建 Servlet 的实例,调用构造器。
这说明 Serlvet 是单实例的!
2)、init 方法: 只被调用一次,在创建好实例后立即被调用,用于初始化当前 Servlet.
3)、service: 被多次调用,每次请求都会调用 service 方法,实际用于响应请求的。
4)、destroy: 只被调用一次,在当前 Servlet 所在的WEB 应用被卸载前调用,用于释放当前
Servlet 所占用的资源。
5、load-on-startup:
1)、配置在 servlet 节点中:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>web.HelloServlet</servlet-class>
<!-- 可以指定 Servlet 被创建的时机 -->
<load-on-startup>1</load-on-startup>
</servlet>
2)、load-on-startup: 可以指定 Serlver 被创建的时机,若为负数,则在第一次请求时被
创建。若为 0 或正数, 则在当前 WEB 应用被 Serlver 容器加载时创建实例,且数组越小越早
被创建。
Servlet容器响应客户请求的过程
a、Servlet 引擎检查是否已经装载并创建了该 Servlet 的实例对象。如果是,则直接执行第④步,否则,执行第②步。
b、装载并创建该 Servlet 的一个实例对象:调用该 Servlet 的构造器
c、调用 Servlet 实例对象的 init() 方法。
d、创建一个用于封装请求的 ServletRequest 对象和一个代表响应消息的 ServletResponse 对象,
然后调用 Servlet 的 service() 方法并将请求和响应对象作为参数传递进去。
e、WEB应用程序被停止或重新启动之前, Servlet 引擎将卸载 Servlet ,
并在卸载之前调用 Servlet 的 destroy() 方法
Servlet的注册与运行
Servlet 程序必须通过 Servlet 容器来启动运行,并且储存目录有特殊要求,
通需要存储在 <WEB应用程序目录>\WEB-INF\classes\ 目录中。
Servlet 程序必须在 WEB 应用程序的 web.xml 文件中进行注册和映射其访问路径,才可以被 Servlet 引擎加载和被外界访问。
一个 <servlet> 元素用于注册一个 Servlet,它包含有两个主要的子元素: <servlet-name> 和 <servlet-class>,
分别用于设置 Servlet 的注册名称和 Servlet 的完整类名。
一个 <servlet-mapping> 元素用于映射一个已注册的 Servlet 的一个对外访问路径,它包含有两个子元素:
<servlet-name> 和 <url-pattern>,分别用于指定 Servlet 的注册名称和 Servlet 的对外访问路径。
6、关于serlvet-mapping
1)、同一个 Servlet 可以被映射到多个 URL 上, 即多个 <serlvet-mapping> 元素的
<servlet-mapping> 子元素的设置值可以是同一个 Servlet 注册名。
2)、 在 Servlet 映射到 URL 中也可以是 * 通配符,但只能有两种固定的格式。
一种格式是 “*.扩展名”,另一种格式是以正斜杠(/)开头并以 “/*”结尾。
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
7、
<!-- 配置 Serlvet 的初始化参数 ,且该节点必须在 load-on-startup 节点前面-->
<init-param>
<!-- 参数名 -->
<param-name>user</param-name>
<!-- 参数值 -->
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
2)、获取初始化参数:
> servletConfig.getInitParameter(String name); 获取指定参数名的初始化参数。
> getInitParameterNames(): 获取参数名组成的 Enumeration 对象
String password = servletConfig.getInitParameter("password");
Enumeration<String> names = servletConfig.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value = servletConfig.getInitParameter(name);
}
3)、获取 Serlvet 的配置名称:
String serlvetName = servletConfig.getServletName();
<!-- 配置当前 WEB 应用的全局的初始化参数, WEB 服务器启动时便初始化 -->
<context-param>
<param-name>driverClass</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
8.
ServletContext(三大框架整合使用)
1)、可以由 SerlvetConfig 获取
2)、该对象代表当前 WEB 应用:可以认为 SerlvetContext 是当前 WEB 应用的一个大管家。
可以从中获取到当前 WEB 应用的各个方面的信息。
a、获取当前 WEB 应用的全局的初始化参数。
servletContext.getInitParameter("driverClass");
9、获取当前 WEB 应用的名称:
String contextPath = servletConfig.getServletContext().getContextPath();
System.out.println(contextPath);
获取当前 WEB 应用的某一个文件在服务器上的绝对路径,而不是部署前的路径 :
String realPath = servletConfig.getServletContext().getRealPath("contextPath");
System.out.println(realPath);
获取当前 WEB 应用的某一个文件对应的输出流。
getResourceAsStream(String Path): Path 的/ 为当前 WEB 应用的根目录。
ClassLoader classLoader = getClass().getClassLoader();
InputStream is = classLoader.getResourceAsStream("jdbc.properties");
System.out.println("1、"+is);
InputStream is2 = servletConfig.getServletContext().getResourceAsStream("/WEB-INF/classes/jdbc.properties");
System.out.println("2、"+is2);
jsp九大内置对象对应servlet:
jsp servlet
out PrintWriter
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
config ServletConfig
exception Throwable
page this
pageContext