JSP 最佳实战系列
本系列文章并不打算完整地介绍 JSP 技术
![](/icons/71849dou.gif)
也不打算作为如何构建特殊类型应用
![](/icons/71849chengxu.gif)
![](/icons/71849de.gif)
指南
![](/icons/71849dou2.gif)
相反
![](/icons/71849dou.gif)
系列文章中
![](/icons/71849de.gif)
每个部分都集中讨论用 JSP 技术编程
![](/icons/71849de.gif)
某
![](/icons/71849yi.gif)
个方面
![](/icons/71849dou.gif)
将它分成很小
![](/icons/71849de.gif)
片段
![](/icons/71849dou2.gif)
有关 JSP 技术
![](/icons/71849de.gif)
更广泛介绍或者对如何将它用于特殊结果
![](/icons/71849de.gif)
更深入研究
![](/icons/71849dou.gif)
请参阅参考资料部分
![](/icons/71849dou2.gif)
您将需要什么
本系列文章中
![](/icons/71849de.gif)
所有最佳实战都基于 JavaServer Pages 技术
![](/icons/71849dou2.gif)
要运行任何
![](/icons/71849yi.gif)
种实战
![](/icons/71849dou.gif)
需要在本地机器或测试服务器上设置符合 JSP
![](/icons/71849de.gif)
Web 容器
![](/icons/71849dou.gif)
如 Apache Tomcat
![](/icons/71849dou2.gif)
您还需要使用文本编辑器或 IDE 编写 JSP 页面代码
![](/icons/71849dou2.gif)
请参阅参考资料
![](/icons/71849dou.gif)
获取 Tomcat 和和 JSP 兼容
![](/icons/71849de.gif)
Web 容器和 IDE
![](/icons/71849de.gif)
清单
![](/icons/71849de.gif)
链接
![](/icons/71849dou2.gif)
更好
![](/icons/71849de.gif)
外观
为 Web 页面创建
![](/icons/71849yi.gif)
致
![](/icons/71849de.gif)
设计和布局是确保获得专业化外观
![](/icons/71849de.gif)
最容易思路方法的
![](/icons/71849yi.gif)
![](/icons/71849dou2.gif)
您或许看过足够多
![](/icons/71849de.gif)
网站WebSite
![](/icons/71849dou.gif)
知道单个站点中
![](/icons/71849de.gif)
大部分页面都共用统
![](/icons/71849yi.gif)
![](/icons/71849de.gif)
页面头、页面尾以及某种类型
![](/icons/71849de.gif)
导航栏
![](/icons/71849dou2.gif)
在设计良好
![](/icons/71849de.gif)
站点上
![](/icons/71849dou.gif)
这些元素将在每个页面上呈现相同
![](/icons/71849de.gif)
布局、内容和功能
![](/icons/71849dou.gif)
而主面板(通常称为内容窗格)会随着每个视图而变化
![](/icons/71849dou2.gif)
以前
![](/icons/71849dou.gif)
这种布局几乎完全由框架和框架集实现
![](/icons/71849dou2.gif)
每段静态内容被放置在
![](/icons/71849yi.gif)
个框架中
![](/icons/71849dou.gif)
而页面
![](/icons/71849de.gif)
主体内容被放置在中间框架中
![](/icons/71849dou2.gif)
框架
![](/icons/71849de.gif)
麻烦就是区别
![](/icons/71849de.gif)
浏览器常常会以区别方式显示它们
![](/icons/71849dou.gif)
使它们
![](/icons/71849de.gif)
外观不
![](/icons/71849yi.gif)
致
![](/icons/71849dou2.gif)
使用框架从内部页面链接外部站点则比想像
![](/icons/71849de.gif)
更加困难
![](/icons/71849dou2.gif)
原本是想允许用户在不离开站点
![](/icons/71849de.gif)
情况下查看外部内容
![](/icons/71849dou.gif)
但结果往往不
![](/icons/71849yi.gif)
致
![](/icons/71849dou2.gif)
用户最终看到
![](/icons/71849de.gif)
是整个站点被挤进小得多
![](/icons/71849de.gif)
框架中
![](/icons/71849dou.gif)
更糟
![](/icons/71849de.gif)
是
![](/icons/71849dou.gif)
您
![](/icons/71849de.gif)
站点最终会嵌套在另
![](/icons/71849yi.gif)
个站点框架中
![](/icons/71849dou2.gif)
这种混乱驱使 Web 设计者寻找
![](/icons/71849yi.gif)
种更佳
![](/icons/71849de.gif)
解决方案
![](/icons/71849dou2.gif)
服务器端
![](/icons/71849include.gif)
(server-side
![](/icons/71849include.gif)
![](/icons/71849dou.gif)
SSI)就是
![](/icons/71849yi.gif)
种
![](/icons/71849dou2.gif)
服务器端
![](/icons/71849include.gif)
不久前
![](/icons/71849dou.gif)
SSI 还是用于创建共享内容
![](/icons/71849de.gif)
最受欢迎
![](/icons/71849de.gif)
选项的
![](/icons/71849yi.gif)
![](/icons/71849dou2.gif)
简单
![](/icons/71849de.gif)
SSI 伪指令允许您创建包含另
![](/icons/71849yi.gif)
个页面内容(如头和脚注文件)
![](/icons/71849de.gif)
页面
![](/icons/71849dou.gif)
如清单 1 中所示
![](/icons/71849dou2.gif)
清单 1. 正使用
![](/icons/71849de.gif)
SSI
<![CDATA[
<html>
<head>
<title>Simple SSI test</title>
</head>
<body>
This content is
![](/icons/71849static.gif)
ally in the
![](/icons/71849main.gif)
HTML file.<br />
<!--#
![](/icons/71849include.gif)
virtual="
![](/icons/71849include.gif)
d.html" -->
</body>
</html>
]]>
我们不久将使用该文件来做
![](/icons/71849yi.gif)
个练习
![](/icons/71849dou2.gif)
目前
![](/icons/71849dou.gif)
您应该将它另存为 test-ssi.shtml
![](/icons/71849dou2.gif)
在大多数设置中
![](/icons/71849dou.gif)
SSI 文件必须以 .shtml 结尾
![](/icons/71849dou.gif)
这让 Web 服务器知道将它们解析为 SSI 伪指令
![](/icons/71849dou2.gif)
清单 2 显示了名为
![](/icons/71849include.gif)
d.html
![](/icons/71849de.gif)
包含文件
![](/icons/71849de.gif)
内容
![](/icons/71849dou2.gif)
清单 2. 包含
![](/icons/71849de.gif)
内容
<![CDATA[
This content is in another file,
![](/icons/71849include.gif)
d.html
]]>
当请求 test-ssi.shtml 时
![](/icons/71849dou.gif)
您将看到该文件
![](/icons/71849de.gif)
内容以及
![](/icons/71849include.gif)
d.html
![](/icons/71849de.gif)
内容
![](/icons/71849dou2.gif)
您可以在任何支持 SSI
![](/icons/71849de.gif)
Web 容器(如 Apache Tomcat
![](/icons/71849dou.gif)
请参阅参考资料)上查看这些文件
![](/icons/71849dou2.gif)
从用户角度看
![](/icons/71849dou.gif)
SSI 和框架相比有重大改进
![](/icons/71849dou.gif)
![](/icons/71849yinwei.gif)
在单个文件和从其它被包含文件引进内容
![](/icons/71849de.gif)
文件的间没有显而易见
![](/icons/71849de.gif)
差别
![](/icons/71849dou2.gif)
不利方面就是 SSI 需要
![](/icons/71849yi.gif)
种特定
![](/icons/71849de.gif)
服务器设置
![](/icons/71849dou.gif)
而 Java 开发人员常常无法使用这种设置
![](/icons/71849dou2.gif)
另外
![](/icons/71849dou.gif)
SSI 通常要求被包含内容是静态
![](/icons/71849de.gif)
![](/icons/71849dou.gif)
尽管在后面
![](/icons/71849de.gif)
版本中加入了动态内容包含
![](/icons/71849dou2.gif)
对于在网站WebSite或 Web 应用
![](/icons/71849chengxu.gif)
中包含区别类型
![](/icons/71849de.gif)
内容来说
![](/icons/71849dou.gif)
SSI 是可行
![](/icons/71849de.gif)
解决方案
![](/icons/71849dou.gif)
但它们不是 Java 开发人员
![](/icons/71849de.gif)
最佳选择
![](/icons/71849dou2.gif)
这不仅
![](/icons/71849yinwei.gif)
JavaServer Pages 技术是替代 SSI
![](/icons/71849de.gif)
全 Java 技术
![](/icons/71849dou.gif)
还
![](/icons/71849yinwei.gif)
这两种技术不太容易结合在
![](/icons/71849yi.gif)
起
![](/icons/71849dou2.gif)
JSP 页以扩展名 .jsp 结尾
![](/icons/71849dou.gif)
这表示要使 SSI 伪指令起作用
![](/icons/71849dou.gif)
必须更改 SSI 配置以解析 JSP 文件(给每个 JSP 页解析增加开销)
![](/icons/71849dou.gif)
或者更改 JSP 配置以将 .shtml 扩展名作为 JSP 页处理(这是
![](/icons/71849yi.gif)
个坏主意)
![](/icons/71849dou2.gif)
对于 Java 开发人员来说
![](/icons/71849dou.gif)
JSP 技术是最好
![](/icons/71849de.gif)
内容管理解决方案
![](/icons/71849dou.gif)
幸运
![](/icons/71849de.gif)
是
![](/icons/71849dou.gif)
其
![](/icons/71849include.gif)
机制很容易掌握
![](/icons/71849dou2.gif)
JSP
![](/icons/71849include.gif)
JSP
![](/icons/71849include.gif)
伪指令和其 SSI 对等伪指令极其相似
![](/icons/71849dou2.gif)
清单 3 显示了清单 1 所示
![](/icons/71849de.gif)
SSI 伪指令
![](/icons/71849de.gif)
JSP 对等伪指令
![](/icons/71849dou2.gif)
任何支持 JSP
![](/icons/71849de.gif)
Web 容器都将处理该 JSP 页
![](/icons/71849de.gif)
显示(同样
![](/icons/71849dou.gif)
请参阅参考资料
![](/icons/71849yi.gif)
节
![](/icons/71849dou.gif)
以获得链接)
![](/icons/71849dou2.gif)
应该将该文件另存为 test-
![](/icons/71849include.gif)
.jsp
![](/icons/71849dou2.gif)
清单 3. JSP
![](/icons/71849include.gif)
伪指令
<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
<head>
<title>JSP
![](/icons/71849include.gif)
element test</title>
</head>
<body>
This content is
![](/icons/71849static.gif)
ally in the
![](/icons/71849main.gif)
JSP file.<br />
<%@
![](/icons/71849include.gif)
file="
![](/icons/71849include.gif)
d.html" %>
</body>
</html>
]]>
![](/icons/71849include.gif)
伪指令使将统
![](/icons/71849yi.gif)
![](/icons/71849de.gif)
头文件和脚注文件合并到您
![](/icons/71849de.gif)
站点变得非常容易
![](/icons/71849dou2.gif)
清单 4 显示了具有几个被包含文件
![](/icons/71849de.gif)
主索引页
![](/icons/71849dou2.gif)
清单 4. 主索引页
![](/icons/71849de.gif)
JSP
![](/icons/71849include.gif)
伪指令
<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
<head>
<title>
![](/icons/71849new.gif)
Instance.com</title>
<meta http-equiv="Content-Type" content="text/html; char
![](/icons/71849set.gif)
=iso-8859-1" />
<link href="/styles/default.css" rel="stylesheet" type="text/css" />
</head>
<body>
<%@
![](/icons/71849include.gif)
file="header.jsp" %>
<%@
![](/icons/71849include.gif)
file="navigation.jsp" %>
<%@
![](/icons/71849include.gif)
file="bookshelf.jsp" %>
<%@
![](/icons/71849include.gif)
file="/mt-blogs/index.jsp" %>
<%@
![](/icons/71849include.gif)
file="footer.jsp" %>
</body>
</html>
]]>
通过查看代码
![](/icons/71849dou.gif)
您将了解有关如何使用 JSP
![](/icons/71849de.gif)
各种思路方法
![](/icons/71849dou2.gif)
您还应该试验
![](/icons/71849yi.gif)
下该代码
![](/icons/71849dou.gif)
让自己掌握其工作原理
![](/icons/71849dou2.gif)
添加动态内容
除了如头、脚注和导航文件的类
![](/icons/71849de.gif)
静态内容外
![](/icons/71849dou.gif)
清单 4 还包括对 Weblog(/mt-blogs/index.jsp)
![](/icons/71849de.gif)
![](/icons/71849diaoyong.gif)
![](/icons/71849dou.gif)
这涉及动态内容
![](/icons/71849de.gif)
主题
![](/icons/71849dou2.gif)
如同 SSI
![](/icons/71849include.gif)
伪指令那样
![](/icons/71849dou.gif)
当 JSP
![](/icons/71849include.gif)
机制应用于动态内容时会出现问题
![](/icons/71849dou2.gif)
可以通过使用 JSP
![](/icons/71849include.gif)
伪指令来引入动态内容
![](/icons/71849dou.gif)
但将无法获得对该内容
![](/icons/71849de.gif)
更改
![](/icons/71849dou2.gif)
这是
![](/icons/71849yinwei.gif)
Web 容器将被包含文件作为原始(包含)页面
![](/icons/71849de.gif)
![](/icons/71849yi.gif)
部分读取
![](/icons/71849dou2.gif)
容器将结果高速缓存Cache为单个文件
![](/icons/71849dou.gif)
而不是多个 JSP 组件
![](/icons/71849dou2.gif)
![](/icons/71849yinwei.gif)
Web 容器不会针对更改去轮询被包含文件
![](/icons/71849dou.gif)
所以它不会知道有任何更改发生
![](/icons/71849dou.gif)
它将自动显示高速缓存Cache
![](/icons/71849de.gif)
页面而不是刷新
![](/icons/71849de.gif)
页面
![](/icons/71849dou2.gif)
要了解它
![](/icons/71849de.gif)
工作原理
![](/icons/71849dou.gif)
我们将做
![](/icons/71849yi.gif)
个简单
![](/icons/71849de.gif)
练习
![](/icons/71849dou2.gif)
首先
![](/icons/71849dou.gif)
将已保存
![](/icons/71849include.gif)
d.html 页面更新为清单 5 中所示
![](/icons/71849de.gif)
那样
![](/icons/71849dou2.gif)
清单 5. 修改包含
![](/icons/71849de.gif)
内容
<![CDATA[
This content is in another file,
![](/icons/71849include.gif)
d.html.
<br />
Some
![](/icons/71849new.gif)
content...
]]>
接下来
![](/icons/71849dou.gif)
保存这些更改
![](/icons/71849dou.gif)
导航至 test-
![](/icons/71849include.gif)
.jsp 文件
![](/icons/71849dou.gif)
刷新浏览器
![](/icons/71849dou2.gif)
您将注意到浏览器中没有显示
![](/icons/71849include.gif)
d.html 中
![](/icons/71849de.gif)
新内容
![](/icons/71849dou2.gif)
被包含文件
![](/icons/71849de.gif)
内容在更改发生的前就被高速缓存Cache了
![](/icons/71849dou.gif)
所以它不会显示出来
![](/icons/71849dou2.gif)
如果您
![](/icons/71849de.gif)
站点包含动态内容或可能被频繁修改
![](/icons/71849de.gif)
内容
![](/icons/71849dou.gif)
那么这会是
![](/icons/71849yi.gif)
个问题
![](/icons/71849dou2.gif)
幸运
![](/icons/71849de.gif)
是
![](/icons/71849dou.gif)
有
![](/icons/71849yi.gif)
个变通思路方法
![](/icons/71849dou2.gif)
在下
![](/icons/71849yi.gif)
个部分中
![](/icons/71849dou.gif)
我将向您演示如何使用 标记将动态内容加入 Web 页面
![](/icons/71849dou2.gif)
在此的前
![](/icons/71849dou.gif)
请参考参考资料
![](/icons/71849yi.gif)
节并试验这里提供
![](/icons/71849de.gif)
代码
![](/icons/71849dou.gif)
我将在网上和您再见
![](/icons/71849dou2.gif)
参考资料
要完成本系列文章中
![](/icons/71849de.gif)
练习
![](/icons/71849dou.gif)
将需要和 JSP 兼容
![](/icons/71849de.gif)
Web 容器
![](/icons/71849dou.gif)
如 Apache Tomcat
![](/icons/71849dou2.gif)
您可能还想要研究如何使用符合 JSP
![](/icons/71849de.gif)
IDE
![](/icons/71849dou2.gif)
您可以从下面几个 IDE 中选择:
JUnit
NetBeans
Eclipse
有关 JSP 技术
![](/icons/71849de.gif)
基本详细信息
![](/icons/71849dou.gif)
最好
![](/icons/71849de.gif)
办法是阅读 JSP 规范标准
![](/icons/71849dou2.gif)
有关 JSP 技术
![](/icons/71849de.gif)
指导性介绍
![](/icons/71849dou.gif)
请尝试阅读教程“JSP 技术入门”
![](/icons/71849dou2.gif)
developerWorks 也提供了许多有关 JSP 及其相关技术
![](/icons/71849de.gif)
有
![](/icons/71849yi.gif)
定深度
![](/icons/71849de.gif)
文章
![](/icons/71849dou.gif)
包括下列文章:
摘自 Professional JSP(2001 年 2 月)
![](/icons/71849de.gif)
“JSP architecture”是有关 JavaServer Pages 技术
![](/icons/71849de.gif)
极佳初级读本
![](/icons/71849dou2.gif)
“JSP 标记库:着意设计
![](/icons/71849de.gif)
更好
![](/icons/71849de.gif)
可用性”(2001 年 12 月)研究了 JSP 定制标记库工具
![](/icons/71849dou.gif)
该工具允许您开发自己
![](/icons/71849de.gif)
用于描述 Web 页面组件
![](/icons/71849de.gif)
标记
![](/icons/71849dou2.gif)
“利用 JSP 代码管理您
![](/icons/71849de.gif)
图像”(2002 年 11 月)讨论了许多本部分 JSP 最佳实战中提供
![](/icons/71849de.gif)
概念 ? 但集中讨论基于图像
![](/icons/71849de.gif)
内容
![](/icons/71849dou2.gif)
Mark Kolb 撰写
![](/icons/71849de.gif)
JavaServer Pages Standard Tag Library 系列文章(共 4部分)为本系列文章所包含
![](/icons/71849de.gif)
最佳实战提供了
![](/icons/71849yi.gif)
些后端理论
![](/icons/71849dou2.gif)
至本次截稿时间
![](/icons/71849dou.gif)
仅发表了 3篇文章:JSTL 入门:表达式语言(2003 年 2 月)介绍了 JSTL 和表达式语言(Expression Language);JSTL 入门:探讨 core(2003 年 3 月)通过讨论流控制和 URL 管理更进
![](/icons/71849yi.gif)
步研究核心库;以及 Part 3, Presentation is everything(2003 年 4 月)集中讨论了用于国际化
![](/icons/71849de.gif)
fmt 标记
![](/icons/71849de.gif)
使用
![](/icons/71849dou2.gif)
Hans Bergsten
![](/icons/71849de.gif)
JavaServer Pages(O´Reilly & Associates
![](/icons/71849dou.gif)
2002 年)是学习 JSP 技术
![](/icons/71849de.gif)
不可缺少
![](/icons/71849de.gif)
参考资料
![](/icons/71849dou2.gif)
developerWorks 上
![](/icons/71849de.gif)
“Ten JSP technology books compared”有点儿过时(2001 年 6 月)
![](/icons/71849dou.gif)
但它仍出色地评论了非常有用
![](/icons/71849de.gif)
JSP 标题
![](/icons/71849dou2.gif)
如果您喜欢 JSP 最佳实战
![](/icons/71849dou.gif)
也可以参考 developerWorks 上
![](/icons/71849de.gif)
EJB best practices 系列文章
![](/icons/71849dou2.gif)
JSP 技术基于 Java Servlet 技术
![](/icons/71849dou2.gif)
通过阅读 Jason Hunter 撰写
![](/icons/71849de.gif)
Java Servlet Programming(O´Reilly & Associates
![](/icons/71849dou.gif)
2002 年)学习有关 Servlet
![](/icons/71849de.gif)
更多知识
![](/icons/71849dou2.gif)
请参阅 developerWorks Java 技术教程页面
![](/icons/71849dou.gif)
从 developerWorks 获取免费 Java 技术教程
![](/icons/71849de.gif)
完整列表
![](/icons/71849dou2.gif)
在 developerWorks Java 技术专区可以找到数百篇有关 Java 编程各个方面
![](/icons/71849de.gif)
文章(包括有关 JSP 技术
![](/icons/71849de.gif)
更多文章)