kapok

垃圾桶,嘿嘿,我藏的这么深你们还能找到啊,真牛!

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  455 随笔 :: 0 文章 :: 76 评论 :: 0 Trackbacks
http://dev2dev.bea.com.cn/techdoc/wlworkshop/2005041803.html

 页面流是Java Page Flow的中文表示,作者在本文中简单分析了页面流框架的运行机制,还通过具体的例子简单的演示了页面流框架下如何应用标签开发用户界面、实现页面导航、处理表单提交等基本功能。

关键词: 页面流 标签 页面导航 表单处理

1 页面流的运行机制
1.1 页面流组成

  页面流是一个MVC框架,一个Web应用中可以有多个页面流,一个页面流由一个java文件(文件后缀名为.jpf,后面的文章中将用”JPF文件”特指这个文件)和一组JSP文件组成:
  1. JSP文件负责生成用户浏览的界面(UI)
  JSP文件使用页面流框架提供的标签库完成内容显示和jpf文件中的对象之间的调用,用户输入表单处理与JPF文件中的方法之间的关联也通过标签库来实现。
  2. JPF文件负责用户访问的流程控制和页面信息传递,主要包括:
  a) 获取用户输入,调用商业流程处理用户输入
  b) 访问企业资源
  c) 在页面间保持状态
  d) 控制页面显示的次序
  页面流框架下,不允许用户直接访问Web应用中的JSP页面,而且用户访问的流程控制都在一个Java文件里面实现,所以可以轻松的实现一些通常Web开发中难于处理的需求,比如:在各页面之间保持一些复杂类型的状态信息,实行一组JSP文件的统一授权访问等。
  [注] 页面流中的jpf文件和JSP文件必须在同一个目录下。

1.2 页面流运行机制
  下面这个图说明了页面流的整个处理流程:


图一:页面流处理流程图

  我们可以看一看struts的处理流程图:


图二:Struts处理流程图

  从这两张图看,JPF对于Struts的改进非常有限,只是增加了一些Filter,实现了不能直接访问JSP文件的功能,但这些只是表面现象,JPF最大的亮点应该是图一中红色标识的部分—JPF文件,页面流中的配置工作都在JPF中完成,因此我们不再需要单独的配置文件:
  1. 使用JPF中的Java批注实现如下配置功能
  A) JSP文件和Action之间的映射
  B) JSP页面之间数据传递的定义
  2. FormBean不再需要配置,通过JPF文件中方法的参数类型直接判断

2 使用页面流框架开发Web应用
  作者将用一个例子来演示如何使用页面流来开发Web应用,这个例子非常简单,就是一个通常的用户注册页面,用户需要提供三个字段:用户名、密码和常用E_Mail,服务器端获取用户输入的内容,并且用另一个JSP页面显示出来,演示的内容将涉及页面流中关键的几个部分:
  1. 国际化
  2. 界面开发
  3. 页面导航
  4. 用户输入的处理
  5. 数据在页面间的传递
  作者的例子将从Beehive提供的例子netui-blank应用开始,Web容器采用Tomcat,操作系统采用Windows2000。
  本文中作者默认你的netui-blank应用已经在Tomcat上配置完成上下文路径是pageflow,并且能够正确运行。如果你的pageflow应用还没有能够运行起来,请参考作者的另一篇文章《Beehive入门》。

2.1 国际化
  和大多数的MVC框架一样,页面流中也使用资源文件的形式来解决应用的国际化显示。页面流中实现资源国际化的步骤如下:
  1. 准备资源文件
  在%tomcat_home%webappspageflowWEB-INFsrcglobal目录下建立资源文件resource_cn.properties,文件的内容如下:
label=你好!欢迎您了解页面流!
  2. 将资源文件转化为unicode码
  打开一个Dos窗口,进入%tomcat_home%webappspageflowWEB-INFsrcglobal目录下,执行命令:
  native2ascii –encoding gb2312 resoure_cn.properties resource.properties
  命令执行完后将在global目录下生成一个名为resource.properties的文件,文件内的中文都已经变成了unicode表示,上面的那个文件转化后内容应该如下所示:
