Microsoft PowerPoint - 07-Cookies-Chinese.ppt

Similar documents
Microsoft PowerPoint - 02-Servlet-Basics-Chinese.ppt

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt

Microsoft PowerPoint - 08-Session-Tracking-Chinese.ppt

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ

Microsoft PowerPoint - 03-Form-Data-Chinese.ppt

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

Microsoft PowerPoint - 04-Request-Headers-Chinese.ppt

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

Microsoft PowerPoint - 10-JSP-Scripting-Elements-Chinese.ppt

Microsoft Word - 01.DOC

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

Servlet

untitled

设计模式 Design Patterns

基于CDIO一体化理念的课程教学大纲设计

chp6.ppt

resp.getwriter().print(j + "*" + i + "=" + j * i+" "); resp.getwriter().print("<br/>"); protected void dopost(httpservletrequest req, HttpServletRespo

Guava学习之Resources


Java

Microsoft Word - PHP7Ch01.docx

Microsoft Word - (web)_F.1_Notes_&_Application_Form(Chi)(non-SPCCPS)_16-17.doc

Microsoft PowerPoint - 06-Response-Headers-Chinese.ppt

untitled

Chapter 9: Objects and Classes

(CIP) Web /,. :, ISBN X.W T P393.4 CIP (2004) Web ( ) ( / ) : * 787

AUCWA0501p00A.indd

Microsoft PowerPoint - 11-page-Directive-Chinese.ppt


OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

untitled

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型

JavaIO.PDF

2002 Shintoukai Chinese Academy. All rights reserved 2

EJB-Programming-4-cn.doc

在所有的项目开发中, 一定是多人协作的团队开发, 但是使用框架就会出现一个问题, 我们所 有的 Action 以及相关的路径都要求在我们的 struts.xml 文件中配置, 如果所有的人去修改一个 文件, 那么就会变得混乱, 而且有可能出现冲突, 那么在 struts.xml 文件中为了解决这个问

11页词库答案

RUN_PC連載_10_.doc

3. 企 业 债 券 : 公 司 债 券 : 5. 证 券 公 司 债 券 : 6. 企 业 短 期 融 资 券 : 7. 中 期 票 据 : 8. 资 产 支 持 证 券 : 9. 国 际 开 发 机 构 人 民 币 债 券 : 10. 中 小 非 金 融 企 业 集 合 票 据 例 题? 判 断

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

untitled

untitled

幻灯片 1



China Academic Journal Electronic Publishing House. All rights reserved.

China Academic Journal Electronic Publishing House. All rights reserved.


優質居所 攜手共建

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

jsp

Chn 116 Neh.d.01.nis

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

:5-6

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

Chapter 9: Objects and Classes

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

第十一届“21世纪杯”全国中小学生英语演讲比赛

Chinese Trauma Simplified - iPad pdf

KillTest 质量更高 服务更好 学习资料 半年免费更新服务


WebSphere Studio Application Developer IBM Portal Toolkit... 2/21 1. WebSphere Portal Portal WebSphere Application Server stopserver.bat -configfile..

< F A4A4B0EAA448C576B3F8A7695FA5C1A544B0F2AAF7B77C2E696E6464>

1

XXXXXXXX

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

<4D F736F F D20B1B4BFCBA5D3BFECBBA1A9FA312E646F63>

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

RUN_PC連載_8_.doc

spc

Process Data flow Data store External entity 6-10 Context diagram Level 0 diagram Level 1 diagram Level 2 diagram

China Academic Journal Electronic Publishing House. All rights reserved.

Microsoft Word - ISPI_CATALOG_BOOKLETS_ _Final.doc

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

Simulation_Non_finance_2013.indd

Microsoft PowerPoint - 09-JSP-Intro-Chinese.ppt

概述

使用MapReduce读取XML文件

關於本書 Part 3 CSS XHTML Ajax Part 4 HTML 5 API JavaScript HTML 5 API Canvas API ( ) Video/Audio API ( ) Drag and Drop API ( ) Geolocation API ( ) Part 5

untitled


untitled

背 景 资 料 对 于 在 华 经 营 的 企 业 里, 人 力 资 源 管 理 绝 不 是 一 件 轻 松 的 工 作 HR 从 业 者 除 了 要 具 备 猎 人 的 眼 光 心 理 学 家 的 耐 心 谈 判 专 家 的 口 才, 更 为 重 要 的 是, 还 需 要 具 备 专 业 的 法

2 Java 语 言 程 序 设 计 教 程 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

Microsoft Word - Functional_Notes_3.90_CN.doc


无类继承.key

¬¬

1 目 的 为 维 护 国 内 政 企 市 场 良 好 的 市 场 秩 序, 加 强 对 窜 货 等 重 大 违 规 行 为 的 管 理, 特 在 2016 年 中 兴 通 讯 国 内 政 企 市 场 窜 货 管 理 办 法 基 础 上 制 定 本 管 理 办 法 本 管 理 办 法 适 用 于 中

chapter 2 HTML5 目錄iii HTML HTML HTML HTML HTML canvas

约 伯 记 : 约 伯 记 : 惟 有 我 一 人 逃 脱, 来 报 信 给 你 他 还 说 话 的 时 候, 又 有 人 来 说 : 你 的 儿 女 正 在 他 们 长 兄 的 家 里 吃 饭 喝 酒, 不 料, 有 狂 风 从 旷 野 刮 来, 击 打 房 屋 的 四 角, 房 屋 倒 塌 在

加 拉 太 书 :8 2 加 拉 太 书 2:4 8 过 了 三 年, 才 上 耶 路 撒 冷 去 见 矶 法, 和 他 同 住 了 十 五 天 9 至 于 别 的 使 徒, 除 了 主 的 兄 弟 雅 各, 我 都 没 有 看 见 20 我 写 给 你 们 的 不 是 谎 话, 这 是 我 在 神

Background 2006 年 2 月 我 国 新 企 业 会 计 准 则 的 颁 布, 标 志 着 与 国 际 惯 例 趋 同 的 中 国 新 会 计 准 则 体 系 的 建 立, 自 2007 年 1 月 1 日 起 首 先 在 境 内 上 市 的 公 司 施 行, 自 2008 年 1 月

设计模式 Design Patterns

第一章





Transcription:

2004 Marty Hall cookie 管理 JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 2 JSP and Servlet Books from Sun Press: http://www.coreservlets.com Available in English, Chinese (simplified and traditional script), and 12 other languages 议程 cookie 的优点和缺点 输出 cookie 的发送 输入 cookie 的接收 跟踪重复用户 cookie 属性的指定 会话 cookie 和持续性 cookie 之间的差异 用实用工具类简化 cookie 的使用 cookie 值的修改 用户偏好的记录 3 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

cookie 的潜能 思想 servlet 发送简单的名称和值到客户程序 客户程序在访问同一站点 ( 或同一域, 依 cookie 设置的不同而定 ) 时将名称和值原样返回 cookie 的典型应用 在电子商务会话中标识用户 针对这项任务 servlet 拥有专门的高层 API 避免存储用户名和密码 对站点进行定制 定向广告 4 JSP/servlet/Struts/JSF training: http://www.coreservlets.com cookie 和定向广告 5 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

cookie 和隐私 FoxTrot 1998 Bill Amend. Reprinted with permission of Universal Press Syndicate. All rights reserved. 6 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 与 cookie 相关的一些问题 问题在于隐私, 不是安全 服务器能够记住您之前的动作 如果您给出自己的个人信息, 服务器能够将这些信息与您之前的动作关联起来 多个服务器能够通过提供协作服务的第三方, 如 doubleclick.net, 共享 cookie 信息 设计欠考虑的网站直接将敏感的信息, 如信用卡号码, 存储在 cookie 中 JavaScript 的 bug 能够使敌对网站窃取 cookie ( 老浏览器 ) servlet 作者应该遵守下面这些法则 如果 cookie 对于您的任务并非至关重要, 则要避免在 cookie 被禁用时 servlet 完全不能工作 不要将敏感的信息存储在 cookie 中 7 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

手动删除 cookie ( 为使测试工作简化 ) 8 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 向客户程序发送 cookie 创建 Cookie 对象 调用 Cookie 的构造函数, 给出 cookie 的名称和 cookie 的值, 二者都是字符串 Cookie c = new Cookie("userID", "a1234"); 设置最大时效 如果要告诉浏览器将 cookie 存储到磁盘上, 而非仅仅保存在内存中, 使用 setmaxage ( 参数为秒数 ) c.setmaxage(60*60*24*7); // One week 将 Cookie 放入到 HTTP 响应中 使用 response.addcookie 如果忘记这一步, 那么不会有任何 cookie 被发送到浏览器! response.addcookie(c); 9 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

从客户端读取 cookie 调用 request.getcookies 这会得到 Cookie 对象组成的数组 在这个数组中循环, 调用每个对象的 getname, 直到找到想要的 cookie 为止 根据应用程序的具体情况使用这个值 (getvalue) String cookiename = "userid"; Cookie[] cookies = request.getcookies(); if (cookies!= null) { for(int i=0; i<cookies.length; i++) { Cookie cookie = cookies[i]; if (cookiename.equals(cookie.getname())) { dosomethingwith(cookie.getvalue()); 10 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 使用 cookie 检测初访者 public class RepeatVisitor extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { boolean newbie = true; Cookie[] cookies = request.getcookies(); if (cookies!= null) { for(int i=0; i<cookies.length; i++) { Cookie c = cookies[i]; if ((c.getname().equals("repeatvisitor"))&& (c.getvalue().equals("yes"))) { newbie = false; break; 11 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

使用 cookie 检测初访者 ( 续 ) String title; if (newbie) { Cookie returnvisitorcookie = new Cookie("repeatVisitor", "yes"); returnvisitorcookie.setmaxage(60*60*24*365); response.addcookie(returnvisitorcookie); title = "Welcome Aboard"; else { title = "Welcome Back"; response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); // (Output page with above title) 12 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 使用 cookie 检测初访者 ( 结果 ) 13 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

使用 cookie 的属性 getdomain/setdomain 允许我们指定 cookie 适用的域 当前的主机必须是所指定的域的一部分 getmaxage/setmaxage 读取 / 设置 cookie 的到期时间 ( 秒 ) 如果没有设置, 则 cookie 只适用于当前的浏览会话 参见前面给出的 LongLivedCookie 辅助类 getname 读取 cookie 的名称 不存在 setname 方法 ; 因为我们在构造函数中提供了名称 对于输入 cookie 构成的数组来说, 我们使用 getname 来找到感兴趣的 cookie 14 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 使用 cookie 的属性 getpath/setpath 读取 / 设置 cookie 适用的路径 如果未指定, 则 cookie 适用于含有当前页面的目录中的 URL, 以及该目录之下的 URL getsecure/setsecure 读取 / 设置标志, 标示 cookie 是否只应适用于 SSL 连接, 或者适用于所有连接 getvalue/setvalue 读取 / 设置与 cookie 关联的值 对于新的 cookie, 我们将值提供给构造函数, 而非 setvalue 对于输入 cookie 组成的数组, 我们使用 getname 找到感兴趣的 cookie, 然后调用所获得对象的 getvalue 方法 如果设置了某个输入 cookie 的值, 我们依旧需要用 response.addcookie 将它发送回去 15 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

区分会话 cookie 和持续性 cookie public class CookieTest extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { for(int i=0; i<3; i++) { Cookie cookie = new Cookie("Session-Cookie-" + i, "Cookie-Value-S" + i); // No maxage (ie maxage = -1) response.addcookie(cookie); cookie = new Cookie("Persistent-Cookie-" + i, "Cookie-Value-P" + i); cookie.setmaxage(3600); response.addcookie(cookie); 16 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 区分会话 cookie 和持续性 cookie(cont) // Start an HTML table Cookie[] cookies = request.getcookies(); if (cookies == null) { out.println("<tr><th COLSPAN=2>No cookies"); else { Cookie cookie; for(int i=0; i<cookies.length; i++) { cookie = cookies[i]; out.println ("<TR>\n" + " <TD>" + cookie.getname() + "\n" + " <TD>" + cookie.getvalue()); 17 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

区分会话 cookie 和持续性 cookie 首次访问 CookieTest servlet 的结果 访问该 servlet, 退出浏览器, 等待一小时, 然后再次访问这个 servlet 得到相同的结果 18 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 区分会话 cookie 和持续性 cookie 首次访问后一小时之内再次访问 CookieTest 的结果 ( 使用同一浏览器会话 ) 也就是说, 初次访问和此处访问之间浏览器保持打开 19 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

区分会话 cookie 和持续性 cookie 首次访问后一小时之内再次访问 CookieTest 的结果 ( 使用不同的浏览器会话 ) 也就是说, 浏览器在初次访问和此次访问之间重新启动过 20 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 实用程序 : 查找指定名称的 cookie public class CookieUtilities { public static String getcookievalue (HttpServletRequest request, String cookiename, String defaultvalue) { Cookie[] cookies = request.getcookies(); if (cookies!= null) { for(int i=0; i<cookies.length; i++) { Cookie cookie = cookies[i]; if (cookiename.equals(cookie.getname())) { return(cookie.getvalue()); return(defaultvalue); 21 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

实用程序 : 创建长生存期的 cookie public class LongLivedCookie extends Cookie { public static final int SECONDS_PER_YEAR = 60*60*24*365; public LongLivedCookie(String name, String value) { super(name, value); setmaxage(seconds_per_year); 22 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 实用程序的使用 : RepeatVisitor2 public class RepeatVisitor2 extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { boolean newbie = true; String value = CookieUtilities.getCookieValue(request, "repeatvisitor2", "no"); if (value.equals("yes")) { newbie = false; String title; if (newbie) { LongLivedCookie returnvisitorcookie = new LongLivedCookie("repeatVisitor2", "yes"); response.addcookie(returnvisitorcookie); title = "Welcome Aboard"; else { title = "Welcome Back"; 23 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

修改 cookie 的值 替换 cookie 的值 使用不同的值发送相同的 cookie 名称 重用输入的 cookie 对象 需要调用 response.addcookie; 只是调用 setvalue 是没用的 不需要通过调用 setmaxage,setpath 等重新设置所有相关的 cookie 属性 输入的 cookie 中并不含有 cookier 的属性 一般不值得这样做, 因而常使用新的 Cookie 对象 指示浏览器删除某个 cookie 使用 setmaxage 将最大时效指定为 0 24 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 记录用户的访问计数 public class ClientAccessCounts extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { String countstring = CookieUtilities.getCookieValue(request, "accesscount", "1"); int count = 1; try { count = Integer.parseInt(countString); catch(numberformatexception nfe) { LongLivedCookie c = new LongLivedCookie("accessCount", String.valueOf(count+1)); response.addcookie(c); 25 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

记录用户的访问计数 ( 续 ) out.println(doctype + "<HTML>\n" + "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<CENTER>\n" + "<H1>" + title + "</H1>\n" + "<H2>This is visit number " + count + " by this browser.</h2>\n"+ "</CENTER></BODY></HTML>"); 26 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 记录用户的访问计数 ( 结果 ) 27 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

使用 cookie 记录用户的偏好 RegistrationForm servlet 使用 cookie 的值预先填写表单的字段 如果未找到相应的 cookie 则使用默认值 课程的后面将会在 JSP 中重做这项工作 Registration servlet 基于接收到的请求参数创建 cookie 如果得到所有的参数则显示这些值 如果任何参数缺失, 则重定向到表单 28 JSP/servlet/Struts/JSF training: http://www.coreservlets.com RegistrationForm Servlet public class RegistrationForm extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); String actionurl = "/servlet/coreservlets.registrationservlet"; String firstname = CookieUtilities.getCookieValue(request, "firstname", ""); String lastname = CookieUtilities.getCookieValue(request, "lastname", ""); String emailaddress = CookieUtilities.getCookieValue(request, "emailaddress", ""); 29 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

RegistrationForm Servlet ( 续 ) out.println (doctype + "<HTML>\n" + "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<CENTER>\n" + "<H1>" + title + "</H1>\n" + "<FORM ACTION=\"" + actionurl + "\">\n" + "First Name:\n" + " <INPUT TYPE=\"TEXT\" NAME=\"firstName\" " + "VALUE=\"" + firstname + "\"><BR>\n" + "Last Name:\n" + " <INPUT TYPE=\"TEXT\" NAME=\"lastName\" " + "VALUE=\"" + lastname + "\"><BR>\n"+ "Email Address: \n" + " <INPUT TYPE=\"TEXT\" NAME=\"emailAddress\" " + "VALUE=\"" + emailaddress + "\"><P>\n" + "<INPUT TYPE=\"SUBMIT\" VALUE=\"Register\">\n" + "</FORM></CENTER></BODY></HTML>"); 30 JSP/servlet/Struts/JSF training: http://www.coreservlets.com Registration Servlet public class RegistrationServlet extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html"); boolean ismissingvalue = false; String firstname = request.getparameter("firstname"); if (ismissing(firstname)) { firstname = "Missing first name"; ismissingvalue = true; String lastname = request.getparameter("lastname"); if (ismissing(lastname)) { lastname = "Missing last name"; ismissingvalue = true; 31 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

Registration Servlet( 续 ) Cookie c1 = new LongLivedCookie("firstName", firstname); response.addcookie(c1); Cookie c2 = new LongLivedCookie("lastName", lastname); response.addcookie(c2); Cookie c3 = new LongLivedCookie("emailAddress", emailaddress); response.addcookie(c3); String formaddress = "/servlet/coreservlets.registrationform"; if (ismissingvalue) { response.sendredirect(formaddress); else { 32 JSP/servlet/Struts/JSF training: http://www.coreservlets.com RegistrationForm( 最初结果 ) 33 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

RegistrationForm( 提交不完整的表单 ) 34 JSP/servlet/Struts/JSF training: http://www.coreservlets.com RegistrationForm( 提交完整的表单 ) 35 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

RegistrationForm( 稍后访问得到的初始结果 ) 36 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 小结 cookie 涉及将名称 / 值对从服务器发送到浏览器, 并在之后访问相同的页面 站点或域时返回 我们可以 跟踪会话 ( 使用高层 API) 对安全性要求较低的网站, 使用 cookie 可以避免用户每次都需要登录 根据用户的不同定制网站 有选择地投放内容或广告 设置 cookie 调用 Cookie 的构造函数, 设置时效, 调用 response.addcookie 读取 cookie 调用 request.getcookie, 检查得到的结果是否为 null, 在数组中查找匹配的名称, 使用相关的值 37 JSP/servlet/Struts/JSF training: http://www.coreservlets.com

2004 Marty Hall 问题? JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 38 JSP and Servlet Books from Sun Press: http://www.coreservlets.com Available in English, Chinese (simplified and traditional script), and 12 other languages