这篇博文主要是《Head First Servlets & JSP》第五章的笔记,由于前四章主要讲基础,这里不会详细记录,以后抽时间把前四章进行一个总结。
本章知识要点:
描述RequestDispatcher机制。
初始化参数在部署描述(DD)文件-web.xml中配置,模板代码为:
<servlet>
<servlet-name>simpleDemoservlet-name>
<servlet-class>TestInitParamsservlet-class>
<init-param>
<param-name>myEmailparam-name>
<param-value>[email protected]param-value>
init-param>
servlet>
在servlet中,读取初始化参数的示例代码为:
String initParameter = getServletConfig().getInitParameter("myEmail");
容器在初始化一个servlet时,会首先从DD中“读出”servlet初始化参数,并把这些参数教给ServletConfig,然后把ServletConfig传递给servlet的init()方法。注意到,在超类中,init()方法有两个版本,一个没有任何方法,另一个init(ServletConfig)方法则会调用无参数的init()方法。servlet在初始化的时候调用的有参数的init方法会得到一个ServletConfig的reference。
要使初始化参数有效,必须重新启动web容器,或者使用支持热部署的web容器。初始化参数只有serlvet能看到。
请求属性有请求对象设置:
request.setAttribute("attr", value);
得到请求的任何其他servlet或JSP都能使用这些属性。用于向视图返回一些值。
上下文初始化参数对整个web应用可见,web应用中的servlet和JSP都能访问上下文初始化参数。上下文初始化参数在web应用启动时就初始化了,而不是加载servlet时初始化,上下文初始化参数可以看作时全局参数,也是在web.xml中配置。示例代码:
<servlet>
servlet>
<context-param>
<param-name>contextParamparam-name>
<param-value>contextValueparam-value>
context-param>
在servlet代码中获取context parameter:
String contextValue = getServletContext().getInitParameter("contextParam");
每个servlet有一个ServletConfig
每个Web应用有一个ServletContext
监听者能监听一个上下文初始化事件,并得到上下文舒适化参数,并在web应用为客户提供服务之前运行一段代码。ServletContextListener类就是用来完成这个任务的。
ServletContextListener能监听ServletContext的初始化和撤销两个重要事件。
在一个需要访问数据库的应用中,有很多servlet需要访问数据库,但是由于上下文初始化参数只能时String型,无法完成这样的任务。一种常见的做法是使用ServletContextLisener:
在web.xml中配置监听者:
<listener>
<listener-class>
com.example.MyServletContextListener
listener-class>
listener>
web容器通过监听者实现的接口判断监听者监听的时什么类型的事件。
监听者能监听很多事件,包括:上下文属性、servlet请求和属性,以及HTTP会话和会话属性相关的事件
属性就是一个对象,可能设置到另外3个servlet API对象中的某一个,包括ServletContext、HttpServletRequest或者HttpSession。可以简单地认为属性时一个映射实例对象中的名/值对(名是一个String, 值是一个Object)。
属性有三个作用域:上下文、请求和会话。应用中的每个部分都能访问上下文属性,而会话属性只有能访问特定HttpSession的部分才能访问,请求属性则只有能访问特定ServketRequest的部分才能访问。
上下文作用域不是线程安全的!
因为应用中的每个部分都能访问上下文属性,而容器对http请求是并发处理的,每个请求在一个单独的线程中处理,此时多个线程可能同时访问这个上下文属性,因此上下文作用域不是线程安全的。
HttpSession也不是线程安全的
因为当一个客户同时发出多个请求时,此时多个线程就可以同时访问HttpSession属性。
请求属性和局部变量是线程安全的
请求属性的使用场景:请求分派。MVC应用中,控制器与模型通信,得到视图建立相应所需要的数据,这些数据只针对某个请求,因此把它放在请求属性红。