声明
文章大部分内容转载自公众号(Java3y),如需转载请关注Java3y公众号联系作者 ;本文已经获得转载声明

Servlet是单例的

 浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,Servlet对象一旦创建了就会驻留在内存中,为后续的请求服务知道服务器关闭.

每次访问的请求对象和响应对象都是新的

 对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

线程安全问题

 当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。

  • 如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制synchronized (对象){}
  • 如果一个变量不需要共享,则直接在 doGet() 或者 doPost()定义.这样不会存在线程安全问题

ServletConfig对象

 通过此对象可以读取web.xml中配置的初始化参数

#在web.xml中设置一个参数,通过ServletConfig对象获取
<init-param>
    <param-name>hello</param-name>
    <param-value>fish</param-value>
</init-param>

#在servlet中的doPost()方法里获取
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletConfig servletConfig = this.getServletConfig();
        String value = servletConfig.getInitParameter("hello");
        System.out.println(value);
    }

ServletContext对象

 当Tomcat启动的时候,就会创建一个ServletContext对象。它代表着当前web站点

  • 所有Servlet都共享一个ServletContext对象(Servlet之间可以通过ServletContext实现通讯)
  • ServletConfig获取的是配置的是单个Servlet的参数信息,ServletContext可以获取的是配置整个web站点的参数信息

实现ServletContext之间的通讯

 需要用到ServletContext的setAttribute(String name,Object obj)方法

ServletContext servletContext = this.getServletContext();
String value = "shafish";
servletContext.setAttribute("MyName",value);
#另一个Servlet
ServletContext servletContext = this.getServletContext();
String value = (String)servletContext.getAttribute("MyName");
System.out.println(value);