一、jbuilder 对于 struts 之支持
jbuilder 提供图形使用者接口以简化组件文件 struts-config.xml 之编辑与设定,此外,jbuilder 于 object gallery对话框内的 web 页次,提供四种精灵以简化 struts 开发流程。
struts c wizard:
可指定 html 或一般 jsp 档案自动产生使用 struts tag libraries 之 jsp 档案。
acti wizard:
可导入jsp 档案产生继承自 acti 之类,或自定义属性 ( property ) 产生继承自acti 之类,类产生后可选择是否自动完成 struts-config.xml 对应设定。
action wizard:
可产生继承自 action 之类,设定搭配之 jsp 档案、有效范围 ( scope ) 并自动完成struts-config.xml 对应设定。
jsp from acti wizard:
可由指定之 acti 自动产生使用 struts tag libraries之 jsp 档案。
除了上述精灵外,jbuilder 可协助开发人员自动设定web.xml 部署描述档,以便 jsp 使用struts 自定义 tag libraries 。
二、使用jbuilder开发struts实例
我们在这里举开发一个简易的 web 应用程序的例子来帮助大家了解struts framework。此 web 应用程序允许使用者输入两独立字符串,并将两字符串连接后显示于网页。由于处理逻辑过于简单,此实例中我们打算直接在扮演 c action 中完成两字符串连接动作,因此未使用扮演 model 角色之 javabean 或类来处理字符串连接。
步骤一: 建立 web 应用程序
首先点击选择 jbuilder 集成开发环境主菜单 file | new project… 建立一个名为strutsdemo 之项目。接着由菜单file | new… 激活object gallery 对话框,并点击选择web 页次中的 web application 精灵准备建立 web 应用程序。
web application 精灵会为此 web 应用程序准备妥产生war 所需之部署描述档 web.xml,war 是 j2ee 规格中用以简化 web 程序部署复杂度之标准档案格式。我们为此 web 应用程序命名为 demo,往后将会在编译此项目档时产生名为 demo.war 档案以便于部署,在此 web 应用程序中由于将会用到 struts 之 tag libraries,因此在jsp/servlet frameworks 中勾选struts 1.0,同时jbuilder 会自动设定妥 web.xml。
步骤二 : 建立自定义之 acti 类
struts framework 中并未限制 mvc 三部份开发顺序,由于此时我们并未准备妥可输入两字符串之 html 或jsp,因此先建立储存信息之 acti 类,再产生扮演 c 角色之 action 类,最后再由 acti jsp 档案,大家可依状况调整顺序以适应实际案例。点击选择object gallery 对话框 web 页次中 acti 可产生自定义之 acti 类,acti 又可分为三步:第一步精灵自动侦测出之前已建妥之 web 应用程序demo,我们将自定义 acti 名称由预设 untitled1acti 修改为 myacti next 按钮进入第二步。第二步依照需求将未来 jsp 页面上所需显示与输入的字段加入 field definition 清单方块中,倘若负责网页美工专职人员已备妥输入用jsp 网页,亦可按下 add from jsp… 按钮直接导入,jbuilder 将解析此 jsp 档案产生field definition 表格。本例中由于未准备输入之 jsp 档案,因此必须自行加入所需之字段。我们为此 web 应用程序预先准备三个字段,fielda 与 fieldb 可储存输入之字符串,fieldresult 可置放两字符串连接后结果。设定完成后按下 next 按钮进入第三步。
步骤三对话框提示是否将 myacti 加入 struts-config.xml 组件档中?是否需要产生reset 方法? 可依照默认值按下 finish 按钮。
此时 acti wizard 已经自动产生了继承自acti 之 myactionform.java 档案,如果我们不打算实现资料核验之 validate 方法,我们完全无须撰写任何程序代码。
步骤三 : 建立自定义之 action 类
点击选择object gallery 对话框 web 页次中 action wizard可产生自定义之 action 类,action wizard 分为两步:第一步精灵自动侦测出之前已建立之 web 应用程序demo 与 struts-config.xml 组件档,我们将自定义 action 名称由预设 untitled1action 修改为 myacti 按钮进入第二步。
在第二步对话框中,我们可以设定 myaction 的 perform 方法会传入哪一个 acti name 组合方块中,所有记录于 struts-config.xml 中的 acti 都会列出以供选用,此外我们设定 myaction 之有效范围( scope ) 为 session,并指明/input.jsp 所有输入动作,将交由 myaction 处理。
按下 finish 按钮后即产生 myaction.java 档案。在myaction.java 中,jbuilder 已经自动产生了 perform 方法与尚未实现之例外程序代码,我们将 perform 内的程序代码做以下之修改,已完成字符串连接的动作:
myacti myacti ;
string sa = myactionform.getfielda ( ) ;
string sb = myactionform.getfieldb ( ) ;
myactionform.setfieldresult (sa+sb) ;
return ( actionmapping.findforward ( "input" ) ) ;
由于 perform 方法会传入参数 acti 以便获知 web浏览器内使用者输入之字符串,在此jbuilder 已将acti 转型 ( type cast ) 为 myacti 之程序代码产生完成,开发人员仅需以 getfielda 与 getfieldb 方法即可得知使用者输入之字符串,并将连接后结果以setfieldresult 方法回存fieldresult 属性。return 将决定负责显示之 jsp 网页,利用perform 方法传入参数acti 之 findforward 方法,可用以指定显示之jsp 网页。之前精灵对话框中已预设 /input.jsp 为负责输入之 jsp 网页,struts 中允许输入与显示同为一个 jsp 网页,因此我们需在 struts-config.xml 中定妥名为 input 之forward 标记,以便 findforward 方法能够利用此标记得知真正 jsp 网页名称 /input.jsp。
步骤四 : 设定 forward 标记
点击选择 jbuilder 左上方之项目窗格 ( project pane ) 内之struts-config.xml,此时集成开发环境便可以图形使用者接口方式编辑 struts-config.xml 内容,左下方结构窗格( structure pane ) 会依照 struts-config.xml 结构,分为 datasources 、form beans、global forwards 与 action mappings四类标记项目。
当点击选择 global forwards 项目后 jbuilder 右方内容窗格( c pane ) 将出现如图所示之编辑画面,开发人员可按下 add 按钮加入名为 input 之标记,并指明此标记对应路径为 /input.jsp。
对于已经熟悉 struts framework 的开发人员, 若欲直接修改 struts-config.xml 内容,可以点击选择内容窗格中的source 页次,此时内容窗格如图所示将以文字编辑器显示 xml 内容,我们可自由选择习惯之方式维护 struts-config.xml 内容。
步骤五 : 产生 jsp
接下来我们将利用现有 myactionform.java 产生/input.jsp,点击选择object gallery 对话框 web 页次中jsp from acti wizard,将出现以三步产生 jsp 之精灵:
在第一步对话框中,我们可将欲产生的 jsp 档名由预设之untitledjsp1.jsp 改为 /input.jsp,并可按下 [ … ] 按钮以选取 acti 选取对话框有两种查找模式,我们可以浏览 java package 树状结构直接选取myactionform。
或是键入java 类前缀名称,jbuilder 将会自动查找相符之类。例如我们键入 myacti 的前缀 my,将可见到对话框查找到两个相符之类。此一便捷选取类别之对话框,可在jbuilder 编辑器中以热键 ctrl-alt-h随时激活使用。
选取 myacti 完毕后,按下 next 按钮可进入至第二步对话框。jbuilder 将分析myactionform.java 内容显示其字段,我们可以组合方块决定该字段将以何种 struts tag 搭配显示,本例中三个字段皆使用可输入文字、预设之 text 型态,按下 next 按钮即进入第三步。第三步对话框针对 struts tag libraries 特性,提供多种选项,并且询问是否将全部之struts tag libraries 宣告导入至jsp 档中。本例我们采用默认值,按下 finish 按钮后 jbuilder 即产生 /input.jsp。
步骤六 : 设定执行组件
接着我们可以设定执行组件以测试本程序。点击选择jbuilder 集成开发环境主菜单 project | project prosperities… 将出现项目属性设定之对话框,点击选择run 页次准备设定执行组件。jbuilder 允许在单一项目中拥有多个执行组件,可执行 java applicati applet、j2me midlet 及 j2ee 各式 server 端应用程序。
本例中将建立一个 server 类型之执行组件。按下对话框右侧 new… 按钮将会出现执行组件属性设定对话框,以新增一个执行组件。
执行组件属性设定对话框中,我们可以键入一识别用途之名称于 name 字段,本例中我们键入中文识别名称 "执行 input.jsp",在 run 页次 type 组合方块中可选取server 类型应用程序,由于本例我们采用 jbuilder 内置之 tomcat 4.0 为 jsp/servlet c server 下拉盒选取 tomcat 4.0。倘若我们的 server 组合方块中无适当选项可供选取,可于jbuilder 主菜单 tools | c server… 中进行相关设定。接着我们必须选取此 web应用程序激活 uri,我们可按下 launch uri 字段右侧 [ … ] 按钮,即可出现选取 uri 之对话框,我们可直接以鼠标点击选择左侧 input.jsp,按下 ok 按钮完成选取,并返回执行组件属性设定对话框。
此时执行组件属性设定对话框中主要项目皆已设定完毕,按下 ok 按钮返回项目属性设定对话框。项目属性对话框中将把前述步骤所设定之执行组件列于runtime c 清单方块中,按下 ok 按钮即完成执行组件设定。
步骤七 : 执行 web 应用程序
接下来可点击选择 jbuilder 菜单 run 或工具列中绿色三角形符号执行此 web 应用程序。jbuilder 将于集成开发环境内激活 tomcat 4.0 server,我们可以通过 jbuilder 内置之 web 浏览器进行测试,或于microsoft internet explorer 网址字段中键入:
http://localhost:8080/demo/input.jsp
以进行测试。在 web 浏览器中我们键入 aaa 与 bbb 按下 submit 按钮,得到预期之运算结果aaabbb。
倘若将第一个字段改以繁体中文键入,却发现产生乱码,字符串连接结果也无法正确辨认。struts framework并无中文兼容性上之问题,但是 tomcat 4.0 在使用 jsp处理内含中文请求时,并需设定请求编码。繁体中文环境常用编码为 big5 与 ms950,ms950 编码含括 big5 编码,并额外增加 碁、恒、里、妆、娴、锈、墙 等七字。
例如,在 microsoft windows 平台下,欲使 tomcat 4.0 正确处理繁体中文,通常在 jsp 起始处加上:
<%@ page c charset=ms950" %>
<% request.setcharacterencoding("ms950") ; %>
以设定网页内容编码与请求编码为 ms950 编码;类似地,对于简体中文(常用编码为gb2312),以上的代码应为:
<%@ page c charset=gb2312" %>
<% request.setcharacterencoding("gb2312") ; %>
但是 struts framework 中实际上是由 acti 收到web 浏览器端请求,再转交特定之 action 类加以处理,因此直接于 jsp 中设定请求编码并无效果。
三、处理中文编码问题(以繁体中文为例)
对于处理 struts framework 中文编码问题有多种方式,在此我们继承 acti 类并覆盖 process 方法,于子类process 方法中设定请求编码。由此展现acti 扮演前端 c 之特质。
首先,点击选择 jbuilder 主菜单 file | new classes 准备产生一新的类。并继承自org.apache.struts.action.acti 改为 myacti ok 按钮后即产生程序代码。点击选择 jbuilder 主菜单wizards | override methods… 激活覆盖方法精灵,覆盖方法精灵会自动列出父类 acti 所有可供覆盖之方法。我们可于 available methods 清单方块中选取process (httpservletrequest request, httpservletresp resp 方法,完成后按下 ok 按钮。
此时我们可修改覆盖后 process 方法程序代码如下:
request.setcharacterencoding ("ms950") ;
super.process (request, resp ;
备注:此处以繁体中文为例,在中国国内一般我们用的是简体中文,因此可以将上述代码在简体中文环境下编写为:
request.setcharacterencoding ("gb2312") ;
super.process (request, resp ;
首行程序代码将 process 传入之参数 request 设定为 ms950编码,其余行为同父类。接下来我们将要修改 web.xml部署描述档,以指定 servlet 之进入点,首先点击选择左上方项目窗格中的 web.xml。
此时,左下方结构窗格将出现 web.xml 内 xml 标记之树状结构。我们可以点击选择 servlets 内的 action 项目。
此时,便可运用右方内容窗格之图形使用者接口编辑器修改 servlet 进入点,目前预设之进入点是 struts framework 的 actionservlet。
我们可以按下 servlet class 项目右方 [ … ] 按钮选取新的进入点替换预设之actionservlet,也就是之我们撰写之strutsdemo.myactionservlet。倘若我们非常熟悉web.xml 结构,同样地可以直接点击选择内容窗格内的 sources 页次,直接以文字编辑器修改<servlet-class> 标记的内容。
修改完毕后,内容窗格内应如下图:
完成后重新编译此项目并执行之。再次测试后我们将发现繁体中文已经可以正确处理。