在XWorker介绍(3)中讲以实现一个发送邮件的功能组件,并演示如何在Java Application和WebApplication中调用这个功能。
其实了解XWorker的最好方法是直接在XWorker中操作一下,大家可以从附件中下载example项目更新一下,实际看看we架构和脚本例子的数据对象。脚本的功能演示写成了文档,所以在帖子中我就挑重要的说明一下。
提示:
- 数据对象+它的方法等于Java Class的效果
- 不要把XWorker理解成一个web应用,XWorker也可以当组件在Java类中使用
- 通过Context可以实现函数的可视化调用,这会大大降低对程序语言的掌握难度要求
要演示的功能说明
在这个演示中我们编写一个发送邮件的脚本(函数),然后演示其他脚本如何调用这个脚本(函数),并最终实现在Java的一般应用和Web应用中的使用发送邮件的脚本(函数)。
一下部分只贴代码部分,具体过程参看文档。
邮件发送脚本的实现
首在这里我们会定义一个SendMail结构数据对象,会定义邮件服务器地址、用户名、密码、发件人、收件人....等属性,会添加sendMail、inherit、success、exception和init五个方法,当把属性和五个方法定义完时邮件发送的脚本(函数)就实现了。
下面贴出其代码片段:
SendMail结构数据对象的xml代码片段
xml 代码
- <structure name="SendMail>
- <field label="邮件服务器地址" name="host"/>
- <field label="用户名" name="userName"/>
- <field label="密码" name="password"/>
- <field label="发件人" name="from"/>
- <field label="发件人姓名" name="fromName"/>
- <field default="success" label="何时发送" inputtype="select" name="when">
- <value value="init" label="init" name="init"/>
- <value value="success" label="success" name="success"/>
- <value value="exception" label="exception" name="exception"/>
- field>
- <field label="收件人" name="to"/>
- <field label="收件人姓名" name="toName"/>
- <field colspan="2" label="主题" size="60" name="subject"/>
- <field type="cdata" colspan="2" label="信息" inputtype="textarea" name="message"/>
- structure>
sendMail方法代码
java 代码
- import org.apache.commons.mail.MultiPartEmail;
-
- MultiPartEmail mail = new MultiPartEmail();
- mail.setHostName(self.host);
- mail.setAuthentication(self.userName, self.password);
-
- mail.setFrom(self.from, "");
- mail.setSubject(self.subject);
- mail.setMsg(self.message);
- mail.addTo(self.to, self.toName);
-
- mail.send();
这是一段groovy代码,self.host相当于在JavaClass里this.host。
init方法代码
java 代码
- if(self.when == "init"){
- self.exec("sendMail", binding);
- }
其他方法和init方法代码类似,省略。
实现对SendMail脚本(函数)的调用
在XWorker中创建并编辑一个脚本数据对象,以下是它的xml代码片段
xml 代码
- <script label="send" description="调用SendMail上下文发送电子邮件。" name="send">
- <contexts>
- <context name="mailContext" password="111" userName="111" from="11" to="11" host="smtp.tom.com"/>
- contexts>
- script>
以上就是脚本的基本概况,这里邮件服务器、邮件信息等参数都是定好的(在web程序里演示动态的)。
在Java类中调用以上脚本发送电子邮件:
java 代码
- import com.xworker.DataCenter;
-
- public class TestSendMail {
- public static void main(String args[]){
-
- DataCenter.getInstance().setPath("webroot/WEB-INF/data");
- DataCenter dataCenter = DataCenter.getInstance();
-
-
- dataCenter.runScript("example:config:context.SendMail:/@send");
- }
- }
执行这个JavaApplication就可以发送电子邮件了。
Web应用下实现对发送邮件的脚本(函数)的使用
在Web下使用发送邮件的脚本的原理是一样的,也是通过上下文的方式调用的(还有其他方式调用)。在Web这里我们编写两个Web页面,一个是编辑电子邮件信息的页面,一个是发送并显示结果的页面。
下面是编辑电子邮件信息的页面的数据象xml形式的概况(包括control,result和界面的定义)
xml 代码
- <webAction description="编辑电子邮件。" name="editMail">
- <result value="example:config:context.SendMailFromWeb:/@editMail/@view" name="success"/>
- <forms title="编辑电子邮件" name="view">
- <form action="do?sc=example:config:context.SendMailFromWeb:/@sendMail" target="_self" name="editForm">
- <group cols="1" title="布局容器" haveLabel="false" showTitle="false" haveTitle="false" name="layout">
- <structureEditBody isNestedInGroup="false" label="编辑邮件信息" name="mail">
- <structure label="电子邮件" name="mail" >
- <field colspan="2" label="发件人" description="请输入发件人的邮件地址。" size="60" name="from"/>
- <field colspan="2" label="收件人" size="60" name="to"/>
- <field colspan="2" label="主题" description="邮件的主题。" size="60" name="subject"/>
- <field colspan="2" label="内容" description="
邮件的内容。
"/>
- structure>
- structureEditBody>
- <cell colspan="2" label="cellButton" align="center" showTitle="false" name="cellButton">
- <button value="发送" type="submit" label="sendButton" name="sendButton"/>
- cell>
- group>
- form>
- forms>
- webAction>
-
下面是发送邮件并显示结果的Web页面的xml的概况(包括WebControl定义,脚本定义和result处理)
xml 代码
- <webAction description="发送电子邮件。" name="sendMail">
- <result value="core:config:forms.messageAndReturnBack" name="success"/>
- <scriptFlow script="
- mail = requestBean.getObject("mail", true);
-
- message = "发送邮件成功!";
- return "sendMail";
- " name="script">
- <scriptFlow script="return "success";" name="sendMail">
- <contexts>
- <context name="mail" from="$_{mail.from}" id="mail" to="$_{mail.to}"
- label="mail" host="host" .../>
- contexts>
- scriptFlow>
- scriptFlow>
- webAction>
以上代码中mail=requestBean.getObject("mail", true)是把界面提交的数据放入一个Map中。return "sendMail"是要执行脚本的子流程的sendMail脚本。在子流程中发送邮件的上下文中$_{}是要修改的变量,mail=reqeustBean.getObject("mail",true)就是为这些变量做了初始化。($_{}和${}的效果一样,可恶freemarker和groovy都用了,我在用就会冲突)
后记
希望大家能从演示中看出点什么来,毕竟了解新的东西需要有个过程。
附件example.rar是最新的example项目插件,里面包含了web框架演示和脚本演示的数据对象,解压后替换原来的即可,如果在使用中发现了什么bug请告诉我,XWorker还没有达到稳定的阶段。
ScriptExample.rar里包含了脚本功能演示的pdf文档。