servlet使用java语言编写的服务端程序,它能够接受客户端的请求并响应。servlet通常被部署到容器内,有容器连接到web服务器。当客户端请求时,web服务器会将请求传递给servlet容器,容器调用响应servlet。
执行原理:
1.当服务器接收到客户端浏览器的请求后,会解析请求的url路径,获取访问的servlet的资源路径/demo1;
2.查找web.xml文件,是否有对应的标签体内容与资源内容一致;
3.如果有 标签体内容,则在找到对应的全类名;
4.tomcat会根据全类名,将字节码文件加载进内存,创建其对象调用其方法;
一个servlet的生命周期由不部署servlet的容器来控制,包括如何加载,实例化,初始化,处理请求,以及销毁。
servlet在第一次被访问时创建实例,创建之后立马调用init()方法进行初始化操作,此后该servlet一直贮存在服务器的内存中为相应的请求提供服务,直到服务器关闭,servlet调用destroy()也被销毁。
servlet默认第一次访问时被创建,内存中servlet是单例、
Httpservlet继承 GenericServlet类,对Http协议进行了封装。实现时只需重写doget(),dopost()方法即可。
1.用idea创建web工程。
2.创建类继承HttpServlet。
3.重写doGet(),doPost()方法。
public class MyServletTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
String date = new Date().toLocaleString();
resp.getWriter().write("time:"+date);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req,resp);
doGet(req,resp);
}
}
4.在web.xml对servlet进行配置
MyServletTest
ServletTest.MyServletTest
MyServletTest
/FirstServlet
servlet-class配置类在项目下的路径,
url-partern表示servlet的资源访问路径。
1.精准匹配
以“/”开头,以字母(非”*”)结束。比如:单层路径/xxx
、多层路径/xxx/xxx
如上例,通过localhost:8080/FirstServlet即可访问到FirstServlet
2.扩展名匹配
以* 开头,以扩展名结束。比如:*.jsp
。
MyServletTest
/FirstServlet
*.jsp
*.do
*.html
当访问localhost:8080/test.do
、localhost:8080/test.jsp
、http://localhost:8080/test.html
路径时,都可以访问该FirstServlet。
3.匹配最长路径
以 / 开头,并以 * 结尾,即/*
可以拦截所有请求
MyServletTest
/*
4.缺省匹配
/*”属于路径匹配,并且可以匹配所有request,但不会拦截*.JSP请求,因为在tomcat的web.xml默认配置中,
default
/
jsp
*.jsp
*.jspx
而扩展名匹配的优先级大于缺省匹配,所以当自己的路径匹配仅有缺省匹配时,遇到*.jsp请求时,优先执行默认的*.jsp匹配。
5.优先级执行顺序
精确路径 > 最长路径 > 扩展名 > 缺省匹配 这样的优先级匹配到对应的servlet。
load-on-startup标记容器是否在启动的时候实例化并调用其init()方法的优先级。
它的值表示servlet应该被载入的顺序当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;如果值小于0或未指定时,则表示只有在第一次请求的容器才在该servlet调用初始化函数正值越小,servlet的优先级越高,应用启动时就越先加载。值相同时,容器就会自己选择顺序来加载。