Servlet 技术(一) --基本介绍和接口使用
Servlet简介
Servle就是一种实现了Servlet接口的类,由Web容器负责创建并调用,用于接收和响应用户的请求
Servlet接口
Servlet接口中定义了5个抽象的方法,具体如下表所示
方法声明 | 功能描述 |
---|---|
void init(ServletConfig config) | 负责Servlet初始化工作,容器在创建好Servlet对象后,就会调用此方法 |
ServletConfig getServletConfig() | 返回容器调用 init(ServletConfig config) 方法传递给Servlet的Servlet对象 |
String getServletInfo() | 返回一个字符串,其中包含了关于Servlet的信息,例如,作者,版本和版权等信息 |
void service(ServletRequest request, ServletResponse response) | 负责响应用户的请求,当容器接收到客户段访问Servlet对象的请求时,就会调用此方法 |
void destroy() | 负责释放Servlet对象占用的资源,当Servlet对象被销毁时,容器就会调用此方法 |
其中init,service,destroy是Servlet生命周期方法
Servlet生命周期
如下图所示:
Servlet的生命周期可以分为三个阶段
初始化阶段
当客户端向Servlet容器发出HTTP请求要求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Serlvet对象,如果有直接使用该Serlvet对象,如果没有就创建Servlet实例对象,然后通过调用init()方法实现Servlet的初始化工作。需要注意的是,在Servlet的整个生命周期内,它的init()方法只被调用一次。
运行阶段
这是Servlet生命周期中最重要的阶段,在这个阶段,Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service()方法。在Servlet的整个生命周期内,对于Servlet的每一次访问请求,service()方法在Servlet的整个生命周期中会被调用多次。
销毁阶段
当服务器关闭或web应用被移除出容器时,Serlvet随着web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个生命周期中,destroy()方法也只被调用一次。需要注意的是,Servlet对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭,或web应用被移除出容器时Servlet对象才会销毁
主要实例代码如下:
To be continue……
HttpServlet主要功能
- 根据用户请求方式的不同,定义相应的doXxx()方法处理用户请求,例如,与GET请求方式对应的doGet()方法,与POST方式对应的doPost()方法。
- 通过service()方法将HTTP请求和响应分别转为HttpServletRequest和HttpServletResponse类型的对象
一般情况下我们就直接继承HttpServlet然后覆盖HttpServelet中的doGet()和doPost()方法就可以了,这里不多加赘述,这是基本的,重复的最多的步骤了
Servlet虚拟路径的映射
在web.xml文件中,一个
Servlet的多重映射
Servlet的多重映射指的是同一个Servlet可以被映射成多个虚拟路径。它的实现方式有两种,具体如下:
- 配置多个
元素 - 在一个
元素下配置多个 子元素
Servlet映射路径中使用通配符
若希望某个目录下的所有路径都可以访问同一个Servlet,这时,可以在Servlet映射的路径中使用通配符“*”。通配符的格式只有两种:
- 格式为“.扩展名”。 例如“.do”匹配以“.do”结尾的所有URL地址。
- 格式为“/”,例如“/abc/”匹配以“/abc”开始的所有URL地址。
缺省Servlet
- 如果某个Servlet的映射路径仅仅是一个正斜线(/),那么这个Servlet就是当前Web应用的缺省Servlet。
- Servlet服务器在接收到访问请求时,如果在web.xml文件中找不到匹配的
元素的URL,就会将访问请求交给缺省Servlet处理,也就是说,缺省Servlet用于处理其他Servlet都不处理的访问请求。
ServletConfig接口
**ServletConfig定义了一系列获取配置信息的方法,如下表所示
方法说明 | 功能描述 |
---|---|
String getInitParameter(String name) | 根据初始化参数名返回对应的初始化参数值 |
Enumeration getInitParameterNames() | 返回一个Enumeration对象,其中包含了所有的初始化参数名 |
ServletContext getServletContext() | 返回一个代表当前Web应用的ServletContext对象 |
String getServletName() | 返回Servlet名字,即web.xml中 |
先以getInitParameter()方法为例,分步讲解该方法的使用(如果不明白web.xml文档的作用请看web.xml文件)
- 在web.xml文件中做如下配置
- 编写TestServlet类,实现读取web.xml文件中的参数信息(主要代码如下)12345678protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubPrintWriter out = response.getWriter();ServletConfig config = this.getServletConfig();String param = config.getInitParameter("encoding");out.println("encoding="+param);out.close();}
ServletContext接口
获取Web应用程序的初始化参数
- 在web.xml文件中配置初始化信息如下
- 通过编写程序实现获取Web应用程序的初始化参数12345678protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubPrintWriter out = response.getWriter();ServletConfig config = this.getServletConfig();String param = config.getInitParameter("encoding");out.println("encoding="+param);out.close();}
实现多个Servlet对象共享数据
提供了许多操作属性的方法,如下所示
方法说明 | 功能描述 |
---|---|
Enumeration getAttributeNames() | 返回一个Enumeration对象,该对象包含了所有存放在ServletContext中的所有属性域名 |
Object getAttribute(String name) | 根据参数指定的属性名返回一个与之匹配的域属性值 |
void removeAttribute(String name) | 根据参数制定的域属性名,从ServletContext中删除匹配的域属性 |
void setAttribute(String name, Object) | 设置ServletContext的域属性,其中name是域属性名,obj是域属性值 |
在此只说思路,具体代码实现就不写了
- 创建一个sevlet1,获得ServeltContext对象后用setAttribute方法设置一个值
- 创建一个servlet2,调用 getAttribute方法得到一个值,然后用PrintWrite对象输出
- 启动服务器,先访问servlet1,然后访问servlet2,于是得到结果
读取Web应用下的资源文件
用于获取资源路径的方法如下所示
- 创建在src目录下创建一个名成为data.properties文件
在创建好的文件中输入配置信息如下所示
Company=Qingdao University of Science and Technology
Address=Qingdao
千万注意的是等号左右不要有空格- 编写读取关键代码如下所示:1234567891011protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubServletContext context = this.getServletContext();PrintWriter out = response.getWriter();InputStream in = context.getResourceAsStream("/WEB-INF/classes/data.properties");Properties pros = new Properties();pros.load(in);out.println("Company=" + pros.getProperty("Company") + "<br/>");out.println("Address=" + pros.getProperty("Address") + "<br/>");out.close();}
获取资源的绝对路径
暂时还没有发现这个方法有什么绝妙的地方(感觉有些多此一举),爱~,经验不够,继续努力,以后在来补充,先将基本实现代码附上如下所示:
结果如下所示
Company=qingdao University of Science and Technology
Address=qingdao
RealPath:F:\WebProject\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\test1\WEB-INF\classes\data.properties