为在其他页面中使用同一代码,只需要在该页 JSPs和ASPs 面中重新插入相同的标签。如果标签代表的代码改 Microsoft和Sun都提供它们各自品牌 变了,所有的标签都将使用更新的版本。而使用标的服务器贝面。Sun提供 JAvasErver 签的JSP页面并不需要进行修订。 Pages(JsP)而 Microsoft提供 Active JSP标记比 scriptlet提供了更好的可重用性,也 Server 更易被页面设计者使用,因为它们看起来很象 Pages(AsP)。JsP和ASP都设计来时 HIML标记。 开发者能从后端系统产生动态页面 有大量的现成的SP标签库( tags libraries)可虽然表面看起来相似,ASP和SP仍有一 用,他们完成很多有用的功能。其中就有新的JSP标些不同之处 准标签库USIL)。这是一个新的标准,提供丰富的可JSP是平台独立性的,一次编写,随处运 重用的JSP标签库。 行 关于JSIL的详细情况,我们高度推荐《SLm开发者通过 Java Community Acon》,作者 Shawn Bayern[ Bayern] Struts可 Process(JCP指引方向; 以很好的和JsIL以及其他公开标签库一起工作,甚JSP开发者可以可以通过定指标记扩展 至是你自己写的标签库。 JSP标记集; 关于JSP的详细内容,我们强烈推荐《 Web JavaBeans和 Enterprise JavaBeans Development with JavaServer Pages》,作者 Duane K.(EJB)可以和JsP起使用,增可重用 Fields, Mark a.Kolb和 Shawn Bayern[Fields]。性和减小能护 JSP是 Struts开发者工具箱的一部分。大多数P可以春取其他一些Java库,包括 Struts开发者使用JSP和定制标记来创建应用的动ava数据库 Connectivity(JDBc), 态内容 Service(JMS),以及JNDl 1.3. 6 Java Beans JSP遣译成二进制类文件,不需妥在每次 Javabeans是一种Java类,它遵从一定的设计请求时进行解释 模式,使他们易于和其他开发工具和组件一起使用。JsP有广泛的支持,包括工具,容器和服 务器 定义 Javabean是一和JAVA语言写成的可重用组件。为写成 Java bean,类必须是具体的和公共的, 并且具有无参数的构造器。 Java beans通过提供符合一致性设计模式的公共方法将内部域暴露 称为属性。众所周知,属性名称符合这科模式,其他Java类可以通过自省机制发现和操作这些 属性
为在其他页面中使用同一代码,只需要在该页 面中重新插入相同的标签。如果标签代表的代码改 变了,所有的标签都将使用更新的版本。而使用标 签的 JSP页面并不需要进行修订。 JSP 标记比scriptle提供了更好的可重用性,也 更易被页面设计者使用,因为它们看起来很象 HTML标记。 有大量的现成的JSP 标签库(tags libraries)可 用,他们完成很多有用的功能。其中就有新的JSP 标 准标签库(JSTL)。这是一个新的标准,提供丰富的可 重用的JSP标签库。 关于 JSTL 的详细情况,我们高度推荐《JSTL in Action》,作者 Shawn Bayern [Bayern]。Struts 可 以很好的和 JSTL 以及其他公开标签库一起工作,甚 至是你自己写的标签库。 关于 JSP 的详细内容,我们强烈推荐《Web Development with JavaServer Pages》,作者 Duane K. Fields,Mark A. Kolb, 和 Shawn Bayern[Fields]。 JSP 是Struts开发者工具箱的一部分。大多数 Struts开发者使用JSP 和定制标记来创建应用的动 态内容。 1.3.6 JavaBeans JavaBeans 是一种 Java 类,它遵从一定的设计 模式,使他们易于和其他开发工具和组件一起使用。 定义 JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的, 并且具有无参数的构造器。JavaBeans 通过提供符合一致性设计模式的公共方法将内部域暴露 称为属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制发现和操作这些 JavaBean 属性。 JSPs 和. ASPs Microsoft 和 Sun 都提供它们各自品牌 的服务器页面。Sun提供JavaServer Pages (JSP)而 Microsoft 提供 Active Server Pages (ASP)。JSP 和 ASP 都设计来时 开发者能从后端系统产生动态页面。 虽然表面看起来相似,ASP 和JSP仍有一 些不同之处: JSP 是平台独立性的,一次编写,随处运 行; 开发者通过Java Community Process(JCP)指引方向; JSP 开发者可以可以通过定指标记扩展 JSP标记集; JavaBeans 和 Enterprise JavaBeans (EJB) 可以和JSP一起使用,增强可重用 性和减小维护。 JSP 可以存取其他一些Java 库,包括 Java 数据库 Connectivity (JDBC), Java Mail,Java Message Service(JMS),以及JNDI。 JSP 遍译成二进制类文件,不需要在每次 请求时进行解释; JSP 有广泛的支持,包括工具,容器和服 务器;
你做的 本书都在写要编写你自己的JSP标签,这里是这个过程的一个免速总捕: 1翁写一个累,通过实现线现 dostart(减者 dead(方法来实现 javax. servlet jsp tagext. TagSupport ba javax. servlet jsp. tagext Body Tag Support F 口。这些方获得一 spRite象,你可以用它来新出你要的HTML内咎。 2创建一个标签库描述文件(TLD来将你的新的类,跳射到一个标签名称。 3在你的Wveb应用捕述符web.xm)中定义你的<tag1ib>元清。题过在SP页厕的顶递 叔量下面的句: adlib:="/taqs/app,t1 d prefix="app”是 来告JSP页面据浆使用你自已的标签库 4这个句导入将在本页中使用的标签库,并升配它一个成氯。关于更多,教SP 标签库技术页面。 Javabean设计模式提供两种类型的方式来访间bean的内部状态:访问器( accessor)用 来读 JavaBean的状态,修改器( mutator)用来改变 JavaBean的状态 Mutator通常以小写的set前缀开始,后跟属性名。属性名的第一个字母必须大写。返 回值通常是void,因为 mutators仅仅改变属性的值,而不返回它们。简单属性的 mutator在 其方法体重可能只有一个参数,可以是各种类型。 Mutator也可根据其前缀称为设置器 setters。例如,对Doub1e类型的属性 weight的 mutator方法体可能是: ublic void setweight (Double weight 相似的设计模式也用于访问器方法的创建。 Accessor通常以小写的ge,为前缀,后跟属 性名。属性名的第一个字母必须大写。返回值必须匹配相应的修改器方法的参数。简单属性 的 Accessor在其方法体中不能接受参数。同样,访问器 accessor也经常称为获取器 genter 属性 weight的访问器方法体可能是 ublic Double getweight () 如果访问器返回一个逻辑值,这种情况下有个变体模式。不使用小写的get,逻辑属性 的访问器可以使用小写的s前缀,后跟属性名。属性名的首字母必须大写。返回值肯定是逻 辑值,不管是 boolean还是 Boolean。逻辑访问器在其方法体中不能接受参数 On属性的逻辑访问器的方法体可能是 pub1 ic boolean⊥son() 在使用 Javabean时,规范的方法体扮演了极为重要的角色。其他组件可以使用Java的 反射API通过查找前缀为set,is,或者ger的方法来发现 JAvabEan的属性。如果一个组件在 个 Javabean中发现一个这样的方法,它就知道这个方法可以用来访问或者改变 Java bean的属 性。 Sun引入 Javabeans是为了工作于GU组件,但它们已经用在Java开发的各个方面,包 括Web应用。Sun的工程师开发了JSP标签的扩展类时,他被设计来可以和 Javabeans-起 工作。一个页面的动态数据可以当作一个 Javabean来传递,并且JSP标记可以随后使用bean
JavaBean 设计模式提供两种类型的方式来访问bean的内部状态:访问器(accessor) 用 来读JavaBean的状态,修改器(mutator )用来改变 JavaBean的状态。 Mutator 通常以小写的set 前缀开始,后跟属性名。属性名的第一个字母必须大写。返 回值通常是void,因为mutators 仅仅改变属性的值,而不返回它们。简单属性的mutator 在 其方法体重可能只有一个参数,可以是各种类型。Mutator 也可根据其前缀称为设置器 setters 。例如,对Double类型的属性weight的mutator方法体可能是: 该你做的 整本书都在写要编写你自己的JSP 标签,这里是这个过程的一个快速总揽: 1 编写一个累,通过实现实现 doStart()或者doEnd()方法来实现 javax.servlet.jsp. -tagext.TagSupport 或者 javax.servlet.jsp.tagext.BodyTagSupport 接 口。这些方法获得一个JspWriter对象,你可以用它来输出你需要的HTML内容。 2 创建一个标签库描述文件(TLD)来将你的新建的类,映射到一个标签名称。 3 在你的Web应用描述符(web.xml)中定义你的<taglib> 元素。通过在JSP页面的顶部 放置下面的语句:%@taglib uri="/tags/app.tld prefix="app" % 来告诉JSP页面泥浆使用你自己的标签库。 4 这个语句导入将在本页中使用的标签库,并分配它一个前缀。关于更多细节,请参考JSP 标签库技术页面。 public void setWeight(Double weight) 相似的设计模式也用于访问器方法的创建。Accessor通常以小写的get,为前缀,后跟属 性名。属性名的第一个字母必须大写。返回值必须匹配相应的修改器方法的参数。简单属性 的Accessor在其方法体中不能接受参数。同样,访问器accessor 也经常称为获取器getter。 属性weight 的访问器方法体可能是: public Double getWeight() 如果访问器返回一个逻辑值,这种情况下有个变体模式。不使用小写的 get,逻辑属性 的访问器可以使用小写的is前缀,后跟属性名。属性名的首字母必须大写。返回值肯定是逻 辑值,不管是 boolean 还是Boolean。逻辑访问器在其方法体中不能接受参数。 On属性的逻辑访问器 的方法体可能是: public boolean isOn() 在使用JavaBean时,规范的方法体扮演了极为重要的角色。其他组件可以使用Java 的 反射API 通过查找前缀为set, is, 或者 get的方法来发现JavaBean的属性。如果一个组件在一 个JavaBean中发现一个这样的方法,它就知道这个方法可以用来访问或者改变JavaBean的属 性。 Sun 引入JavaBeans是为了工作于GUI组件,但它们已经用在 Java 开发的各个方面,包 括Web应用。Sun 的工程师开发了 JSP 标签的扩展类时,他被设计来可以和JavaBeans一起 工作。一个页面的动态数据可以当作一个JavaBean来传递,并且 JSP 标记可以随后使用bean
的属性来定制页面的输出。 1.3.7Mode|2 Servlet/JSP规范的0.92版描述了在一个应用中使用 servlet和JSP的架构。在其后的 规范中, Model2这个叫法消失了,但它已经在 Java web开发人员中非常通用了。 根据 Model2, servlet处理数据存取和导航流,JsP处理表现。 Model2使Java工 程师和HIML设计者分别工作于它们所擅长和负责的部分。 Model2应用的一部分发生改 变并不强求其他部分也跟着发生改变。HIML开发人员可以改变程序的外观和感觉,并不 需要改变后端 servlet的工作方式 Struts框架是基于 Model2的架构。它提供一个控制器 controller servlet来处理导航 流和一些特殊类来帮助数据存取。随框架也提供一个充实的标签库,以使 Struts易于和JsP 起使用。 14 Struts开始于三万英尺 抓紧你的帽子! 既然我们已经讲了一些基本知识,我们现在可以进行一个Suts的飞速之旅了。在我们 打开框架吃到一些果子之前,我们先了解一个大概模样 Stus使用 Model2架构。 Struts的 ction Servlet控制导航流。其他 Struts类,比如 Action,用来访问业务逻辑类。当 Action Servlet从容器接收到一个请求,它使用URI(或者 路径path”)来决定那个 Action将用来处理请求。一个 Action可以校验输入,并且访问业务 层以从数据库或其他数据服务中检索信息 为校验输入或者使用输入来更新数据库, Action需要知道什么指被提交上来。并不是 强制每个 Action从请求中抓取这些值,而是由 Action Servlet将输入绑定到 JavaBean中 输入bean是 Struts action Form c类的子类。 Action Servlet通过查找请求的路径可以决定使用 哪个 Action Forn, Action也是通过同样的方法选取的。 Action Forn扩展 org. apache. struts. action. Actionform类。每个都必须以HITP响应进行应答。通 常, Struts Action并不自行加工响应信息,而是将请求转发到其他资源,比如JSP页面。 Struts提 供一个 Action Forward类,用来将一个页面的路径存储为逻辑名称。当完成业务逻辑后, Action选择并向 Servlet返回一个 Action Forward servlet然后使用存储在 Action Forward对 象中的路径来调用页面完成响应 Struts将这些细节都绑定在一个 Iction Mapping对象中。每个 ActionMapping相对于 个特定的路径。当某个路径被请求时, Servlet就查询 ActionMapping对象。 ActionMapping 对象告诉 servlet,哪个 Actions, Action Forms,和 Action Forwards将被使用 所有这些细节,关于 Action, Action Form, Action Forward, Action Mapping,以及其 他一些东西,都在srs- config.xn/文件中定义。 Action Servlet在启动时读取这个配置文件, 并创建一个配置对象数据库。在运行时, Struts应用根据文件创建的配置对象,而不是文件 本身。图1.1显示了这些组件是如何一起工作的
的属性来定制页面的输出。 1.3.7 Model 2 Servlet/JSP 规范的 0.92 版描述了在一个应用中使用 servlet 和 JSP 的架构。在其后的 规范中,Model 2 这个叫法消失了,但它已经在 Java web 开发人员中非常通用了。 根据 Model 2,servlet 处理数据存取和导航流, JSP 处理表现。Model 2 使 Java 工 程师和 HTML 设计者分别工作于它们所擅长和负责的部分。Model 2 应用的一部分发生改 变并不强求其他部分也跟着发生改变。HTML 开发人员可以改变程序的外观和感觉,并不 需要改变后端 servlet 的工作方式。 Struts 框架是基于 Model 2 的架构。它提供一个控制器 controller servlet 来处理导航 流和一些特殊类来帮助数据存取。随框架也提供一个充实的标签库,以使 Struts 易于和 JSP 一起使用。 1.4 Struts开始于三万英尺 抓紧你的帽子! 既然我们已经讲了一些基本知识,我们现在可以进行一个Struts的飞速之旅了。在我们 打开框架吃到一些果子之前,我们先了解一个大概模样。 Struts 使用 Model 2 架构。Struts 的ActionServlet 控制导航流。其他Struts 类,比如 Action, 用来访问业务逻辑类。当 ActionServlet 从容器接收到一个请求,它使用URI (或者 路径“path”) 来决定那个Action 将用来处理请求。一个 Action可以校验输入,并且访问业务 层以从数据库或其他数据服务中检索信息。 为校验输入或者使用输入来更新数据库, Action 需要知道什么指被提交上来。并不是 强制每个Action 从请求中抓取这些值,而是由 ActionServlet 将输入绑定到JavaBean中。 输入 bean是Struts ActionForm c类的子类。ActionServlet 通过查找请求的路径可以决定使用 哪个ActionForm,Action 也是通过同样的方法选取的。ActionForm 扩展 org.apache.struts.action.ActionForm类。每个都必须以HTTP 响应进行应答。通 常, Struts Action 并不自行加工响应信息,而是将请求转发到其他资源,比如JSP 页面。Struts 提 供一个ActionForward 类,用来将一个页面的路径存储为逻辑名称。当完成业务逻辑后, Action 选择并向Servlet返回一个ActionForward。Servlet 然后使用存储在ActionForward 对 象中的路径来调用页面完成响应。 Struts 将这些细节都绑定在一个ActionMapping 对象中。每个ActionMapping 相对于一 个特定的路径。当某个路径被请求时,Servlet 就查询ActionMapping 对象。ActionMapping 对象告诉servlet,哪个Actions, ActionForms, 和 ActionForwards 将被使用。 所有这些细节,关于Action, ActionForm, ActionForward, ActionMapping,以及其 他一些东西,都在struts-config.xml 文件中定义。 ActionServlet 在启动时读取这个配置文件, 并创建一个配置对象数据库。在运行时,Struts 应用根据文件创建的配置对象,而不是文件 本身。图 1.1 显示了这些组件是如何一起工作的
Form ACTION SERVLET 图1-1 Struts组件 不管你相信与否,你已经知道了足够的东西,可以组装一个简单的 Struts应用了。它并 不需要做很多工作,但它显示了 Struts实际是如何工作的。 1.4.1建方筒单的 Struts应用 开发者进行开发,我们大多数则从例子中学习最好的方法。虽然我们花了几乎一页不到的篇 幅来讲 Struts是如何工作的,我们也需要建立一些什么,以便你可以看到如何完成这个工作。 完成了这章,我们将建立一个非常简单但全功能的web应用。这个程序将用来注册用户和 用户密码。一旦你完成它,你将接触到部署你的Web应用所需要的所有 Struts组件。 14.2刷到开始开发了 当我们渴望要创建点什么时,接下来再设置环境并遇到障碍的时候就可能让所有人都觉得受 挫。根据这章所述,你所需要的是一个 Java Development Kit(①DK),一个web容器(比如 Tomcat),以及一个简单的文本编辑器。如果你还没有一个Java开发环境和web容器,下面 是你该做的 下载并安装DK14 下在并安装 Tomcat4 校验 Tomcat是否工作正常。 14.3落到实处 我们的第一个 Struts程序将是一个用户注册程序。用户将看到一个注册屏幕,包含3个字 段:用户名,密码和密码确认。成功的注册要求两次密码相符。如果注册成功,控制将转向 一个页面,显示注册成功 successful!。如果两次输入密码不同,控制流将转向一个显示失败 的页面。 这个简单的练习将展示以下内容 λ创建HTML表单; λ从HIML表单获取输入 λ处理输入(业务逻辑); λ根据动态输入改变控制流
图 1-1 Struts 组件 不管你相信与否,你已经知道了足够的东西,可以组装一个简单的Struts应用了。它并 不需要做很多工作,但它显示了Struts实际是如何工作的。 1.4.1 建立简单的Struts应用 开发者进行开发,我们大多数则从例子中学习最好的方法。虽然我们花了几乎一页不到的篇 幅来讲Struts是如何工作的,我们也需要建立一些什么,以便你可以看到如何完成这个工作。 完成了这章,我们将建立一个非常简单但全功能的web 应用。这个程序将用来注册用户和 用户密码。一旦你完成它,你将接触到部署你的Web应用所需要的所有Struts组件。 1.4.2 跳到开始开发了 当我们渴望要创建点什么时,接下来再设置环境并遇到障碍的时候就可能让所有人都觉得受 挫。根据这章所述,你所需要的是一个 Java Development Kit (JDK),一个web 容器(比如 Tomcat),以及一个简单的文本编辑器。如果你还没有一个Java 开发环境和web 容器,下面 是你该做的: 下载并安装JDK 1.4. 下在并安装 Tomcat 4 . 校验Tomcat 是否工作正常。 1.4.3 落到实处 我们的第一个Struts程序将是一个用户注册程序。用户将看到一个注册屏幕,包含3个字 段:用户名,密码和密码确认。成功的注册要求两次密码相符。如果注册成功,控制将转向 一个页面,显示注册成功successful!.。如果两次输入密码不同,控制流将转向一个显示失败 的页面。 这个简单的练习将展示以下内容: λ 创建HTML 表单; λ 从HTML 表单获取输入; λ 处理输入(业务逻辑); λ 根据动态输入改变控制流;
为完成这个程序,你需要建立 λ一个 Action For λ一个 Action λ struts- config. xml文件 λ三个页面 就这些! 14.3.1创建 Action Form Action Form是一个 JavaBean,扩展了org. apache. struts. ActionForm类。这个 对象捕获通过请求传送的输入。当浏览器提交一个表单,它在请求中为每个表单中的字段创 建一个参数。 Action Form针对每个HIML表单中的字段具有一个对应的属性。 Action Servlet 匹配请求中的参数和 Action Forn中的属性。当匹配好后, Action Servlet为属性调用 setter方 法,并将请求中的值传入。在我们的练习中,表单中的 username字段需要一个 setUsername( string)方法。 password字段需要 set password1( string)和 setpassword2( String)方法。这些方法负责组装隐藏在 Register Form Java Bean中的实例 变量。 RegisterForm的源代码显示在清单中。 package app; import org. apache struts action. *i public class RegisterForm extends ActionForm protected string username: protected string password; protected string password i public string getUsername ()return this username; ); public string getPasswordl()return this password1; ); public string getPassword2() return this password: public void setUsername (string username)[this username username; ); public void setPassword1 (string password)[this password password:) public void setPassword2 (String password)(this password= password; ) 代码清单1.1 RegistrationForm 创建一个文件,取名为 RegisterForm. java,内容示于代码清单1.1。存储在<Base rector>/ ebapps/register/WEB-INF/ classes/app下。默认情况下,< Base Directory>可能是 C:/ PROGRAM FILES/APACHE TOMCAT40。对于其他容器,使用其 classes目录的路径来部 署我们的 Register程序 14.3.2创建 RegisterAction Action一个Java类,扩展了org. apache. struts. Action. Action Servlet组装 Action form,然后将其传递给 Action。 Action通常负责输入校验,存取业务信息,以及决 定向 Servlet返回哪个 Action Forward 现在,创建一个文件,命名为 Register Action. java,其内容为代码清单12的内容 package app
为完成这个程序,你需要建立: λ 一个ActionForm λ 一个Action λ struts-config.xml 文件 λ 三个页面 就这些! 1.4.3.1 创建ActionForm ActionForm 是一个JavaBean ,扩展了 org.apache.struts.ActionForm类。这个 对象捕获通过请求传送的输入。当浏览器提交一个表单,它在请求中为每个表单中的字段创 建一个参数。ActionForm 针对每个HTML表单中的字段具有一个对应的属性。ActionServlet 匹配请求中的参数和ActionForm中的属性。当匹配好后,ActionServlet 为属性调用setter方 法,并将请求中的值传入。在我们的练习中,表单中的username 字段需要一个 setUsername(String)方法。password 字段需要setPassword1(String) 和 setPassword2(String)方法。这些方法负责组装隐藏在RegisterForm JavaBean中的实例 变量。RegisterForm 的源代码显示在清单1中。 package app; import org.apache.struts.action.*; public class RegisterForm extends ActionForm { protected String username; protected String password1; protected String password2; public String getUsername () {return this.username;}; public String getPassword1() {return this.password1;}; public String getPassword2() {return this.password2;}; public void setUsername (String username) {this.username = username;}; public void setPassword1(String password) {this.password1 = password;}; public void setPassword2(String password) {this.password2 = password;}; } 代码清单 1.1 RegistrationForm 创建一个文件,取名为RegisterForm.java,内容示于代码清单1.1。存储在 <Base Directory>/webapps/register/WEB-INF/classes/app下。默认情况下, <Base Directory> 可能是 C:/PROGRAM FILES/APACHE TOMCAT 4.0。对于其他容器, 使用其classes目录的路径来部 署我们的Register 程序。 1.4.3.2 创建 RegisterAction Action 一个 Java 类,扩展了 org.apache.struts.Action。ActionServlet 组装 ActionForm ,然后将其传递给Action。Action 通常负责输入校验,存取业务信息,以及决 定向Servlet返回哪个ActionForward 。 现在,创建一个文件,命名为RegisterAction.java,其内容为代码清单1.2的内容: package app;