1:web 应用程序的配置
1.1 conf/server.xml <Context> 讲解 : 表示一个web 应用程序运行在特定的虚拟机中,不用再将项目文件拷贝到 webapps 下
<Context> 元素 是 <Host> 元素的子元素
元素属性讲解:
className: 指定实现了 org.apache.catalina.Context 接口的类名。
coockie
: 指定是否将coockie应用于 session,默认为 true
crossContext : 如果设置为 true在应用程序内容调用 ServletContext.getContext() 成功返回运行在同一个虚拟机中的其他web项目的 请求调度器。默认 false
doBase: 指定web 程序的文档目录或者 war文件的路径名,该属性是必须的 绝对路径 或者 appBase 下的相对路径
path: 指定web 应用程序的上下文路径。
reloadable: 如果设置为 true,服务器会监视 WEB-INF/classes 和 WEB-INF/lib 目录下类的改变,如果发现更新,服务器会自动重新加载该 web 程序,默认 false,需占用一定资源开销
unpackWAR: 为true 的话 Tomcat 在运行web 应用程序前将展开所有压缩的 Web 应用程序。默认 true
例如:
<Host name[="localhost" appBase="webapps" unpackWARS="true" autoDeply="true" xmlValidation="false" xmlNamespaceaWare="false">
<Context path="/MyServlet" doBase="/MyServlet" reloadable="true">
</Host>
<Context> 元素还可以放在 conf/context.xml 在这个文件中的信息将被所有的web 应用程序所加载
还可以放在 对应 应用程序下的 META-INF/context.xml 内
Tomcat 中 不建议将 <Context> 元素放在 server.xml 中,因为容器启动后,server.xml 只加载一遍,将不会再加载。
1.2 servlet 的另一种运行方式
第一种方式: web.xml 中部署 servlet
第二种方式: 利用 Tomcat 的 Servlet 调用器,即在 Tomcat 下的/conf/catalina/localhost 下创建 项目名.xml 添加 <Context> 元素 docBase 节点为 绝对路径,可以运行
1.3 与servlet 配置相关的元素 web.xml
<servlet> 节点

![]()
![]()
<init-param> 节点内容的获取通过 servlet 实例中的ServletContext.getInitParameter("这里输入param-name 名称"); 并且这部分应该在 servlet init() 方法中初始化
<servlet-mapping> 节点
在 servlet 和 URL 之间定义一个映射,包含了子元素 <servlet-name> 和 <url-pattern> url相对路径 这个在form 表单中的 action = 中 定义
2:web 应用程序中数据库的访问
数据库的url name passwd driverClass 可以放在 servlet 的 <init-param> 中注意 CallableStatement 用于执行存储过程本章节重点讲下 JDBC数据源和连接池利用 DataSource 接口来获取对数据库的连接DataSource 对象获取,通过 java 的 jndi服务器查询来获取1:在 server.xml 的 <Context> 元素中配置数据源![]()
2:使用 java 上下文来获取数据源: 注意:在配置jdbc 数据源所指定的JNDI 名,是相对于 java:comp/env 上下文来的![]()
下章节讲 servlet 的会话跟踪技术 本章节不再进行举例3: 会话跟踪
客户和服务器之间的会话是通过HTTP 协议 属于无状态的,web服务器需要采用一种机制来唯一标示一个客户会话跟踪实现的三种机制:SSL 会话: 安全套接字层Cookie: 以键值对的形式记录会话跟踪的内容,服务器利用响应报头 Set-Cookie 来发送Cookie 信息响应包头的格式为:Set-Cookie: NAME=VALUE (Coockie 名称); 这里必须首先出现,后面的元素可以无序Content=value; - 包含用户私有信息Domain=value; - 指定cookie 在哪一个域中有效 必须以 . 号开始Max-Age=value; - Cookie 生生存时间 以秒 为单位 超过就无效path=value; - 指定 coockie 在哪一个URL 子集下有效Version=1例如: Set-Cookie: uid=zhangsan;Max-Age=3600;Domain=.sunxin.org;Path=/bbs;Version=1说明上面这个响应包头发送了一个名为 uid 值为 zhangsan 的cookie,生存时间为3600秒,在 sunxin.org 域的/bbs 路径内有效,超时该cookie 无效。当浏览器接受到这个响应报头后,可以选择拒绝或者接受这个cookie,如果接受的话,浏览器下一次发送请求给 http://www.sunxin.org/bbs/路径下的资源时,同时也会发送一个请求报头:Cookie:uid=zhangsan服务器从请求报头中获取到cookie,通过标示符取出 zhangsan 的状态信息,这样,通过为不同的客户发送不同的cookie,可以实现每个用户的会话跟踪。 cookie 会存在客户硬盘上,如果客户浏览器禁用 cookie的话,那么本机制就无法运行。URL重写:在 URL 中嵌入标示客户的 Session ID,servlet 容器解析 URL,取出 SessionID,根据SessionID将请求与特定的Session 关联。SessionID的名称按照规范必须是 jsessionid,例如: http://www.sunxin.org/bbs/index.jsp;jsessionid=1234?name=zhangsan&age=18要跟踪客户端的会话,就需要将所有发往客户端的URL 进行编码,可以通过调用 HttpServletResponse 接口中的 encodeURL() 方法和 encodeRedirectURL() 方法来实现,其中 encodeRedirectURL() 方法在 调用 重定向 sendRedirect() 方法调用前使用。3.1 java Servlet API 的会话跟踪
java Servlet API 中的 HttPSession 封装了Session 的概念,当一个会话开始的时候,Servlet 容器 就创建了一个 HttpSession 对象,在 HttpSession 中存放客户的状态信息,同时
Servlet 容器为 HttpSession 分配了一个唯一的 SessionID 将其作为 Cookie 或 URL的一部分发送给浏览器,当客户再发送请求的时候,浏览器将Cookie 一起发出,容器读出 SessionID 找到 HttpSession 对象。
HttpSession 接口:Object getAttribute(String name);
Enumberation getAttributeNames();
void removeAttribute(String name);
void setAttribute(String name,Object value);
四个方法用于 HttpSession 读取 移除和设置属性,
long getCreationTime():返回session 创建的时间,从1970-1-1 以后的毫秒数
String getId(): 返回一个字符串,包含Session 唯一标示符。
long getLastAccessedTime(): 返回客户最后一次发送与Session 相关请求的时间 可以确定两次会话期间客户的非会话间隔时间
int getMaxInActiveInterval(): 返回以毫秒为单位的最大时间间隔,这个时间是容器在客户请求期间保持session 打开的最长时间间隔,超过时间session 失效。
void setMaxInActiveInterval(): 设置session 失效时间,如果值为 -1 ,session 永不失效。ServletContext getServletContext(): 返回 Session 所属的 ServletContext 对象
void invalidate(): 使session 失效,如客户退出登录。
boolean isNew(): 判断session是否在容器中存在。
Session 的生命周期: