Tomcat web服务器中 web-info 文件夹下的web.xml文件的作用:
某个web资源配置为web应用首页
将servlet程序映射到某个url地址上
为web应用配置监听器
为web应用配置过滤器
但凡涉及到对web资源进行配置,都需要通过web.xml文件
servlet调用过程:
1、浏览器访问服务器 发送http请求
2、web服务器解析请求 主机– 应用 – web资源(比如静态资源或者是某一个具体的servlet)
3、servlet若之前没有被访问果,则首次创建
4、servlet的init方法 只会初始化一次,之后该servlet对象滞留内存,为后续访问提供服务
5、–service方法(doGet doPost)每次访问均会调用一次
6、在doGet或者doPost方法中使用response对象写输入内容
7、web服务器拿到response对象返回的数据再打给浏览器,这样一次请求以及响应结束
其他关于servlet的细节问题:
1、浏览器是通过url路径访问服务的,所以要把具体的servlet映射到具体的url路径,这一过程实在web.xml文件中完成的。
2、同一个servlet可以映射到多个url
3、若一个servlet中配置了,则会在web应用启动时会执行其init方法(用途示例:可以用来为整个web应用创建一些基础必备的数据库表和数据)
4、如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。
凡是在web.xml文件中找不到匹配的元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。
在web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。
当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。
5、servlet是线程不安全的
使用建议:(1)实现 SingleThreadModel 接口(2)同步对共享数据的操作(3)避免使用实例变量
servletconfig对象:
其代表的是servlet容器中的servlet配置对象,tomcat下web.xml文件中的servlet配置
将放在前会提示有错误,init应该在前面,执行顺序问题(本来我还以为运行中也可以修改web.xml中的配置呢 囧)
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
servletcontext对象:
servletcontext对象代表当前的web应用(生命周期:随应用启动,一直驻留内存,随应用销毁而销毁。 作用范围:整个应用内共享数据)
1、WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
2、ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
3、由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
servletContext应用:
1、多个Servlet通过ServletContext对象实现数据共享。
2、获取WEB应用的初始化参数。
3、实现Servlet的转发。
其他概念: 请求重定向 — 302 + location (两次请求,两次响应)
请求转发(Servlet的转发可以实现):服务器内部资源流转(一次请求一次响应)
4、利用ServletContext对象读取资源文件
servlet环境下:
getServletContext().getRealPath(“config.properties”);获取文件实际路径。
这个文件是可以实时改变的(而前面的配置初始化仅在初始化时执行一次)。
非servlet环境下 利用类加载器(实际中为了分层 不允许传递servletcontext对象)
this.getClass().getClassLoader().getResource(“../../config.properties”).getPath())