label=4f60\u597dFf016b228fce60a84e8689e3987597626d41Ff01
  3. 在JSP文件中使用标签访问资源
  现在我们需要修改JSP,以便在JSP中引用创建的国际化内容,这个步骤比较简单,主要两个步骤,这里以pageflow应用中的index.jsp为例来演示这个过程:
  A) 增加对资源的绑定
  在index.jsp文件的头部增加这么一句:
<netui-data:declareBundle bundlePath="global.resource" name="ui"/>
  其中的buildlePath属性表示了资源文件在classpath中的全路径,name属性制定页面中访问时的标识。
  [注] 很容易的我们应该知道,在页面流中,一个JSP文件,可以绑定到多个资源文件上。
  B) 显示资源内容
  JSP文件中用这样的声明表示在当前位置显示资源内容,其中的ui就是步骤A)中声明的name属性对应的字符串,label表示显示该资源文件中label关键字对应的资源。
  我们修改index.jsp,将源代码变成如下内容:
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0" prefix="netui-data"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-html-1.0" prefix="netui"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-template-1.0" prefix="netui-template"%>

<netui-data:declareBundle bundlePath="global.resource" name="ui"/>

 <netui:html>
 <head>
  <title></title>
  <netui:base/>
 </head>
 <netui:body>
 <p>
  
 </p>
 </netui:body>
</netui:html>

  4. 重新编译应用
  重新编译的步骤请参考《Beehive入门》中的内容,主要是将资源文件拷贝到WEB-INF ass下对应的目录下。
  5. 测试一下
  现在你启动Tomcat,访问http://localhost:8080/pageflow/,浏览器中出现的界面应该出现中文。

2.2 界面开发
  页面流中提供了一组以<netui:xxx>命名的标签库来实现界面上的可视化控件,在这里例子中需要两个JSP页面,一个JSP页面用于接受用户输入,一个JSP页面显示用户的输入信息。
  我们首先建立输入文件,在pageflow应用的根目录下创建接受用户输入的JSP文件—input.jsp,该文件源代码如下:

<%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0" prefix="netui-data"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-html-1.0" prefix="netui"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-template-1.0" prefix="netui-template"%>

<netui-data:declareBundle bundlePath="global.resource" name="ui"/>

<netui:html>
 <head>
 <title></title>
 <netui:base/>
 </head>
 <netui:body>
 <center> <br/>
  <!—form的action属性的内容必须是JPF中的某一个方法的名字,这里的register方法的详细内容请参考2.5用户输入处理中的相关内容–〉
<netui:form action="register">
:<netui:textBox dataSource="actionForm.name"/><br/>
:<netui:textBox password="true" dataSource="actionForm.password"/><br/>
E_mail:<netui:textBox dataSource="actionForm.email"/><br/>
 <netui:button type="submit"></netui:button>
 </netui:form>
 </center>
 </netui:body>
</netui:html>

  • JSP文件中使用了netui:html、netui:body、netui:form、netui:textbox、netui:button等标签来完成html内容的显示,每个标签的命名基本和html中的标签的名字对应,应该比较好理解,更多的标签和详细的标签用法作者将在后续的文章中专门讲解。
  • netui标签的dataSource="actionForm.name"表示这个标签和传输form的哪个字段相对应。
  • 这个JSP文件中引用了比较多的文字资源,如何准备这些国际化资源,请大家参考

  2.1国际化中的步骤来完成。
  另一个显示用户输入信息的页面命名为regiester.jsp,文件内容暂时输入如下内容:
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0" prefix="netui-data"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-html-1.0" prefix="netui"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-template-1.0" prefix="netui-template"%>
<netui:html>
 <head>
 <title>用户输入</title>
 <netui:base/>
 </head>
  <netui:body>
 <p>
  用户信息输入成功!
 </p>
  </netui:body>
</netui:html>

2.3 准备FormBean
  要获取用户输入,需要一个能够和用户输入一致的FormBean,作者的FormBean命名为UserForm,文件的内容如下:
