Servlet
Servlet:
Servlet(Server Applet)是Java Servlet的简称,可以运行在Web服务器中的小型Java程序,有时也叫做服务器端的小应用程序。以通过 HTTP协议接收和响应来自 Web 客户端的请求。
1 package com.monkey1024.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.Servlet; 6 import javax.servlet.ServletConfig; 7 import javax.servlet.ServletException; 8 import javax.servlet.ServletRequest; 9 import javax.servlet.ServletResponse; 10 11 public class FirstServlet implements Servlet { 12 13 @Override 14 public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { 15 System.out.println("Hello Servlet"); 16 } 17 18 @Override 19 public void destroy() { 20 21 } 22 @Override 23 public ServletConfig getServletConfig() { 24 return null; 25 } 26 27 @Override 28 public String getServletInfo() { 29 return null; 30 } 31 32 @Override 33 public void init(ServletConfig arg0) throws ServletException { 34 35 } 36 37 }
执行过程:
- 客户端向tomcat发送请求
- tomcat根据请求的URL找到servlet的应用
- tomcat根据请求的URI”/hello”找到web.xml文件中url-pattern与之对应的标签
- tomcat根据url-pattern标签中的servlet-name定位到com.monkey1024.servlet.FirstServlet类。
- tomcat实例化FirstServlet类
- 调用FirstServlet类中的init方法
- 调用FirstServlet类中的service方法
- FirstServlet将数据响应给客户端
- 调用distroy方法销毁FirstServlet
生命周期
Servlet第一次请求执行构造方法、init()方法、service()方法
以后每次请求执行一次service()方法
关闭Tomcat 执行destroy()方法
由于 Servlet 是单例多线程的,所以为了保证其线程安全性,一般情况下是不建议在 Servlet类中定义可修改的成员变量,因为每个线程均可修改这个成员变量,会出现线程安全问题。
在tomcat启动时,默认不会创建servlet实例,如果想要让tomcat在启动时创建servlet实例的话,只需要在web.xml中添加load-on-startup标签即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<servlet> <servlet-name>lifeServlet</servlet-name> <servlet-class>com.monkey1024.servlet.LifeServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>lifeServlet</servlet-name> <url-pattern>/life</url-pattern> </servlet-mapping>
添加load-on-startup的作用是,标记是否在 Tomcat启动时创建并初始化这个 Servlet实例。它的值必须是一个整数。
- 当值大于等于 0 时,表示容器在启动时就加载并初始化这个 Servlet,数值越小,该 Servlet的优先级就越高,其被创建的也就越早;
- 当值相同时,容器会自己选择创建顺序。
ServletConfig接口
Servlet 规范将Servlet 的配置信息全部封装到了 ServletConfig 接口对象中。在tomcat调用 init()方法时,首先会将 web.xml 中当前 Servlet 类的配置信息封装为一个对象。传给ServletConfig参数
ServletConfig中的方法
- getInitParameter(): 获取指定名称的初始化参数值。例如从下面的servlet中调用 getInitParameter("userName");方法会返回字符串"monkey1024"。
- getInitParameterNames():获取当前 Servlet 所有的初始化参数名称。其返回值为枚举类型 Enumeration。
- getServletName():获取当前 Servlet 的中指定的 Servlet名称。如下面中的 ServletName 为"configServlet"。
- getServletContext():获取到当前 Servlet 的上下文对象 ServletContext,这是个非常重要的对象,将在下一节中详细介绍
ServletContext接口(application)
ServletContext中不仅包含了 web.xml 文件中的配置信息,还包含了当前应用中所有Servlet可以共享的数据。
常用方法
- String getInitParameter ():获取 web.xml 文 件 的 中 指 定 名 称 的上下文参数值 。
- Enumeration getInitParameterNames():获取 web.xml 文件的中的所有的上下文参数名称。其返回值为枚举类型 Enumeration。
- void setAttribute(String name, Object object):在 ServletContext 的公共数据空间中,也称为域属性空间,放入数据。这些数据对于 Web应用来说,是全局性的,与整个应用的生命周期相同。当然,放入其中的数据是有名称的,通过名称来访问该数据。
- Object getAttribute(String name):从 ServletContext 的域属性空间中获取指定名称的数据。
- void removeAttribute(String name):从 ServletContext 的域属性空间中删除指定名称的数据。
- String getRealPath(String path):获取当前 Web 应用中指定文件或目录在本地文件系统中的路径。
- String getContextPath():获取当前应用在 Web 容器中的名称。
欢迎页面
1 <welcome-file-list> 2 <welcome-file>index.html</welcome-file> 3 <welcome-file>index.htm</welcome-file> 4 <welcome-file>index.jsp</welcome-file> 5 <welcome-file>default.html</welcome-file> 6 <welcome-file>default.htm</welcome-file> 7 <welcome-file>default.jsp</welcome-file> 8 </welcome-file-list>
由上到下依次加载
url-pattern
精确路径
1 <servlet-mapping> 2 <servlet-name>contextServlet02</servlet-name> 3 <url-pattern>/context02</url-pattern> 4 <url-pattern>/servlet/context02</url-pattern> 5 <url-pattern>/test/servlet/context02</url-pattern> 6 </servlet-mapping>
通配符
1 <servlet-mapping> 2 <servlet-name>contextServlet02</servlet-name> 3 <url-pattern>/servlet/*</url-pattern> 4 </servlet-mapping>
使用/*,表示当前的 Servlet 会拦截用户对于静态资源(.css、.js、.html、.jpg、.png…..)与动态资源(.jsp)的请求。
1 <servlet-mapping> 2 <servlet-name>contextServlet02</servlet-name> 3 <url-pattern>/*</url-pattern> 4 </servlet-mapping>
使用/,表示当前的 Servlet 会拦截用户对于静态资源(.css、.js、.html、.jpg、.png…..),
但对于动态资源的请求,是不进行拦截的。
1 <servlet-mapping> 2 <servlet-name>contextServlet02</servlet-name> 3 <url-pattern>/*</url-pattern> 4 </servlet-mapping>
后缀名模式
1 <servlet-mapping> 2 <servlet-name>contextServlet02</servlet-name> 3 <url-pattern>*.do</url-pattern> 4 </servlet-mapping>
路径匹配原则匹配过程 4->3->2->1
- /xxx/*
- /xxx/*.do
- /some
- /some/other/*
继承GenericServlet类
只需要重写service()即可
HttpServlet类
重写doGet()、doPost()等方法
创建servlet的三种方式
- 定一个类实现javax.servlet.Servlet接口
- 定义一个类继承javax.servet.GenericServlet类
- 定义一个类继承javax.servlet.http.HttpServlet类
如果是通过参数传过来的对象,就叫依赖
通过方法得到的对象,就叫关联