2004 Marty Hall 用 JSP 脚 本 元 素 调 用 Java 代 码 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 议 程 静 态 和 动 态 文 本 动 态 代 码 和 好 的 JSP 设 计 JSP 表 达 式 servlet 和 JSP 页 面 对 类 似 任 务 的 处 理 JSP scriptlet JSP 声 明 预 定 义 变 量 表 达 式 scriptlet 和 声 明 之 间 的 对 比 3 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
不 同 JSP 构 造 的 应 用 简 单 应 用 复 杂 应 用 脚 本 元 素 直 接 调 用 servlet 代 码 脚 本 元 素 间 接 调 用 servlet 代 码 ( 通 过 实 用 工 具 类 ) bean servlet/jsp 的 组 合 (MVC) MVC 连 同 JSP 表 达 式 语 言 定 制 标 签 4 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 设 计 策 略 : 限 制 JSP 页 面 内 的 Java 代 码 有 两 种 选 择 : 将 25 行 Java 代 码 直 接 放 在 JSP 页 面 中 将 这 25 行 代 码 放 在 单 独 的 Java 类 中, 在 JSP 页 面 中 用 一 行 代 码 调 用 它 为 什 么 第 二 种 选 择 更 好? 开 发 我 们 可 以 在 Java 开 发 环 境 ( 编 辑 器 或 IDE) 中 编 写 单 独 的 类, 而 非 在 HTML 环 境 中 调 试 如 果 代 码 中 含 有 语 法 错 误, 在 编 译 时 就 能 够 直 接 看 到 简 单 的 打 印 语 句 可 以 直 接 看 到 结 果 测 试 我 们 可 以 编 写 测 试 过 程, 每 次 更 改 后 都 通 过 循 环 进 行 上 万 次 的 测 试 重 用 多 个 页 面 都 可 以 使 用 同 一 个 类 5 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
基 本 语 法 HTML 文 本 <H1>Blah</H1> 不 加 更 改 地 传 递 给 客 户 实 际 上 是 由 类 似 于 下 面 的 servlet 代 码 生 成 : out.print("<h1>blah</h1>"); HTML 注 释 <! 注 释 内 容 --> 和 其 他 HTMl 一 样 : 直 接 传 递 给 客 户 JSP 注 释 <%-- 注 释 内 容 --%> 并 不 发 送 给 客 户 要 输 出 <%, 使 用 <\% 6 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 脚 本 元 素 的 类 型 表 达 式 格 式 :<%= expression %> 求 值 并 插 入 到 servlet 的 输 出 中 也 就 是 会 产 生 类 似 于 out.print(expression) 的 语 句 scriptlet 格 式 :<% code %> 逐 字 地 插 入 到 servlet 的 _jspservice 方 法 中 ( 由 service 调 用 ) 声 明 格 式 :<%! code %> 逐 字 地 插 入 到 servlet 类 的 定 义 体 中, 不 在 任 何 方 法 之 内 7 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
JSP 表 达 式 格 式 <%= Java Expression %> 结 果 表 达 式 被 求 值, 转 换 成 字 符 串, 将 按 照 它 在 JSP 页 面 中 出 现 的 位 置 插 入 到 HTML 页 面 中 即, 表 达 式 在 out.print 内 放 置 在 That is, expression placed in _jspservice inside out.print 示 例 当 前 时 间 :<%= new java.util.date() %> 您 的 主 机 名 :<%= request.getremotehost() %> XML 兼 容 的 语 法 <jsp:expression>java Expression</jsp:expression> 在 单 个 页 面 中 不 能 混 合 使 用 不 同 的 版 本 如 果 使 用 jsp:expression 就 必 须 整 个 页 面 都 使 用 XML 8 JSP/servlet/Struts/JSF training: http://www.coreservlets.com JSP/servlet 的 对 应 原 始 的 JSP <H1>A Random Number</H1> <%= Math.random() %> 所 产 生 的 具 有 代 表 性 的 servlet 代 码 public void _jspservice(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html"); HttpSession session = request.getsession(true); JspWriter out = response.getwriter(); out.println("<h1>a Random Number</H1>"); out.println(math.random());... 9 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
JSP 表 达 式 : 示 例 <BODY> <H2>JSP Expressions</H2> <UL> <LI>Current time: <%= new java.util.date() %> <LI>Server: <%= application.getserverinfo() %> <LI>Session ID: <%= session.getid() %> <LI>The <CODE>testParam</CODE> form parameter: <%= request.getparameter("testparam") %> </UL> </BODY></HTML> 10 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 预 定 义 变 量 request HttpServletRequest(service/doGet 的 第 一 个 参 数 ) response HttpServletResponse(service/doGet 的 第 二 个 参 数 ) out 用 来 将 输 出 发 送 到 客 户 程 序 的 Writer(JspWriter 带 缓 冲 的 版 本 ) session 与 请 求 关 联 的 HttpSession( 除 非 用 page 指 令 的 session 属 性 将 之 禁 止 ) application ServletContext( 用 于 数 据 共 享 ), 可 通 过 getservletcontext() 获 取 11 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
servlet 和 JSP 的 比 较 : 读 取 三 个 参 数 (Servlet) public class ThreeParams extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { out.println(doctype + "<HTML>\n" + "<HEAD><TITLE>"+title + "</TITLE></HEAD>\n" + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" + "<UL>\n" + " <LI><B>param1</B>: " + request.getparameter("param1") + "\n" + " <LI><B>param2</B>: " + request.getparameter("param2") + "\n" + " <LI><B>param3</B>: " + request.getparameter("param3") + "\n" + "</UL>\n" + "</BODY></HTML>"); 12 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 读 取 三 个 参 数 (Servlet): 结 果 13 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
servlet 和 JSP 的 比 较 : 读 取 三 个 参 数 (JSP) <!DOCTYPE > <HTML> <HEAD> <TITLE>Reading Three Request Parameters</TITLE> <LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"> </HEAD> <BODY> <H1>Reading Three Request Parameters</H1> <UL> <LI><B>param1</B>: <%= request.getparameter("param1") %> <LI><B>param2</B>: <%= request.getparameter("param2") %> <LI><B>param3</B>: <%= request.getparameter("param3") %> </UL> </BODY></HTML> 14 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 读 取 三 个 参 数 (JSP): 结 果 15 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
JSP scriptlet 格 式 <% Java Code %> 结 果 代 码 被 逐 字 地 插 入 到 servlet 的 _jspservice 方 法 中 示 例 <% String querydata = request.getquerystring(); out.println("attached GET data: " + querydata); %> <% response.setcontenttype("text/plain"); %> XML 兼 容 的 语 法 <jsp:scriptlet>java Code</jsp:scriptlet> 16 JSP/servlet/Struts/JSF training: http://www.coreservlets.com JSP/servlet 之 间 的 对 应 关 系 原 始 的 JSP <H2>foo</H2> <%= bar() %> <% baz(); %> 所 产 生 的 具 有 代 表 性 的 servlet 代 码 public void _jspservice(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html"); HttpSession session = request.getsession(); JspWriter out = response.getwriter(); out.println("<h2>foo</h2>"); out.println(bar()); baz();... 17 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
JSP scriptlet: 示 例 假 定 您 希 望 能 够 让 最 终 用 户 定 制 页 面 的 背 景 色 下 面 的 代 码 有 什 么 问 题? <BODY BGCOLOR= "<%= request.getparameter("bgcolor") %>"> 18 JSP/servlet/Struts/JSF training: http://www.coreservlets.com JSP scriptlet: 示 例 <!DOCTYPE > <HTML> <HEAD> <TITLE>Color Testing</TITLE> </HEAD> <% String bgcolor = request.getparameter("bgcolor"); if ((bgcolor == null) (bgcolor.trim().equals(""))) { bgcolor = "WHITE"; %> <BODY BGCOLOR="<%= bgcolor %>"> <H2 ALIGN="CENTER">Testing a Background of "<%= bgcolor %>"</H2> </BODY></HTML> 19 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
JSP scriptlet: 结 果 20 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 使 用 scriptlet 将 JSP 文 件 的 某 些 部 分 条 件 化 要 点 scriplet 会 被 严 格 按 照 所 写 的 样 子 插 入 到 servlet 中 不 需 要 是 完 整 的 Java 表 达 式 但 完 整 的 表 达 式 常 常 更 清 楚 且 易 于 维 护 示 例 <% if (Math.random() < 0.5) { %> Have a <B>nice</B> day! <% else { %> Have a <B>lousy</B> day! <% %> 具 有 代 表 性 的 结 果 if (Math.random() < 0.5) { out.println("have a <B>nice</B> day!"); else { out.println("have a <B>lousy</B> day!"); 21 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
JSP 声 明 格 式 <%! Java Code %> 结 果 代 码 被 逐 字 地 插 入 到 servlet 类 的 定 义 中, 在 任 何 现 有 方 法 以 外 示 例 <%! private int somefield = 5; %> <%! private void somemethod(...) {... %> 设 计 上 的 考 虑 字 段 当 然 有 用, 但 对 于 方 法 而 言, 通 常 在 单 独 的 Java 类 中 定 义 更 好 一 些 XML 兼 容 的 语 法 <jsp:declaration>java Code</jsp:declaration> 22 JSP/servlet/Struts/JSF training: http://www.coreservlets.com JSP/servlet 之 间 的 对 应 关 系 原 始 的 JSP <H1>Some Heading</H1> <%! private String randomheading() { return("<h2>" + Math.random() + "</H2>"); %> <%= randomheading() %> ( 也 可 以 使 randomheading 成 为 单 独 Java 类 的 静 态 方 法 ) 23 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
JSP/servlet 之 间 的 对 应 关 系 生 成 的 servlet 代 码 public class xxxx implements HttpJspPage { private String randomheading() { return("<h2>" + Math.random() + "</H2>"); public void _jspservice(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html"); HttpSession session = request.getsession(true); JspWriter out = response.getwriter(); out.println("<h1>some Heading</H1>"); out.println(randomheading());...... 24 JSP/servlet/Struts/JSF training: http://www.coreservlets.com JSP 声 明 : 示 例 <!DOCTYPE > <HTML> <HEAD> <TITLE>JSP Declarations</TITLE> <LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"> </HEAD> <BODY> <H1>JSP Declarations</H1> <%! private int accesscount = 0; %> <H2>Accesses to page since server reboot: <%= ++accesscount %></H2> </BODY></HTML> 25 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
JSP 声 明 : 结 果 26 JSP/servlet/Struts/JSF training: http://www.coreservlets.com JSP 声 明 :jspinit 和 jspdestroy JSP 页 面, 如 同 常 规 servlet, 有 时 需 要 用 到 init 和 destroy 问 题 在 于 : 根 据 JSP 页 面 构 建 的 servlet 有 可 能 已 经 使 用 了 init 和 destroy 覆 盖 它 们 会 引 发 问 题 因 此, 使 用 JSP 声 明 来 声 明 init 或 destroy 是 不 合 法 的 解 决 方 案 : 使 用 jspinit 和 jspdestroy 根 据 JSP 页 面 生 成 的 servlet 一 定 会 init 和 destroy 中 调 用 这 些 方 法, 而 标 准 版 的 jspinit 和 jspdestroy 是 空 的 ( 仅 为 占 位 符, 由 用 户 覆 盖 27 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
JSP 声 明 和 预 定 义 变 量 问 题 预 定 义 变 量 (request, response, out, session, 等 ) 是 _jspservice 方 法 中 的 局 部 变 量 因 而, 由 JSP 声 明 定 义 的 方 法 或 辅 助 类 中 的 方 法 都 不 能 使 用 它 们 怎 么 处 理 这 种 情 况 呢? 解 决 方 案 : 将 它 们 作 为 参 数 传 递, 例 如 <%! private void somemethod(httpsession s) { dosomethingwith(s); %> <% somemethod(session); %> 要 注 意 :JspWriter 的 println 方 法 抛 出 IOException 异 常 使 用 println 的 方 法 要 使 用 throws IOException 28 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 表 达 式 scriptlet 和 声 明 的 对 比 任 务 1 输 出 由 从 1 到 10 之 间 的 5 个 随 机 整 数 构 成 的 项 目 列 表 由 于 本 页 的 结 构 固 定, 并 且 对 于 randomint 方 法, 我 们 使 用 单 独 的 辅 助 类,JSP 表 达 式 完 全 能 够 胜 任 任 务 2 生 成 1 到 10 数 据 项 构 成 的 列 表 ( 随 机 选 定 ), 每 一 项 为 1 到 10 之 间 的 整 数 由 于 列 表 中 的 数 据 项 是 动 态 的, 所 以 需 要 JSP scriptlet 任 务 3 在 首 次 请 求 时 生 成 一 个 随 机 数, 然 后 向 所 有 的 用 户 展 示 这 个 随 机 数, 直 到 服 务 器 重 新 启 动 实 例 变 量 ( 字 段 ) 是 完 成 这 种 持 续 性 的 自 然 方 式 使 用 JSP 声 明 来 完 成 这 项 任 务 29 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
辅 助 类 :RanUtilities package coreservlets; // Always use packages!! /** Simple utility to generate random integers. */ public class RanUtilities { /** A random int from 1 to range (inclusive). */ public static int randomint(int range) { return(1 + ((int)(math.random() * range))); public static void main(string[] args) { int range = 10; try { range = Integer.parseInt(args[0]); catch(exception e) { // Array index or number format // Do nothing: range already has default value. for(int i=0; i<100; i++) { System.out.println(randomInt(range)); 30 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 任 务 1:JSP 表 达 式 ( 代 码 ) <!DOCTYPE > <HTML> <HEAD> <TITLE>Random Numbers</TITLE> <LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"> </HEAD> <BODY> <H1>Random Numbers</H1> <UL> <LI><%= coreservlets.ranutilities.randomint(10) %> <LI><%= coreservlets.ranutilities.randomint(10) %> <LI><%= coreservlets.ranutilities.randomint(10) %> <LI><%= coreservlets.ranutilities.randomint(10) %> <LI><%= coreservlets.ranutilities.randomint(10) %> </UL> </BODY></HTML> 31 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
任 务 1:JSP 表 达 式 ( 结 果 ) 32 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 任 务 2:JSP scriptlet ( 代 码 : 版 本 1) <!DOCTYPE > <HTML> <HEAD> <TITLE>Random List (Version 1)</TITLE> <LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"> </HEAD> <BODY> <H1>Random List (Version 1)</H1> <UL> <% int numentries = coreservlets.ranutilities.randomint(10); for(int i=0; i<numentries; i++) { out.println("<li>" + coreservlets.ranutilities.randomint(10)); %> </UL> </BODY></HTML> 33 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
任 务 2:JSP scriptlet ( 结 果 : 版 本 1) 34 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 任 务 2:JSP scriptlet ( 代 码 : 版 本 2) <!DOCTYPE > <HTML> <HEAD> <TITLE>Random List (Version 2)</TITLE> <LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"> </HEAD> <BODY> <H1>Random List (Version 2)</H1> <UL> <% int numentries = coreservlets.ranutilities.randomint(10); for(int i=0; i<numentries; i++) { %> <LI><%= coreservlets.ranutilities.randomint(10) %> <% %> </UL> </BODY></HTML> 35 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
任 务 2:JSP scriptlet ( 结 果 : 版 本 2) 36 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 任 务 3:JSP 声 明 ( 代 码 ) <!DOCTYPE > <HTML> <HEAD> <TITLE>Semi-Random Number</TITLE> <LINK REL=STYLESHEET HREF="JSP-Styles.css" TYPE="text/css"> </HEAD> <BODY> <%! private int randomnum = coreservlets.ranutilities.randomint(10); %> <H1>Semi-Random Number:<BR><%= randomnum %></H1> </BODY> </HTML> 37 JSP/servlet/Struts/JSF training: http://www.coreservlets.com
任 务 3:JSP 声 明 ( 结 果 ) 38 JSP/servlet/Struts/JSF training: http://www.coreservlets.com 小 结 JSP 表 达 式 格 式 :<%= expression %> 封 装 到 out.print 中, 并 插 入 到 _jspservice JSP scriptlet 格 式 :<% code %> 逐 字 地 插 入 到 servlet 的 _jspservice 方 法 中 JSP 声 明 格 式 :<%! code %> 逐 字 地 插 入 到 servlet 类 的 定 义 体 中 预 定 义 变 量 request, response, out, session, application 限 制 直 接 放 在 页 面 中 的 Java 代 码 考 虑 使 用 辅 助 类 bean servlet/jsp 的 组 合 (MVC) JSP 表 达 式 语 言 定 制 标 签 39 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 40 JSP and Servlet Books from Sun Press: http://www.coreservlets.com Available in English, Chinese (simplified and traditional script), and 12 other languages