一、概念
1.servlet 是一种动态web资源 ; 需要放在servlet容器中(web应用),由容器调用才可以执行 ;
扩展:动态web资源:根据输入不同输出也不同; 静态web资源:输出都是相同的 ;
2.作用:
处理请求 --- 获取请求参数、类型转换、编码处理、参数封装 ;
创建响应 --- 响应的编码、响应头设置、数据转换xml/json ;
二、servlet开发步骤
1.手动开发一个servlet程序
1)写一个类,实现(或间接实现)Servlet接口,并添加未实现的方法;
2)将编译后的class文件,放在web应用中 ; 并在web应用的web.xml中配置servlet对外访问的虚拟路径 ;
具体看word文档 ;
2. 开发一个servlet程序流程:
1)创建dynamic project
2) 创建servlet模板(见word笔记)
3)按照模板创建一个servlet
4)将dynamic project添加给Tomcat服务器
5)启动服务器
注意: 只有将servle在web.xml中配置,才能访问该servlet ;
3. 开发实例:
需求:开发一个servlet程序,通过浏览器来访问这个servlet ; servlet接收浏览器的请求并将代表时间的字符串发送给浏览器 ;
1)创建dynamic project ;
2) 创建FirstServlet, 实现 Servlet接口(或继承GenericeServlet),并添加未实现的方法 ;
3)实现service(), 将代表当前时间的字符串发送给浏览器 ;
public class FirstServlet extends GenericServlet{
public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException{
/* send time string */
String dateStr = new Date().toLocaleString();
res.getWriter().write("time: "+dateStr);
}
}
4)将编译后的FirstServlet.class 文件 放入一个web应用中 ;
a. 手动创建classes,lib目录 ;将编译后的文件复制到classes目录下 ;
b. 在web应用的web.xml中,配置servlet对外访问的虚拟路径,如下:
<servlet></servlet> 配置一个servlet
<servlet-mapping></servlet-mapping> 配置一个servlet映射的URL路径,即访问该servlet的虚拟路径
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0">
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.tedu.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>
</web-app>
c. 重启服务器 ; 重启浏览器 ; 访问FirstServlet ;
三、servlet继承关系
Servlet接口
|-- GenericServlet抽象类
|-- HttpServlet抽象类 : 实现了service(), 在service()判断请求方式,根据不同的请求方式来调用不同的doxxx方法
|-- 自定义servlet类,继承HttpServlet , 并覆盖doGet()和doPost()方法,来处理GET请求和POST请求 ;
public class ServletDemo2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
四、servlet调用过程
例如访问 http://localhost/servlet/FirstServlet
1. 通过host请求头获知浏览器访问的是哪一个主机; Host:localhost
2. 通过请起行中的请求资源路径获知浏览器访问的是哪一个web应用、哪一个资源 ; /day13/SecondServlet
3. 根据获取到的资源路径到web.xml文件中匹配真实的路径 cn.tedu.Servlet.RequestDemo1 ; 如下图:
4. 访问对应的servlet
a. servlet在第一次被访问时创建servlet实例 ;
b.创建之后,服务器立即调用init()进行初始化操作 ;
c.之后servlet的实例会一直驻留在服务器的内存中 为后续请求服务 ;
只要有请求访问该servlet,服务器就会调用service()来处理请求,直到服务器关闭或web应用被移除web容器中 ;
d. 随着web应用的销毁,servlet实例也会销毁 ; 在销毁前服务器会调用destory() ;
5.service()执行完之后,服务器负责将response缓冲器的数据取出来,按照http响应的格式发送给浏览器 ;
五、servlet实例
六、.虚拟路径配置
1. 虚拟路径的配置方式
1)固定的路径 , <url-pattern>/FirstServlet</url-pattern>
2)通过星号(*)配置一个路径
a. 以 / 开头 , 以 /*结尾
b. *.后缀
2. 匹配的优先级
问题:可能会导致一个URL被多个mapping所匹配
规则1:哪一个更详细哪一个就起作用
规则2:*.后缀 的优先级永远最低