JBuilder 9 运用Struts 开发 Web 应用程序导览
使用Borland JBuilder 9 Developer 或Enterprise 版简介
本文内容将引导读者了解JBuilder 9 集成开发环境如何搭配Apache 开放原始程序代码之Struts Framework以开发Web 应用程序,本文并非完整之 Struts 教学文件,适合已熟悉 Struts 读者藉以了解 JBuilder 对于 Struts 支持程度,而熟悉 JBuilder 开发环境用户则可藉本文对 Struts Framework 有概括性了解,Struts Framework 相关详细内容请参阅 /struts/index.html。文中所述内容可适用于 JBuilder 9 Developer 版与 Enterprise 版。
为什么前端不学jspModel-View-Controller 模式
早期 Smalltalk 程序语言便采用了 MVC ( Model-View-Controller ) 模式 ( Patterns ) 以增加程序代码弹性,MVC
模式将程序代码整理切割为三部份,Model 部分是业务与应用领域 ( Business domain ) 相关逻辑、管理状态之对象,Controller 部分接收来自 View所输入的资料并与Model 部分互动,是业务流程控制 ( Flow Control ) 之处,View 部分则负责展现资料、接收使用者输入资料。在Java 应用中,JFC/Swing、AWT、JSP 皆是可用作 View 之技术规格,而JavaBean 与  Enterprise JavaBean 规格则可用于Model 程序代码,一旦应用程序以 MVC 模式加以适当之分割,Model 部分程序代码可在不同使用者接口外观之应用程序中重复使用。
Struts Framework 起源
随着JSP 与 Servlet 技术大量应用于以 Web 为基础之应用程序,Java 开发人员体认为应以较佳之模式以提升Web 应用程序之可维护性与重复使用性。早期JSP 规格
书中曾列举两种可行之JSP应用架构,分别为  Model1 与Model 2。
目录
简介  1 Model-View-Controller  模式  1 Struts Framework 起源  1 Struts 基本组件  2 Data Transfer Object 模式  2 JBuilder  对于 Struts 之支持  2 步骤一 : 建立 Web 应用程序  3 步骤二 : 建立自定义之 ActionForm 类  3 步骤三 : 建立自定义之 Action 类  4 步骤四 : 设定  Forward 标记  5 步骤五 : 产生 JSP    5 步骤六 : 设定执行组件7 步骤七 : 执行 Web 应用程序8 处理中文编码问题8
在  Model 1架构中,JSP 直接处理 Web 浏览器送来之请求 ( Request ),并辅以 JavaBean 处理应用相关逻辑。Model 1 架构单纯编写比较容易,但在 Model 1 中 JSP 可能同时肩负 View 与 Controller 角,两类程序代码有可能混杂而不易维护。而 Model 2 中将 Servlet 纳入架构中扮演前端 Controller 角,将 Web 浏览器送出之请求集中送至
Servlet,Servlet可集中管理使用者登入、权限控制、多国语言转换等前置处理,再视需求转向给对应之 JSP 处理。Model 2中采用了较佳之MVC 模式,但增加了编写复杂度。2000 年Craig R. McClanahan
先生贡献了他编写的 JSP Model 2 架构之 Application Framework 原始程序代码给 Apache 基金会,成为 Apache Jakarta 计划 Struts Framework 前身。Craig R. McClanahan 先生是 JCP Expert Group 成员之一,曾参与 JSP 规格制定与 Tomcat 4 之编写,因此 Struts Framework 广受 Java 开发人员体所重视。Borland 自 2002 年底开始于开发工具 JBuilder中支持Struts Framework。
Struts 基本组件
Struts 依照  Model 2 架构,享有 MVC 模式之优点,并运用 XML 格式档案 l 存贮组件设定。Struts 中负责Controller 之类以及负责 View 的  JSP 档案,都必须于组件档中正确设定,执行时期仅需修改 l 即可轻易变换 Controller 类变更程序行为,或重新导向至不同显示画面之 View。
Struts预先运行扮演前端 Controller 角之 Servlet,此Servlet 称为 ActionServlet,倘若需用在ActionServlet 中处理集中、前置性控制作业,可以继承 ActionServlet 并覆盖 ( Overriding ) ActionServlet 的 process 方法,于其内撰
写相关处理程序代码,倘若无此类需求,您完全不需要撰写任何与 ActionServlet 相关程序代码。所有来自 Web 浏览器之请求,ActionServlet 会自动依照组件档 struts-
加以处理。
Struts 以 Action 类扮演后端 Controller 角,一般性、后置控制皆可置于Action 类的 perform 方法中加以实现,
Action 类可依照l内forward 标记内容,将最后运算结果交由某个 JSP 呈现。在展现使用者接口的
View 部分,Struts 提供了五种自定义之 Tag Libraries 供
JSP 使用,这些 Tag Libraries能够依照接收到的资料自动转换为 HTML,或提供条件判断等显示逻辑流程控制。
Data Transfer Object 模式
在 Struts 架构中,Model、View、Controller 三部份可能跨越网络位于不同硬件环境中,为了解决 MVC 间传递、交换资料的问题,Struts 采用了 Data Transfer Object 模式
(  或称 Value Object 模式 ) 来解决此问题。Struts 中运用继承自为ActionForm的 JavaBean ( 亦可称为 FormBean ) 来储存使用者在 Web 浏览器中所输入的资料,由于
JavaBean 可实现 Serialization 接口,具备跨越网络传递资料的特性,因而解决 MVC间资料传递交换问题。此外,ActionForm亦可于其内实现资料核验之方法,实际应用中ActionForm 可能对应到多个 View 画面,每个
ActionForm 开发完毕后也须于 l 内做正确之设定。
JBuilder  对于 Struts 之支持
JBuilder 提供图形使用者接口以简化组件文件 struts-
2
对话框内的 Web 页次,提供四种精灵以简化 Struts 开发流程。
Struts Converter Wizard:
可指定 HTML 或一般 JSP 档案自动产生使用 Struts Tag Libraries 之 JSP 档案。
ActionForm Wizard:
可导入JSP 档案产生继承自 ActionForm 之类,或自定义属性 ( property ) 产生继承自 ActionForm 之类。类产生后可选择是否自动完成 l 对应设定。
Action Wizard:
可产生继承自 Action之类,设定搭配之 JSP 档案、有效范围 ( scope ) 并自动完成 l 对应设定。
JSP from ActionForm Wizard:
可由指定之 ActionForm 自动产生使用 Struts Tag Libraries 之 JSP 档案。
除了上述精灵外,JBuilder 可协助开发人员自动设定l 部署描述档,以便 JSP使用 Struts 自定义 Tag Libraries。
使用实例
本文尝试开发一个简易的 Web 应用程序以帮助读者了解Struts Framework。此 Web 应用程序允许使用者输入两独立字符串,并将两字符串连接后显示于网页。由于处理
逻辑过于简单,此实例中我们打算直接在扮演 Controller 角的 Action 中完成两字符串连接动作,因此未使用一扮演 Model 角之 JavaBean 或类来处理字符串连接。
步骤一: 建立 Web 应用程序
首先点击选择 JBuilder 集成开发环境主菜单 File | New
Project…建立一个名为 StrutsDemo 之项目。接着由菜单File | New… 激活Object Gallery 对话框,并点击选择
Web 页次中的 Web Application 精灵准备建立 Web 应用程序。
Web Application 精灵会为此 Web 应用程序准备妥产生
WAR 所需之部署描述档  l,WAR 是 J2EE 规格中用以简化 Web 程序部署复杂度之标准档案格式。我们为此 Web 应用程序命名为 demo,往后将会在编译此项目档时产生名为 demo.war 档案以便于部署,在此 Web 应用程序中由于将会用到 Struts 之 Tag Libraries,因此在
JSP/Servlet frameworks 中勾选 Struts 1.0,同时JBuilder 会自动设定妥 l。
步骤二 : 建立自定义之 ActionForm 类
Struts Framework 中并未限制 MVC 三部份开发顺序,由于此时我们并未准备妥可输入两字符串之 HTML或
JSP,因此尝试先建立储存信息之 ActionForm 类,再产生扮演 Controller 角之 Action 类,最后再由 ActionForm 类产生 JSP 档案,读者可依状况调整顺序以适应实际案例。
3
点击选择Object Gallery 对话框 Web 页次中 ActionForm Wizard 可产生自定义之 ActionForm 类,ActionForm Wizard 分为三步骤,步骤一中精灵自动侦测出之前已建妥之 Web 应用程序demo,我们将自定义 ActionForm 名称由预设 Untitled1ActionForm修改为 myActionForm,接着按下 Next 按钮进入步骤二。
步骤二中,依照需求将未来 JSP 页面上所需显示与输入的字段加入 Field definition 清单方块中,倘若负责网页美工专职人员已备妥输入用JSP 网页,亦可按下 Add from JSP… 按钮直接导入,JBuilder 将解析此 JSP 档案产生Field definition 表格。本例中由于未准备输入之 JSP 档案,因此必须自行加入所需之字段。我们为此 Web 应用程序预先准备三个字段,fieldA 与 fieldB 可储存输入之字符串,fieldResult 可置放两字符串连接后结果。设定完成后按下 Next 按钮进入步骤三。
步骤三对话框提示是否将 myActionForm 加入 l 组件档中?是否需要产生 reset 方法?可依照默认值按下 Finish 按钮。
此时 ActionForm Wizard 已经自动产生了继承自
ActionForm 之 myActionForm.java 档案,如果您不打算实现资料核验之 validate 方法,您完全无须撰写任何程序代码。
步骤三 : 建立自定义之 Action 类
点击选择Object Gallery 对话框 Web 页次中 Action Wizard 可产生自定义之 Action 类,Action Wizard
分为两步骤,步骤一中精灵自动侦测出之前已建立之 Web 应用程序
demo与 l 组件档,我们将自定义 Action名称由预设 Untitled1Action修改为 myAction,接着按下
Next 按钮进入步骤二。
步骤二对话框中,我们可以设定 myAction 的 perform方法会传入哪一个 ActionForm,在 FormBean Name 组合方块中,所有记录于 l 中的 ActionForm 都会列出以供选用,此外我们设定 myAction 之有效范围
( Scope ) 为 Session,并指明/input.jsp所有输入动作,将交由 myAction 处理。
4
5
按下 Finish 按钮后即产生 myAction.java 档案。在 myAction.java 中,JBuilder 已经自动产生了 perform 方法与尚未实现之例外程序代码,我们将 perform 内的程序代码做以下之修改,已完成字符串连接的动作:
myActionForm myActionForm=(myActionForm)ActionForm ; String sA = FieldA ( ) ;
String sB = FieldB ( ) ; myActionForm.setFieldResult (sA+sB) ; return ( actionMapping.findForward ( "input" ) ) ;
由于 perform 方法会传入参数 ActionFrom 以便获知 Web 浏览器内使用者输入之字符串,在此 JBuilder 已将 ActionForm  转型 ( Type Cast ) 为 myActionForm 之程序代码产生完成,开发人员仅需以 getFieldA 与 getFieldB 方法即可得知使用者输入之字符串,并将连接后结果以 setFieldResult 方法回存fieldResult 属性。return 将决定负责显示之 JSP 网页,利用perform 方法传入参数 actionMapping  之 findForward 方法,可用以指定显示之 JSP 网页。之前精灵对话框中已预设 /input.jsp  为负责输入之 JSP 网页,Struts 中允许输入与显示同为一个 JSP 网页,因此我们需在 l 中定妥名为 input  之 Forward  标记,以便 findForward  方法能够利用此标记得知真正 JSP 网页名称 /input.jsp 。
步骤四 : 设定 Forward 标记
点击选择 JBuilder 左上方之项目窗格 ( Project Pane ) 内之 l ,此时集成开发环境便可以图形使用者接口方式编辑 l 内容,左下方结构窗格
( Structure Pane ) 会依照 l 结构,分为 Data Sources 、Form Beans 、Global Forwards 与 Action Mappings 四类标记项目。
当点击选择 Global Forwards 项目后 JBuilder 右方内容窗格 ( Content Pane ) 将出现如图所示之编辑画面,开发人员可按下 Add 按钮加入名为 input  之标记,并指明此标记对应路径为 /input.jsp 。
对于已经熟悉 Struts Framework 的开发人员, 若欲直接修改 l 内容,可以点击选择内容窗格中的 Source 页次,此时内容窗格如图所示将以文字编辑器显示 XML 内容,您可自由选择习惯之方式维护 l 内容。
步骤五 : 产生 JSP
接下来我们将尝试利用现有 myActionForm.java 产生 /input.jsp ,点击选择Object Gallery 对话框 Web 页次中JSP from ActionForm Wizard ,将出现以三步骤产生 JSP 之精灵。