??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美一区二区福利,国产91精品精华液一区二区三区,国产精品91在线http://www.aygfsteel.com/jeffy/category/7977.htmlzh-cnThu, 08 Mar 2007 11:01:00 GMTThu, 08 Mar 2007 11:01:00 GMT60FreeMarker设计指南 (转蝲)http://www.aygfsteel.com/jeffy/archive/2006/03/02/33260.htmlLive-in JavaLive-in JavaThu, 02 Mar 2006 09:17:00 GMThttp://www.aygfsteel.com/jeffy/archive/2006/03/02/33260.htmlhttp://www.aygfsteel.com/jeffy/comments/33260.htmlhttp://www.aygfsteel.com/jeffy/archive/2006/03/02/33260.html#Feedback0http://www.aygfsteel.com/jeffy/comments/commentRss/33260.htmlhttp://www.aygfsteel.com/jeffy/services/trackbacks/33260.html阅读全文

Live-in Java 2006-03-02 17:17 发表评论
]]>
webwork 相关urlshttp://www.aygfsteel.com/jeffy/archive/2006/03/02/33237.htmlLive-in JavaLive-in JavaThu, 02 Mar 2006 08:21:00 GMThttp://www.aygfsteel.com/jeffy/archive/2006/03/02/33237.htmlhttp://www.aygfsteel.com/jeffy/comments/33237.htmlhttp://www.aygfsteel.com/jeffy/archive/2006/03/02/33237.html#Feedback0http://www.aygfsteel.com/jeffy/comments/commentRss/33237.htmlhttp://www.aygfsteel.com/jeffy/services/trackbacks/33237.htmlhttp://blog.video.com.cn/andy/subject/177.shtml

Live-in Java 2006-03-02 16:21 发表评论
]]>
WebWork的interceptor机制 (转蝲)http://www.aygfsteel.com/jeffy/archive/2006/03/02/33234.htmlLive-in JavaLive-in JavaThu, 02 Mar 2006 08:02:00 GMThttp://www.aygfsteel.com/jeffy/archive/2006/03/02/33234.htmlhttp://www.aygfsteel.com/jeffy/comments/33234.htmlhttp://www.aygfsteel.com/jeffy/archive/2006/03/02/33234.html#Feedback0http://www.aygfsteel.com/jeffy/comments/commentRss/33234.htmlhttp://www.aygfsteel.com/jeffy/services/trackbacks/33234.htmlWebWork目建立在XWork目上。入口Servlet是WebWork目中定义的ServletDispatcherQ而Action在XWork目中定义?
XWork Action接口的execute()Ҏ没有参数Q不像Struts Action那样接受request, response参数Q所以XWork Action能够qWeb环境被直接调用,便于单元试?
q里引入了一个问题。没有了request参数Q那么XWork Action如何获得request parameters作ؓ输入数据Q又通过什么桥梁(Struts用request.setAttributeQ把l果数据传送到View层?
在Web Work中,只能通过Action本n的getter, setter属性来传送输入参数和输出l果?
比如Q我们有q样一个实CXWork Action接口的类Q?/FONT>

YourAction implements Action{
int productId = null;
String productName = null;
public void setProductId(int productId){this.productId = productId;}
public String getProductName(){return productName;}
public String execute(){
productName = findNameById(productId);
return “success?
}
}
q个c里面的productId接受request输入参数QproductName是输出到面昄的结果?
比如Q这LhQhttp://yourhost/yourapp/MyAction.action?productId=1
Web Work会把1填到YourAction的productId里面Q然后执行execute()ҎQJSP里的语句<ww:property value=“productName?gt;会把YourAction的productName昄在页面上?

如果一个Web Framework采用了这U屏蔽Action的request, response参数的设计方式,一般也同时会采用这UAction和输入输出数据结合成一体的解决方式。类似的情Ş也存在于Tapestry和Maverick中,后面会讲到?

当WebWork ServletDispatcher接收到HTTP Request的时候,首先把所有相关的信息Q包括request, response, session, servlet config, servelt context, 所有request参数Q等存放到AcationContext中,然后ҎInterceptor配置信息Q生成一个YourAction的动态代理类对象。实际上q行的正是这个代理对象,如同Servlet Filter的工作机制一般,所有注入的InterceptorҎ会先于ActioҎq行?

我们来看一下Action和Interceptor的地位:Action没有参数Q无法获得ActionContextQ而Interceptor接受的ActionInvoication参数拥有包括ActionContext在内的所有重要信息?
q种权力分配的不q等Q注定了Action的作用非常有限,只限于调用商业逻辑Q然后返回一个成功与否标志。所有与外部Web世界打交道、协调内部工作流E的重担Q都责无旁贷地落在Interceptor的肩上?
我们可以设想一个极端的例子。我们声明一批不做Q何事情的IActionQ我们只是需要它们的I壳cdQ我们制作一批对应的InterceptorQ所有的转发控制、商业逻辑都在Interceptor上实玎ͼ然后把Interceptor都注入到对应的空Action。这在理Z是完全可行的?
在Webh的包围中QAction可少QInterceptor不可。Action是一个孤?如果没有外来盟友Interceptor的协助,只能在自q范围内独立作战Q比如Unit TestQ,而对整体大局的作战目标无法生媄响?
下面我们来看一下Action是如何在Interceptor的全E监下工作的?
在WebWork中,我们需要如下配|XWork.xml?
<xwork>

<!-- Include webwork defaults (from WebWork-2.1 JAR). -->
<include file="webwork-default.xml" />
<!-- Configuration for the default package. -->
<package name="default" extends="webwork-default">
<!-- Default interceptor stack. -->
<default-interceptor-ref name=" defaultStack" />
<!-- Action: YourAction. -->
<action name="youraction" class="yourapp.YourAction">
<result name="success" type="dispatcher">
YourAction.jsp
</result>
</action>
</package>
</xwork>

webwork-default.xml里面的相兛_义如下:
<interceptors>
<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
<interceptor name="static-params" class="com.opensymphony.xwork.interceptor.
StaticParametersInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor "/>
<interceptor name="conversionError" class="com.opensymphony.webwork.interceptor.
WebWorkConversionErrorInterceptor"/>
<interceptor-stack name="defaultStack">
  <interceptor-ref name="static-params"/>
  <interceptor-ref name="params"/>
  <interceptor-ref name="conversionError"/>
</interceptor-stack>
</interceptors>

从上q的配置信息中可以看出,YourAction执行execute()Ҏ的前后,会被
defaultStack所定义的三个Intercepter截获。这些Interceptor的Q务之一是把输入参数设|到Action的对应属性当中?
如果我们需要加入对YourAction的属性的验证功能Q只要把上述定义中的validation Interceptor加入到defaultStack中就可以了。当Ӟ实际工作q没有这么简单,一般来_q要为每个进行属性验证的Action的都配置一份validation.xml?
XWork Interceptor能够在Package和ActionU别上,q行截获处理?
Servlet Filter能够在URL PattenU别上,q行截获处理。虽然实际上QServlet Filter截获的是ServletQ但某些情况下,可以辑ֈ和截获一批Action的同h果?
比如Q在Web Work中,我们可以为所有admin package的ActionQ加入一个InterceptorQ当查到当前Session的用h有admin权限Ӟl一q回一个警告页面:您没有够的权限执行q个操作?
我们看到也可以ؓ所有URL Pattern为“admin/*.action”的URL定义一个Servlet FilterQ当查到当前Session的用h有admin权限Ӟl一q回一个警告页面:您没有够的权限执行q个操作?
WebWork的Interceptor配置是相当灵zȝQ相当于对Action实现了AOP。Interceptor相当于AspectQ基cAroundInterceptor的before(), after()Ҏ相当于Advice?
另外QXWork也提供了从XML配置文g装配Component的机Ӟ相当于实C对于Component的IoC?/FONT> 
                                                               Q申明:本文来源于网l,摘录于此Q仅为日后方便查看)

Live-in Java 2006-03-02 16:02 发表评论
]]>
Webwork2 的Action Result Type 的定?(转蝲)http://www.aygfsteel.com/jeffy/archive/2006/03/02/33227.htmlLive-in JavaLive-in JavaThu, 02 Mar 2006 07:45:00 GMThttp://www.aygfsteel.com/jeffy/archive/2006/03/02/33227.htmlhttp://www.aygfsteel.com/jeffy/comments/33227.htmlhttp://www.aygfsteel.com/jeffy/archive/2006/03/02/33227.html#Feedback0http://www.aygfsteel.com/jeffy/comments/commentRss/33227.htmlhttp://www.aygfsteel.com/jeffy/services/trackbacks/33227.html    和Webwork1.x不同QWebwork2的Action执行完后Q其Result对应一?Result TypeQ而这个Result Type完全可以Ҏ具体应用或环境自p?定义Q只需实现com.opensymphony.xwork.Result接口。Result Type使得Action的执行结果表现Ş式可以灵zd变!下面q会举例说明Q这里先看看Webwork2提供的几UResult Type的定义,该定义在webwork-default.xml中,xwork.xml文g包含了该文gQ自定义的Result Type可以直接写在 xwork.xml中:
  <result-types>
    <result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/>
    <result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
    <result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
    <result-type name="chain" class="com.opensymphony.xwork.ActionChainResult"/>
    <result-type name="xslt" class="com.opensymphony.webwork.views.xslt.XSLTResult"/>
    <result-type name="jasper" class="com.opensymphony.webwork.views.jasperreports.JasperReportsResult"/>
    <result-type name="freemarker" class="com.opensymphony.webwork.views.freemarker.FreemarkerResult"/>
  </result-types>
  其大多都有location和parse两个参数Qlocation指明action执行后接着d里,parse指明是否对locationq行OGNL表达式解析?BR> 
  1) dispatcher
    action执行完后Q请求会导向对应的ViewQWebwork2q后其实是用RequestDispatcher来处理的Q所以原Request/Response对象会接着传递,原Request中的Atrributes不会丢失Q这点与下面的redirect是不同的?BR> 
  2) redirect
    对上ơ的响应重定向到指定的位置Qredirect是重C生一个新的RequestQ原来Request保存的东西将不再有效Q比如不能通过requet.getAtrribute 取得原来set的对象,也不能取得action的实例,errorsQfield errors{,因ؓAction是徏立在Single-thread model上的?BR>
  3) chain
    action链,Ҏ的View调用方式Q一个action执行完接着调用另一个action。有个必ȝ参数actionNameQ指明紧接着调用的另一action对象。如Q?BR>    <result name="success" type="chain">
        <param name="actionName">bar</param>
        <param name="namespace">/foo</param>
    </result>
  执行后接着调用下面的action:
    <action name="bar" class="myPackage.barAction">
        ...
    </action>

  4) velocity
  5) freemarker
  6) jasperreports
  7) xslt
    以上都是用不同技术的产生不同的View?BR>
  下面我D个自定义Result Type的示例,假如我有个Action testSendmailQ根据处理结果将l指用户发送一份email。自定义一个Result TypeQ实现Result接口?BR>   
    com.mycompany.webwork.example.SendmailResult
    有三个必d敎ͼfrom ,to, subject,一个可选参?body?BR>  在xwork.xml中定义如下:
  <result-types>
    <result-type name="sendmail" class="com.mycompany.webwork.example.SendmailResult"/>
  </result-types>
 
  action定义Q?BR>  <action name="testSendmail" class="com.mycompany.webwork.example.TestSendMailAction">
    <result name="success" type="sendmail">
        <param name="from">root@sina.com</param>
        <param name="to">user@sina.com</param>
        <param name="subject">hello,webwork!</param>
    </result>
    <result name="error" type="dispatcher">
        <param name="location">error.jsp</param>
    </result>
  </action>
 
  SendmailResult.java

  package com.opensymphony.webwork.example;

  import com.opensymphony.xwork.ActionInvocation;
  import com.opensymphony.xwork.Result;

  public class SendmailResult implements Result {
    private String to;
    private String from;
    private String subject;
    private String body;

    public void execute(ActionInvocation invocation) throws Exception {
    //TODO 实现Email发送部?BR>    System.out.println("sending mail....");
    System.out.println("   To:" + to);
    System.out.println("   From:" + from);
    System.out.println("Subject:" + subject);
    }

    public String getBody() {
    return body;
    }

    public void setBody(String body) {
    this.body = body;
    }

    public String getFrom() {
    return from;
    }

    public void setFrom(String from) {
    this.from = from;
    }

    public String getSubject() {
    return subject;
    }

    public void setSubject(String subject) {
    this.subject = subject;
    }

    public String getTo() {
    return to;
    }

    public void setTo(String to) {
    this.to = to;
    }
  }

  写个单的试ActionQ?BR>  package com.opensymphony.webwork.example;
 
  import com.opensymphony.xwork.ActionSupport;

  public class TestSendMailAction extends ActionSupport {
    public String execute() throws Exception {
      return SUCCESS;
    }
  }

  试jsp,把它攑֜webwork-example/下:

  testsendmail.jsp

  <%@ taglib prefix="ww" uri="webwork" %>
  <html>
  <head><title>Test sendmail restul type</title></head>
  <body>
 
  <form action="testSendmail.action">
    <input type="Submit" value="Submit"/>
  </form>
  </body>
  </html>

         Q申明:本文来源于网l,摘录于此Q仅为日后方便查看)


Live-in Java 2006-03-02 15:45 发表评论
]]>
Tapestry和ognlhttp://www.aygfsteel.com/jeffy/archive/2006/03/01/32990.htmlLive-in JavaLive-in JavaWed, 01 Mar 2006 03:43:00 GMThttp://www.aygfsteel.com/jeffy/archive/2006/03/01/32990.htmlhttp://www.aygfsteel.com/jeffy/comments/32990.htmlhttp://www.aygfsteel.com/jeffy/archive/2006/03/01/32990.html#Feedback1http://www.aygfsteel.com/jeffy/comments/commentRss/32990.htmlhttp://www.aygfsteel.com/jeffy/services/trackbacks/32990.htmlOGNL(Object Graph Navigation Language)Tapestry?/SPAN>OGNLl合的很完美?/SPAN>OGNL是一U?/SPAN>Java表达式语aQ它被用来读取和更新对象的属性?/SPAN>OGNL比徏立在JSP2.0标签库之上的表达式语a更简单功能也更强大?/SPAN>OGNL不仅仅提供属性的讉KQ它包括了精的表达式和Ҏ的调用。也能访问类的静态域。也可以创徏新的对象Q包?/SPAN>List?/SPAN>Map对象。简单的OGNL表达式是属性的名字。如Q?/SPAN>fooQ这q同于调用了方?/SPAN>getFoo()Q或者是setFoo()如果表达式是用来更新属性的Q。当属性的名字是连l的属性名ӞD功能pv作用了。如Q?/SPAN>foo.bar.bazQ它q?/SPAN>getFoo().getBar().getBaz() 。不q要注意的是foo?/SPAN>barq些属性不能ؓI?/SPAN> OGNL允许两个对象Q如和|包含的组Ӟ来共享信息?/SPAN>



Live-in Java 2006-03-01 11:43 发表评论
]]>
Tapestry介- 转蝲 (转自java-cn)http://www.aygfsteel.com/jeffy/archive/2006/02/27/32710.htmlLive-in JavaLive-in JavaMon, 27 Feb 2006 09:46:00 GMThttp://www.aygfsteel.com/jeffy/archive/2006/02/27/32710.htmlhttp://www.aygfsteel.com/jeffy/comments/32710.htmlhttp://www.aygfsteel.com/jeffy/archive/2006/02/27/32710.html#Feedback0http://www.aygfsteel.com/jeffy/comments/commentRss/32710.htmlhttp://www.aygfsteel.com/jeffy/services/trackbacks/32710.html介绍Tapestry的相关中文网址Q?/FONT>
http://www.netbei.com/Article/jsp/Tapestry/Index.html


Tapestry是一个开源的Zservlet的应用程序框Ӟ它用组件对象模型来创徏动态的Q交互的web应用。一个组件就是Q意一个带有jwcid属性的html标记。其中jwc的意思是Java Web Component。Tapestry使得java代码与html完全分离Q利用这个框架开发大型应用变得轻而易举。ƈ且开发的应用很容易维护和升。Tapestry支持本地化,光误报告也很详l。Tapestry主要利用javabean和xml技术进行开发?nbsp;

W一个应用程?nbsp;

在介l第一个应用之前,先介l一下Tapestry的安装。从sourceforge下蝲其最新版Q解压后Q将lib目录下的jar文g攑ֈCLASSPATH中,其中的war文g攑ֈtomcat的webapp目录下。然后就可以通过http://localhost:8080/tutorial讉K其tutorial应用?nbsp;
在Tapestry中一个应用程序有以下几部分组成,我们以其自n带的HelloWorldE序Z介绍Q?nbsp;

ServletQ?nbsp;
q是一个应用的M部分Qservletc,q个cdLApplicationServlet的子c,q且必须实现getApplicationSpecificationPath()Ҏ。示例如下: 


import com.primix.tapestry.*; 
public class HelloWorldServlet extends ApplicationServlet 

protected String getApplicationSpecificationPath() 

return "/tutorial/hello/HelloWorld.application"; 




/tutorial/hello/HelloWorld.application是一个应用的说明文g?nbsp;
Application SpecificationQ?nbsp;
其实是描述q个应用的一个xml文gQ在q个应用中有许多参数需要设|,engine-class在下面介绍Qpage中的name属性指定html文g名,specification-path指定对这个页面的说明文g。在一个应用中可以有很多个pageQ但必须有一个page的name?Home"Q因为当讉K你的应用Ӟ首先昄的就是这个page?nbsp;

<?xml version="1.0" encoding="UTF-8"?>; 
<!DOCTYPE application PUBLIC "-//Howard Ship//Tapestry Specification 1.1//EN" "http://tapestry.sf.net/dtd/Tapestry_1_1.dtd">; 
<application name="Hello World Tutorial" engine-class="com.primix.tapestry.engine.SimpleEngine">; 
<page name="Home" specification-path="/tutorial/hello/Home.jwc"/>; 
</application>; 


Application EngineQ?nbsp;

当客戯接到Tapestry应用ӞTapestry会创徏一个Engine对象Q类gsessionQ。通常我们E序中的application engine 一般是SimpleEnginecȝ一个实例,当然q个cȝ子类也可以?nbsp;

Page SpecificationQ?nbsp;
跟应用说明相|说明也是一个xml描述文gQ?nbsp;


<?xml version="1.0" encoding="UTF-8"?>; 
<!DOCTYPE specification PUBLIC "-//Howard Ship//Tapestry Specification 1.1//EN" "http://tapestry.sf.net/dtd/Tapestry_1_1.dtd">; 
<specification class="com.primix.tapestry.BasePage"/>; 


因ؓq个应用是静态的Q所以用com.primix.tapestry.BasePage卛_Q如果是动态的应用Q则需在这个文件中定义一些componentQ当然用BasePage为基cȝzcM可以?nbsp;
html面Q?nbsp;
q个应用的html面非常单: 


<html>; 
<head>; 
<title>;Hello World</title>; 
</head>; 
<body>; 
<b>;HelloWorld</b>; 
</body>; 
</html>; 


注意上面所讲到的各U文仉要放到放在WAR的WEB-INF/classes目录下?BR>一个复杂的应用 

在这个应用中我们以一个简单的学生理pȝZ介绍一下Tapestry的常用功能。我们要实现学生的增加和昄Q因此我们需要两个html面。至于StudentServletcdStudent.application我们׃描述了,在Student.application中定义了两个pageQHome和EditStudentQ具体看附g。学生数据存攑֜数据库中Q我们用Studentc表C数据中的一条记录,用StudentFactorycL索学生数据,q两个类用到了一个JDBC包装器,关于q个JDBC包装器可以见我的另外一文?lt;<对一个简单的 JDBC 包装器的扩展及应?gt;;>;?nbsp;
首先看一下Home.html 


<html>; 
<head>; 
<title>;学生理</title>; 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">; 
</head>; 
<body bgcolor="#FFFFFF">; 
<p align="center">;学生列表</p>; 
<table width="100%" border="1">; 
<tr>; 
<td >;学号</td>; 
<td >;姓名</td>; 
<td >;性别</td>; 
<td >;班</td>; 
</tr>; 
<span jwcid="liststudent">; 
<tr>; 
<td>;<span jwcid="id">;20012400</span>;</td>; 
<td>;<span jwcid="sname">;宗锋</span>;</td>; 
<td>;<span jwcid="gender">;?lt;/span>;</td>; 
<td>;<span jwcid="department">;计算机研一</span>;</td>; 
</tr>; 
</span>; 
<tr jwcid="$remove$">; 
<td>;20011389</td>; 
<td>;桑一?lt;/td>; 
<td>;?lt;/td>; 
<td>;计算机研一</td>; 
</tr>; 
</table>; 
<a jwcid="add">;d学生</a>; 
</body>; 
</html>; 

与前面的单应用不同,我们在这个页面中定义了七个组Ӟ下面看一下部分Home.jwc文gQ我们将详细讲述一下怎样描述q些lg?nbsp;


<specification class="test.ListStudent">; 
<component id="liststudent" type="Foreach">; 
<binding name="source" property-path="student"/>; 
<binding name="value" property-path="eachstudent"/>; 
</component>; 
<component id="id" type="Insert">; 
<binding name="value" property-path="eachstudent.id"/>; 
</component>; 
<component id="add" type="Page">; 
<static-binding name="page">;EditStudent</static-binding>; 
</component>; 
</specification>; 

在这里,我们的specification的class属性g再是BasePageQ而是其派生类ListStudent。对于每一个组Ӟid属性指定唯一的标识符Q这个ghtml文g中的jwcid值相对应Qtype 指定lg名,binding指定lg怎得到数据,property-path是一pd属性的集合Q这些属性一般定义在javabean中,例如上面的property-path="student"Q则在相应的javabeancListStudent中应该有个函数getStudent。liststudent是一个ForeachlgQ这个组件其实是一个for循环Q它从source中读入一个数l,其一个一个的赋值给value参数指定的属性。idQnameQgenderQdepartment四个是InsertlgQ这个组件用来插入文本数据,参数value指定要插入的|property-path指定怎样获取q些|eachstudent.id相当于调用javabean的getEachstudent().getId()。add是一个PagelgQpage属性指定页面名Q定义在application文g中)Qstatic-binding表明要绑定的数据是不可修改的?remove$lg没有在这个文件中描述Q因为Tapestryq行时会自动删除q种lg?nbsp;
下面看一下ListStudentc: 

package test; 
import com.primix.tapestry.*; 
import sun.jdbc.odbc.JdbcOdbcDriver ; 


/** 
* q回每个学生的数?nbsp;

*/ 

public class ListStudent extends BasePage 

private Student eachstudent; 
private Student[] student; 
public void detach() 

eachstudent=null; 
student=null; 
super.detach(); 


public Student getEachstudent() 

return eachstudent; 

public void setEachstudent(Student value) 

eachstudent = value; 

public Student[] getStudent() 

try{ 
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
student=StudentFactory.findAllStudents(); 
}catch(Exception e){ 
e.printStackTrace(); 

return student; 






q个cL四个函数Q其中detach函数是将面攑օ~冲池时执行的操作,getStudent函数q回所有的学生记录Q这是给jwc文g中liststudentlg的source参数赋|getEachstudentl这个组件的value参数赋|因ؓsource是一个数l,每次循环需要从中取Z条记录赋值给eachstudent,所以还有一个函CؓsetEachstudentQ你会注意到q个函数很简单,其实是Tapestry帮你做了大部分工作?nbsp;
xQ显C学生的部分已经完成Q下面看一下EditStudent.html 

<html>; 
<head>; 
<title>;增加学生</title>; 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">; 
</head>; 
<body>; 
<p>;<img src="student.gif" width="32" height="32"/>; 学生理pȝ</p>; 
<form jwcid="form">; 
<span jwcid="ifError">; 
<font size=+2 color=red>;<span jwcid="insertError"/>;</font>; 
</span>; 
<p>;学号Q?nbsp;
<input jwcid="id"/>; 
</p>; 
<p>;姓名Q?nbsp;
<input jwcid="name"/>; 
</p>; 
<span jwcid="gender">; 
<p>;性别Q?nbsp;
<input jwcid="male"/>; 
?nbsp;
<input jwcid="female"/>; 
?nbsp;
</p>; 
</span>; 
<p>;班Q?nbsp;
<input jwcid="department"/>; 
</p>; 
<p>; 
<input type="submit" value="定">; 
</p>; 
</form>; 
</body>; 
</html>; 


在这个文件中Q用C另外一些常用的lgQ先看一下EditStudent.jwc中的q些lg的描qͼ 


<specification class="test.EditStudent">; 
<component id="form" type="Form">; 
<binding name="listener" property-path="listeners.formSubmit"/>; 
</component>; 
<component id="gender" type="RadioGroup">; 
<binding name="selected" property-path="gender"/>; 
</component>; 
<component id="ifError" type="Conditional">; 
<binding name="condition" property-path="error"/>; 
</component>; 
<component id="insertError" type="Insert">; 
<binding name="value" property-path="error"/>; 
</component>; 
<component id="id" type="TextField">; 
<binding name="value" property-path="id"/>; 
</component>; 
<component id="male" type="Radio">; 
<field-binding name="value" field-name="test.EditStudent.MALE"/>; 
</component>; 
</specification>; 


form是一个FormlgQ它的参数listener指定submitq个form时有那个函数处理。ifError是一个ConditionallgQ这个组件指定当condition满时才会显C,在本例中Q如果error不ؓI,则condition满。在q个lg中,有嵌套了一个Insertcd的组Ӟ用于错误显C。这是Tapestry中经常用到的处理错误的方式。gender是一个RadioGrouplgQ它l定了javabean中的gender属性,selected参数指定那个radio被选中Q在q个lg中,又嵌套了两个RadiolgQ分别用来表C男Q女。Radio的value参数指定当用户选定q个radioӞRadioGroupl定的属性值将会等于field-name中指定的|q个值必Lstatic的)Q在本例中,gender=test.EditStudent.MALE。id是一个TextFieldlgQ其参数valuel定到javabean中的id属性?nbsp;
下面是相应的EditStudentc: 

package test; 
import com.primix.tapestry.*; 

public class EditStudent extends BasePage 

public static final int MALE = 1; 
public static final int FEMALE = 2; 

private int gender; 
private String error; 
private String id; 
private String sname; 
private String department; 

public void detach() 

error = null; 
id=null; 
sname=null; 
gender=0; 
department=null; 
super.detach(); 


public int getGender() 

return gender; 

public String getId() 

return id; 

public String getSname() 

return sname; 

public String getDepartment() 

return department; 



public void setGender(int value) 

gender = value; 
fireObservedChange("gender", value); 

public void setId(String value) 

id = value; 
fireObservedChange("id", value); 

public String getError() 

return error; 

public void setSname(String value) 

sname = value; 
fireObservedChange("sname", value); 

public void setDepartment(String value) 

department = value; 
fireObservedChange("department", value); 

public void formSubmit(IRequestCycle cycle) 

//判断用户是否d了所有数?nbsp;
if (gender== 0||id==null||id.equals("")||sname==null||sname.equals("")|| 
department==null||department.equals("")) 

error = "请填充完所有选项"; 
return; 

//学生保?nbsp;
try{ 
Student student=new Student(); 
student.setId(id); 
student.setName(sname); 
if(gender==1) 
student.setGender("?); 
else 
student.setGender("?); 
student.setDepartment(department); 
student.save(null); 
}catch(Exception e){ 
e.printStackTrace(); 

//清空当前的各个属性,以免再次q入此页面时Q各属性仍旧保留原来的?nbsp;
setSname(null); 
setDepartment(null); 
setId(null); 
setGender(0); 
//重定向到Home面 
cycle.setPage("Home"); 





在本cȝ一些设|属性的函数中用了fireObservedChangeq个函数Q这个函数激发一个改变事Ӟ通知当前的属性的值已l改变?BR>其他应用 

Tapestry中自带的例子中的Workbench中的localization例子演示了怎样使用本地化,你只需要创Z同语a的html模板Q还有图形等其它一些html中用到的资源。例如创Z个法语版的EditStudent.htmlQ则相应的html文g名ؓEditStudent_fr.htmlQ而jwc中定义的lg的描qC用有多个版本。这里要介绍一下Tapestry本地化中l常用到的一个概念:assets。assets是一些web应用中用到的资源Q如图象Q视频。assets有三U:external, internal 和private。Externalcd的assets来源于Q意的URL。Internalcd的assets来源于和Tapestry应用在同一个服务器上的URL。Private cd的assets允许部v在WAR的WEB-INF/classes目录下(同上面的html模板Qjwc文g一PQ这个目录对于web服务器来说是不可见的?nbsp;
看一下Workbench中localization例子中的localization.jwc文g的片断: 

<component id="changeButton" type="ImageSubmit">; 
<binding name="image" property-path="assets.change-button"/>; 
</component>; 

<private-asset name="change-button" resource-path="/tutorial/workbench/localization/Change.gif"/>; 

在changeButtonlg中就使用了private assetsQ而这些图像文件就攑֜WAR的WEB-INF/classes下,注意囑փ跟html一样也有多个语a的版本?nbsp;
注意jwc文g中的inputLocaleq个lgQ其实localization应用是通过q个lg来实现本地化。具体参数请看其Developer guide?nbsp;

<component id="inputLocale" type="PropertySelection">; 
<binding name="value" property-path="page.engine.locale"/>; 
<binding name="model" property-path="localeModel"/>; 
</component>; 

Tapestryq支持创q可重用组Ӟ其自w带了一个这L例子QBorder。同时它q有其它一些例子:Inspector展示了怎样监视你的应用E序。vlib是一个用tapestry作表C层的j2ee应用E序Q用jboss作ؓ应用服务器)?nbsp;

Tapestry的功能非常强大,本文只是介绍了其一部分,q有很多斚w没有涉及刎ͼ例如javascript在Tapestry中的应用。具体可以看其文档,怿如果你用一下这个框Ӟ你就会被它深深吸引。Tapestry的文档做的不是很全,不过l过不断的摸索,怿你会很快掌握它?img src ="http://www.aygfsteel.com/jeffy/aggbug/32710.html" width = "1" height = "1" />

Live-in Java 2006-02-27 17:46 发表评论
]]>
վ֩ģ壺 ױ| ²| ɽ| ľ| | ̩| | ƽ| | ̩| | Ͽ| | | Ϸ| Ͽ| ƽ½| | | ٳ| | | Դ| ƽ| ͸| | | Ƹ| | | Ϣ| | | | | | | Һ| ɳ| ˳| |