Servlet=Server + let,表示小的服务程序,它是运行在Web服务器上的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载和调用。
Servlet接收客户端浏览器发送过来的请求,并为这些请求完成相应的处理、产生相应的响应结果送回到客户端的浏览器上进行显示。
Servlet有着完备的规范,开发一个Servlet就是说开发一个遵守规范中各项规定、满足各种特征的Java类,该类接收用户Web形式的输入进行相关的处理并以Web的形式给出响应结果。
Servlet容器
Servlet的运行需要Servlet容器的支持,Servlet容器即Servlet运行时所需的运行环境。
Servlet容器接收客户的Servlet调用请求,调用相应的Servlet执行,并把执行结果返回给客户。Servlet容器一般由Java Web Server进行实现。
Servlet的工作过程
² Servlet引擎解析并载入一个Servlet
² Servlet引擎对Servlet进行初始化
³javax.servlet.Servlet接口的init()方法提供了Servlet的初始化信息
²servlet处理来自客户端的请求
³Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象
³Servlet也可以执行ServletRequest接口和ServletResponse接口
²服务器关闭或删除应用时,调用destroy()
一个Java servlet具有一个生命周期,这个生命周期定义了一个Servlet如何被载入并被初始化,如何接收请求并做出对请求的响应,如何被从服务中清除。
Servlet的生命周期被javax.servlet.Servlet这个接口所定义。
Servlet的运行状态完全由Servlet容器维护和管理,一个Servlet的生命周期一般有初始化、提供服务和销毁三个阶段。
当Servlet容器接收到客户的Servlet调用请求时,容器首先判断Servlet是否是第一次被访问,如果是第一次被访问,容器创建Servlet对象并调用Servlet的init()方法对Servlet进行初始化,而后调用service()方法为客户提供服务。
Servlet实质上是以单例的形式被实现的,它在被初始化之后将一直在内存中活动,后续的客户请求Servlet服务时将不再创建该Servlet的新的对象,只是新建一个线程调用service()方法提供服务。
当服务器重新启动时,所有已经创建的Servlet对象需要被销毁,这时候容器会调用Servlet的destroy()方法,然后把内存中的Servlet对象销毁。
²ServletRequest接口
public interface ServletRequest;
定义一个Servlet引擎产生的对象,通过这个对象,Servlet可以获得客户端请求的数据。这个对象通过读取请求体的数据提供包括参数的名称、值和属性以及输入流的所有数据。
1、getAttribute
public Object getAttribute(String name);
返回请求中指定属性的值,如果这个属性不存在,就返回一个空值。
这个方法允许访问一些不提供给这个接口中其他方法的请求信息以及其他Servlet放置在这个请求对象内的数据。
2.
getParameter
public String getParameter(String name);
以一个String返回指定的参数的值,如果这个参数不存在返回空值。例如,在一个HTTP Servlet中,这个方法会返回一个指定的查询语句产生的参数的值或一个被提交的表单中的参数值。如果一个参数名对应着几个参数值,这个方法只能返回通过getParameterValues方法返回的数组中的第一个值。
3. getParameterValues
public String[] getParameterValues(String name);
通过一个String对象的数组返回指定参数的值,如果这个参数不存在,该方法返回一个空值。
Servlet的部署(映射与发布)
配置Servlet的方法有两种,一种是使用xml文件进行配置,另一种是使用标注的方式进行配置。
1、使用web.xml文件配置Servlet类
传统的配置方法是使用web应用中WEB-INF文件夹下的web.xml部署描述文件来进行。配置Servlet类需要在web.xml文件的<webapp></webapp>元素之间添加:
<webapp>
<servlet>
<servlet-name>servletname</servlet-name>
<servlet-class>servletclass</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> servletname </servlet-name>
<url-pattern>url-pattern</url-pattern>
</servlet-mapping>
</webapp>
2、标注方式配置Servlet
Servlet3.0中加入了新增的标注支持,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了。
采用标注方式配置Servelt类是在通过在Servlet类文件中类定义之前的位置添加标注信息来实现的,类的其它部分不变。
@WebServlet(
urlPatterns = { "/SayHello" },
initParams = {
@WebInitParam(name = "language",
value = "english")
}
)
Servlet的访问
调用Servlet类的基本方法有两种:一种是直接使用Servlet的URL对Servlet进行访问。这种方式Web容器将调用Servlet的doGet()方法为请求提供服务。
另一种是在表单中设置提交目标位Servlet的URL,这种方式Web容器将调用Servlet的doPost()方法为请求提供服务。
5. Servlet高级
a)数据的作用域
在servlet中进行变量的共享可以通过Servlet容器中存在的ServletContext 、HttpSession 和HttpServletRequest 的实例来实现。
这几种方式共享变量和获得变量的方法都是一致的,只是在变量的作用域,也就是共享的范围上有所不同。
这三种方式共享变量的方法是使用Context、Session或Request类型的实例调用setAttribute(“varName”,obj)方法将需要共享的变量存储到对象当中。
然后在需要使用该共享变量的地方再通过,再通过实例的getAttribute(“varName”)方法来获得变量。
ServletContext范围最大,应用程序级别的,整个应用程序都能访问。HttpSession次之,会话级别的,在当前的浏览器中都能访问。HttpServletRequest范围最小,请求级别,请求结束,变量的作用域也结束。