本文描述了如何对 WebSphere Studio Application Developer V5.1.2(以下称为 Application Developer)进行设置,以使用 Struts 脚本工具在 Jython 中实现 ActionClass。使用脚本语言开发 Struts 操作,可以使编写-测试周期更短,且可以重用现有的 Jython/Python 脚本,而无需将其转换为 Java。通过选择 Jython 作为脚本语言,您可以轻松地与 Java 交互并使用 Struts 框架类。不过配置有一些麻烦,因为这基于 Bean Scripting Framework、Struts 脚本工具以及 Jython。本文提供了自定义此环境的循序渐进指南。本文要求读者对 WebSphere Studio、Struts 和 Jython 或 Python 有所了解。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
引言
Struts 是一个使用 Servlet 和 JavaServer Pages (JSP) 的模型-视图-控制器 (MVC) 框架实现。使用 Struts 框架的 Web 应用程序通常具有多个 ActionClass,而其中每个 ActionClass 都代表某种业务处理。ActionClass 将响应委托给使用 struts-config.xml
定义的逻辑名称的客户机。通常用 Java 编写 ActionClass,但也可以借助 Struts 脚本工具使用流行的脚本语言编写 ActionClass 和重用 JavaScript、Python、Jython 或 TCL 代码。Python 是一种面向对象的可扩展高级解释编程语言,其功能强大,语法清楚。此语言支持各种各样的应用程序,包括从简单的文本处理脚本到交互 Web 浏览器等等。Jython 是 Python 的百分之百纯 Java 实现。通过使用 Jython,可以同时使用 Java 库和 Python 库,重用现有的脚本,而且,由于脚本在运行时加载,因此还可以缩短测试编码周期。在使用 Struts 的普通 Web 应用程序中,如果更改 ActionClass,Application Developer 将会注意到这一情况,并将重新加载修改过的类。通过使用脚本语言,Application Developer 无需重新加载任何东西:ActionClass 会始终保持不变,您只应更改脚本。但使用 Python 的最重要的好处在于工作效率的提高。请参阅 side-by-side feature comparison of Java and Python。
配置工作区
您将需要安装和配置四个软件包(请参阅下面的参考资料)。
必备软件
- WebSphere Studio Application Developer V5,此软件中包括 Struts 支持。
- Jython 解释器。要安装此软件,请下载
jython-21.class
文件,然后执行 java jython-21
。根据您的 JDK 版本修改此命令——要获得有关安装的详细信息,请参阅下面的参考资料。
- 利用 Struts 脚本工具,Struts 开发人员可以使用各种流行的脚本语言编写 Action,并对脚本的执行环境进行自定义。
- Bean Scripting Framework 是用于在 Java 中使用各种脚本语言及与这些脚本语言交互的 Java 框架。Struts 脚本工具使用 Bean Scripting Framework 加载和调用脚本。
可选软件
- 用于 Application Developer 的 Python 插件。我们安装的是 pyeclipse,不过您可以选择您喜欢的插件。此插件不是必需的,不过它的确使得工作区更为友好。通过将
org.python.pyeclipse_0.0.1
目录复制到 Application Developer 安装程序中并重新启动 Application Developer,即可安装此插件。有关使用 Python 和 Eclipse 的信息,请参阅下面的参考资料。
- Struts 框架的最新版本。此软件可以下载,但在本文中,我们使用 Application Developer 附带的。
构建 Web 应用程序
创建项目
- 启动 Application Developer。
- 打开 Web 透视图。
- 创建一个新的 Web 项目:选择 File => New => Dynamic Web Project。可以立即添加 Struts,也可以稍后进行。要立即添加,请选中 Configure advanced options,转到 Features 页,然后选择 Add Struts support。
- 创建一个新的 Enterprise Application Project:选择 File => New => Project => J2EE => Enterprise Application Project。将 Web 项目添加到该应用程序项目。
配置项目
- 如果没有创建具有 Struts 支持的项目,或者正在重用旧项目,可以通过使用 Web 项目“Properties”页中的“Web Project Features”添加此支持。
- 将 JAR 文件
StrutsScripting11.jar
、bsf.jar
和 jython.jar
导入到 WebContent\WEB-INF\lib
目录中。
创建主 JSP
- 在 Web 项目中,右键单击 WebContent 文件夹,然后选择 New JSP File。
- 将其命名为
Login.jsp
(我们的 Web 应用程序的主页面将为登录页)。
- Application Developer 已创建了 JSP 骨架。您必须用您的 JSP 内容填写
<BODY>
部分:
<h1>Login</h1> <html:errors/> <html:form action="/login.do"> User: <html:text property="user"/><br> Password: <html:password property="password"/><br> <html:submit property="submit" value="Ok"/> <html:reset/> </html:form>
|
基本上,当用户单击 OK 时,此 JSP 会调用链接到逻辑操作登录的 Action 类。
编写脚本的操作
此时,Struts 开发人员将用 Java 编写登录操作,从而加载下一个 Web 页。不过,我们希望使用脚本语言编写操作,因此,我们将使用 ScriptedAction 类,该类会对 Struts Action 进行扩展以执行脚本。
ScriptedAction 类使用 Bean Scripting Framework (BSF) 加载和调用脚本。ScriptedAction 目前仅支持 BSF 支持的语言。
配置 ScriptedAction
要配置 ScriptedAction,type 属性必须引用 com.ibm.etools.struts.scripting.ScriptedAction
类,而 parameter 属性必须包含指向将要由 ScriptedAction 执行的脚本文件的上下文根相对路径。修改 struts-config.xml
以添加以下代码:
<action-mappings> <action name="loginForm" path="/login" scope="session" type="com.ibm.etools.struts.scripting.ScriptedAction" input="/Login.jsp" parameter="/scripts/LoginAction.py"> <forward name="success" path="./YourNextJSP.jsp"> </forward> <forward name="failure" path="./Login.jsp"> </forward> </action> </action-mappings>
|
也可以选择 Action Mappings 选项卡通过 Struts Configuration File Editor 进行此操作。然后可以创建名为 /login
的 Action Mapping:
图 1. 配置 Action Mapping之后,切换到 Local Forwards 选项卡,并创建加载 YourNextJPS.jsp
的转发成功:
图 2. 配置本地转发成功最后,采用与转发成功相同的方式,创建将重新加载 Login.jsp
的转发失败。
当用户单击 OK 时,Struts 框架(使用 Struts 脚本工具,而该工具使用 Bean Scripting Framework)将执行脚本 LoginAction.py
。
为 ScriptedAction 开发脚本
下一步是编写 LoginAction.py
。将需要与 Struts 框架进行交互,以获取和设置 Bean 表单中的信息,并指定下一个操作,等等。您将可以使用 Struts(ScriptedAction 类提供的一个上下文对象)进行此项工作。此对象具有以下方法:
String getScriptPath() |
指向调用的脚本的路径 |
void setForward(ActionForward) |
设置当脚本完成执行时 ScriptedAction 将返回转发 |
ActionMapping getMapping() |
传递给 Action.execute() 的映射参数 |
ActionForm getForm() |
传递给 Action.execute() 的表单参数 |
ServletRequest getRequest() |
传递给 Action.execute() 的请求参数。 |
ServletResponse getResponse() |
传递给 Action.execute() 的响应参数 |
boolean isHttpCall() |
是否通过 Action.execute(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) 调用此 Action |
ScriptedAction getAction() |
调用脚本的 ScriptedAction |
ActionForward findForward(String name) |
按名称查找转发(调用 mapping.findForward()) |
为 ScriptedAction 开发脚本时,Struts 对象将提供进行此项工作所需的全部上下文和参数。通过脚本可以使用 Action 类所有受保护方法:调用 Struts.getAction()
,将会得到 Action 实例。
指定脚本语言
Struts 脚本工具可以执行用一些脚本语言编写的 Scripted Action,因而需要指定将使用哪种语言。编辑 struts-config.xml
并添加 ScriptedEnvironmentPlugin
和两个映射扩展:一个指定配置文件,另一个启用调试模式(为了查看 Jython 特定的语言错误,必须启用此模式)。
要这样做,请打开 Struts Configuration File Editor 并如下填写 Plug-ins 页:
图 3. 配置 ScriptEnvirontmentPlugin
另外,也可以将以下代码行添加到 struts-config.xml
中:
<plug-in className="com.ibm.etools.struts.scripting.ScriptEnvironmentPlugin"> <set-property property="scriptEnvironmentFile" value="/WEB-INF/script-env.xml"/> <set-property property="debug" value="true"/> </plug-in>
|
然后,创建插件配置文件并为要使用的脚本语言添加一个新标记:
<script-environment> <language name="jython"> </language> </script-environment>
|
编写脚本
脚本应完成与普通 Struts Action 类相同的工作:保存 Bean 表单中的一些数据(在本例中为用户信息)、进行一些处理(例如,主要凭证验证)并指定本地转发进行执行,换句话说,指定下一个应该加载的页面(在本例中, 如果验证成功,则加载第一个应用程序 Web 页,否则重新加载登录页)。可以将脚本放置在名为 scripts
的文件夹中,以保持工作区整洁。事实上,回头看看图 2,您将发现操作的属性参数,它是脚本路径(相对于 WebContent
),假定脚本在此文件夹中。下面是脚本的内容:
import sys sys.path.append("YourExistingPythonCodeDirectory") sys.add_extdir("YourWebProjectDirectory\\webcontent\\web-inf\\lib") import org.apache.struts.action import repository form = Struts.getForm() mapping = Struts.getMapping() request = Struts.getRequest() userPassword = {"admin":"psswd1", "g01":"psswd2", "u01":"psswd3"} userRoles = {"admin":"Administrator", "g01":"Guest", "u01":"User"} user = form.getUser() password = form.getPassword() forward = "failure" if (user in userPassword): if (password == userPassword[user]): request.setAttribute("user", user) role = userRoles[user] request.setAttribute("role", role) forward = "success" else: errors = org.apache.struts.action.ActionErrors() errors.add("invalidpassword", org.apache.struts.action.ActionError("error.invalid.password")) action.saveErrors(request,errors) else: errors = org.apache.struts.action.ActionErrors() errors.add("invaliduser", org.apache.struts.action.ActionError("error.invalid.user")) action.saveErrors(request,errors) Struts.setForward(mapping.findForward(forward))
|
我们正在执行一个简单的验证,并对 user
和 role
属性进行设置,以在打开下一个 JSP 时显示它们。看一看脚本,您会发现可以像在普通 ActionClass 中一样创建 ActionErrors。本例中,我们要处理的错误为 invalid user
和 invalid password
。事实上,我们可以使用所需的任何 Java 类,如 Java 跟踪(例如 log4j,虽然我们并没有对此类进行测试)。如果要使用错误,则编辑 ApplicationResources.properties
文件,以在其中添加合适的行。下面是我们要使用的文件之一:
title=Login <hr><h3>Errors</h3><ul> errors.header=<hr><h3>Errors</h3><ul> errors.footer=</ul><hr> errors.required={0} is required loginForm.password=Password loginForm.user=User name errors.minlength={0} cannot be less than {1} errors.maxlength={0} cannot be greater than {2} error.invalid.user=<li>Invalid user error.invalid.password=<li>Invalid password
|
创建 Action Form
前一个脚本存储 loginForm(参阅上面的图 2)中的信息。下一个加载的 JSP 将访问此信息。使用 Application Developer 向导构建表单:选择 File => New => Other => Web => Struts => ActionForm class。在本例中,我们将表单命名为 LoginForm
,并将其包括在 Java 软件包 com.ibm.strutswithjythonweb.forms
中。该表单如下所示(我们删除了一些由向导生成的注释):
package com.ibm.strutswithjythonweb.forms; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionMapping; public class LoginForm extends ActionForm { private String user = null; private String password = null; private String role = null; private String submit = null; public String getUser() { return user; } public void setUser(String u) { this.user = u; } public String getPassword() { return password; } public void setPassword(String p) { this.password = p; } public String getRole() { return Role; } public void setRole(String role) { this.role = role; } public String getSubmit() { return submit; } public void setSubmit(String s) { this.submit = s; } public void reset(ActionMapping mapping, HttpServletRequest request) { // Reset values are provided as samples only. Change as appropriate. user = null; password = null; role = null; submit = null; } public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ActionErrors errors = new ActionErrors(); // Validate the fields in your form, adding // adding each error to this.errors as found return errors; } }
|
如果不想使用 Java,则可以使用 DynaActionForm
类,此类是通过 struts-config.xml
配置的。将此 Action Form 与 ScriptedAction 结合使用,可以不使用 Java 即可完成相应的工作。
配置框架以使用 Bean 表单
编辑 struts-config.xml
,添加以下代码行:
<form-beans> <form-bean name="loginForm" type="com.ibm.strutswithjythonweb.struts.LoginForm"> </form-bean> </form-beans>
|
可以使用 Struts Configuration File Editor,如图 4 所示:选择 Form Beans 选项卡,然后单击 New。
图 4. 配置表单
检查表单属性名称和类型是否与 ActionForm 名称和软件包匹配。这些名称区分大小写。
创建要加载的下一个 JSP
在本例中,我们将只创建在本地转发成功执行(如果验证成功)的情况下加载的 JSP。此 JSP 访问 ActionForm 以获得用户的信息。如果凭证验证成功,前面的操作将保存用户信息(请参阅 LoginAction.py
)。可以像创建 Login.jsp
一样创建此 JSP,并向 body 部分添加以下代码行:
<P>The user <%=request.getAttribute("user")%>> logged in with role <%=request.getAttribute("role")%>></P>
|
测试 Web 应用程序
测试 Struts Web 应用程序之前的最后一步是创建服务器并自定义其环境,如图 5 所示。基本上,您必须添加在“Configuring the project to the WebSphere-specific classpath”部分列出的所有 JAR 文件并设置一些环境变量,才能查找 Jython 代码 (python.home
) 和 Python 代码 (python.path
),然后设置 Python 模式以进行调试。
图 5. 配置服务器
现在,可以启动服务器并在 Web 浏览器中加载 Login.jsp
,也可以右键单击 Login.jsp
并选择 Run on server。如果单击 OK,将执行 LoginAction.py
并加载 YourNextJSP.jsp
。
使环境更加灵活
随着应用程序不断增大,您必须编写许多 Struts Action,您将发现所有 Jython 脚本的开头和结尾都是一样的。正如脚本中所示,一些常见的任务在所有的脚本中都是重复的。为了避免这种重复,请使用前缀脚本(在执行 Scripted Action 中指定的脚本之前执行的脚本)和后缀脚本(之后执行的脚本)。可以在 Scripted Action 脚本与前缀脚本和后缀脚本间共享变量。下面是一个示例 prefix.py
,其中包含了将在 Scripted Action 中使用的最常见的对象:
form = Struts.getForm() action = Struts.getAction() mapping = Struts.getMapping() request = Struts.getRequest() response = Struts.getResponse()
|
可以使用此脚本添加 Python 软件包导入。在我们的示例中,不需要 suffix.py
脚本,因为脚本结尾处重复的代码行并不多。但我们的确必须指定接下来将要加载的页:
Struts.setForward(mapping.findForward(forward))
|
最后,必须告知框架使用此脚本:编辑 script-env.xml
,为 Jython 语言添加 prefix-script
和 suffix-script
标记:
<script-environment> <language name="jython"> <prefix-script path="/WEB-INF/script-env/prefix.py"/> <suffix-script path="/WEB-INF/script-env/suffix.py"/> </language> </script-environment>
|
结束语
用 Jython 编写 Struts Action 使得 Struts 框架更加灵活,但安装和配置所需的软件包却并非易事。本文说明了如何对它们进行配置,从而使您能够受益于 Python 的强大功能和清晰语法。而且,它还使得编码周期更短:只需修改 Action Class、重载页面并执行相应的用户操作即可。如果更改仅仅影响 Scripted Action,则没有必要再重新启动服务器了。
致谢
感谢 Xavier Verg Farrero 鼓励我们撰写这篇文章并对其进行了修改,感谢 Jordi Buj Aris 仔细阅读了全文并与我们就 Struts 进行了非常有益的讨论,感谢 David Charboneau 帮助我们配置 StrutsScripting 工具。
分享到:
相关推荐
《WebSphere Application Server ...以上就是《WebSphere Application Server Administration Using Jython》中的主要知识点,通过学习和实践,你将能够熟练地使用Jython进行WebSphere的自动化管理和运维工作。
WebSphere Studio不仅作为一个开发工具,还能无缝集成WebSphere Application Server,允许开发者在开发环境中直接预览和测试应用。通过WebSphere Studio,可以方便地监控服务器状态,查看日志,进行性能分析,以及...
3. **Jython与WebSphere接口**:阐述如何使用Jython脚本与WebSphere的管理API交互,如AdminClient、AdminService等,这些接口允许管理员执行如部署应用、监控服务器状态、管理资源等操作。 4. **自动化管理任务**:...
WebSphere Studio Application Developer (WSAD) 是IBM推出的一款强大的集成开发环境,主要用于构建、测试和部署基于Java EE(Java Platform, Enterprise Edition)的应用程序。在Version 5的时代,它主要聚焦于EJB...
【标题】"WebSphere自动配置的脚本"指的是在IBM的WebSphere Application Server(WAS)环境中,通过编写脚本来实现自动化配置的过程。这通常是为了提高效率,减少手动配置的错误,特别是在大型企业环境中,当需要对...
在使用WebSphere Application Server(WAS)部署基于Struts2.0的应用时,可能会遇到一些问题导致Struts2无法正常工作。这个问题通常表现为在尝试访问Struts2控制的页面时,返回HTTP 500错误,并且日志中显示"Filter ...
【标题】"在 WebSphere Studio V5.1.2 中使用代码片段进行 EJB 编程"涉及到的关键知识点包括WebSphere Studio的版本信息、企业级JavaBeans (EJB) 编程、代码片段的使用以及应用程序开发工具。在这个场景中,...
IBM WebSphere Studio 是IBM公司开发的一款集成开发环境(IDE),专门用于构建基于Java EE(Java Platform, Enterprise Edition)的应用程序,它在WebSphere应用服务器上运行,提供了全面的开发工具和服务,以帮助...
- **插件开发工具**:允许开发者创建自定义工具和功能,满足特定项目需求,增强了WebSphere Studio的适应性和扩展性。 综上所述,《WebSphere Studio应用开发指南》不仅是一部详尽的开发手册,更是企业级应用开发者...
websphere自动启服务shell脚本
通过结合使用`wsadmin`工具和Jython脚本,可以高效地自动化WAS的配置和应用部署流程。XML文件的引入增加了灵活性,使得配置脚本可以适应各种环境变化。理解并熟练掌握这些技术,对于提升WAS环境管理的效率和准确性至...
Jython将Python语言的灵活性和简洁性与Java平台的强大功能相结合,使得开发者能够在Java环境中利用Python进行开发。 描述中的博文链接指向了ITEYE博客上的一篇文章,虽然具体内容没有给出,但可以推测这篇文章可能...
根据提供的文件信息,可以看出这里似乎混杂了几部分内容:一个是关于使用 Jython 脚本管理 WebSphere Application Server 的英文资料介绍;另一个则是两本书籍的简介,分别涉及使用 WebSphere Portlet Factory 开发 ...
### WebSphere Studio Application Developer与Web服务自学习指南 #### 标题解读: 标题"Self-Study Guide: WebSphere Studio Application Developer and Web Services"表明这是一份专注于IBM WebSphere Studio ...
### IBM Redbook - WebSphere Studio ...通过深入理解IBM Redbook中关于WebSphere Studio 5.1.2对于JSF和SDO的支持,开发者可以充分利用这些工具和技术,加速Java Web应用程序的开发过程,同时保持代码质量和可维护性。
启动IBM WAS集群上的所有服务器,使用Jython实现,调用方法wsadmin.sh -f StartAllServers.py
本篇文章将详细介绍如何利用IBM WebSphere生成heapdump以及使用分析工具"ha456"进行故障排查。 首先,让我们理解heapdump的生成过程。在IBM WebSphere中,可以通过以下步骤创建heapdump: 1. 登录到WebSphere管理...
在使用WebSphere 7.0部署Struts2应用程序时,可能会遇到一个问题,即"找不到用于处理JSP的扩展处理器"。这个问题通常与Web容器对JSP的支持和扩展处理器的初始化失败有关。以下是对该问题的详细分析和解决方法: 1. ...