Servlet 简介
-
java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中。
-
Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户端的通信采用“请求/响应”的模式。
-
Servlet可完成如下功能:
-创建并返回基于客户请求的
动态HTML页面;
-创建可嵌入到现有HTML页面中的部分HTML页面(HTML片段);
-与其他服务器资源(如数据库或基于java的应用程序)进行通信。
Servlet 容器:运行Servlet、JSP、Filter等的软件环境
-
可以创建Servlet,并调用Servlet 的相关生命周期方法
-
JSP ,Filter ,Listenter ,Tag。。。。
Servlet 生命周期的方法:以下方法都是由Servlet容器自动调用
-
构造器:只有第一次请求Servlet 时 ,创建Servlet的实例。调用构造器。说明 Servlet是单实例的 。
-
init 方法: 只被调用一次 ,,在创建好实例后立即被调用,用于初始化当前的Servlet。
-
service:被多次调用,每次请求都会调用service方法,实际用于响应请求。
-
destroy:只被调用一次,在当前Servlet所在的WEB应用被卸载前调用,用于释放当前Servlet所占用的资源 。
load-on-startup:参数
-
配置在Servlet节点中:
<
servlet
>
<
servlet-name
>
helloServlet
</
servlet-name
>
<
servlet-class
>
HelloServletOne
</
servlet-class
>
<
load-on-startup
>
1
</
load-on-startup
>
</
servlet
>
-
load-on-startup :可以指定Servlet被创建的时机,若为负数,则在第一次请求时被创建,若为0或正数,则则在当前Web应用被Servlet容器加载时创建实例,且数值越小越早被创建。
Servlet容器响应客户请求的过程
-
Servlet引擎检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则执行第2步;
-
装载并创建该Servlet的一个实例对象:调用该Servlet的构造器;
-
调用Servlet实例对象的 init()方法;
-
创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletRequest对象,然后调用Servlet的 service() 方法并将请求和响应对象作为参数 传递进去;
-
Web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的 destroy() 方法。
Servlet的注册与运行
-
Servlet程序必须通过Servlet容器来启动运行,并且存储目录有特殊要求,通过需要存储在 <WEB应用程序目录>\WEB-INF\classes\ 目录中
-
Servlet程序必须在WEB应用程序的 web.xml文件中进行 注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问;
-
一个 <servlet></servlet>元素用于注册一个Servlet,它包含两个主要的子元素: <servlet-name></servlet-name> 和 <servlet-class></servlet-class>,分别用于设置Servlet的 注册名称和Servlet的 完整类名;
-
一个 <servlet-mapping></servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含两个子元素: <servlet-name></servlet-name> 和 <url-pattern></url-pattern>,分别用于指定Servlet的 注册名称和Servlet的 对外访问路径。
Servlet映射的细节
-
同一个Servlet可以被映射到对个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名;
-
在Servlet映射到的URL中也可以使用 * 通配符,但是只能有两种固定格式:A、 *.扩展名 B、以正斜杠( / )开头并以 " /* " 结尾。
ServletConfig :
[x]
封装了Servlet 的配置信息,并且可以获取 ServletContext 对象
-
配置Servlet 的初始化参数
<servlet>
<
servlet-name
>
helloServlet
</
servlet-name
>
<
servlet-class
>
HelloServletOne
</
servlet-class
>
<!-- 配置
Servlet
的初始或参数 ,并且该节点必须在 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
>
long
</
param-value
>
</
init-param
>
<
load-on-startup
>
1
</
load-on-startup
>
</
servlet
>
-
获取初始化参数
> getInitParameter(String name) :获取指定参数名的初始化参数
> getInitParameterNames() :获取参数名组成的 Enumeration 对象。
public
void
init(
ServletConfig
servletConfig
)
throws
ServletException
{
//
TODO
Auto-generated method stub
System
.
out
.
println
(
"init.........."
)
;
String
user
=
servletConfig
.
getInitParameter
(
"user"
)
;
System
.
out
.
println
(
"user:"
+
user
)
;
Enumeration
<
String
>
names
=
servletConfig
.
getInitParameterNames
()
;
while
(
names
.
hasMoreElements
())
{
String
name
=
names
.
nextElement
()
;
String
value
=
servletConfig
.
getInitParameter
(
name
)
;
System
.
out
.
println
(
"****"
+
name
+
"->"
+
value
)
;
}
}
-
获取Servlet的注册(配置)名:
String
servletname
=
servletConfig
.
getServletName
()
;
System
.
out
.
println
(
"servletname: "
+
servletname
)
;
ServletContext
ServletContext接口:
-
Servlet引擎为 每个WEB应用程序都创建一个对应的 ServletContext对象,ServletContext对象被 包含在ServletConfig对象中,调用 ServletConfig.getServletContext 方法返回ServletContext 对象的引用。
-
由于一个WEB应用程序中的所有Servlet都共享同一个ServletContext对象,所以,ServletContext对象被称之为application对象(Web应用程序对象)。
-
功能
-
获取WEB应用程序的初始化参数
-
<!-- 设置当前WEB 应用 的初始化参数-->
<!-- 可以被所有Servlet 所获取 ,而Servlet中的初始化参数,只能被其本身的Servlet所获取-->
<
context-param
>
<
param-name
>
driverlong
</
param-name
>
<
param-value
>
com.mysql.jdbc.Driver
</
param-value
>
</
context-param
>
<
context-param
>
<
param-name
>
jdbcURL
</
param-name
>
<
param-value
>
jdbc:mysql:///
atguigu
</
param-value
>
</
context-param
>
/*获取ServletContext 对象*/
ServletContext
servletContext
=
servletConfig
.
getServletContext
()
;
String
driver
=
servletContext
.
getInitParameter
(
"driverlong"
)
;
System
.
out
.
println
(
"driver :"
+
driver
)
;
Enumeration
<
String
>
namesTwo
=
servletContext
.
getInitParameterNames
()
;
while
(
namesTwo
.
hasMoreElements
()){
String
name
=
namesTwo
.
nextElement
()
;
System
.
out
.
println
(
"***"
+
name
)
;
}
/* rusult
* driver :com.mysql.jdbc.Driver
* ***driverlong
* ***jdbcURL
*/
-
记录日志
-
application域范围的属性
-
访问资源文件
-
获取虚拟路径所映射的本地路径
-
WEB应用程序之间的访问
-
ServletContext的其他方法
-
获取当前WEB 应用程序的某个文件在服务器上的绝对路径:
getRealPath
(String Path
)
String
path
=
servletContext
.
getRealPath
(
"/01.png"
)
;
System
.
out
.
println
(
"01.png 's path:-->"
+
path
)
;
-
获取当前 WEB 应用的名称:
getContextPath
()
String
contextPath
=
servletContext
.
getContextPath
()
;
System
.
out
.
println
(
"contextPath:-->"
+
contextPath
)
;
-
获取当前WEB 应用中某个文件对应的输入流:
getResourceAsStream
(String Path
)
try
{
ClassLoader
classloader
=
getClass
()
.
getClassLoader
()
;
InputStream
is
=
classloader
.
getResourceAsStream
(
"jdbc.properties"
)
;
System
.
out
.
println
(
"1."
+
is
)
;
}
catch
(
Exception
e)
{
//
TODO
Auto-generated catch block
e
.
printStackTrace
()
;
}
try
{
InputStream
is2
=
servletContext
.
getResourceAsStream
(
"/WEB-INF/classes/jdbc.properties"
)
;
System
.
out
.
println
(
"2."
+
is2
)
;
}
catch
(
Exception
e)
{
//
TODO
Auto-generated catch block
e
.
printStackTrace
()
;
}