📄 11. servlet note.txt
字号:
一般来讲,从同一客户打开浏览器连接到服务再到客户关闭浏览器可称为一次会话(中间浏览器可以打开多个窗口)
通信协议分为有状态和无状态两种。Http协议是一种无状态协议。一个客户向服务器发出请求然后服务器返回响应,连接就被关闭了。在服务器端不保留连接的有关信息.因此当下一次连接建立时,服务器已没有以前连接的信息了,无法判断这一次连接和以前的连接是不是属于同一客户发出的。在实际应用中,客户进行一个事务性的操作可能需要对服务器进行好几次连接,这时维护前几次连接的状态就非常重要。
服务器必须能够区分不同的客户,而且还要有为每一个客户存储数据的方法。
session实现的三种方法
Cookie
URL Rewriting
隐藏表单域
使用java servlet API进行会话管理
(session)
java servlet API 主要提供了两个与会话相关
的类和接口:Cookie和HttpSession
Cookie
控制机制:
⊕Browser---------request----- Web server
⊕Web server---------request+info--------- Browser
⊕Browser---------request+info-------- Web server(客户端
带信息来再次访问其标志的资源)
详细解释
Cookie是一小块可以嵌入到Http请求和相应中的数据。
它在服务器端产生,并作为响应头域的一部分返回用户。浏览器收到包含Cookie的响应后,会把Cookie的内容用key-value对的形式写入到一个客户端专门存放Cookie的文本文件中(c:/documents and setting/$user/Cookies)。浏览器会把Cookie及随后产生的请求发给相同的服务器,服务器可以再次读取 Cookie中存放的数据。
Cookie可以进行有效期的设置,过期的Cookie不会发送给服务器。
Cookie的用法:
获取Cookies:Cookie[] all = request.getCookies();
获取Cookies名字:Cookie[i].getName();
获取Cookies的值:Cookie[i].getValue();
为Cookies设置新值:Cookie[i].setValue();
设置Cookie保存的最大期限:
Cookie[i].setMaxAge (int expiry);毫秒
以cookie实现的session的流程:
Browser访问 Web server---- Web server
分给用户一个jsessionId并返回给用户保存在本地,同时将jsessionId保存在session中--- 用户再次访问本Web server时带着 jsessionId来访问------ Web server根据用户传过来的jsessionId跟session中的 jsessionId比较,如果有相同的,就将这个jsessionId对应的session返回给用户,这样用户可以看到上一次的访问信息。
HttpSession
javax.servlet.http.HttpSession接口封装了HTTP会话的细节,该会话与一段时间内特定的web客户对web服务器的多个请求相关。它由Servlet容器环境实现。对Servlet的开发者隐藏实现的细节。
在Servlet中进行会话管理时,首先要获得会话对象。HttpServletRequest.getSession()对象返回与请求相关的当前HttpSession对象,并且该对象不存在时就创建一个新的对象。
HttpServletRequest.getSession(true)具有相同的功能。如果参数是false,当不存在会话对象的时候就不创建新的,而是返回一个Null值。
容器做的事情
产生不重复的jsessionId;
将jsessionId和session对象映射成表;
将jsessionId返回给用户
(cookie/urlRewriting);
再次访问时,先在表中查jsessionId对应的session;
将查到的session对象的引用放入request给用户。
用户做的事情
request.getSession();
request.setAttribute();
request.getAttribute();
servlet的会话机制(servlet将
cookie/urlRewriting封装而成)
底层的cookie和url之间的过程被封装;
urlRewriting的细节被屏蔽,即jsessionId由容器生成,jsessionId列表由容器维护;
状态对象由容器维护;
容器提供了在状态对象中存取数据的方法;会话状态会被自动持久化。
URL Rewriting
Cookies可以用来跟踪某一用户向站点发出的每一个请求,有人认为web站点管理员能都收集到用户所浏览网页的足够信息。这侵犯
了用户的个人隐私权,所以某些用户会关闭浏览器的Cookie功能。这样的话就要求程序员事先在实现Cookie的同时也实现重写URL,那当Cookie失效的时候重写URL就会替代Cookie发挥作用。
Servlet中的数据可见范围和生命周期:
一个应用只有一个上下文对象。
Filter
链式结构的问题.
f.doFilter(r,r)
过滤器是没有url的servlet
容器知道filter的转发顺序,通过配置文件
web.xml中的位置决定执行先后
所以filter就解放了.
2004-9-16 星期四 晴 Servlet的基础概念
1. Servlet是什么? 答:
1) 模块化的程序,运行在服务器端,增强了请求/响应导向服务;
2) 应用示例: a. 访问远端对象; b. 跟踪大量信息; c. 多用户协作
2. HTTP和Servlets 答:
1) Servlet是HTTP协议中作为CGI的一个替代品;
2) HttpServlet类用于开发HTTP为基础的Servlet
3. HttpServlet 答:
1) 继承抽象类javax.servlet.GenericServlet,实现接口java.io.Serializable;
2) 用以开发Http协议为基础的Servlet
4. 服务方法 答:
1) 每当服务接收到对Servlet的请求时,服务器就会产生一个新线程,并调用Service。service方法检查HTTP请求类型(GET、POST、PUT、DELETE等),并相应地调用doGet、doPost、doPut、doDelete等。
2) doGet/doPost方法接收HttpServletRequest和HttpServletResponse对象。
3) 99%的时间里,只需注意GET和/或POST请求;
4) 没有任何doHead方法。
5. 返回响应 答:
1) PrintWriter out = response.getWriter // 用于返回文本数据给客户端
2) ServletOutputStream out = response.getOutputStream // 用于返回二进制数据给客户端
6. 支持Servlet的Web服务器 答:
1) J2EE应用服务器包括:Web Container和EJB Container;
2) Web Container的Servlet Engine提供对Servlet的运行支持;
2004-9-17 星期五 晴 用Servlet处理表单数据
1. Form元素的属性 答:
1) ACTION: 用来指定要处理FORM数据的Servlet的URL,也可以指定FORM数据将要发送到的电子邮件;
2) METHOD: 指定数据传送给HTTP服务器的方法;
3) ENCTYPE: 指定数据在传输之前进行编码的方式,
例multipart/form-data 编码将每个字段作为MIME可兼容的文档的单独部分传输。
2. 解析请求 答:
1) 对于所有的请求:
a. getParameterNames: 以Enumeration形式获取表单中清单, 每一项都可以转换成String;
b. getParameter: 返回表单中参数名(区分大小写)对应的值(没有这样的参数,返回null;没有任何值,返回空String);
c. getParameterValues: 返回表单中参数名(区分大小写)对应的字符串数组(没有这样的参数,返回null;只有一个值,返回值为单一元素组); Servlet的生命周期
1. Servlet的生命周期 答:
1) 通过web Container装载(J2EE的组件都是被动地装载入Container)并实例化Servlet对象;
2) 调用init()方法(在整个生命周期中只被调用一次);
3) 调用service()方法(在整个生命周期中可被调用多次);
4) 调用destroy()方法(在整个生命周期中只被调用一次);
2. init方法 答:
1) 当首次创建Servlet时就会调用init方法, 而不是每个用户请求都会调用该方法。
2) 除非被destroy方法移除,否则不能被重载;
3) init方法一结束,servlet即可接受客户端请求;
3. init方法实例 答:
1) 在编写接受ServletConfig作为参数的init方法时,应该总是在首行调用super.init;
2) init方法接受ServletConfig作为参数, 用以下方法获得参数值:
a. getInitParameter: 返回指定参数名称对应的值,如果参数不存在,返回null;
b. getInitParameterNames: 返回指定参数名称对应的值枚举,如果参数不存在,返回的空枚举;
2004-9-20 星期一 阴
3. service方法 答:
1) 每当服务器接收到对Servlet的请求时,服务器就会产生一个新线程, 并调用service。
service方法检查HTTP请求类型,请相应地调用doGet、doPost、doPut、doDelete。
2) 被container调用去响应(ServletResponse)来自客户端的请求(ServletRequest);
4. Servlets的多线程安全 答:
1) 多线程占用资源少,处理速度快,提高了效率。
2) 一些编码建议:
a. 对变量和方法定义适当的访问方式, 例如单纯取值操作不会有多线程安全问题;
b. 同步化所有访问重要数据的实例变量;
c. 创建访问类变量的访问方法。
5. SingleThreadModel接口 答:
1) 如果希望禁止多线程访问,可以让Servlet使用SingleThreadModel接口:
public class YourServlet extends HttpServlet implements SingleThreadModel{ ... }
2) 使用此接口,系统将保证不会存在多个请求线程同时访问Servlet的单个实例。
但是仍然需要同步对存储在Servlet外部的类变量或共享字段的访问。
3) 如Servlet频繁被访问,则Servlet访问的同步将严重影响性能(延时)。
6. destroy方法 答:
1) 服务器决定删除已经加载的Servlet实例之前将调用Servlet的destroy方法;
2) 该方法允许Servlet:
a. 关闭数据库连接;
b. 中止后台线程;
c. 将Cookie程序清单或访问计数写到磁盘以及执行其他类似的收尾工作。
7. 在Servlet终止时处理Service线程 答:
1) 在destroy()方法中:
如有服务(通过一个同步化的实例方法取得当前线程数大于0),则置关闭状态为true(通过一个同步化的实例方法实现)。
然后循环等待服务线程数为0.
2) 在Service()方法中: 如见关闭状态为true,便不执行具体逻辑方法,直接退出。
2004-9-21 星期二 晴 资源访问
1. 分布式JAVA技术 答:
1) JDBC; a. 实现了Data和Client的分开; b. 通过简单的配置可以适用不同种类的数据库。
2) RMI(RMI使用的协议为Internet Inter ORB Protocol);
3) CORBA(核心技术为ORB:相应的你的请求转为另一个物理地址另一个不同语言对象的请求。
纯Java的情况下根本不用CORBA);
2. 转发结果至可视页面 答:
1) 用JavaBean(用来装载一组值,遵从一定协议的class)封装结果;
2) 每个JVM中的每一个应用程序里都存在一个上下文;
3) servletContext在servletConfig的对象中;
4) ServletContext.getRequestDispatcher(String path):返回一个RequestDispatcher
5) 通过RequestDispatcher的forward()或include()方法传送请求。
3. 转发请求至新的资源 答:
1) request dispatcher的二种传送请求方式
a. Forward: 将请求从一个servlet传到服务器上的其他资源(servlet、JSP、HTML);
b. Include: 包括静态或动态内容;
2) 获得request dispatcher的二种方式: a. ServletRequest.getRequestDispatcher() // 相对路径 b. ServletContext.getRequestDispatcher() // 绝对路径
3) 四种资源范围
a. javax.servlet.ServletContext: 整个应用程序范围内;
b. javax.servlet.http.HttpSession: 会话期间;
c. javax.servlet.ServletRequest: 一个请求期间;
d. javax.servlet.jsp.PageContext: 一个JSP页面;
2004-9-22 星期三 晴 Servlets中的持久状态
1. HTTP协议中无状态的优缺点:
优点:可以服务很多客户端;
缺点:不能在多个请求之间共享信息(通过Cookie和Session解决);
2. Cookies 答:
1) Cookies是Web服务器发送到浏览器的简短文本信息,以后在访问同一个Web站点或域时浏览器就会毫无更改地返回该文本信息。
2) 用户可以决定是否接受Cookie。
3) 一个Cookie由以下内容组成: a. 名称; b. 单个值; c. 一些操作属性:路径或所在域、有效期以及版本号。
4) 每个站点,浏览器通常只接受20条Cookie,总共接受300条,以及每条Cookie限制为4KB。
3. 设置Cookie 答:
1) 创建Cookie: Cookie c = new Cookie("CookieName", "CookieValue");
2) 设置有效期: c.setMaxAge(int lifetime); 黙认为负值,只作用于当前会话,不能存储在磁盘上;如为0值表示删除Cookie;有效值为秒为单位。
3) 在响应头中放置Cookie: response.addCookie(c);
4) 从客户端读取Cookie:
Cookie[] cookies = request.getCookies();
Cookie cookie;
for(int i=0; i" + cookie.getName() + "" + cookie.getValue()); }
4. Sessions 答:
1) 一个客户端和一个服务器端一次连接信息的所有集合,通过brower发出,由服务器端的servlet调用;
2) 提供一种方式在多个页面请求间确认用户或者储存关于用户的信息;
3) 实现会话跟踪的三种方式:a. cookie; b. URL重写; c. 隐藏的表单段
5. 设置Sessions 答:
1) 创建Sessions: HttpSession session = request.getSession(true);
// true表示如不存在则创建一个新的session
2) 用指定名称将一个对象绑定到session: public void setAttribute(String name, Object value);
3) 删除与指定名称相关的所有值: public void removeAttribute(String name);
4) 返回会话中所有属性名 public Enumeration getAttributeNames();
5) 返回指定名称对象 public Object getAttribute(String name);
6. Cookies和Sessions的比较 答:
1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -