参考文档: 
l         A.1 簡単なサンプル:/APC/manual/guide/guideaa/guide291.htm 
l         UJI标记参考:/APC/manual/tag/index.html
  
  
1、基本运作流程
  
  
l         基本要数:JSP+UJI Tags(View)、Handler(Controller)、DataBean(Model),符合MVC模式 
l         推荐原则:一个画面对应1个JSP页面、1个Handler和1个DataBean 
l         如果共用Handler或DataBean(如样例中情况),容易出现逻辑混乱,不利于开发维护 
  
2、控制页main.jsp 
<HTML> <HEAD> <TITLE>sample</TITLE> <%@ page contentType= "text/html; charset=shift_jis" %> <%@ taglib uri="uji-taglib" prefix="uji" %> </HEAD> <BODY> <uji:dispatch /> <uji:include pane="head" /> <uji:include pane="body" /> </BODY> </HTML>  
l         APC应用程序从main.jsp开始执行 
l         uji:include标记包含页面头和页面体两个部分 
l         对于不需要页面头的APC应用程序,去掉<uji:include pane="head" /> 
  
3、DataBean 
l         HeadBean.java 
package sample;   public class HeadBean extends com.fujitsu.uji.DataBean {    protected int count;     protected java.util.Date loginTime;       public int getCount() {        return count;     }     public void setCount(int count) {        this.count = count;     }       public java.util.Date getLoginTime() {        return loginTime;     }     public void setLoginTime(java.util.Date loginTime) {        this.loginTime = loginTime;     } }  
l         BodyBean.java 
package sample;   public class BodyBean extends com.fujitsu.uji.DataBean {    protected String message;     protected double val1;     protected double val2;     protected double result;       public String getMessage() {        return message;     }     public void setMessage(String message) {        this.message = message;     }       public double getVal1() {        return val1;     }     public void setVal1(double val1) {        this.val1 = val1;     }       public double getVal2() {        return val2;     }     public void setVal2(double val2) {        this.val2 = val2;     }       public double getResult() {        return result;     }     public void setResult(double result) {        this.result = result;     } }  
l         DataBean是标准的JavaBean,需要扩展com.fujitsu.uji.DataBean 
l         DataBean中属性与画面项目定义书中的项目一致 
l         子DataBean的使用:对于画面中有条目列表的情况,使用子DataBean表示一条条目,通过list结构子DataBean的表示整个条目列表,并作为父DataBean的一个属性 
  
4、入出力页面 
l         header.jsp 
<%@ page contentType="text/html; charset=shift_jis" %> <%@ taglib uri="uji-taglib" prefix="uji" %> <uji:useBean id="head" cls="sample.HeadBean" request="true" /> 実行回数は   <uji:getProperty bean="head" property="count" /> 回です。 <BR> セションを開始した時間は   <uji:getProperty bean="head" property="loginTime" /> です。 <BR> <HR><BR>  
l         uji:useBean标记指定DataBean,id属性值需要和main.jsp中uji:include的pane属性值保持一致,cls属性指定DataBean类的全路径 
l         uji:getProperty标记获得DataBean中指定属性值,bean属性与uji:useBean的id属性一致,property属性指定DataBean中的属性 
l         request.jsp 
<%@ page contentType="text/html; charset=shift_jis" %> <%@ taglib uri="uji-taglib" prefix="uji" %> <uji:useBean id="body" cls="sample.BodyBean" request="true" /> サンプルプログラムでは、2項の加減算を実行します。  <FORM method="post">     <INPUT name="uji.verbs" type="hidden" value="add,sub">      <INPUT name="uji.id" type="hidden" value="body">     値1の入力: <INPUT name="val1"> <BR>     値2の入力: <INPUT name="val2"> <BR>     <INPUT name="add" type="submit" value="加算">      <INPUT name="sub" type="submit" value="減算">  </FORM>  
l         对于表单处理,需要提供几个特殊的隐藏值: 
Ø         uji.verbs:指定逗号分隔的动作(按钮、链接等)命令列表(参看后面的commands.map) 
Ø         uji.id:指定DataBean的ID,与下面直接指定DataBean的语句是等效的 
    <INPUT name="uji.bean" type="hidden" value="sample.BodyBean">  
l         文本框的name属性要和DataBean中对应的属性名相同,以便能够将输入的值自动设置到DataBean中对应的属性 
l         实际应用中通常使用uji:fieldString来表示文本框: 
    <uji:fieldString bean="body" name="val1">  
l         提交按钮的name属性值要和uji.verbs的命令列表中的值保持一致,以便能够执行相应的动作 
l         样例中没有涉及数据验证的情况,对于实际应用中需要数据验证的情况,需要使用JavaScript进行处理(这里,按钮的name属性值不一定要和uji.verbs的命令列表中的值保持一致): 
Ø         添加uji.verb隐藏表单域 
    <INPUT name="uji.verb" type="hidden" value=" ">   
