简单的webflow应用
在此章节中,我们将通过使用webflow创建一个简单的应用来模拟跟踪装船出货信息的流程.这个简单的应用包括向用户发送mail传递跟踪信息的过程.在现实中,实际工作还应包括接受邮递跟踪信息,但我们在此省略以保持应用例子的简洁.
提示:pipelines是线形的,所以很难得到建立在pipeline上的分支结果,循环更是难上加难.所以,pipelines应该建立在具有线形属性的流上,且没有分支或循环发生.除非你需要事务处理,pipelines的使用一般有条件限制.
ebcc中的webflow
创建一个基于webflow的应用首先要将其在概念上加以分解.本文将提供一些良好的实践.将验证从业务逻辑分离是个不错的主意.在webflow的世界里,这意味着将验证逻辑放置在自身的inputprocessor中.
另外一个实践将引入pipelines和pipelinecomponts的选择. pipelines适用于商业逻辑组织在一起且没有分支和循环的情形.如果执行中的流是在许多不同的流发生后到达某固定的节点,你应该选择使用inputprocessors.同样的,如果你需要重复执行某相同的流,你应该选择inputprocessors.尽管如此,在这两种预先考虑的条件都不太适合的情形下,pipelines可能会更适合些.
最后,考虑流是否需要事务.比如,如果一个流包括2个步骤,而且这两步都必须执行成功并提交否则回滚,你应该将pipelinecomponents作为可支持事务的ejb组件.
在我们的应用中, 不管用户是否选择接受出货信息的email.都出现了分支的情形,所以,我们将我们的逻辑放入inputprocessors.在应用中有3个inputprocessors分别作为应用的3个逻辑步骤.分别为:
1.接受用户的输入并验证.
2.从系统后台接受出货信息.
3.选择出货信息的电子邮件给用户
隐含的第四个步骤为向用户展示出货的信息.这并不是业务逻辑的一部分,而应属于视图逻辑,所以被放到了jsp页面中.
此webflow,有下列inputprocessors和建立的jsp页面,如图1所示:
图1. 完整的webflow
你可以看到开始节点是一个索引视图节点。这个节点包含一个名为submit的单独事件(如图2所示),此事件使流导向examplevalidationip.
图2. webflow 事件
在这个节点上,有2个事件。第一个,如图3所示,是由com.bea.p13n.appflow.webflow.forms.invalidformdataexception的异常引发的事件。如果examplevalidationip类抛出异常的实例,webflow会根据此异常事件返回到索引视图节点。
图3. webflow 异常
图2和图3的有关资料相应见图4和图5
图4. webflow 事件信息
图 5. webflow 异常信息l
jsp页面
我们现在要开始编写执行验证和抛出异常的代码了。在此之前,我们首先要创建我们的jsp页面,或至少在我们的脑子里知道jsp页面要包括什么。我们需要一个单独的电子表单,让用户用来提供要跟踪的有关信息,比如要跟踪的号码等。用户将可以选择电子邮件和填写自己邮箱的地方。
作为webflow的一部分,bea提供了便于表单验证的自定义标签库。这些标签和相应的api被验证表但所调用。验证表单是webflow的保留特色.一般而言,一个验证表单可以使开发人员很容易通过name(httpservletrequest parameter的name)和简单的javabean属性进行验证。此api不支持复杂的javabean操作。
首先我们在jsp页面中插入标签库,例如:
<%@ taglib uri=”webflow.tld” prefix=”wf” %>
<wf:validatedform event="submit" namespace="example" applystyle="field" invalidstyle="color: red;">
tracking number <wf:text name="trackingnumber"/><br>
email? <wf:checkbox name="email" value="true"/><br>
email address <wf:text name="emailaddress"/><br>
<input type="submit" value="submit" name="submit"/>
</wf:validatedform>
//创建request javabean并保存至request中
trackingrequest trackingrequest = new trackingrequest();
request.setattribute("trackingrequest", trackingrequest);
validatedform vform = validatedformfactory.getvalidatedform();
validatedvalues vvalues = validatedvaluesfactory.getvalidatedvalues(request);
vform.validate(vvalues, string_validator, "trackingnumber", new minmaxexpression(10, 15),"the tracking number must be between 10 and 15 characters");
if (trackingrequest.isemail()) {
vform.validate(vvalues, string_validator, "emailaddress",
new minmaxexpression(10, 100),
"the email address must be between 10 and 100 characters");
}
if (vvalues.getinvalidfieldcount() > 0) {
throw new invalidformdataexception("please correct the invalid fields");
}//从request中接受trackingrequest
trackingrequest trackingrequest = (trackingrequest) request.getattribute("trackingrequest");
...
// 选择走向何处
return trackingrequest.isemail() ? "email" : "complete";
<jsp:usebean id="trackingdata" scope="request" type="com.inversoft.javaworld.trackingdata"/>
<jsp:usebean id="trackingrequest" scope="request" type="com.inversoft.javaworld.trackingrequest"/>
<p>
the value of your shipment:
<jsp:getproperty name="trackingdata" property="value"/>
</p>
<p>
the description of your shipment:
<jsp:getproperty name="trackingdata" property="description"/>
</p>
<%
if (trackingrequest.isemail()) {
%>
your shipment information has been emailed to:
<jsp:getproperty name="trackingrequest" property="emailaddress"/>
<%
}
%>
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器