首先创建一个符合Web应用的目录结构。如果打算把这个应用部署到单机的Tomcat服务器中,那么可以直接在Tomcat/Webapps目录下创建这个目录。图3ˉ2展示了已创建的目录结构和文件。
|
|
| 图3ˉ2 第一个JSP例子的目录结构 |
当按照下面的步骤来创建每个文件时,请参考图3ˉ2的目录结构以确定在哪个目录下保存这个文件。
在这个welcome.jsp页面中,用JSP的include指令加入了一个标准的页脚。因为所包含的文件只是一个片段而不是一个完整的JSP文件,所以我们根据JSP规范的建议,按照惯例把这段代码命名为具有.jspf扩展名的文件。
清单3ˉ1 welcome.jsp
清单3ˉ2 footer.jspf
我们不希望这个简单的例子出现任何错误。如果确实出现了不可预期的错误,那么应该向客户端返回一个错误页面。
清单3ˉ3 errorPage.jsp
最后,清单3ˉ4列出了welcome.jsp用到的帮助文件FaqCategories.java。在编辑好源码后,把它编译成一个类文件。
清单3ˉ4 FaqCategories.java
welcome.jsp文件(清单3ˉ1)利用了本章前面介绍的许多特性,在开头用到了页面指令:
这里的page指令包含两个属性。首先,定义了一个errorPage,如果welcome.jsp出现错误,那么浏览器将重定向到指定页面。page指令中的另外一个属性是import,它说明该页面引入了两个Java类:Java API中的Iterator类和该应用程序的FaqCategories类。
注意这个页面还可以用下面的import语法:
下面接着是一些HTML。然后接下来是脚本元素的声明:
这个元素声明了一个变量faqs,并且调用FaqCategories帮助类的构造函数来对它进行初
始化。你可以看到,声明元素以及用分号作为语句结束符,都必须符合Java的编码规则。
这一页的下一个JSP元素是一段脚本程序:
这段脚本程序从FaqCategories实例得到一个Iterator。用这个Iterator对FaqCategories中的每个分类(category)进行循环访问。然后把每个分类放到一个String类型的变量category中,并且用这个变量创建一个HTML链接。用表达式元素把每个分类打印两次:第一次是在标签的href属性中设置链接指向的页面,第二个是在链接体内。第一个表达式元素调用了replaceUnderˉscore()方法(由本页后面定义)并输出结果;第二个表达式元素简单输出category的值。
注意在脚本程序内必须使用Java语法。但是在表达式元素内,你只需要用表达式本身,而不需要用分号作为结束符。
在这一页的最后,用include指令包含了一个标准的页脚:
这个文件的最后是另外一个声明元素:
这个元素声明了replaceUnderscore()方法,这个方法是用来把字符串中的空格替换成下划线。前面的脚本调用了这个方法。
下一个文件是footer.jspf(清单3ˉ2)。可以发现,这不是一个完整的JSP文件。当用户访问页面时,这个文件用一个表达式元素打印服务器的当前日期和时间。该文件的扩展名为“.jspf”,这是由JSP规范推荐使用的,用于说明该文件是一个JSP的片段。另外,由于这个文件只是一个片段,并不公开使用,所以把它放到WEBˉINF目录下。WEBˉINF目录下的所有文件都是不公开的,也就是说,无法通过在浏览器中输入该文件的地址来访问它们,只有应用程序的代码可以访问WEBˉINF目录下的文件。
另外一个文件是errorPage.jsp,当welcome.jsp页面产生某个异常但没有被捕获时将使用它。但是,假设welcome.jsp中全部都是正确的,那么此应用将不会调用这个错误页面。这个页面是不公开使用的,所以它也位于WEBˉINF目录中。另外,由于errorPage.jsp是一个错误页面,所以页面指令的isErrorPage属性设置为true。除了这个指令之外,这个页面还包括了一些HTML文本和一个包含footer.jsp的include指令。
最后一个源文件是FaqCategories.java(清单3ˉ4)。这是一个辅助类,它为welcome.jsp页面提供三个分类(category)。在实际的应用中,分类的值应当是从某个持久存储中读取的,比如数据库或者目录。而本例中的辅助类对分类的值进行了硬编码(hardˉcode),所有的分类都储存在一个Vector对象中,这个Vector对象是FaqCategories类的一个成员变量。在这个类的构造函数中,把硬编码值加入到Vector中。尔后,该类定义了一个getAllCategories()方法简单地返回Vector的迭代器(iterator)。这个JSP页面用Iterator来循环依次获取每个类别。
现在完成了这个应用的所有编码,但实际被客户端访问之前,必须将它部署到一个应用服务器中。本章有两个应用服务器,其中的参考实现服务器是来自Java EE SDK,还有一个单机的Tomcat服务器。首先,让我们看一下如何把应用部署到Java EE服务器中。
| 回书目 上一节 下一节 |
|
· SQL Server入门到精通.. · 交换技术配置手册技术.. · 超级网管员——网络应.. · 网络服务器配置与应用.. · Linux集群技术自测试题.. · JavaSript核心技术自测.. |
· ARP攻击与防范技术自测.. · 国庆挑战自己参加自测 .. · 《网管员必读—网络应.. · 历次技术自测 获奖网友.. · 51CTO国庆七天技术自测.. · 9.2.2 无线AP |
|
|||
| · McWill、WiMAX、3G博弈 · 网管系统介绍 · 网络管理系统如何支撑I.. · CISSP认证成长之路 · 51CTO国庆充电专题之好.. · 网络技术经典基础教程 · 51CTO主编推荐经典专题 · RAID——磁盘阵列基础 |
· 充电计划之热门IT认证.. · 51CTO技术自测 挑战自.. · AMD Phenom三核处理器.. · 国际文档格式标准开战 · 2007年互联网大会 · 我是黑客我怕谁——讲.. · Solaris 10 配置管理 · Solaris基础知识入门 |
||
|
|||
| · Java基础教程 · VPN技术 · ARP攻击防范与解决方案 · SQL Server 2005全解 · SOA 面向服务架构 · SQL Server 2005全解 · Java编程开发手册 · RAID——磁盘阵列基础 |
· 三层交换技术专题 · SQL Server入门到精通 · Windows Server 2003企.. · Windows远程桌面应用 · C#技术开发指南 · VPN技术 · C#技术开发指南 · Solaris 10 配置管理 |
||
|
|||
| · ARP攻击防范与解决方案 · VPN技术 · SQL Server 2005全解 · Java基础教程 · SQL Server入门到精通 · SQL Server 2005全解 · SOA 面向服务架构 · Java编程开发手册 |
· C#技术开发指南 · 三层交换技术专题 · C#技术开发指南 · Windows远程桌面应用 · RAID——磁盘阵列基础 · Windows Server 2003企.. · 邮件服务器专题 · wimax技术与趋势 |
||
| ·DB2 Viper快速入门 ·DB2 9数据库的镜像分割与.. |
·将XML应用程序从DB2 8.x.. ·DB2 9中的pureXML:如何.. |
| ·服务器中的“傻瓜机”在.. ·盖茨也喜欢登录Youtube看.. |
· · |
| ·体验Windows Server 2008.. ·将超星图书转成PDF文档 |
·使用 Office Communicati.. ·VMware Workstation 6.01.. |
| ·强烈质疑“步行1公里就能.. ·国庆期间新闻回顾:微软.. |
·9月第3周回顾:微软和英.. ·9月第2周回顾:四核之战.. |
| · 华为、贝恩资本22亿美元.. · NGN:下一代网络 · 网络访问中断大排查 |
· 教你使用Anti ARP Sniff.. · 网络嗅探教程:使用Snif.. · 常见病毒手工清除方法大.. |
| · C++是垃圾语言?! · 2007年IT界七大抄袭事件 · Java实用开发全集 |
· 解析Ajax开发框架 走进A.. · 基于Google Maps与Ajax.. · 基于Google Maps与Ajax.. |
| · 热门 IT 培训认证官方资.. · Ubuntu 中文开源频道 · Solaris基础知识入门 |
· Google推出唯一硬件——.. · 硬盘之父获得诺贝尔物理.. · 理性面对四核服务器选购 |
| · 甲骨文Oracle 11g正式发.. · Oracle数据库开发之PL/S.. · Oracle数据库开发基础教.. |
· 硬盘之父获得诺贝尔物理.. · 存储2006,一个并购的大.. · IDC宣布浪潮蝉联存储市.. |