package org.vivianj.samples.jpf.form;
//UserForm必须实现java.io.Serializable接口,否则编译的时候会出错
public class UserForm implements java.io.Serializable
{
//用户输入三个字段,FormBean提供三个属性和他们一一对应
//并且分别提供getter,setter方法
private String name;
private String password;
private String email;

public void setName(String name)
{
this.name = name;
}

public String getName()
{
return this.name;
}

public void setPassword(String pwd)
{
this.password = pwd;
}

public String getPassword()
{
return this.password;
}

public void setEmail(String mail)
{
this.email = mail;
}

public String getEmail()
{
return this.email;
}
}

2.4 页面导航
  现在我们开始准备开始要访问2.2中创建的那个JSP文件,我们希望在index.jsp中有个链接指向这个文件,通过单击该链接访问这个JSP文件,下面是详细的步骤:
  1. 在JPF文件中增加Action指向改JSP文件
  因为页面流框架中不能直接访问JSP文件,所以必须将JSP文件映射为Action。
  修改Controller.jpf,增加Action指向改JSP文件,下面是Controller.jpf修改后的部分代码,用斜/粗体表示标识的代码是需要增加的代码:
 .Controller(
  simpleActions={
   .SimpleAction(name="reg", path="input.jsp")
  }
)

public class Controller
  extends PageFlowController

  2. 修改index.jsp
  在index.jsp中增加一个链接,用标签来表示的链接如下:
<netui:anchor action="reg.do">用户注册</netui:anchor>
[注] action的属性reg.do中reg对应Controller.jpf中simpleActions的name属性,而.do是必须的后缀。

2.5 用户输入处理
  在2.2界面开发中,我们定义表单的action是register,在页面流中,这个register应该是JPF的一个方法名,所以如果需要处理用户输入,我们还需要在JPF文件中增加一个register方法,修改后的Controller.jpf文件的部分代码,用斜/粗体表示标识的代码是需要增加的代码:
import javax.servlet.http.HttpSession;

import org.apache.beehive.netui.pageflow.Forward;
import org.apache.beehive.netui.pageflow.PageFlowController;
import org.apache.beehive.netui.pageflow.annotations.Jpf;
//引入formbean类
import org.vivianj.samples.jpf.form.UserForm;

.Controller(
    simpleActions={
        .SimpleAction(name="reg", path="input.jsp")
    } )
  public class Controller
    extends PageFlowController {
         public User user = new User();
      .Action(
        forwards={
           .Forward(name="success", path="index.jsp")
        }
    )
    protected Forward begin()
    {
        return new Forward("success");
    }

      .Action(
        forwards={
           .Forward(name="register", path="register.jsp")
        }
    )
//register方法处理用户输入
//UserForm对象中保存了用户输入的信息
//用户输入处理完成后导航到注册信息显示页面
    protected Forward register(UserForm form)
    {
       System.out.println("form.getName()=" + form.getName());
       Forward forward = new Forward("register");
        forward.addActionOutput("user", user);  
        return forward;
    }
      /**
     * Callback that is invoked when this controller instance is created.
     */
    protected void onCreate()
    {
    }
      /**
     * Callback that is invoked when this controller instance is destroyed.
     */
    protected void onDestroy(HttpSession session)
    {
    }
}

  现在重新编译整个Web应用,重新发布到Tomcat服务器上,你应该可以完成如下流程:
  1、 进入导航页,上面有一个链接指向用户信息输入界面
  2、 在用户信息输入界面输入信息,提交信息
  3、 服务器上应该打印你输入的name字段的内容,浏览器显示“用户信息输入成功!”字样。

2.6 数据在页面之间的传递
  按照我们例子的要求,用户输入的信息应该在浏览器中输出来,所以需要数据在页面之间传递,这部分工作在页面流中实现比上面的功能稍微复杂一点,下面将详细的演示这个过程。
  紧接着上面的例子,用户的信息如果需要在regiester.jsp上显示出来,需要修改Controller.jpf和register.jsp。
  A) 修改Controller.jpf,确定被传递的数据的类型、标识
