Servlet 是 Server Applet 的简称,译为“服务器端小程序”。
Servlet的定义:
服务端
的Java小程序;sun公司提供一套规范
(接口),用来处理客户端请求、响应给浏览器的动态资源;实质就是java代码
,通过java的API动态的向客户端输出内容;实现步骤:
第一个Servlet程序实现,参照前一篇文章:Hello,Servlet
**Servlet运行的过程解析: **
tomcat服务器启动时,首先加载webapps中的每个Web项目的web.xml配置文件。
webapps文件夹里就是一个对外开放的资源库。
用户在浏览器输入:http://localhost:8080/KrojectDynamicWeb/HelloServlet后,
http://
:表明http协议localhost
:到本地的hosts文件中查找是否存在该域名对应的IP地址,查找到是127.0.0.18080
:根据端口找到运行中的Tomcat服务器KrojectDynamicWeb
:在tomcat的webapps目录下找到KrojectDynamicWeb文件夹HelloServlet
:资源名称,在KrojectDynamicWeb中的web.xml中查找,是否有匹配url-pattern的内容如果找到匹配的url-pattern
,则使用当前的servlet-name的名称到web.xml文件中查询是否有相同名称的servlet配置如果找到,则取出
对象的servlet配置信息中的servlet-class内容
:net.hackyle.HelloServlet,即一个Java类反射,构造HelloServlet对象
,调用该对象里面的方法,Tomcat服务器给浏览器做出响应
,显示在浏览器的页面上就是这样,你就看到了页面上你编写的内容。
Servlet接口是已经过时了的开发接口,它的开发步骤是:
在实际开发中,我们不会直接去实现Servlet接口,因为那样需要覆盖的方法太多,我们一般创建类继承HttpServlet
。但是它以及其里面的方法任然有学习的价值,因为HttpServlet是Servlet接口的实现!
SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
HttpServlet类
:能够处理HTTP请求的servlet,它在原有Servlet 接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。
因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口
。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式;
如为GET请求
,则调用
HttpServlet的doGet方法
;
如为Post请求
,则调用doPost方法
。
因此,开发人员在编写Servlet时,通常只需要覆写doGet或 doPost方法,而不要去覆写service方法
。
1)init(ServletConfig config)
2)service(ServletRequest request,ServletResponse response)
3)destroy()
Servlet程序的生命周期由tomcat服务器控制。
1)Servlet何时创建:默认第一次访问servlet时创建该对象
2)Servlet何时销毁:服务器关闭servlet就销毁了
3)每次访问必然执行的方法:service(ServletRequest req, ServletResponse res)方法
Servlet四个生命周期方法
第一次
访问servlet的时候创建servlet对象只调用1次
。证明servlet对象在tomcat是单实例的。创建完servlet对象
的时候调用。只调用1次。发出请求
时调用。调用n次
。销毁servlet对象
的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。证明Servlet生命周期方法调用次数
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
public class HelloServlet extends HttpServlet {
// 1.构造方法
public HelloServlet(){
System.out.println("1.servlet对象被创建了。");
}
// 2.init方法
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("2.init方法被调用");
}
// 3.service方法
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("3.service方法被调用");
}
// 4.destroy方法
@Override
public void destroy() {
System.out.println("4.servlet对象销毁了");
}
}
功能:
HelloServlet的web.xml配置详情:
<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">
<display-name>KrojectDynamicWebdisplay-name>
<welcome-file-list>
<welcome-file>index.htmlwelcome-file>
<welcome-file>index.htmwelcome-file>
<welcome-file>index.jspwelcome-file>
<welcome-file>default.htmlwelcome-file>
<welcome-file>default.htmwelcome-file>
<welcome-file>default.jspwelcome-file>
welcome-file-list>
<servlet>
<description>description>
<display-name>HelloServletdisplay-name>
<servlet-name>HelloServletservlet-name>
<servlet-class>hello.HelloServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>HelloServletservlet-name>
<url-pattern>/HelloServleturl-pattern>
servlet-mapping>
web-app>
元素用于注册Servlet,它包含有两个主要的子元素:
和
,分别用于设置Servlet的注册名称和Servlet的完整类名。
一个
元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:
和
,分别用于指定Servlet 的注册名称和Servlet的对外访问路径。
访问Web项目的URL中,最后一个组成成分(“http://localhost:8080/KrojectDynamicWeb/HelloServlet”),将会在项目工程中的web.xml中查找是否有匹配的url-pattern的内容,匹配成功才能正常运行URL;
例如URL: http://localhost:8080/Kroject/first;映射路径是指把”/first”在web.xml中的url-pattern中寻找是否有一样的;
在执行URL最后部分与url-pattern的匹配过程中,有两种匹配类型:
A. 精确匹配
浏览器输入:url-pattern
http://localhost:8080/day10/first: /first
http://localhost:8080/day10/itcast/demo1: /itcast/demo1
B. 模糊匹配
浏览器输入 ===> url-pattern
http://localhost:8080/day10/任意路径 ===> /*
http://localhost:8080/day10/itcast/任意路径 ===> /itcast/*
http://localhost:8080/day10/任意路径.后缀名 ===> *.后缀名
http://localhost:8080/day10/任意路径.do ===> *.do
http://localhost:8080/day10/任意路径.action ===> *.action
注意事项:
Tomcat的安装“config”目录下的web.xml文件指定了缺省路径(即当我们输入的一个URL,在webapps目录下并没有找到,于是就把缺省路径下的一个HTML资源返回。)
servlet的缺省路径(/)是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件。
匹配问题例题
问题: URL输入http://localhost:8080/day10/index.html 如何读取文件????
解答:
1)到当前day10应用下的web.xml文件查找是否有匹配的url-pattern。
2)如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处理
3)DefaultServlet程序到day10应用的根目录下查找是存在一个名称为index.html的静态文件。
4)如果找到该文件,则读取该文件内容,返回给浏览器。
5)如果找不到该文件,则返回404错误页面。
结论:先找动态资源,再找静态资源。尽量不要在web.xml文件下配置伪静态文件。
当服务器接收到URL后;
经过URL与web.xml中的url-pattern
进行映射匹配后;
找到了servlet-class
的内容,得到了本次URL需要调用的类的全名:net.hackyle.HelloServlet;
通过反射
构造该类对象,即构造HelloServlet类的对象;
创建ServletConfig对象
,通过反射调用init方法
创建request,response对象
,通过反射调用service方法
反射调用destroy方法
① Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
② 装载并创建该Servlet的一个实例对象。
③ 调用Servlet实例对象的init()方法。
④ 创建一个用于封装HTTP请求消息的HttpServletRequest对象和 一个代表HTTP响应消息的HttpServletResponse对象,然后调用 Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤ WEB应用程序被停止或重新启动之前,Servlet引擎将卸载 Servlet,并在卸载之前调用Servlet的destroy()方法。
出现背景:
解决方案: