The only stupid question is the one you never ask 一B名 11关于才书 欢迎你阅读《Sms在行动》。本书的目的是帮助web应用开发者可以最好的使用 Strut web应用框架。 Struts是一个开源软件,有助于开发者更加快速和容易地建立Web应用程序。 Struts依 靠绝大多数开发者已熟知的标准技术一比如 Javabeans, Java servlet,以及 JavaServer Page (JSP)。通过基于标准的技术,“填空式”的软件开发方法, Struts可以减轻在创建新项目时 的令人抱怨的极费时间的工作 1.11推包建了 Struts? Struts是 Apache软件基金下 Jakarta项目的一部分。除 Struts之外,还有其他成功的开源产 品,包括 Tomcat,Ant,和 Velocity. 开始的代码基础从2000年5月开始开发,直到2001年6月,1.0版本发布。有30多个开 发者参与进来,并有数千人参与到讨论组中。 Struts代码基础由一个志愿的 Committer团队 来管理。到2002年, Struts小组共有9个志愿 Committe Struts框架的主要架构设计和开发者是 Craig R Mc Clanahan. Craig也是 Tomcat4的主要 架构师,以及 Java Web Services Developer Pack的主要架构师和实现者。他现在是Sun的 JavaServer faces(JSR-127)以及J2EE平台的Web层架构的规范领导。 Struts在 Apache软件许可[ASF, LicenseI下对公众是免费的。使用此软件没有任何获 得和再现成本。不象其他一些开源许可, Apache软件许可对商业用途是友好的。你可以在 你的商业项目中使用 Struts,并自由分发 Struts库。你也可以将 Struts组件集成到你的框架中, 就像他们是你自己编写的一样。详细情况,参见 Apache Software License, www.apacheorg/license。 112为什么 Struts要开源? 现在许多非常好的Java程序和框架都是开源项目。许多开发人员为这些项目工作,同时 又在象IBM, Sun Microsystems,以及 Apple这样的公司从事其常规工作。这类软件的开发 式协作有利于整个软件市场。今天,许多开源组件都集成到商业产品之中。公司可以向其客 户出售其专业的文档,保证支持水平,以及其他有价值的售后服务 当软件是自由的的时候,对市场来说它更容易得到支持。 Struts就是个典型例子。虽然 它还只是个很新的产品,也已经有很多文章和教程涉及到它,但却还没有什么象这样的书籍。 许多开发团队不喜欢使用不是自己内部开发的软件。开源组件提供了所有自行开发的软 件的优点,但绝不将你锁定在一个只有你们团队才懂的专有解决方案上。 开源软件对所有人都是双赢的。 11.3为什么 Struts?
The only stupid question is the one you never ask. —佚名 1.1 关于本书 欢迎你阅读《Struts 在行动》。本书的目的是帮助Web应用开发者可以最好的使用Struts web 应用框架。 Struts 是一个开源软件,有助于开发者更加快速和容易地建立Web应用程序。Struts依 靠绝大多数开发者已熟知的标准技术—比如JavaBeans, Java servlet, 以及 JavaServer Page (JSP)。通过基于标准的技术,“填空式”的软件开发方法,Struts 可以减轻在创建新项目时 的令人抱怨的极费时间的工作。 1.1.1 谁创建了Struts? Struts是Apache软件基金下Jakarta项目的一部分。除Struts之外, 还有其他成功的开源产 品,包括Tomcat, Ant, 和 Velocity。 开始的代码基础从2000年5月开始开发,直到2001年6月,1.0版本发布。有 30 多个开 发者参与进来,并有数千人参与到讨论组中。Struts 代码基础由一个志愿的Commnitter团队 来管理。到 2002年,Struts 小组共有9个志愿Commnitter。 Struts框架的主要架构设计和开发者是Craig R.McClanahan。Craig 也是Tomcat 4的主要 架构师,以及Java Web Services Developer Pack的主要架构师和实现者。他现在是Sun的 JavaServer Faces (JSR-127) 以及J2EE平台的Web层架构的规范领导。 Struts 在Apache 软件许可 [ASF, License]下对公众是免费的。 使用此软件没有任何获 得和再现成本。不象其他一些开源许可,Apache 软件许可对商业用途是友好的。你可以在 你的商业项目中使用Struts,并自由分发Struts 库。你也可以将Struts 组件集成到你的框架中, 就像他们是你自己编写的一样。详细情况,参见Apache Software License, www.apache.org/LICENSE。 1.1.2 为什么Struts 要开源? 现在许多非常好的Java程序和框架都是开源项目。许多开发人员为这些项目工作,同时 又在象IBM, Sun Microsystems, 以及 Apple这样的公司从事其常规工作。这类软件的开发 式协作有利于整个软件市场。今天,许多开源组件都集成到商业产品之中。公司可以向其客 户出售其专业的文档,保证支持水平,以及其他有价值的售后服务。 当软件是自由的的时候,对市场来说它更容易得到支持。Struts 就是个典型例子。虽然 它还只是个很新的产品,也已经有很多文章和教程涉及到它,但却还没有什么象这样的书籍。 许多开发团队不喜欢使用不是自己内部开发的软件。开源组件提供了所有自行开发的软 件的优点,但绝不将你锁定在一个只有你们团队才懂的专有解决方案上。 开源软件对所有人都是双赢的。 1.1.3 为什么叫Struts?
这个框架之所以叫 Struts”,是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚 至我们踩高跷时候的基础支撑。这也是一个解释 Struts在开发Web应用程序中所扮演的角色 的精彩描述。当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。同样, 软件工程师使用 Struts为业务应用的每一层提供支持。 1.2什么是应用框架? 框架( framework)是可重用的,半完成的应用程序,可以用来产生专门的定制程序 Johnson]。象人一样,软件应用的相似性比不同点要多。它们运行在相同的机器上,期望从 相同的设备输入信息,输出到相同的显示设备,并且存储数据到相同的硬盘设备。工作在传 统桌面应用的开发人员习惯于那些可以覆盖应用开发同一性的工具包和开发环境。构架在这 些公共基础上的应用框架可以为开发人员提供可以为他们的产品提供可重用服务的基础架 构 框架向开发人员提供一系列具有以下特征的骨架组件: λ已经知道他们在其他程序上工作的很好; 它们随时可以在下一个项目中使用 λ他们可以被组织的其他团队使用 框架是典型的构建还是购买命题。如果你自己构建它,在你完成时你就会理解它,但是 在你被融入之前将花费多长时间?如果要购买,你必须得克服学习曲线,同样,在你可以用 它工作之前得花多长时间?这里没有所谓正确答案,但许多观察者将会同意,象 Struts这样 的框架能提供比从头开始开发更显著的投资回报,特別是对于大型项目来说。 1.21其它类型的架 框架的概念不仅用于应用程序也可用于组件。通过此书,我们也介绍其他可以和 Struts 一起使用的框架。这些包括 Lucene搜索引擎, Scaffold工具包, Struts验证器,以及 Tiles 标签库。象应用框架一样,这些工具也提供了一些半完成的版本,可以用在用户的定制组件 之中 某些框架限制到专门的开发环境中。 Struts以及本书中涉及的组件都不是这样。你可以 在很多环境中来开发 Struts: Visual age for Java, J Builder, Eclipse,macs,以及 Textpad 如果你可以用来开发Java,你就可以用它来开发 Strut 译者注:目前很多大型公司也重视到它,它们的工具也提供相应的ms开发支持。比如BM WSAD, BEA Work Shop等。另外,一些公司专么提供可视化的Sms集成开发环境。 1.3使用的技术 使用 Struts的应用开发使用了大量的使能技术。这些技术并不是专门针对 Struts,而是 所有 Java web应用都可以使用的。开发者使用Suts之类的框架是为了隐藏在诸如HITP, CGl,以及JSP之类技术后面的繁琐的细节。作为一个 Struts开发者,你并不需要知晓所有的
这个框架之所以叫“Struts”,是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚 至我们踩高跷时候的基础支撑。 这也是一个解释Struts在开发Web应用程序中所扮演的角色 的精彩描述。当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。同样, 软件工程师使用Struts为业务应用的每一层提供支持。 1.2 什么是应用框架? 框架(framework)是可重用的,半完成的应用程序,可以用来产生专门的定制程序 [Johnson]。象人一样,软件应用的相似性比不同点要多。它们运行在相同的机器上,期望从 相同的设备输入信息,输出到相同的显示设备,并且存储数据到相同的硬盘设备。工作在传 统桌面应用的开发人员习惯于那些可以覆盖应用开发同一性的工具包和开发环境。构架在这 些公共基础上的应用框架可以为开发人员提供可以为他们的产品提供可重用服务的基础架 构。 框架向开发人员提供一系列具有以下特征的骨架组件: λ 已经知道他们在其他程序上工作的很好; λ 它们随时可以在下一个项目中使用; λ 他们可以被组织的其他团队使用; 框架是典型的构建还是购买命题。如果你自己构建它,在你完成时你就会理解它,但是 在你被融入之前将花费多长时间?如果要购买,你必须得克服学习曲线,同样,在你可以用 它工作之前得花多长时间?这里没有所谓正确答案,但许多观察者将会同意,象Struts这样 的框架能提供比从头开始开发更显著的投资回报,特别是对于大型项目来说。 1.2.1 其它类型的框架 框架的概念不仅用于应用程序也可用于组件。通过此书,我们也介绍其他可以和Struts 一起使用的框架。这些包括 Lucene 搜索引擎,Scaffold 工具包,Struts 验证器,以及Tiles 标签库。象应用框架一样,这些工具也提供了一些半完成的版本,可以用在用户的定制组件 之中。 某些框架限制到专门的开发环境中。Struts 以及本书中涉及的组件都不是这样。你可以 在很多环境中来开发Struts: Visual Age for Java, JBuilder, Eclipse, Emacs, 以及Textpad 。 如果你可以用来开发Java, 你就可以用它来开发Struts。 译者注:目前很多大型公司也重视到它,它们的工具也提供相应的Struts开发支持。比如IBM WSAD,BEA WorkShop等。另外,一些公司专么提供可视化的Struts集成开发环境。 1.3 使用的技术 使用Struts的应用开发使用了大量的使能技术。这些技术并不是专门针对Struts ,而是 所有Java web应用都可以使用的。开发者使用Struts之类的框架是为了隐藏在诸如HTTP, CGI,以及JSP之类技术后面的繁琐的细节。作为一个Struts开发者,你并不需要知晓所有的
相关知识,但是这些基本技术的工作原理可能有助于你针对棘手问题设计出创造性的方案。 如果你已经非常熟悉这些技术,你可以跳过这些章节到14节。 1.3.1超文本传新协戎(HTTP 当两个国家之间进行调解时,外交官们总是遵循一定的正式加议。外交协议设计来避免 误解,以及防止谈判破裂。同样,当计算机间需要对话,他们也遵循一个正式的协议。这个 协议定义数据是如何传输,以及他们到达后如何进行解码。Web应用程序就是使用HTTP协 议在运行浏览器的计算机和运行的服务器的程序间传输数据。 很多服务器应用程序使用HITP之外的其他协议。他们在计算机之间维护一个持久性的 的连接。应用服务器可以清楚的知道是谁连接上来,而且何时中断连接。因为他们知道每 个连接的状态,以及每一个使用它的人。这称之为状态协议。 相反,HITP是一个无状态协议。 Http server可以接受来自于各种客户的各种请求 并提供各种响应,即使是这个响应仅仅是说No。没有大量的协商和连接持久性,无状态协 议可以处理大量的请求。这也是 Internet可以扩展到很多计算机的原因。 HTTP成为通用标准的原因是其简单性。HTP请求看起来就像一个平常的文本文档 这使应用程序很容易创建HITP请求。你甚至可以通过标准的程序如 Telnet来手动传递一个 HTP请求。当HITP响应返回时,他也是一个开发者可以直接阅读的平面文本 HTTP请求的第一行包含方法,其后是请求的来源地址和HITP版本。HITP请求头跟在 首行后面,可以没有也可以有多个。HTTP头向服务器提供额外的信息。可以包括浏览器的 种类和版本,可接受的文档类型,浏览器的 cookies等等。7种请求方法中,GET和POST 是用得最多的。 旦服务器接收到请求,他就要产生一个HTTP响应。响应的第一行称为状态行,包含 了HTTP协议的版本,数字型状态,以及状态的简短描述。状态行后,服务器将返回一个HTTP 响应头,类似于HTTP请求头。 如上所述,HIP并不在请求间保持状态信息。服务器接受请求,发出响应,并且继续 愉快地处理文本请求。 因为简单和效率,无状态协议不适合于需要跟踪用户状态的动态应用。 Cookies和URL重写是两个在请求间跟踪用户状态的方式。 cookie是一种特殊的信息 包,存储于用户的计算机中。URL重写是在页面地址中存储一个特殊的标记,Java服务器 可以用它来跟踪用户。这两种方法都不是无缝的,是用哪一个都意味着在开发时都要进行额 外的工作。对其本身来说,标准的 Http web服务器并不传输动态内。它主要是使用请求 来定位文件资源,并在响应中返回此资源。通常这里的文件使用 Hypertext Markup Language (HTML)[WC,HIML格式化,以使浏览器可以显示它们。HIML页面通常包含一些到其 他页面的超文本连接,也可以显示其他一些内容比如图像和视频等等。用户点击连接将产生 另一个请求,就开始一个新的处理过程。 标准web服务器处理静态内容处理得很好,但处理动态内容时则需要额外的帮助手段 定义 静态内容直接来自于文本或数据文件,比如HTML或者JPEG文件。这些文件可以随时 改变,但通过浏览器请求时,却不能自动改变 相反,动态内容是临时产生的,典型地,它是针对浏览器的个别请求的响应
相关知识,但是这些基本技术的工作原理可能有助于你针对棘手问题设计出创造性的方案。 如果你已经非常熟悉这些技术,你可以跳过这些章节到1.4节。 1.3.1 超文本传输协议 (HTTP) 当两个国家之间进行调解时,外交官们总是遵循一定的正式协议。外交协议设计来避免 误解,以及防止谈判破裂。同样,当计算机间需要对话,他们也遵循一个正式的协议。这个 协议定义数据是如何传输,以及他们到达后如何进行解码。Web应用程序就是使用HTTP协 议在运行浏览器的计算机和运行的服务器的程序间传输数据。 很多服务器应用程序使用HTTP之外的其他协议。他们在计算机之间维护一个持久性的 的连接。应用服务器可以清楚的知道是谁连接上来,而且何时中断连接。因为他们知道每一 个连接的状态,以及每一个使用它的人。这称之为状态协议。 相反, HTTP 是一个无状态协议。HTTP server 可以接受来自于各种客户的各种请求, 并提供各种响应,即使是这个响应仅仅是说No。没有大量的协商和连接持久性,无状态协 议可以处理大量的请求。这也是Internet可以扩展到很多计算机的原因。 HTTP成为通用标准的原因是其简单性。HTTP 请求看起来就像一个平常的文本文档。 这使应用程序很容易创建HTTP请求。你甚至可以通过标准的程序如Telnet来手动传递一个 HTTP请求。当HTTP 响应返回时,他也是一个开发者可以直接阅读的平面文本。 HTTP请求的第一行包含方法,其后是请求的来源地址和HTTP版本。HTTP请求头跟在 首行后面,可以没有也可以有多个。HTTP 头向服务器提供额外的信息。可以包括浏览器的 种类和版本,可接受的文档类型,浏览器的 cookies等等。7种请求方法中, GET 和 POST 是用得最多的。 一旦服务器接收到请求,他就要产生一个HTTP响应。响应的第一行称为状态行,包含 了HTTP协议的版本,数字型状态,以及状态的简短描述。状态行后,服务器将返回一个HTTP 响应头,类似于HTTP请求头。 如上所述, HTTP并不在请求间保持状态信息。服务器接受请求,发出响应,并且继续 愉快地处理文本请求。 因为简单和效率,无状态协议不适合于需要跟踪用户状态的动态应用。 Cookies 和 URL 重写是两个在请求间跟踪用户状态的方式。cookie 是一种特殊的信息 包,存储于用户的计算机中。URL 重写是在页面地址中存储一个特殊的标记,Java 服务器 可以用它来跟踪用户。这两种方法都不是无缝的,是用哪一个都意味着在开发时都要进行额 外的工作。对其本身来说,标准的HTTP web 服务器并不传输动态内容。它主要是使用请求 来定位文件资源,并在响应中返回此资源。通常这里的文件使用Hypertext Markup Language (HTML) [W3C, HTML] 格式化,以使浏览器可以显示它们。HTML页面通常包含一些到其 他页面的超文本连接,也可以显示其他一些内容比如图像和视频等等。用户点击连接将产生 另一个请求,就开始一个新的处理过程。 标准web 服务器处理静态内容处理得很好,但处理动态内容时则需要额外的帮助手段 了。 定义 静态内容直接来自于文本或数据文件,比如HTML 或者 JPEG 文件。这些文件可以随时 改变,但通过浏览器请求时,却不能自动改变。 相反,动态内容是临时产生的,典型地,它是针对浏览器的个别请求的响应
1.3.2公共网关接(CGD 第一个普遍使用来产生动态内容的标准是公共网关接口 Common Gateway Interface (CGI)。CGl使用标准的操作系统特征,比如环境变量和标准输入输出,在web服务期间以及 和主机系统间创建桥和网关。其他程序可以看到 web server传递过来的请求,并创建一个定 制的响应 当web服务器接收到一个对CGl程序的请求,它便运行这个程序并提供它他请求里面包 含的信息。CG程序运行,并将输出返回给 Web server, web server则将输出响应给浏览器 CGI定义了一套关于什么信息将作为环境变量传递,以及它希望怎样使用标准输入和输出 的惯例。象HTTP一样,CGI是灵活和易于实现的,并且已经有大量现成的CGI程序。 CGI的主要缺点是它必须为每个请求运行一个程序。这是一个相对昂贵的处理方法, 对大容量站点来说,每分钟有数千个请求,有可能使站点瘫痪。CGI程序的另一个缺点是 平台依赖性,一个平台上开发的程序不一定在另一个平台上能运行。 1.3.3 Java servlet Sun公司的 Java Servlet平台直接解决了CGl程序的两个主要缺点。 首先, servlet比常规CGl程序提供更好的性能和资源利用。其次,一次编写,随处运行 的JAVA特性意味着 servlet在有JM的操作系统间是轻便可移动的。 Servlet看起来好像是一个微小的 web server。它接受请求并产生响应。但,和常规web servers不同, servlet apl是专门设计来帮助Java开发人员创建动态应用的。 Servlet本身是遍译成字节码的Java类,就像其他Java对象一样。 Servlet访问HTP特 定服务的API,但仍然有另外一个Java对象运行于程序之中,并管理所有的Java资产 为了使常规 web servers能访问 servlet, servlet被安插在一个容器之中。 Servlet容器连接 到Web服务器。每个 servlet都可以宣称它可以处理何种样式的URL。当符合所注册样式的 请求到达, web server将请求传递给容器,容器则调用响应的 servlet 但不像CGI程序,并不是针对每个请求创建一个新的 servlet。一旦容器实例化一个 servlet,它就仅为每个新的请求创建一个新的线程。Java线程可比使用CGl程序的服务器处 理开销小多了。 旦 servlet被创建,使用它处理额外的请求仅带来很小的额外开销。 Servlet开发人员 可以使用init()方法保持对昂贵资源的引用,比如到数据库或者 EJB Home接口的连接, 以便它们可以在不同的请求间进行共享。获得这些资源要耗费数秒时间,这比大多数冲浪者 愿意等的时间要长些。 Servlet的另一个好处是,它是多线程的, servlet开发人员必须特别注意确保它们的 servlet是线程安全的。学习 servlet编程,我们推荐 Java Servlets by example,作者 Alan r Williamson [ Williamson 1.3.4 Java Server Pages 虽然 servlets对CGl程序来说前进了一大部,但它也不是万能药。为产生响应,开发人员不 得不使用大量的 print1n语句来生成HTML。像这样的代码 out println("<P>one line of HTML</P>"); outprintln("<P>Another line of HTML </P>") 在产生HTTP响应的Servlet中是很普遍的。也有一些库有助于你产生HIML,随着应用越来 越复杂,Java开发人员将不再扮演HIML页面设计的角色 同时,大多数项目经理更喜欢将团队分成不同的小组。它们喜欢HTML设计人员处理
1.3.2 公共网关接口(CGI) 第一个普遍使用来产生动态内容的标准是公共网关接口Common Gateway Interface (CGI)。CGI使用标准的操作系统特征,比如环境变量和标准输入输出,在Web服务期间以及 和主机系统间创建桥和网关。其他程序可以看到web server传递过来的请求,并创建一个定 制的响应。 当web 服务器接收到一个对CGI程序的请求,它便运行这个程序并提供它他请求里面包 含的信息。CGI程序运行,并将输出返回给Web server,web server则将输出响应给浏览器。 CGI 定义了一套关于什么信息将作为环境变量传递,以及它希望怎样使用标准输入和输出 的惯例。象 HTTP一样,CGI 是灵活和易于实现的,并且已经有大量现成的CGI 程序。 CGI 的主要缺点是它必须为每个请求运行一个程序。这是一个相对昂贵的处理方法, 对大容量站点来说,每分钟有数千个请求,有可能使站点瘫痪。CGI 程序的另一个缺点是 平台依赖性,一个平台上开发的程序不一定在另一个平台上能运行。 1.3.3 Java servlet Sun公司的Java Servlet 平台直接解决了CGI 程序的两个主要缺点。 首先,servlet 比常规CGI程序提供更好的性能和资源利用。其次,一次编写,随处运行 的JAVA特性意味着servlet在有JVM的操作系统间是轻便可移动的。 Servlet看起来好像是一个微小的web server。它接受请求并产生响应。但,和常规web servers不同,servlet API 是专门设计来帮助Java 开发人员创建动态应用的。 Servlet 本身是遍译成字节码的Java 类,就像其他Java对象一样。Servlet 访问HTTP特 定服务的API,但仍然有另外一个Java 对象运行于程序之中,并管理所有的Java资产。 为了使常规web servers能访问servlet,servlet 被安插在一个容器之中。Servlet容器连接 到Web服务器。每个servlet 都可以宣称它可以处理何种样式的URL。当符合所注册样式的 请求到达,web server 将请求传递给容器,容器则调用响应的servlet。 但不像CGI程序,并不是针对每个请求创建一个新的servlet。一旦容器实例化一个 servlet,它就仅为每个新的请求创建一个新的线程。Java 线程可比使用CGI程序的服务器处 理开销小多了。 一旦servlet 被创建,使用它处理额外的请求仅带来很小的额外开销。Servlet 开发人员 可以使用init() 方法保持对昂贵资源的引用,比如到数据库或者EJB Home 接口的连接, 以便它们可以在不同的请求间进行共享。获得这些资源要耗费数秒时间,这比大多数冲浪者 愿意等的时间要长些。 Servlet的另一个好处是,它是多线程的, servlet 开发人员必须特别注意确保它们的 servlet是线程安全的。学习servlet 编程,我们推荐Java Servlets by Example, 作者Alan R. Williamson [Williamson]。 1.3.4 JavaServer Pages 虽然servlets 对CGI 程序来说前进了一大部,但它也不是万能药。为产生响应,开发人员不 得不使用大量的println 语句来生成HTML。像这样的代码: out.println("<P>One line of HTML.</P>"); out.println("<P>Another line of HTML.</P>"); 在产生HTTP 响应的Servlet中是很普遍的。也有一些库有助于你产生HTML,随着应用越来 越复杂,Java 开发人员将不再扮演HTML 页面设计的角色。 同时,大多数项目经理更喜欢将团队分成不同的小组。 它们喜欢HTML 设计人员处理
表现层的工作,而Java工程师则专注于业务逻辑。单独使用 servlet鼓励混合标记和业务逻辑」 很难区分团队人员的专业工作 为解决这个问题,Sun提出了一个结合脚本和模板技术到一个组件中的服务器页面技 术。为创建JSP页面,开发者按同样创建HTML页面的方式创建页面,使用相同的HTML语法。 为将动态内容引入页面,开发人员可以将脚本元素置入页面之中。脚本元素是一些标记,封 装了可以被SP识别的逻辑。你可以在JSP页面中很容易的识别出脚本元素,他们被封装在 对<号和影>标记中。例如,要显示页面的最后修改日期,开发人员可以将以下代码放入页 面中 <B>This page was accessed at <% new Date()% ></B> 有三种不同的脚本元素 表达式,脚本小程序和宣称。如表1.1所示 表格11JSP脚本元素 目的 表达式 Java代码,對装在<8=和8>之中,用来计算AvA语句的值,并将结果入 Servlet的着出之中 Java代码,刻装在<和名>之中,常用来创建动态内容 ava代码,封濑在%和>之中,常用来创建动态内容 为区分JSP页面,程序将文件存为扩展名jsp。当一个客户请求JSP页面时,容器将页面翻 译成 Java servlet源代码文件,并将它编译成Java类文件-就象你写的 servlet文件一样。在运 行时,容器也能检测JSP文件和相应类的最后更新时间。如果,JSP文件自上次编译以来修 改了,容器将重新翻译和编译JSP文件。 项目经理现在可以将表现层分派给HML开发人员,将业务逻辑工作分派绐JAVA开发 人员。重要的是记住,JSP页面事实上是一个 servlet。你可以在 servlet做的,也可以在JSP 中做 1.35JSP标签 脚本元素仅是两种产生动态内容的方式之一。 Scriptlet是快捷、简单、强大的手段但要 求开发者在HIML中混合Java代码。经验告诉我们,混合业务逻辑到JSP页面中将导致难以 维护的应用和最小的可重用性。一个可选的方案是使用JSP标签(tags)。JSP标签可以和 HTML标记混合使用,就象它们是原生HIML标记一样。一个JSP标签可以代表许多Java 语句,但是所有的开发者都需要了解如何在页面中插入标记。源代码隐藏在Java类文件之中
表现层的工作,而Java 工程师则专注于业务逻辑。单独使用servlet鼓励混合标记和业务逻辑, 很难区分团队人员的专业工作。 为解决这个问题,Sun提出了一个结合脚本和模板技术到一个组件中的服务器页面技 术。为创建JSP页面, 开发者按同样创建HTML页面的方式创建页面,使用相同的HTML语法。 为将动态内容引入页面,开发人员可以将脚本元素置入页面之中。脚本元素是一些标记,封 装了可以被JSP识别的逻辑。你可以在JSP页面中很容易的识别出脚本元素,他们被封装在一 对<% 和 %>标记中。例如,要显示页面的最后修改日期,开发人员可以将以下代码放入页 面中: <B>This page was accessed at <%= new Date() %></B> 有三种不同的脚本元素: 表达式,脚本小程序和宣称。如表1.1所示: 表格 1.1 JSP 脚本元素 元素 目的 表达式 Java代码,封装在<%= 和 %>之中,用来计算JAVA语句的值,并将结果插入Servlet的输出之中 脚本程序 Java代码,封装在<% 和 %>之中,常用来创建动态内容 宣称 Java代码,封装在<%!和 %>之中,常用来创建动态内容 为区分JSP 页面,程序将文件存为扩展名.jsp。当一个客户请求JSP 页面时,容器将页面翻 译成Java servlet源代码文件,并将它编译成Java 类文件--就象你写的servlet文件一样。在运 行时,容器也能检测JSP文件和相应类的最后更新时间。如果,JSP 文件自上次编译以来修 改了,容器将重新翻译和编译JSP文件。 项目经理现在可以将表现层分派给HTML开发人员,将业务逻辑工作分派给JAVA开发 人员。重要的是记住, JSP 页面事实上是一个servlet。你可以在servlet做的,也可以在JSP 中做。 1.3.5 JSP标签 脚本元素仅是两种产生动态内容的方式之一。Scriptlet 是快捷、简单、强大的手段但要 求开发者在HTML中混合Java代码。经验告诉我们,混合业务逻辑到JSP页面中将导致难以 维护的应用和最小的可重用性。一个可选的方案是使用JSP 标签(tags)。JSP 标签可以和 HTML标记混合使用,就象它们是原生HTML 标记一样。一个 JSP 标签可以代表许多Java 语句,但是所有的开发者都需要了解如何在页面中插入标记。源代码隐藏在Java类文件之中