【Jsp精品源码栏目提醒】:网学会员Jsp精品源码为您提供Servlet与JSP核心编程读书笔记 - 其它资料参考,解决您在Servlet与JSP核心编程读书笔记 - 其它资料学习中工作中的难题,参考学习。
第 3 章 servlet 基础1. servlet 的生命周期。
a init 方法:首次创建 servlet 时,它的 init 方法会得到调用,因此,init 是放置一次 性设置代码的地方。
i. 可以使用此方法进行常规初始化,用来创建或载入在 Servlet 生命期内用到的 一些数据,或者执行某些一次性的计算。
ii. 由初始化参数控制的初始化。
要理解 init 参数的动机,您需要了解什么样的人可能希望对 Servlet 的行为方 式进行定制。
其中包括:开发人员、最终用户、部署人员。
开发人员通过改变代码改变 Servlet 的行为。
最终用户通过向 HTML 表单提供数据改变 Servlet 的行为。
部署人员为了能够在不修改 Servlet 的源代码的情况下,就可以将 Servlet 在机 器间移动,以及改变特定的参数 (例如,数据库的地址,连接共享大小,或者 数据文件的位置)。
init 参数的目的就是为了提供这项能力。
b service 方法:在 init 之后,针对每个用户请求,都会创建一个线程,该线程调用前 面创建的实例的 service 方法。
service 方法检查 HTTP 请求的类型(GET,POST, PUT,DELETE 等)并相应地调用 doGet,doPost,doPut,doDelete 等方法。
c doGet,doPost 和 doXxx 方法 GET 请求起因于正常的 URL 请求,或没有指定 METHOD 的 HTML 表单。
POST 请求起因于特别将 POST 列为 METHOD 的 HTML 表单。
你可以覆盖 doGet 和/或 doPost 方法来处理。
DELETE 请求由 doDelete 处理,PUT 由 doPut 方法处理,OPTIONS 由 doOptions 处理,TRACE 由 doTrace 方法处理。
OPTIONS 和 TRACE 的请求在 Servlet 中是自动支持的。
doHead 以处理 HEAD 请求 (HEAD 请求规定,服务器应该只返回正常的 HTTP 头,不含与之相关联的文档)。
为了能够更快地生成对 HEAD 请求的响应(例如 来自定制客户的请求,只需要 HTTP 报头,不需构建实际的文档输出),会实现 doHead 方法。
2. SingleThreadModel 接口 a 通过让 Servlet 实现这个接口,系统会保证不会有多个请求线程同时访问该 servlet 的单个实例。
大多数和情况下,系统将所有的请求排队,一次只将一个请求转给 单个 servlet 实例。
b 此接口已经过时,如果要同步最好使用 synchronized 关键字。
第 4 章 客户请求的处理:表单数据1. 表单数据的读取。
a 单个值的读取:getParameter表单项名称,表单项名称大小写敏感。
如果表单项 存在但没有相应的值,返回空的 String;如果没有这样的表单项,则返回 null。
b 多个值的读取:getParameterValues表单项名称,如果同一表单项名称在表单数 据中多次出现,则应该调用 getParameterValues返回字符串的数组。
对于不存在 的表单项名称,getParameterValues 的返回值是 null,如果参数只有单一的值,则 返回只有一个元素的数组。
如果是 HTML 表单的设计者,最好保证每个文本字段、复选框或其他用户界面元 素都有一个唯一的名称。
2. 参数名的查找:getParameterNames 和 getParameterMap getParameterNames 以 Enumeration 的形式返回表单项名称列表,其中的的每一项都可 以转换成 String,并可以用在 getParameter 或 getParameterValues 调用中。
如果当前请求 中没有表单名称返回空的 Enumeration(不是 null)。
Enumeration 只是一个接口,它保证实际的类实现了 hasMoreElements 和 nextElement 方 法:它并不保证具体的实现会采用某种特定的底层数据结构。
getParameterNames 的替代方案是 getParameterMap。
这个方法返回一个 Map:表单名称 (字符串)是表的键,表单项的值是表的值。
3. 读取上载的文件和原始数据:getReader 或 getInputStream 当数据不是 HTML 表单提交,而是来自于定制的客户程序时,可能需要自己读取和分 析这些数据。
最常见的客户程序是 applet。
当数据来自于上载的文件时,可能需要自己读取数据。
servlet 的 API 没有定义任何机 制来读取ltinput type”file”gt元素的文件。
4. 多字符集输入的读取:setCharacterEncoding字符集名称 request.getParameter 使用服务器的当前字符集解释输入。
要改变这种默认行为,需要使 用 ServletRequest 的 setCharacterEncoding 方法。
setCharacterEncoding 必须在访问任何请 求参数之前调用。
我们可以按照某个字符集读取参数,然后将它转换到另外的字符集;或者用某些字符 集提供的自动检测特性。
第一种方案:使用 getByte 提取出原始的字节数据,之后将这些字节连同期望字符集的 名称一同传递给 String 的构造函数。
例: String firstNameWrongEncoding request.getParameter“firstName” String firstName new StringfirstNameWrongEncoding.getBytes “shift_JIS” 第二种方案:需要使用一种支持从默认字符集进行检测和转换的字符集。
例:如果允许输入既可以是英语,也可以是日语,则要使用下面的语句: request.setCharacterEncoding“JISAutoDetect” String firstName request.getParameter“firstName”5. 参数缺失或异常时默认值的应用 如果用户没有提供必需的信息,那么该 servlet 应该怎么处理这种情况 a 使用默认值 b 重新显示这个表单(提示用户缺失的值)。
c 请求中的参数需要检查下面三种情况: i. 参数的值为 null 用户使用了错误的表单或使用了包含 GET 数据的 URL 书签,但在制作 URL 书签之后,参数名发生变化,都会发生返回值为 null 的情况。
ii. 参数的值为空字符串(“”) 用户没有输入指定的值。
为了安全起见,最好调用 trim,移除用户可能输入 的任何空格。
iii. 参数的值为非空字符串,但格式错误 在长度和类型(只要求数值的字段)上输入错误。
在设计 servlet 时,要使之 能够优雅地处理参数缺失(null 或空字符串)或格式不正确等情况。
6. 过滤字符串中的 HTML 特殊字符 a 如果 servlet 希望生成含有诸如lt或gt等字符的 HTML,只需简单地使用标准的 HTML 字符实体——lt或gt。
b 如果您需要读取请求参数,并将它们的值显示在生成的页面中,则必须过滤出那 些特殊的 HTML 字符。
不这样做可能会导致输出中缺失部分,或者某些部分格式 错误。
c Java 字符串虽不可改变的 (即不能修改) ,因此,重复的字符串拼接操作需要复制 许多字符串片段,并在使用后废弃。
建议在循环中执行重复性的拼接操作时,应 该使用可以改变的数据结构:StringBuffer 是通常的选择。
7. 根据请求参数自动填充 Java 对象:表单 bean a 普通的 Java 对象,如果它所属的类使用私有字段,且拥有遵循 get/set 命令约定的 方法,则可以看作是 bean。
方法名(除去单词“get”或”set”,并且首字母小写)称 为属性(property)。
8. 当参数缺失或异常时重新显示输入表单。
a 由同一 servlet 提供表单、处理数据并提供最后的结果。
表单省略 Action 属性,从而,表单提交时会自动发送到表单自身的 URL。
b 由一个 servlet 提供表单:由第二个 servlet 处理数据并提供结果。
从一个 servlet 转到另外的 servlet 可以使用 response.sendredirect 或 RequestDispatcher 的 forward 方法。
将数据从负责处理的 servlet 传递回显示表单的 servlet 时,最简单 的方式是将它存储在 HttpSession 对象中。
c 由一个
JSP 页面“手动地”提供表单:由一个 servlet 或
JSP 页面处理数据并提供结 果。
d 由一个
JSP 页面提供表单,用从数据对象获取的值自动填写表单中相应的字段: 由一个 servlet 或
JSP 页面处理这些数据并提供最终结果。
第 5 章 客户请求的处理:HTTP 请求报头1. 简介:请求报头在
JSP 中的读取及应用与在 servlet 中相同。
请求报头由浏览器间接地 设定,并紧跟在初始的 GET 和 POST 请求行之后发送。
2. 请求报头的读取。
只需用报头的名称为参数,调用 HttpServletRequest 的 getHeader 方法。
如果当前的请求 中提供了指定的报头,则这个调用返回一个 String,否则返回 null。
在 HTTP1.0 中,请 求的所有报头都是可选的:在 HTTP1.1 中,只有 Host 是必需的。
因而,在使用请求报 头之前一定要检查是否为 null。
报头名称对大小写不敏感。
a 访问 HTTP 报头的方法汇总。
getHeader 是读取输入报头的通用方式。
访问其他常用报头的方法有: i. getCookies 方法返回 Cookie 报头的内容。
ii. getAuthType 和 getRemoteUser 返回 Authorization 报头进行拆分,分解成它的各个构成部分。
iii. getContentLength 返回 Content-Length 报送的值(作为一个 int 值返回) iv. getContentType 返回 Content-Type 报头的值(作为一个 String 返回) v. getDateHeader 和 getIntHeader 读取指定的报头,然后分别将它们转换成 Date 和 int 值。
vi. getHeaderNames 可以使用此方法得到一个 Enumeration,枚举当前特定请求中所有的报头名 称。
vii. getHeaders 大多数情况下,每个报头名称在请求中只出现一次。
然而,报头偶尔也有可 能出现多次,每次出现列出各自的值。
可以使用此方法得到一个 Enumeration,枚举报头每次出现所对应的值。
b 获取主请求行自身的信息,同样是使用 HttpServletRequest 提供的方法: i. getMethod 返回主请求方法 (一般是 GET 或 POST,也有可能是 HEAD,PUT 和 DELETE 方法) ii. getRequestURI 返 回 URL 中 主 机 和 端 口 之 后 , 但 在 表 单 数 据 之 前 的 部 分 。
例 : http://randomhost.com/servlet/search.BookSearchsubjectjsp,getRequestURI 返 回“/servlet/search.BookSearch”。
iii. getQueryString 返回表单数据。
http://randomhost.com/servlet/search.BookSearchsubjectjsp, getQueryString 返回“subjectjsp”。
iv. getProtocol 返回请求行的第三部分,一般为 HTTP/1.0 或 HTTP/1.1。
c 了解 HTTP1.1 请求报头 i. Accept:这个报头指明浏览器或其他客户程序能够处理的 MIME 类型。
ii. Accept-Charset:标明浏览器可以使用的字符集(如 ISO-8859-1)。
iii. Accept-Encoding:详细列出客户端能够处理的编码类型。
gzip 或 compress 是 二种最常见的值。
iv. Accept-Language:列出客户程序首选的语言。
v. Authorization:在访问密码保护的 Web 页面时,客户用这个报头来标识自己 的身份。
vi. Connection:标明客户是否能够处理持续性 HTTP 连接。
持续性连接允许客户 或其他浏览器在单个 socket 中读取多个文件(例如 HTML 文件及相关的几幅 图像),从而节省协商几个独立连接所需的开销。
服务器只在读完 HTTP 请求之后,才会调用 servlet。
servlet 的工作只是使服务 器能够使用持续性连接;servlet 通过设置 Content-Length 响应报头来做到这一 点。
vii. Content-Length:这个报头只适用于 POST 请求,用来给定 POST 数据的大 小,以字节为单位。
只需简单地使用 request.getContentlength就可以得到这 个报头的值。
viii. Cookie:这个报头向服务器返回 cookie,这些 cookie 是之前由服务器发送给 浏览器的。
不要直接读取这个报头,而要使用 requet.getCookies。
ix. Host:它标明原始 URL 中给出的主机名和端口号。
x. if-Modified-Since:仅当页面在指定的日期之后发生更改的情况下,客户程序 才希望获取该页面。
xi. If-Unmodified-Since:这个报头和 If-Modified-Since 正好相反;它规定仅当文 档比指定的日期要旧时,操作才需要继续。
一般来说,If-Modified-Since 用在 GET 请求中(“仅当文档比我缓存的版本要新时,才传送该文档”),而 If-Unmodified-Since 用在 PUT 请求中(“仅当我生成这个文档之后,没有其他 人对它做过更改时,才更新这个文档”)。
xii. Referer:标明引用 Web 页面的 URL。
例如,如果您在 Web 页面 1 单击指向 Web 页面 2 的链接,那么,在浏览器请求 Web 页面 2 时,就会将 Web 页面 1 的 URL 引入 Referer 报头。
xiii. User-Agent:标识生成请求的浏览器或其他客户程序,根据这个报头,可以 针对不同类型的浏览器返回不同的内容。
第 6 章 服务器响应的生成:HTTP 状态代码简介:Web 服务器对请求的响应,一般由一个状态行、一些响应报头、一个空行和相应的文档构成。
状态行由 HTTP 版本、一个状态代码 (整数) 、以及一段对应状态代码的简短消息(如 OK)组成。
除 MIME 类型的 Content-Type 报头之外,其他的报头都是可选的。
1. HTTP1.1 中可用的特定状态代码。
共分为 5 类: a 100-199 都是信息性的,标示客户应该采取的其他动作。
b 200-299 表示请求成功。
c 300-399 用于那些已经移走的文件,常常包括 Location 报头,指出新的地址。
d 400-499 表明客户引发的错误。
e 500-599 表示由服务器引发的错误。
2. 状态代码的指定: a 设置任意状态代码:setStatus一个整数建议使用 HttpServletResponse 中定义的常 量。
因为 HTTP 请求由状态行、一个或多个报头、一个空行、以及实际的文档按 照此处开出的次序组成。
所以要在用 PrintWriter 实际返回任何内容之前调用 setStatus。
b 设置 302 和 404 状态代码:sendRedirect 和 sendError 这两个方法都会抛出 IOException 异常,而 setStatus 不会。
状态代码 302 命令浏览器连接到新位置。
sendRedirect 方法生成 302 响应以及 Location 报头,给出新文档的 URL。
状态代码 404 用于服务器没有找到文档的情况。
sendError 方法发送状态代码(一 向为 404)以及一小段简短的消息,这段消息被自动安排到 HTML 文档中发送给 客户。
第 7 章 服务器响应的生成:HTTP 响应报头响应报头可以用来:指定 cookie;提供页面的修改日期(用于客户端缓存),指示浏览器在指定的时间间隔后重新载入页面;给出文件的大小使持续性 HTTP 连接的应用成为可能;指定生成文档的类型以及执行许多其他任务。
1. 设置响应报头。
a setHeaderString headerName String headerValue 这个方法将指定名称的响应报头设为给定的值。
b setDateHeaderString header long milliseconds 这个方法省去将 Java 日期转换成 GMD 时间字符串的麻烦。
c setIntHeaderString header int headerValue 这个方法可以省去在将整数插入到报头之前将 int 转换成 String 的不便。
HTTP 允许相同的报头名多次出现,有时,我们希望加入新的报头,而非替换已 有的同名报头。
方法 setHeader、setDateHeader、setIntHeader 会替换任何同名的已 有报头,而 addHeader,addDateHeader 和 addIntHeader 等方法可以添加一个报头。
d setContentTypeString mimeType 这个方法设置 Content-Type 报头,大多数 servlet 都要用到这个方法。
e setContentLengthint length 这个方法设置 Content-Length 报头,如果浏览器支持持续性(继续使用)HTTP 连 接,这个报送十分有用。
f addCookieCookie c 这个方法向 Set-Cookie 报头插入一个 cookie。
由于响应中一般都会拥有多个 Set-Cookie 行,故而没有对应的 setCookie 方法。
g sendRedirectString address 将状态代码设为 302,同时设置 Location 报头。
第十章
JSP 技术概述1. 关于
JSP。
我们可以将 servlet 看作是含有 HTML 的 Java 代码;可以将
JSP 看作是含有 Java 代码 的 HTML。
a
JSP 页面仅在修改后第一次被访问时,才会被转换成 servlet 并进行编译; b 载入到内存中、初始化和执行遵循 servlet 的一般规则。
由
JSP 页面生成的 servlet 使用_jspService 方法(GET 和 POST 请求都调用该函数),不是 doGet 或 doPost 方法。
同样,对于初始化使用的是 jspInit 方法而非 init 方法。
各种情况下的
JSP 操作 请求次序 将
JSP 页 编译 servlet 将 servlet 载 调用 jspInit 调 用 面转换成 入到服务器 _jspService serlvet 内存中 页面初次创建 请求 1 有 有 有 有 有 请求 2 无 无 无 无 有 服务器重启后 请求 3 无 无 有 有 有 请求 4 无 无 无 无 有 页面修改后 请求 5 有 有 有 有 有 请求 6 无 无 无 无 有 c
JSP 是一种优秀的工具,但它所处理的基本问题是表示(presentation):对于格式 相对固定且含有许多静态文本的页面,
JSP 是一种好的选择。
不太适合于结构不 固定的应用;也不适合于大部分由动态数据组成的应用;对于输出二进制数据, 或操作 HTTP 但并不生成明确输出的应用更是完全不适用。
d servlet 需要您设置 CLASSPATH,使用包来避免命名冲突,将类文件安装在 servlet 专用的位置,同时需要使用专用的 URL,而
JSP 页面则不需要这些。
JSP 页面可以 和常规 HTML 页面、图像和样式表放在相同的目录中;还可以用与 HTML 页面、 图像和样式表形相同的 URL 访问它们。
(注:不允许将 WEB-INF 或 META-INF 用途目录名)2.
JSP 基本语法。
a
JSP 注释:lt-- Blah --gt b
JSP 表达式:lt Java Value gt XML 语法:ltjsp:expressiongt java Expression lt/
jsp:expressiongt c
JSP Scriptlet:lt Java Statement gt XML 语法:ltjsp:scriptletgtJava Codelt/
jsp:scriptletgt d
JSP 声明:在页面转换成 servlet 时,成为类定义的一部分的字段或方法。
lt Field Definition gt lt Method Dfinition gt XML 语法:ltjsp:declarationgtField or Method Dfinitionlt/
jsp:declarationgt e
JSP 指令:servlet 代码的高层结构信息page、页面转换期间引入的代码(include) 或所采用的定制标签库taglib。
lt directive att”val” gt f
JSP 动作:页面被请求时应该采取的动作 ltjsp:blahgt…lt/
jsp:blahgt g
JSP 表达式语言的元素:简写的
JSP 表达式。
EL Expression h 定制标签(定制动作) ltprefix: namegt body lt/prefix: namegt i 需要特殊解释的文本。
使用转义序列的方式即:加“”显示。
第十一章 用
JSP 脚本元素调用 Java 代码1.
JSP 表达式的应用。
a
JSP 表达式 基本上成为由
JSP 页面生成的 servlet 中的 print或 (lt Expression gt) write语句。
这些 print 语句没有放在 doGet 方法中,而是放在了一个新的方法 _jspService 中,无论是 GET 和 POST 请求,service 方法都会调用_jspService 方 法。
b .
上一篇:
【精品】J2EE相关技术
下一篇:
与消费者互动的决策辅助(ICDAS)____电子商务论文