Servlet初始化以及执行过程

前言:因为刚开始工作,菜鸟一个,工作初期主要用框架SpringMVC,SpringJPA等,工作上用到的知识点不是很多,工作上用的是一个点,但是我们要想好好学技术就要系统的学习下。所以自己闲暇之余在看Spring In Action ,但是好多东西都比较蒙圈,例如AppliactionContext、Filter、Listener等,所以自己就去学了一些基础的知识,自己学了Servle初始化、servlet 原理(了解)、tomcat原理(了解),在这里简单的分享一下,如果问题请多多指教。

          • serlvet容器
          • serlvet初始化过程
            • 1生命周期
            • 2几个类
            • 3ServletContext
            • 4Sessioncookie
          • FilterListener
          • 个人理解

serlvet容器

-简单的说:就是servlet运行的场所,在servlet容器中会处理所有的客户端请求,将并且将请求返回给客户端。

serlvet初始化过程
1生命周期

(1)init:初始化阶段
- Serlvet容器加载serlvet类,将.class文件加载到虚拟机内存。
- Serlvet容器加载Servletconfig类。
- Serlvet容器创建serlvet对象。这个servlet对象下面会稍微说一下。
- Serlvet容器调用servlet的初始化的init方法将servlet进行初始化。
(2)service:处理请求,返回结果
- 当serlvet容器收到请求后,创建HttpRequest和HttpResponse方法。
- servlet容器调用service方法,容器将请求参数HttpRequest和HttpResponse传递给service,HttpRequest中封装了所有跟请求相关的信息。
- HttpResponse将请求的结果传递给用户。
(3)destory:销毁阶段
- web容器终止的时,会调用servlet的destory方法,销毁servlet对象,
- 释放资源

2几个类

(1)Httpservlet相关类
- Servlet(接口):定义了servlet中必须要实现的方法
- GenericServlet(抽象类):实现了Servlet接口和ServletConfig接口,定义了一些协议相关的方法。
- HttpServlet:实现了跟Http请求相关的类和方法。
(2)ServletConfig
- 配置类,在servlet容器加载的的时候,会加载这个配置类,同时重写init方法中带参数的方法,可以得到ServletContext对象。

public interface ServletConfig {
    public String getServletName();//返回初始化的servlet名
    //获取serlvtContext对象
    public ServletContext getServletContext();
    //获取初始化时web.xml文件中给某个固定的servlet配置的初始化属性值,如果属性不存在,返回空
    public String getInitParameter(String name);
    public Enumeration getInitParameterNames();
}
3ServletContext
  • 全局变量:整个servlet容器启动的时候就会创建这个对象,一个web应用只能有一个servletContext对象,当容器被关闭的时候这个对象就被销毁了
    (1)作用
  • 同一个应用的servlet对象之间可以进行通信
  • 获取web应用的初始化参数,读取web.xml文件
  • 实现servlet的转发重定向
  • 读取资源文件,现在不都流行代码于配置结合吗,所有的配置文件都可以通过它进行读取。
4Session/cookie/

(1)http协议是无状态的,一旦客户端服务器端数据交换完毕,就会关闭客户端和服务器端的连接,再次请求需要重新进行连接,客户端和服务器的连接需要进行三次握手,断开需要进行四次挥手,如果系统频繁的进行连接和断开连接,系统会浪费大量的资源。为了祢补http无状态的不足,可以通过cookie、session、url重写、隐藏表单域。
(2)cookie是客户端技术,客户端浏览器和服务器进行交互时,由服务器的response对象将数据写入客户端的cookie,以后每次客户浏览器访问服务器时,都会带着cookie的数据去访问服务器,服务器能够通过cookie中的数据识别这个用户。cookie区分浏览器,不同浏览器的数据不能够共享。服务器对象通过操作cookie对客户端的数据进行保存。
(3)session是服务器端的技术,服务器在运行时为每一次用户都创建session对象,由于session对象是独享的,每次客户端浏览器访问服务器时都会将用户的数据写入session对象中。session技术需要通过cookie获取浏览器数据,当用户端禁止了cookie,session也就不能用了。服务器端通过http请求不能够确认用户的信息,只能通过cookie去获取用户的信息。当然你第一次访问一个新的服务器是没有办法识别用户的信息的,因为用户没有session对象。

public class SessionWriter extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        HttpSession session = req.getSession();
        Cookie cookie = new Cookie("JSESSIONID", session.getId());
        cookie.setMaxAge(session.getMaxInactiveInterval());
        cookie.setPath(((HttpServletRequest) this.getServletContext()).getContextPath());
        res.addCookie(cookie);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        System.out.println("调用 doPost()方法 ");
        doGet(req, res);
    }
}

在服务器端是通过sessionid来确定用户的身份的,sessionid是从session中获取的,然后写入cookie的,当用户第二次访问了,用户直接携带sessionid到服务器端即可。

Filter/Listener

(1)Filter:过滤器,顾名思义就是是过滤请求的意思,在web.xml中配置过滤器类,让满足的条件的请求,能够继续向下处理请求,如果没有满足条件可以直接拒绝,过滤器有助于减轻服务器的压力,过滤掉不想关的请求。在同一个web应用中可以配置实现多个过滤器,过滤器的加载顺序和web.xml文件配置顺序是不相同的,请求通过过滤器链(FilterChain)不断的向下执行,过滤器的执行顺序和定义顺序是一样的。过滤器的配置FilterConfig和容器的ServletConfig都是在web容器加载的时候实现的,都在tomcat源码中有具体的实现。
(2)Listener:监听,就是当某个行为触发的时候会执行的。如下所示就是监听一个session 的创建:

public class ListenerTest implements HttpSessionListener, ServletContextListener, ServletRequestListener {
    public void sessionCreated(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        System.out.println("新创建一个session, ID为: " + session.getId());

        System.out.println();
    }
}

在web.xml中配置了监听类,web应用加载的时候就会加载这个监听类,当请求到来时,触发了创建session,就行执行上面的这个listener。

个人理解
  • tomcat容器的初始化过程跟Servlet的初始化过程是息息相关的,Servlet的很多实现都是在tomcat中的发生的。
  • 监听请求是通过多线程实现的,当请求来临时,激活一个线程,将创建的resquest、response对象封装在这个线程中,然后线程将请求传递给容器就行处理。
  • 一个服务器上可以添加多个web应用,每个web应用要有不同的端口号,服务上通过不同端口号选择不同的web应用对请求进行处理。
  • 请求Http://hostname:port/contextpath/servletpath hostname:port服务器通过选择host、选择端口号来确定请求要选择的web应用,同一个主机下可能存在多个web应用,同一个主机的web 应用通过端口号来区分的。
  • /contextpath/servletpath后面的url才是选择服务中的那个容器处理那个路径下的具体的服务来处理用户的请求。
  • Servlet容器是整个servlet的运行环境,初始化整个servlet容器的时候就会初始化加载web.xml文件,同时也会创建整个类的全局变量ServletContext。
  • servlet初始化的过程中,会创建servlet对象,这个对象就是web.xml中配置的servlet类的相关信息。
    参考文档:
    https://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/
    https://www.ibm.com/developerworks/cn/java/j-lo-servlet/
    http://blog.csdn.net/u012228718/article/details/41730903

你可能感兴趣的:(web开发)