站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题使用Webflow组件创建Web应用(二)

使用Webflow组件创建Web应用(二)

摘要: 使用Webflow组件创建Web应用(二)
内容: 简单的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” %>
  
JSP页面的验证表单如下:

Tracking number

Email?

Email address

<input type="submit" value="Submit" name="submit"/>


  验证节点
  现在我们开始创建JSP页面,我们可以从一个验证节点开始。我们将使用ValidatedForm的一些API:ValidatedFormFactory创建ValidatedForm类,ValidatedValuesFactory创建ValidatedValues类。ValidatedForm类和Validatedvalues类联合处理用户提供的每个表单的信息并判断每个电子表单项是否正确。这样,当验证错误发生时,我们的Webflow将导向用户返回到输入页面,ValidatedForm API将使表单域填入原来的输入值,而且有一些错误消息提示。
验证表单的代码如下:

//创建request JavaBean并保存至request中
TrackingRequest trackingRequest = new TrackingRequest();
request.setAttribute("trackingRequest", trackingRequest);

ValidatedForm vForm = ValidatedFormFactory.getValidatedForm();
ValidatedValues vValues = ValidatedValuesFactory.getValidatedValues(request);


//设置JavaBean值,但我们要将check box自动设置,因为BEA的
//Validated API并不对它处理
vForm.validate(vValues, trackingRequest);
...
// 验证要跟踪的号码
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");
}

  代码片段用到了validate()方法。此方法通过request parameter进行验证,使用到了validator的名字(这里我们使用BEA提供的STRING_VALIDATOR),在验证过程中也使用了表达式来作辅助。

  另外一项验证的特色是validated form是JavaBean的入口。我们在代码中使用到了validate()方法,使用了validatedValues类和JavaBean类。JavaBean的值被自动设置。

  如果有验证错误发生,我们抛出了一个InvalidFormDateException,正如我们上面所述,引导用户返回输入页面。如果用户没有输入合适的要跟踪的号码,他将受到错误的消息,”要输入的号码的字符数必须在10到15个之间”。

  如果验证通过,ExampleValidationIP返回一个字符串”success”,标志着Webflow讲引导flow指向ExampleBackendIP(如图1,2和4所示)。

  InputProcessor的分支
  作为InputProcessor的ExampleBackendIP代码在此故意省去。要知道,理解Webflow如何作为一个流系统比深入了解复杂的商业逻辑更为重要。如图1Webflow所示,InputProcessor包含两个分叉事件:一个指向视图节点的结果,另一个指向了ExampleEmailIP。下面是ExampleBackendIP选择返回事件的代码:

//从request中接受TrackingRequest

TrackingRequest trackingRequest = (TrackingRequest) request.getAttribute("trackingRequest");
...
// 选择走向何处
return trackingRequest.isEmail() ? "email" : "complete";


  这里返回经过选择值到Webflow系统,并由系统决定执行那条路径。在我们的例子里,如果用户选择接受email,则返回字符串”email”。否则返回字符串”complete”。图1没有向你展示哪种事件指向Webflow的那一部分,但很容易想到ExampleBackendIP到ExampleEmailIP的事件是”email”,从ExampleBackednIP到result.jsp 的事件是”complete” 。

  通常,Webflow系统的事件为简单的字符串。回想一下,InputProcessor的process()方法返回的是一个典型的对象。Webflow系统会执行这个对象的toString()方法,然后继续执行。

  在图1中,ExampleEmailIP同样由一个到result.jsp的链接。这个链接同样被叫做”complete”(在图中并没有显示),此命名可以在任意地方使用。这个是ExampleEmailIP的process()方法的返回值。这个流并不是Webflow唯一的流。系统有足够的可扩展性允许分支到其他的InputProcessorS,同样包括视图节点。你可以分支或链接到任何Webflow允许的各种节点,包括自定义节点。

  我们省去了ExampleEmailIP的代码。同样页省去了商业逻辑,这不致于使代码变得繁乱。你可以更轻松入门Webflow技术。你可以下载完整的源代码,看一下程序的其他部分。

  结局
  在我们的例子中,Jsp的最终页面包含了非常简单的逻辑,我们用ExampleBackendIP收集信息并贮存到HttpServletRequest的跟踪信息在此进行了展示。



The value of your shipment:



The description of your shipment:



<%
if (trackingRequest.isEmail()) {
%>
Your shipment information has been emailed to:

<%
}
%>

  扩展
  Webflow是使用BEA WebLogic和BEA WebLogic Portal开发基于Web引用的得力框架。象各种processor的通信,pipelines和事件分支是Webflow的独特之处。我们希望此文是你更好的理解给一个Webflow是什么和能作什么。你可以在BEA’s的官方站点查找到更多Webflow的信息,包括各种框架组件,比如通配节点和异常事件等。

  关于作者
  原创作者: 
Brian Pontarelli是一名Java认证程序员和认证开发员,之前就职于BEA的WebLogic Portal框架的开发。Brian在Java网络应用框架领域非常活跃,在Software Reality曾经写过一篇关于JavaServer Faces的文章。他现在在USFreightways工作。业余时间,他正在为他的Inversoft公司开发一种新的Java portal框架。
Grant Zemont是一名Java认证程序员,具有5年的Web应用开发经验。他现在在DePaul大学攻读计算机软件工程理科硕士,同时在USFreightways开发设计Java2企业级平台(J2EE)应用。
翻译作者:
Kunmao ,java 爱好者,Matrixjsp翻译小组成员,可以通过catflame@msn.com 与他联系.也可以点击http://www.matrix.org.cn/user_view.asp?username=kunmao查看他的个人信息
  资源:

下载本文的源代码:http://www.javaworld.com/javaworld/jw-02-2003/webflow/jw-0214-webflow.zip
BEA官方站点:
http://www.bea.com
BEA webflow文档:
http://edocs.bea.com/wlp/docs40/wflopipe/index.htm
BEA WebLogic Portal 和 BEA Webflow 的Javadoc:
http://edocs.bea.com/wlp/docs70/javadoc/index.html
BEA WebLogic Portal and BEA Webflow 的新闻组
Webflow 白皮书:
ftp://edownload:BUY_ME@ftpna2.bea.com/pub/downloads/portalWFwhitepaper.zip
"开发 Java Portlets," Carl Vieregger (JavaWorld, 2003年2月):
http://www.javaworld.com/javaworld/jw-02-2003/jw-0207-iviews.html
"使用Jetspeed创建Portal," Jeff Linwood (JavaWorld, 2001年7月):
http://www.javaworld.com/javaworld/jw-07-2001/jw-0727-jetspeed.html
JavaWorld的JavaServer Pages部分的首页http://www.javaworld.com/channel_content/jw-jsp-index.shtml
JavaWorld的 Java and Web Services 部分的首页http://www.javaworld.com/channel_content/jw-webserv-index.shtml
访问 JavaWorld's Enterprise Java 的讨论:
http://forums.devworld.com/webx?50@@.ee6b80a
免费注册 JavaWorld每周的 Enterprise Java 最新消息:
http://www.javaworld.com/subscribe
你可以在IDG.Net查找我们的姊妹出版物的更多有关IT的讯息。
Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd, scwcd 简单
↑返回目录
前一篇: 解决日期选择问题,一劳永逸(使用Decorator模式实现日期选择组件)(一)
后一篇: 使用JSF(Java Server Faces)开发(四)