javaweb基础之servlet

来源:互联网 发布:淘宝详情页面尺寸 编辑:程序博客网 时间:2024/04/28 03:48
1.servlet是Javaweb三大组件之一,它是javaweb的最为基础的组件。(其他两种组件:Filter和Listener)


2.javaweb请求响应原理:
当tomcat接收到请求(http://localhost:8080/servlet_demo/login)后,tomcat会找到servlet_demo项目中的web.xml文件,然后通过login这个请求路径,查找处理这个请求的Servlet类型。这刚好与<url-pattern>/login</url-pattern>匹配,这说明存在一个可以通过这个请求的Servlet。然后再通过<url-pattern>/longin</url-pattern>查找到<servlet-name>login</servlet-name>,然后再通过<servlet-name>login</servlet-name>找到查找到<servlet-class>com.syx.servlet.LoginServlet</servlet-class>。这时tomcat已经得到了一个servlet类的名字(一个字符串而已)。
tomcat通过servlet类名字去查找内存中是否存在servlet对象,如果存在,那么就不用再去创建,直接获取这个servlet实例,调用它的service()方法完成请求!
如果这个servlet不存在,那么tomcat会通过反射来创建servlet实例,并把servlet实例放到servlet池中,再去调用servlet的service方法处理请求。


3.servlet的声明周期:
servlet实例并非我们手动创建,而是由web容器创建。
void init():默认情况当servlet被第一次访问的时候init会被调用;servlet是单例模式;
void service():每次请求都会调用;
void destory():当servlet实例销毁时被调用;


4.专注HTTP请求的Servlet
接口Servlet下有两个主要的实现类:GenericServlet和HttpServlet.
1>GenericServlet是一个抽象类,不限制具体的传输方式,通用的servlet类,包含很多方法。
2>HttpServlet是一个抽象类,提供将要被子类集成的以创建web站点的用Http协议传输的类,其中包含两个重要的方法:doGet()和doPost()。。


HttpServlet抽象类的继承类中的init()方法,实际上是调用了父类的init()方法,如果没有初始化内容,可以不重写。
HttpServlet抽象类的继承类中的service()方法,其实是调用了doGet()和doPost()方法,所以在继承类中只需要重写抽象类的doGet()和doPost()方法。


5.tomcat启动时创建servlet:
使得servlet随着tomcat的启动而创建,就需要在web.xml文件中的<servlet>标签中配置<load-on-startup>元素,这个元素的值必须是大于等于0的整数,以定义多个servlet加载顺序。【先创建的先销毁】


6.初始化方法init(ServletConfig config),参数config来自于web.xml文件中<servlet>标签<init-param>标签的值。
【注意:在eclipse里面复制一个项目,需要修改项目的webroot路径值。这样才是一个新的项目】


7.servlet路径映射:
关于url-pattern的配置:
>完全路径匹配:以/开头,例如  /aaa  /aaa/bbb
>目录匹配:以/开头,例如 /aaa/*  /*
>以扩展名匹配:不能以/开头,例如 *.do  *.action ...
【优先级:完全路径匹配>目录匹配>扩展名匹配】

8.ServletContext
>WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前WEB应用。
>由于一个web应用中的所有servlet共享一个servletContext,所以同一个ServletContext中的servlet之间可以通讯。
【创建servletContext:在<webapp>标签中配置<context-param>标签,这样所有的servlet类都可以放到servletContext中。】


9.获得classpath下的资源文件的流有两种方式:
>通过ServletContext()方法获取的对象调用getResourceAsStream(path1)方法,path1则为src目录下的类编译后在webapps下的路径,即/web-inf/classess/test1.properties。
>直接通过类的加载器表示classpath下的资源文件,即this.getClass().getClassLoader().getResourceAsStream(filename)。


10.Servlet是由tomcat创建的,且只会创建一个实例,所以是单例模式,单例模式下的默认servlet并非是安全的。(图片来源于菜鸟教程)