宏观地讲,Servlet是连接web服务器与服务端java程序的协议,是一种通信规范。这个规范是以一套接口的形式实现的
1.servlet声明周期
所谓servlet生命周期是指servlet对象的创建,servlet对象的初始化,servlet对象服务的执行,及最终servlet对象销毁的整个过程
(1).首先建立servlet的映射关系
在WebContent文件夹下,配置web.xml文件的映射关系
写一个servlet实现类
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class TestServlet implements Servlet {
public TestServlet() {
super();
System.out.println("创建servlet");
}
@Override
public void destroy() {
System.out.println("销毁servlet");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("初始化servlet");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("创建servlet服务");
}
}
在web.xml文件中建立url和servlet的映射关系
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!-- 注册Servlet -->
<!-- 第一部分,注册servlet实现类和类名之间的关系 -->
<servlet>
<servlet-name>some-servlet</servlet-name>
<servlet-class>com.swust.servlet01.TestServlet</servlet-class>
</servlet>
<!-- 第二部分,注册类名和url之间的关系 -->
<servlet-mapping>
<servlet-name>some-servlet</servlet-name>
<url-pattern>/some</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
Servlet特征
1.Servlet是单例多线程的
2.一个Servlet实例只会执行一次无参构造器与Init()方法,并且是在第一次访问时执行
(容器启动时就创建servlet)
注意:所以对于一些对客户响应速度有要求的重要的servlet,可以在web容器创建时就先创建好。但是一般的servlet都是在执行的时候再创建因为会节省内存
load-on-startup:优先部署的命令,数字(正数)代表优先级,0是最优先,依次递减
<servlet>
<servlet-name>some-servlet</servlet-name>
<servlet-class>com.swust.servlet01.TestServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
3.用户每提交一次对当前Servlet的请求,就会执行一次servlet()方法
4.一个servlet实例只会执行一次destroy()方法,在应用停止时执行
5.由于servlet时单例多线程的,所以为了保证其线程安全性,一般情况下时不为servlet类定义可修改的成员变量的。因为每个线程均可修改整个成员变量,会出现线程安全问题
对于部署在服务器上的代码的特点:
1.项目部署后启动服务器,发现并没有执行servlet无参构造器方法,说明在web容器启动时并没有创建servlet对象
2.用户提交请求后,马上可以看到无参构造器,init()方法,service()方法均执行
3.刷新页面,发现只会执行service()方法,每刷新一次,即每提交一次请求,就会执行一次servcie()方法
Servlet里的两个Map
一个map 的key值为url,value是servlet的引用
另一个mao的key值为url,value是servlet的class的包名,可以获取它通过反射机制实例化对象
Servlet里的getServletInfo()方法
Servlet里的servletconfig(接口)
1.servletconfig的作用是:在初始化servlet实例时用来给web容器传递servlet的配置信息
2.要连接源码才能看到Servlet得具体实现,是由服务器实现得,所以源码连接到Tomcat服务器得源码
3.获取servletconfig对象
一个servlet对象,对应一个servletconfig
4.servletconfig的用法
servletconfig对象是获取servlet的配置信息的,servlet的配置信息是存在web.xml文件里的,
通过servletconfig就可以获取到web.xml里对于servlet的配置信息
具体语法
public class SomeServlet implements Servlet {
private ServletConfig config; //定义一个ServletConfig 接口
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config; //获取到ServletConfig对象
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//获取servlet名称
String servletName = config.getServletName();//通过ServletConfig 来获取的,因为servlet的名字是放在配置文件里的
System.out.println("the servletname is :"+servletName);
//获取所有的初始化对象
//在配置文件(web.xml)有配置一些初始化信息,也是通过ServletConfig读出来
Enumeration<String> names = config.getInitParameterNames();
//遍历枚举
while(names.hasMoreElements()) {
//获取当前枚举的遍历值
String name = names.nextElement();
//获取指定参数的值
String value = config.getInitParameter(name);
System.out.println(name+"="+value);
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
servletContext对象 通过servletconfig 获取servletcontext对象
1.一个应用只有一个servletContext,也有一个别名叫application 代表整个应用
2.在servletContext里初始化的内容,在应用中的所有servlet均可调用
(1)web.xml 里面配置的内容
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<!-- 定义整个应用的初始化参数 -->
<!-- servlet初始化的内容 -->
<context-param>
<param-name>id</param-name>
<param-value>工号</param-value>
</context-param>
<servlet>
<servlet-name>some-servlet</servlet-name>
<servlet-class>com.swust.servlet.SomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>some-servlet</servlet-name>
<url-pattern>/some</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>other-servlet</servlet-name>
<servlet-class>com.swust.servlet.OtherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>other-servlet</servlet-name>
<url-pattern>/other</url-pattern>
</servlet-mapping>
</web-app>
域属性具有全局性,一个servlet改变了它,他在全局就已经改变了
(2)域属性的设置,一个servlet设置了servlet的域属性,其他servlet都可以修改和删除
servletContext.setAttribute(String name ,String value); 设置域属性
servletContext.getAttribute(); 获取域属性
servletContext.removeAttribute(); 删除域属性
3.contextPath的使用,获取的是当前应用的名称
4.获取当前应用目录下文件,在电脑中真实存在的路径
代码://realPath的用法,获取images的真实路径
String path = sc.getRealPath("/images"); //整个images是在webcontext下新建的,程序里直接通过相对路径访问它
System.out.println("images real path:"+path);
输出结果:images real path:D:\eclispe\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\03-servletcontext\images
设置web欢迎页面
在webContext---->WEB-INF下新加一个html后缀的文件
欢迎页面的顺序,是由上倒下的查找
在tomcat会 默认查找三个文件 index.html index.htm index.jsp 如果文件目录下有这三个的任意一个。那么不用定义欢迎页面也可以默认读出
URL路径
1.一个servlet可以对应多个url-pattern
精路径
<servlet>
<servlet-name>some-servlet</servlet-name>
<servlet-class>com.swust.servlet.SomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>some-servlet</servlet-name>
<url-pattern>/some</url-pattern>
<url-pattern>/some/sd</url-pattern>
<url-pattern>/so</url-pattern> //可以有多个url-patttern
</servlet-mapping>
2.通配符匹配
<url-pattern>/some/*<url-pattern> ’*‘ 代表后面写啥都行
2.全路径匹配
<url-pattern>/*</url-pattern> 代表所有的请求都被改servley拦截,并执行servlet服务
<url-pattern>/</url-pattern>
“/*” “/” 都是全路径模式,但他们有不同
“/*” 拦截所有请求
“/” 只拦截静态请求 ,不拦截动态请求(如jsp)
3.后缀名模式
<url-pattern>*.do</url-pattern> 拦截后缀为.do的文件,任意给什么uri,只有是后缀为.do 则拦截
匹配原则:
路径优先匹配原则
精确路径匹配原则
长路径优先匹配原则