??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美一区二区福利,国产91精品精华液一区二区三区,国产精品91在线 http://www.aygfsteel.com/jeffy/category/7977.htmlzh-cn Thu, 08 Mar 2007 11:01:00 GMT Thu, 08 Mar 2007 11:01:00 GMT 60 FreeMarker设计指南 (转蝲) http://www.aygfsteel.com/jeffy/archive/2006/03/02/33260.htmlLive-in Java Live-in Java Thu, 02 Mar 2006 09:17:00 GMT http://www.aygfsteel.com/jeffy/archive/2006/03/02/33260.html http://www.aygfsteel.com/jeffy/comments/33260.html http://www.aygfsteel.com/jeffy/archive/2006/03/02/33260.html#Feedback 0 http://www.aygfsteel.com/jeffy/comments/commentRss/33260.html http://www.aygfsteel.com/jeffy/services/trackbacks/33260.html 阅读全文 ]]> webwork 相关urls http://www.aygfsteel.com/jeffy/archive/2006/03/02/33237.htmlLive-in Java Live-in Java Thu, 02 Mar 2006 08:21:00 GMT http://www.aygfsteel.com/jeffy/archive/2006/03/02/33237.html http://www.aygfsteel.com/jeffy/comments/33237.html http://www.aygfsteel.com/jeffy/archive/2006/03/02/33237.html#Feedback 0 http://www.aygfsteel.com/jeffy/comments/commentRss/33237.html http://www.aygfsteel.com/jeffy/services/trackbacks/33237.html http://blog.video.com.cn/andy/subject/177.shtml ]]> WebWork的interceptor机制 (转蝲) http://www.aygfsteel.com/jeffy/archive/2006/03/02/33234.htmlLive-in Java Live-in Java Thu, 02 Mar 2006 08:02:00 GMT http://www.aygfsteel.com/jeffy/archive/2006/03/02/33234.html http://www.aygfsteel.com/jeffy/comments/33234.html http://www.aygfsteel.com/jeffy/archive/2006/03/02/33234.html#Feedback 0 http://www.aygfsteel.com/jeffy/comments/commentRss/33234.html http://www.aygfsteel.com/jeffy/services/trackbacks/33234.html WebWork目建立在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仅为日后方便查看) ]]> Webwork2 的Action Result Type 的定?(转蝲) http://www.aygfsteel.com/jeffy/archive/2006/03/02/33227.htmlLive-in Java Live-in Java Thu, 02 Mar 2006 07:45:00 GMT http://www.aygfsteel.com/jeffy/archive/2006/03/02/33227.html http://www.aygfsteel.com/jeffy/comments/33227.html http://www.aygfsteel.com/jeffy/archive/2006/03/02/33227.html#Feedback 0 http://www.aygfsteel.com/jeffy/comments/commentRss/33227.html http://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仅为日后方便查看) ]]> Tapestry和ognl http://www.aygfsteel.com/jeffy/archive/2006/03/01/32990.htmlLive-in Java Live-in Java Wed, 01 Mar 2006 03:43:00 GMT http://www.aygfsteel.com/jeffy/archive/2006/03/01/32990.html http://www.aygfsteel.com/jeffy/comments/32990.html http://www.aygfsteel.com/jeffy/archive/2006/03/01/32990.html#Feedback 1 http://www.aygfsteel.com/jeffy/comments/commentRss/32990.html http://www.aygfsteel.com/jeffy/services/trackbacks/32990.html OGNL(Object Graph Navigation Language )Tapestry ?/SPAN>OGNL l合的很完美?/SPAN>OGNL 是一U?/SPAN>Java 表达式语aQ它被用来读取和更新对象的属性?/SPAN>OGNL 比徏立在 JSP2.0 标签库之上的表达式语a更简单功能也更强大?/SPAN>OGNL 不仅仅提供属性的讉KQ它包括了精的表达式和Ҏ的调用。也能访问类的静态域。也可以创徏新的对象Q包?/SPAN>List ?/SPAN>Map 对象。简单的 OGNL 表达式是属性的名字。如Q?/SPAN>foo Q这q同于调用了方?/SPAN>getFoo() Q或者是 setFoo() 如果表达式是用来更新属性的Q。当属性的名字是连l的属性名ӞD功能pv作用了。如Q?/SPAN>foo.bar.baz Q它q?/SPAN>getFoo().getBar().getBaz() 。不q要注意的是 foo ?/SPAN>bar q些属性不能ؓI?/SPAN> OGNL允许两个对象Q如和|包含的组Ӟ来共享信息?/SPAN>
]]>Tapestry介- 转蝲 (转自java-cn) http://www.aygfsteel.com/jeffy/archive/2006/02/27/32710.htmlLive-in Java Live-in Java Mon, 27 Feb 2006 09:46:00 GMT http://www.aygfsteel.com/jeffy/archive/2006/02/27/32710.html http://www.aygfsteel.com/jeffy/comments/32710.html http://www.aygfsteel.com/jeffy/archive/2006/02/27/32710.html#Feedback 0 http://www.aygfsteel.com/jeffy/comments/commentRss/32710.html http://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" /> ]]>
վ֩ģ壺
ױ |
² |
ɽ |
ľ |
|
̩ |
|
ƽ |
|
̩ |
ൺ |
Ͽ |
|
|
Ϸ |
Ͽ |
ƽ½ |
|
|
ٳ |
|
|
Դ |
ƽ |
|
|
|
Ƹ |
|
|
Ϣ |
|
|
|
|
彧 |
|
Һ |
ɳ |
˳ |
|