刚接触Servlet时感觉有点晕,各种与servlet相关的东西。从API上弄了点东西,供初学者参考。
Servlet是运行在服务器端的程序,Sun只是制定了其规范(即只定义了接口),而由Servlet容器来具体实现。所以,Servlet程序的具体实现因容器的不同而不同。但是都遵循同一个规范。
javax.servlet.Servlet是个Interface,其他的各种Servlet都必须继承或者实现这个接口。
Servlet这个接口被以下类、抽象类或者接口实现:FacesServlet(类), GenericServlet(抽象类), JspPage(接口)。
这三个里面我们讲一下GenericServlet(javax.servlet.GenericServlet):
public abstract class GenericServlet implements Servlet,ServletConfig,java.io.Serializable
以上可知,这个抽象类实现了Servlet, ServletConfig, java.io.Serializable。但这些都是空实现,而且没有实现service方法,由容器具体实现。HttpServlet(javax.servlet.http.HttpServlet)这个有具体实现的抽象类继承了GenericServlet,这是个基于http特定协议的servlet。举个Servlet类的例子:
public class LoginPage extends HttpServlet
可以看到,我们一般的基于http协议编程的Servlet类直接继承了HttpServlet。
在每个Servlet类中都有doGet和doPost方法,我们看看他们后面的参数,比如doPost:
public void doPost(HttpServletRequest request, HttpServletResponse response)
其实,根据规范应该有这个通用方法来服务请求:
public void service(ServletRequest req, ServletResponse res)
而HttpServlet是针对Http协议的实现,所以HttpServlet把这个方法重写为:
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
可以看到,最后实际上调用了:
service(HttpServletRequest req, HttpServletResponse resp)
而在这个方法内部,又根据http协议的规定,分别对请求进行分析。如果是get请求,执行doGet方法;如果是post请求,执行doPost方法,等等等等。
我们看HttpServletRequest(HttpServletResponse类似)。这是个接口,它实现了ServletRequest接口,ServletRequest中有我们熟悉的setAttribute、getAttribute、getParameter、getParameterMap、getParameterValues、getRequestDispatcher等方法。
—————————————————————低调的分割线————————————————————
Servlet初始化阶段:
在下列时刻,Servlet容器装载Servlet:
- Servlet容器启动时自动装载某些Servlet
- 在Servlet容器启动后,客户首次向Servlet发出请求
- Servlet的类文件被更新后,重新装载Servlet(.class文件)。访问时,同第二种情况
Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期中,init方法只被调用一次。
Servlet终止阶段
在下列情况,Servlet容器终止Servlet:
- 当Web应用被终止
- Servlet容器终止运行
- Servlet容器重新装载新实例
Servlet容器会先调用Servlet的destory方法。在destory方法中可以释放Servlet所占用的资源
—————————————————————低调的分割线————————————————————
访问Servlet:
要访问Servlet,首先需要在web.xml文件中进行配置,其格式如下:
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>test.test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
我们通过浏览器http://localhost:8080/projectname/test来进行访问。可以看到,通过浏览器地址的/test对应到了<servlet-mapping>中的url-pattern,在根据其对应的servlet-name找到<servlet>中的servlet-class,这样就可以访问到相应的servlet了。
有的servlet配置并没有<servlet-mapping>,这样的servlet的作用并不是用来访问,而是用于servlet容器启动之后的初始化工作。在servlet类中重写init方法,并在web.xml中如下配置:
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>test.test</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<load-on-startup>内的数字无关紧要,只是标识这个servlet在容器启动后初始化的顺序。在容器启动后,会自动加载这个servlet,并执行其中的init方法。
—————————————————————低调的分割线————————————————————
关于ServletContext:
servlet容器启动一个应用时,会为此应用创建一个全局共享的ServletContext对象。此对象任何时候都可以访问,而且所有的servlet实例共享此对象。此外还有一个全局的ServletConfig对象,此对象包含了servlet的初始化信息。
如何获得ServletContext对象?
1、假设request为HttpServletRequest对象,则可以如下方式获取:
ServletContext context = request.getSession().getServletContext();
2、ServletConfig中有getServletContext()这样一个方法,这也是ServletConfig主要的用处。但是如何获取ServletConfig对象呢?
注意:在前文中已经提到,我们一般的servlet继承了HttpServlet,而HttpServlet又继承了GenericServlet,GenericServlet实现了ServletConfig接口。因此可以这么获取ServletContext对象:
ServletContext context = this.getServletContext();
—————————————————————低调的分割线————————————————————
Servlet是单例的!
Servlet是单例的,即多个请求由同一个Servlet对象进行处理。虽然只有一个对象进行处理,但对象会生成多个线程来处理多个请求。因此,在servlet中如果涉及写操作的话,最好不要使用成员变量,而使用局部变量。
三种避免多线程混乱的方法:
1、实现javax.servlet.SingleThreadModel(servlet2.4中已经废止)
2、使用局部变量(推荐,忘掉其他两种方法吧……)
3、使用synchronized块
Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行。
分享到:
相关推荐
### Servlet基础知识总结 #### 一、Servlet简介 Servlet是一种服务器端的小程序,是Java平台上的一个重要的技术之一,主要用于处理客户端的HTTP请求并生成动态网页。Servlet是在服务器端运行的,能够提供各种服务...
在Servlet编程中,`GenericServlet`是最基础的抽象类,它实现了Servlet接口,而大多数HTTP相关的Servlet会继承`HttpServlet`。`HttpServlet`提供了针对HTTP请求方法的抽象方法,如`doGet`和`doPost`。开发者通常需要...
本篇将深入探讨Servlet的基础知识及其运行环境——Servlet容器模型。 首先,让我们了解Servlet的基础。Servlet是一个Java类,遵循javax.servlet.Servlet接口,它允许开发者扩展服务器的功能。当用户向Web服务器发送...
**学习JSP和Servlet基础,你需要理解它们的基本概念、生命周期、API使用以及如何协作处理Web请求。此外,熟悉EL和JSTL,以及如何在实际项目中应用MVC模式,对于提升开发效率和代码质量至关重要。本课件将逐步引导你...
因此,可以说Servlet是JSP技术的基础,因为JSP最终也是通过Servlet来实现其功能的。 处理HTTP请求的方法主要有两种:GET和POST。GET请求通常用于获取资源,其参数会显示在URL中,而POST请求则常用于向服务器提交...
Servlet 基础补充案例习题 在本节中,我们将探讨 Servlet 基础补充案例习题,旨在掌握实际开发中 Servlet 程序的基本实现和使用。我们将通过两个案例,分别演示如何编写基于 HTTP 协议的 Servlet 程序,并掌握 ...
在本教程"Servlet基础Demo"中,我们将深入理解Servlet的工作原理,以及如何创建和运行一个简单的Servlet应用。 首先,Servlet是一个Java类,它实现了Servlet接口或者HttpServlet类,后者是Servlet接口的一个实现,...
在本文中,我们将深入探讨Servlet的基础知识,包括其基本概念、生命周期、部署以及如何进行实际开发。 一、Servlet基本概念 Servlet是一种Java类,它扩展了服务器的功能,可以处理来自客户端(通常是浏览器)的请求...
Servlet基础入门教程 Servlet是Java Web开发中的一个关键组件,它是服务器端的程序,用于处理来自客户端(如浏览器)的请求并返回响应。本教程旨在为初学者提供一个全面的Servlet入门指南,涵盖其基本概念、方法及...
### servlet基础教程知识点详解 #### 一、Servlet简介与特点 **Servlet** 是服务器端的一种小型程序,主要用于处理客户端发送的HTTP请求,并返回相应的HTTP响应。它与客户端的小程序 **Applet** 相对应,主要区别...
Servlet是Java Web开发中的核心组件,它用于处理HTTP请求并生成动态响应。Servlet技术是由Sun ...通过学习和理解这些源代码,你将能够更好地掌握Servlet的基础知识,并为更高级的Java Web开发打下坚实的基础。
JavaWeb Servlet 基础教程 http原理, bs架构和cs架构, servlet原理, tomcat的部署
Servlet基础教程 http原理 request, response
jsp 与servlet基础 1:jsp概述 2:jsp基础 3:jsp隐含对象 4:jsp中使用数据库 5:jsp与javabean ...
通过学习“Servlet基础教程”,你可以掌握创建动态网站的基本技能。无论你想构建用户管理系统还是其他类型的Web应用,Servlet都能提供强大的支持。这个课程将帮助你理解Servlet的工作原理,如请求和响应的处理,以及...
JSP Servlet基础知识测试题
在本文中,我们将深入探讨Servlet的基础知识,帮助初学者更好地理解和掌握这一技术。 1. **Servlet简介** Servlet是Java API的一部分,允许开发者创建能够与Web服务器交互的应用程序。它们可以接收HTTP请求,处理...
Servlet基础Servlet基础
本文将用通俗易懂的语言深入浅出地介绍JSP和Servlet的基础理论知识。 首先,我们来理解什么是JavaServer Pages(JSP)。JSP是Java平台上的一个标准视图技术,它允许开发者将HTML、CSS和JavaScript与Java代码相结合...