Controller.jpf经过修改后内容如下,其中的斜/粗线部分是增加的内容:
import javax.servlet.http.HttpSession;

import org.apache.beehive.netui.pageflow.Forward;
import org.apache.beehive.netui.pageflow.PageFlowController;
import org.apache.beehive.netui.pageflow.annotations.Jpf;

import org.vivianj.samples.jpf.form.UserForm;


          .Controller(
    simpleActions={
        .SimpleAction(name="reg", path="input.jsp")
    }
)
  public class Controller
    extends PageFlowController
{
         public User user = new User();
      .Action(
        forwards={
           .Forward(name="success", path="index.jsp")
        }
    )
    protected Forward begin()
    {
        return new Forward("success");
    }
//修改Action的注释,增加actionOutputs批注
//说明该方法执行完跳转到下一个页面时会有共享信息传递
//name=”user”规定页面之间传递的对象名为”user”
//type=xxx.class规定了传递对象的内容
    .Action(
        forwards={
           .Forward(name="register", path="register.jsp",
                         actionOutputs = {
                             .ActionOutput(name = "user",
                                               type = org.vivianj.samples.jpf.form.User.class,
                                               required = true)
                         })
        }
    )
    protected Forward register(UserForm form)
    {
               
Forward forward = new Forward("register");
              //给跳转增加传递对象 //对象名称和actionOutputs批注中的name属性保持一致
        forward.addActionOutput("user", form);
          return forward;
    }
      /**
     * Callback that is invoked when this controller instance is created.
     */
    protected void onCreate()
    {
    }
      /**
     * Callback that is invoked when this controller instance is destroyed.
     */
    protected void onDestroy(HttpSession session)
    {
    }

  B) 修改regiester.jsp文件,显示传递过来的数据
  修改后的regiester.jsp文件如下,其中斜/粗体的内容是新增加的内容:
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0" prefix="netui-data"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-html-1.0" prefix="netui"%>
<%@ taglib uri="http://beehive.apache.org/netui/tags-template-1.0" prefix="netui-template"%>
//用页面流的netui-data标签将页面的JavaBean绑定到传递过来到的对象
//name属性和Controller.jpf文件中规定的传递对象的名字保持一致
//type属性和Controller.jpf文件中规定的传递对象类型保持一致
<netui-data:declarePageInput name="user" type="org.vivianj.samples.jpf.form.User"/>
<netui-data:declareBundle bundlePath="global.resource" name="ui"/>

<netui:html>
 <head>
  <title></title>
 <netui:base/>
 </head>
 <netui:body>

 <center> <br/><br/><br/>
 <br/>
 <br/>
 email<br/>
 </center>
</netui:body>
</netui:html>

  页面流中用的形式可以获取页面之间跳转数据的属性,其中的user对应netui-data标签的name属性,name是被访问对象的属性。
现在你重新编译、发布该Web应用,重新启动Tomcat后,在用户信息输入界面输入信息、提交给服务器后,浏览器应该显示你所输入的信息,类似这样的情况:

3 总结
  通过一个用户信息输入、回显的例子,详细地演示了Web开发应用中最常见的几个动作:国际化的处理、界面开发、页面导航、用户输入处理、数据在页面间传递。
  纵观整个演示流程,应该说使用页面流是非常简单的,通常我们只需要做一些声明性的工作,整个过程中只有FormBean的准备部分和JPF文件中用户输入处理要求对Java非常熟悉。

作者简介:
姓名:肖菁
E_mail:guilaida.com
  软件工程师,buildfiledesign项目设计师(buildfiledesign.sourceforge.net),Vivianj技术交流站站长(guilaida.go.nease.net),致力于研究J2EE编程技术、Web Service技术以及他们在 WebSphere、WebLogic、 Apache平台上的实现。

posted on 2005-04-25 14:55 笨笨 阅读(569) 评论(0)  编辑  收藏 所属分类: J2EEALLWeblogic Portal

只有注册用户登录后才能发表评论。


网站导航: