Servlet学习笔记(二)


1. Servlet 的初始化参数
配置:
<servlet>
<description></description>
<display-name>BeerSelect</display-name>
<servlet-name>BeerSelect</servlet-name>
<servlet-class>com.example.web.BeerSelect</servlet-class>
<init-param>
<param-name>adminEmail</param-name>
<param-value>zhangzhaoyu0524@163.com</param-value>
</init-param>
</servlet>
使用:
ServletConfig sc = this.getServletConfig();
String adminEmail = sc.getInitParameter("adminEmail");
request.setAttribute("adminEmail", adminEmail);

2. 在 Servlet 初始化之前不能使用Servlet 的初始化参数。即不能从构造函数中调用getServletConfig() 方法。
容器调用 init() 之前,它还不能算是一个完整的 Servlet。容器初始化 Servlet使,会为这个Servlet 建一个唯一的
ServletConfig。容器从web.xml 文件中读取 Servlet 的初始化参数,并把这些参数交给 ServletConfig,然后把
ServletConfig 传递给servlet 的init 方法。

3. JSP 能不能得到 Servlet 初始化参数。ServletConfig 用于 Servlet 配置(而不是JSPConfig)。所以,如果想让应用的其
他部分使用你在 web.xml 中配置的Servlet 初始化参数信息,就要通过Servlet 获取,然后request.setAttribute(key, value);

4. 针对应用的初始化参数:上下文初始化参数。
上下文初始化参数与 Servlet 初始化参数很类似,只不过上下文参数对整个Web 应用而不是一个 Servlet 可用。
这说明应用中的所有Servlet 和JSP 都自动地能访问上下文初始化参数,我们不用为每个Servlet 在Web.xml 中配置。
每个Servlet 有一个ServletConfig, 每个Web 应用有一个ServletContext。
ServletContext sct = this.getServletContext();
String contextAdminEmail = sct.getInitParameter("adminEmail");
request.setAttribute("contextAdminEmail", contextAdminEmail);

5. ServletContext 是JSP或Servlet 与容器及Web 其他部分的一个连接。

6. ServletContextListener 它能监听ServletContext一生中两个关键的事件:初始化和撤销。这个类实现了 javax.servlet.
ServletContextListener。
它能做到:上下文初始化时得到通知,上下文撤销时得到通知。
<listener>
<listener-class>com.example.listener.MyServletContextListener</listener-class>
</listener>
在初始化任何 Servlet 之前初始化应用。

7. 监听者不只是针对上下文事件,还可以监听上下文属性、servlet请求和属性,以及HTTP会话和会话属性相关的事件。

8. ServletContextAttributeListener:Web 应用上下文中是否增加、删除或替换了一个属性。
HttpSessionListener:跟踪活动的会话。
ServletRequestListener:每次请求到来之时,你都想知道,以便建立日志记录。
HttpSessionBindingListener:你有一个属性类,而且你希望这个类型的对象绑定到一个会话或从会话删除时得到通知。
HttpSessionAttributeListener:你想知道什么时候增加、删除或替换一个会话属性。
ServletContextListener:你想知道是否创建或撤销了一个上下文。
HttpSessionActivationListener:你有一个属性类,而且希望此类对象绑定的会话迁移到另一个JVM 时得到通知。

HttpAttributeListener 类只是想知道会话中何时增加、删除或替换了某种属性。但是HttpSessionBindingListener
能够让属性本身知道它何时增加到一个会话中,或者何时从会话中删除。

9. 上下文作用域不是线程安全的。同步服务方法意味着Servlet 中一次只能运行一个线程,但是并不能阻止其他Servlet 和
JSP 访问这个属性。但是可以对上下文对象加锁。
synchronized(this.getServletContext()) {
//对上下文操作
}

10. 对会话HttpSession 同步来保护会话属性。
synchronized(request.getSession()) {
//对上下文操作
}

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

12. RequestDispatcher 只有两个方法 forward 和 include
1)从ServletRequest 中得到 getRequestDispatcher(String path) path 路径作为一个资源。
2)从ServletContext 得到RequestDispatcher view = this.getServletContext().getRequestDispatcher(String path)
路径必须要以斜线开头。

include 是指把请求发给别人处理,处理完后在返回自己。

13. 当响应已经提交了,就不能再转发请求。提交了的意思是已经把相应发给客户了。

14. 使用一个 HttpSession 对象保存跨多个请求的会话状态。也就是保存与该客户的整个会话期间的会话状态。
客户需要一个唯一的会话ID 对客户的第一次请求,容器会生成一个唯一的会话ID,并通过相应把它返回给客户。
客户再在以后的每一个请求中发回这个会话ID。

15. 客户与容器是如何交换会话ID信息?
在请求发送一个会话cookie HttpSession session = request.getSession();
session.isNew() 用来判断该会话是否新的。
Session 还可以通过会话事件对象获得。
如果有时候只想使用一个已经的会话,并不像创建,则可以使用 request.getSession(false);

16. 如果客户禁用cookie 那么getSession()方法总会返回一个新会话。只能采用URL重写。把会话ID 加到各个URL后面。
URL + ;jsessionid=1234567。这样到当请求到达容器时,容器会去下请求URL 中这个额外的部分。
response.encodeURL(String) 像这个URL增加额外的JD信息。

17. 使用 sendRedirect() 的URL重写。希望把请求重定向到另外一个URL,但是还是想使用一个会话。方法如下:
response.encodeRedirectURL("path");
URL 编码由响应处理。

18. 如果客户不接受Cookie,URL 重写会自动发生,但是必须显示地对所有URL编码。没有办法对静态页面完成自动的URL重写。
所以,如果依赖于会话,就必须使用动态生成的页面。
setMaxInactiveInterval() 指定客户请求的最大时间间隔,超过容器会撤销会话。
invalidate() 结束会话。

19. 设置会话超时
1)在DD 中配置会话超时
<session-config>
<session-timeout>15</sesison-timeout>
</session-config>
2) 设定一个特定会话的会话超时
session.setMaxInactiveInterval(20*60);

20. 利用Servlet API使用Cookie

21. 会话绑定监听者和活化激活监听者不再DD 中配置,因为他们与会话本身相关。而不是与会话中放置的单个属性相关。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值