Ø         将提交按钮改为普通按钮,通过Click事件进行处理 
    <INPUT name="add" type="button" value="加算" onClick="add()" >   
Ø         在处理函数中设置当前动作命令,提交表单 
function add() {       // ... 进行验证,失败就返回        document.forms[0].elements["uji.verb"].value="add";        document.forms[0],submit(); }  
l         response.jsp 
<%@ page contentType="text/html; charset=shift_jis" %> <%@ taglib uri="uji-taglib" prefix="uji" %> <uji:useBean id="body" cls="sample.BodyBean" request="true" /> <uji:getProperty bean="body" property="message" /><BR> <uji:getProperty bean="body" property="val1" />と  <uji:getProperty bean="body" property="val2" />の計算結果は<BR> <uji:getProperty bean="body" property="result" />です。<BR> <FORM method="post">     <INPUT name="uji.verbs" type="hidden" value="next">      <INPUT name="uji.id" type="hidden" value="body">      <INPUT name="next" type="submit" value="入力に戻る">  </FORM>  
  
5、Handler类 
package sample; import com.fujitsu.uji.DispatchContext;   public class SampleHandler extends com.fujitsu.uji.GenericHandler {    public SampleHandler() {    }       public boolean init() {        return true;     }       public void add(DispatchContext context, BodyBean dataBean) {        double result = dataBean.getVal1() + dataBean.getVal2();         dataBean.setMessage("加算を実行しました。");        dataBean.setResult(result);         dataBean.setVerb("resmode");        context.setResponseBean("body", dataBean);        setHead(context);     }       public void sub(DispatchContext context, BodyBean dataBean) {        double result = dataBean.getVal1() - dataBean.getVal2();         dataBean.setMessage("減算を実行しました。");        dataBean.setResult(result);         dataBean.setVerb("resmode");        context.setResponseBean("body", dataBean);        setHead(context);     }       public void next(DispatchContext context, BodyBean dataBean) {        dataBean.setVerb("reqmode");        context.setResponseBean("body", dataBean);        setHead(context);     }       public void startup(DispatchContext context) {        BodyBean dataBean = new BodyBean();         dataBean.setVerb("reqmode");        context.setResponseBean("body", dataBean);        setHead(context);     }       private HeadBean headBean;     private void setHead(DispatchContext context) {        if(headBean == null) {            headBean = new HeadBean();             headBean.setLoginTime(new java.util.Date());         }         headBean.setCount(headBean.getCount() + 1);         context.setResponseBean("head", headBean);    } }  
l         Handler类扩展com.fujitsu.uji.GenericHandler,主要包含与动作命令对应的处理方法(在commands.map中定义) 
l         处理方法通常有两个参数: 
Ø         context:上下文环境变量对象 
Ø         dataBean:当前Handler对应的DataBean对象 
l         使用传递的DataBean对象,可以对DataBean中的数据进行存取操作(getter/setter) 
l         dataBean.setVerb()方法指定画面的迁移(具体在pages.map中定义) 
l         context.setResponseBean()方法指定响应页面的DataBean,第一个参数要和main.jsp中uji:include的pane属性值保持一致,第二个参数是响应页面的DataBean 
l         样例中由于使用同一个Handler和DataBean,在逻辑控制方面会产生混乱,不值得推荐 
l         下面给出的实际应用中使用的例子:0115Handler中从0115画面迁移到0110画面的方法 
    public void goto_0110(DispatchContext context, eft_0115Bean dataBean) {        ...         eft_0110Bean eft0110Bean = new eft_0110Bean();         eft0110Bean.setLdc(dataBean.getLdc());         eft0110Bean.setVerb("resmode");        context.setResponseBean("body", eft0110Bean);    }  
l         startup()是个特殊方法,根据commands.map中的定义,会在应用程序启动时被调用,以显示指定的首画面 
  
6、关系定义文件 
l         commands.map 
# commands.map sample.BodyBean;add=sample.SampleHandler.add sample.BodyBean;sub=sample.SampleHandler.sub sample.BodyBean;next=sample.SampleHandler.next ;=sample.SampleHandler.startup  
l         commands.map的行格式是:DataBean全路径;动作命令名称=Handler全路径.方法名 
l         最后一行比较特殊,指定应用程序启动时被调用对应Handler的方法,没有DataBean全路径和动作命令名称 
l         pages.map 
# pages.map sample.HeadBean;=header.jsp sample.BodyBean;reqmode=request.jsp sample.BodyBean;resmode=response.jsp  
l         pages.map的行格式是:DataBean全路径;[迁移名称]=迁移页面 
l         对不需要迁移的页面,不指定迁移名称 
   
 
  |