Head First Servlets & JSP 学习笔记 第五章 —— 作为Web应用

时间:2022-10-28 21:03:46

初始化参数:(init-param)

初始化参数写在web.xml文件中:(写在<servlet>标签内部)

1 <servlet>
2     <servlet-name>BeerAdvisorServlet</servlet-name>
3     <servlet-class>com.example.web.BeerServlet</servlet-class>
4 
5     <init-param>
6         <param-name>Email</param-name>
7         <param-value>101101@qq.com</param-value>
8     </init-param>
9 </servlet>

 

一个Servlet在执行构造函数时,只是实例化了一个普通的对象,要想变成真正的Servlet,需要两样东西 :ServletConfig、ServletContext

Web容器(Tomcat)在初始化一个Servlet的时候,会为这个Servlet构建一个唯一的ServletConfig

Web容器从部署描述文件(web.xml)读出Servlet的初始化参数(init-param),并把这些参数交给ServletConfig,然后把ServletConfig传递给init()方法

Web容器读取DD(web.xml)中的初始化参数,在一个Servlet的生命周期中,只读取一次,就像构造函数、init()初始化函数一样,只执行一次。

每次重启Tomcat时,Tomcat会查看自己的webapps目录,并部署在那里发现的所有应用。

<servlet>初始化参数只对一个Servlet有效,而<web-app>上下文参数对整个Web应用都有效。上下文参数不写在某个<servlet>中,因为对整个Web应用有效,所以写在<web-app>里面:

1 <web-app>
2     <context-param>
3         <param-name>adminEmail</param-name>
4         <param-value>adminEmail@163.com</param-value>
5     </context-param>
6 </web-app>

每个Servlet有一个ServletConfig,一个Web应用只有一个ServletContext。

比较ServletConfig对象和ServletContext对象
  ServletConfig对象(保存着初始化参数) ServletContext对象(保存着上下文参数)
 使用方法 getServletConfig().getInitParameter("参数名"); getServletContext.getInitParameter("参数名");
 可用范围  

只对配置了<init-param>的Servlet可用;不过可以

通过保存在一个属性中来得到更大范围的可用性

 对整个Web应用的所有Servlet、JSP都可用

 个数  一个Servlet有一个ServletConfig  一个Web应用只有一个ServletContext(分布式应用除外)

 在web.xml

 中的配置

<servlet>

  <init-param>

    <param-name>参数名</param-name>

    <param-value>参数值</param-value>

  </init-param>

</servlet> 

<web-app>

  <context-param>

    <param-name>参数名</param-name>

    <param-value>参数值</param-value>

  <context-param>

</web-app> 

对象赋值

在Servlet刚初始化的时候,提供ServletConfig

 在Servlet刚初始化的时候,提供ServletContext

要把初始化参数<init-param>和上下文参数<context-param>认为是部署常量,即在Web应用运行的时候修改这些参数是没用的,它们只在刚刚部署时读取一次。

ServletContextListener(上下文监听者)

ServletContextListener能够监听一个上下文初始化事件,这样就能得到上下文参数,并在应用为客户提供服务之前运行一些代码。

就像告诉Web容器,Web应用其他部分的有关情况一样,用部署描述文件(web.xml)同样来配置ServletContextListener,Web容器就可以发现和使用ServletContextListener。                                                                                                       

1 <web-app>
2     <listener>
3         <listener-class>
4             com.example.listener.MyServletContextListener
5         </listener-class>
6     </listener>
7 </web-app>

三个属性作用域:

上下文(Context)、会话(HttpSession)、请求(ServletRequest)

上下文属性不是线程安全的:一个Servlet  A设置了一个上下文属性,并赋值;马上另一个Servlet  B也给这个上下文属性赋值;这个时候Servlet  A在获取这个上下文属性的值,就不是自己当初的赋值了。

会话属性也不是线程安全的:一个客户可以打开多个浏览器窗口发出请求,容器还是用同一个会话。

只有请求属性和局部变量是线程安全的。