一.URL
打开百度首页随便搜索内容后,会出现
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=a&rsv_pq=c122c9dd0020c7c0&rsv_t=bea4FGcgHWh%2BkVEvNQ0jdx2x%2FoTwRzLc6DNMLetuwFp1w40vDfi70Cvlu8o&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=2&rsv_sug1=1&rsv_sug7=001&inputT=1866&rsv_sug4=2206&rsv_sug=9
这种内容称为请求URL
由协议+ip+端口+resource+querything组成
协议:在这里就是https
端口:http默认端口是80,在这里可以省略
querything 由多组参数名和参数组成以问号开头,以&进行分割.
所以如何访问我们自己的项目呢?路径如何书写
协议+ip+端口+资源
http://localhost:8080/项目名/servleturlpattern
二.Servlet三种创建方式
1.实现(implements)Servlet接口
要重写里面的五种方法
init(),getServletConfig(),service(),getServletInfo(),Destory();
2.继承GenericsServlet类
要重写service()方法.
3.继承HttpServlet类
支持http的Servlet,根据实际情况进行重写方法.
三.分析Servlet里面的方法
init
1.它是Servlet组件初始化的一项工作,在整个生命周期内调用0次或者1次
并不会追随容器初始化而初始化(默认情况下).
2.当第一次完成访问的时候才完成初始化.初始化的工作是在Servlet对象创建后完成的
3.且整个初始化只会完成一次.所以Servlet的设计为单例多线程模式.
这里证明下: 使用注解来表明它是一个Servlet,它的路径是localhost/servlet01 在构造 init,service方法中都有响应打印.
@WebServlet(urlPatterns = "/servlet01")
public class Style01 implements Servlet {
public Style01(){
System.out.println("Servlet Creating...");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
servletResponse.getWriter().println( "servlet01" );
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destory");
}
}
当启动tomcat后,无日志打印
在浏览器输入url后,service方法打印
再看控制台,先打印构造函数,说明初始化的工作是在Servlet创建后执行的
service
每有一次请求,他就会执行一次.
destory
当容器销毁的时候,它才会执行,有个前提,出生过才能死去.
意思就是说,如果没有执行过init方法,它不会执行destory方法.
有个loadOnStartup
这个值默认是-1,它来确定我们的Servlet是否跟随容器的启动而启动.
可以设置优先级,当某些Servlet比较重要的时候,可以设置为让他跟随容器而启动
这样访问它的时候就比较快了.
因为有很多工作它是有严格的先后顺序的,当这些组件工作的时候,
我们就可以通过配置loadOnstartup并指定order就可以完美解决。数字越小,优先级越高.
四.Servlet的生命周期
图来自B站深圳邱道长
1.先看servlet是否配置loadOnStartup,
如果配置了那么它将会随容器的启动而执行init方法
如果每配置那么它将等待第一次访问.
2.如果一个Servlet一直没有被访问那么它所有方法不会被执行.
3.如果是第一次访问这个Servlet,那么它先执行init方法,再执行service()方法
4.如果不是第一次,那么直接执行service()方法
5.如果容器要销毁,servlet要跟随它一起销毁.