Servlet简介
•
Java
Servlet
是和平台无关的服务器端组件,它运
行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,
Servlet和客户的通信采用“请求/响应”的模式。
•
Servlet
可完成如下功能:
–
创建并返回基于客户请求的
动态
HTML
页面
。
–
创建可嵌入到现有
HTML
页面中的部分
HTML
页面(
HTML
片段)。
–
与其它服务器资源(如数据库或基于
Java
的应用程序)进行通信。
Servlet容器响应客户请求的过程
-----------------------
更为迅速的方式,直接在Servlet类上加注解:
@WebServlet("/HelloServlet")
@WebServlet("/HelloServlet")
public class HelloServlet implements Servlet {
Servlet容器响应客户请求的过程
①
Servlet
引擎检查是否已经装载并创建了该
Servlet
的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②
装载并创建该
Servlet
的一个实例对象:调用该
Servlet的构造器
③
调用
Servlet
实例对象的
init()方法
。
④
创建一个用于封装请求的
ServletRequest
对象和一个代表响应消息的
ServletResponse
对象,
然后调用
Servlet
的
service()
方法并将请求和响应对象作为参数传递进去。
⑤
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
的对外访问路径。
<load-on-startup>:大于等于0时,在当前WEB应用被Servlet容器加载时创建,数字越小越早被创建。
为负数或者没有此元素时,则在第一次被请求时创建。
Servlet映射的细节
•
同一个
Servlet
可以被映射到多个
URL
上,即多个
<
servlet
-mapping>
元素的
<
servlet
-name>
子元素的设置值可以是同一个
Servlet
的注册名。
•
在
Servlet
映射到的
URL
中也可以使用*通配符,但是只能有两种固定的格式:
一种格式是
“*.扩展名”,
另一种格式是以正斜杠(
/
)开头并以
“/*”
结尾。
ServletConfig接口
•
Servlet
在有些情况下可能需要访问
Servlet
容器或借助
Servlet
容器访问外部的资源,
所以,
Serlvet
引擎需要将表示
Servlet容器的对象
传递给
Servlet
。
另外,在
web.xml
文件中为某个
Servlet
设置的友好名称和初始化参数等信息也需要传递给该
Servlet
•
Servlet
引擎将
代表
Servlet
容器的对象
(
ServletContext
)
和
Servlet
的配置参数
信息一并
封装到一个称为
ServletConfig
的对象中,
并在初始化
Servlet
实例对象时传递给该
Servlet
。
ServletConfig
接口则用于定义
ServletConfig
对象需要对外提供的方法,
以便在
Servlet
程序中可以调用这些方法来获取有关信息。
•
Servlet
引擎调用
Servlet
的实例对象的
init(ServletConfig config)方法将ServletConfig对象传递给Servlet
。
Servlet.
getServletConfig()
方法必须返回
init(
ServletConfig
config
)
方法传递进来的这个
ServletConfig
对象的引用。
ServletConfig接口的方法
•
getInitParameterNames
•
getInitParameter
•
getServletName
•
getServletContext
配置在
web.xml中,init-param元素配置在servlet元素中,并且一定要放在load-on-startup之前。
Enumeration<String> param = servletConfig.getInitParameterNames();
while (param.hasMoreElements()) {
String name = param.nextElement();
System.out.println("===========--->" + name + ":" + servletConfig.getInitParameter(name));
}
while (param.hasMoreElements()) {
String name = param.nextElement();
System.out.println("===========--->" + name + ":" + servletConfig.getInitParameter(name));
}
ServletContext接口
•
ServletContext该对象代表当前WEB应用,可以说是当前WEB应用的一个大管家,从中可以获取到WEB应用各个方面的信息。
•
Servlet
引擎为
每个
WEB
应用程序
都创建一个对应的
ServletContext
对象,
ServletContext
对象被包含在
ServletConfig
对象中,
调用
ServletConfig.getServletContext
方法可以返回
ServletContext
对象的引用。
•
由于一个
WEB
应用程序中的所有
Servlet
都共享同一个
ServletContext
对象
,所以,
ServletContext
对象被称之为
application 对象(Web应用程序对象)。
•功能:
---获取
WEB
应用程序的初始化参数
ServletContext context = servletConfig.
getServletContext();
Enumeration<String> conParam = context.getInitParameterNames();
while (conParam. hasMoreElements()) {
String name = conParam. nextElement();
System.out.println("===========--->" + name + ":" + context. getInitParameter(name));
}
Enumeration<String> conParam = context.getInitParameterNames();
while (conParam. hasMoreElements()) {
String name = conParam. nextElement();
System.out.println("===========--->" + name + ":" + context. getInitParameter(name));
}
---获得WEB应用的名称
context.
getContextPath() //FirstPro
---记录日志
---application
域范围的属性
---访问资源文件
---获取虚拟路径所映射的本地路径
context.getRealPath(strPath)
---
获取文件对应的输入流
InputStream is = context.
getResourceAsStream("/WEB-INF/classess/jdbc.properties");
---WEB
应用程序之间的访问
---ServletContext
的其他方法
获取WEB应用程序的初始化参数
•为WEB应用程序设置初始化参数的好处在于不需要修改Servlet源程序,就可以改变一些参数信息。
•ServletContext.getInitParameterNames方法用于返回一个包含WEB应用程序的所有初始化参数名称的Enumeration集合对象,
ServletContext.getInitParameter方法用于返回某个指定名称的初始化参数值。
•在web.xml文件的根元素<web-app>中增加<context-param>子元素,如下所示:
<context-param>
<param-name>companyName</param-name>
<param-value>lampbrother</param-value>
</context-param>
获取虚拟路径所映射的本地路径:
•
getRealPath(String path)
方法
:
用于返回某个虚拟路径所映射的本地文件系统路径
•