??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲中文无码永久免,亚洲mv国产精品mv日本mv,亚洲精华液一二三产区http://m.tkk7.com/sdkdsyy/zh-cnSun, 11 May 2025 02:10:20 GMTSun, 11 May 2025 02:10:20 GMT60什么是j2ee【{?/title><link>http://m.tkk7.com/sdkdsyy/archive/2007/03/16/104347.html</link><dc:creator>寿业?/dc:creator><author>寿业?/author><pubDate>Fri, 16 Mar 2007 12:13:00 GMT</pubDate><guid>http://m.tkk7.com/sdkdsyy/archive/2007/03/16/104347.html</guid><wfw:comment>http://m.tkk7.com/sdkdsyy/comments/104347.html</wfw:comment><comments>http://m.tkk7.com/sdkdsyy/archive/2007/03/16/104347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/sdkdsyy/comments/commentRss/104347.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/sdkdsyy/services/trackbacks/104347.html</trackback:ping><description><![CDATA[ <font color="#000000" size="2">J2EE: 电子商务和信息技术的快速发展以及对它们的需求给应用E序开发h员带来了新的压力?br />必须以比以前更少的金钱、更的资源来更快地设计、开发企业应用程序。ؓ了降低成本,q加快企业应用程序的设计和开发, J2EE q_提供了一个基于组件的ҎQ来设计、开发、装配及部v企业应用E序。J2EE q_提供了多层的分布式的应用模型、组件再用、一致化的安全模型以及灵zȝ事务控制。您不仅可以用比以前更快的速度向市场推出创造性的客户解决ҎQ而且您的q_独立的、基于组件的J2EE 解决Ҏ不会被束~在M一个厂商的产品和API 上?br />1. J2EE 规范定义了以下种cȝlg<br />?应用客户lg?br />?Enterprise JavaBeans lg?br />?S e r v l e t及JavaServer PagesQJSP 面Q组Ӟ也被UCWeb lgQ?br />?Applet?br />一个多层的分布式的应用模型意味着应用逻辑被根据功能划分成lgQƈ且可以在同一?br />服务器或不同的服务器上安装组成J2EE 应用的这些不同的lg。一个应用组件应被安装在什?br />地方Q取决于该应用组件属于该多层的J2EE 环境中的哪一层。这些层是客户层、We b层、业?br />层及企业信息pȝ层( EIS Q等?br />(1) 客户?br />J2EE 应用可以是基于Web 的,也可以是不基于Web 的。在一个基于Web 的J2EE 应用中,用户的浏览器在客户层中运行,q从一个We b服务器下载Web 层中的静态HTML 面或由J S P或Servlet 生成的动态HTML 面。在一个不ZWeb 的J2EE 应用E序中,一个独立客L序不q行在一个HTML 面中,而是q行在其他一些基于网l的pȝQ比如手持设备或汽R电话Q中QApplet E序Q在客户层中q行Qƈ在不l过Web 层的情况下访问Enterprise Beans。这个不ZWeb 的客户层可能也包括一个JavaBeans cL理用户输入Qƈ该输入发送到在企业层中运行的Enterprise BeanscLq行处理。根据J2EE 规范QJavaBeans cM被视为组件。ؓJ2EE q_~写的JavaBeans cL实例变量和用于访问实例变量中的数据的?get 和set Ҏ”。以q种方式使用的JavaBeans cd设计和实C通常都是单的Q但是它们必ȝ合JavaBeans 规范中列出的命名和设计约定?br />(2) Web ?br />        J2EE Web lg可以由JSP 面、基于Web 的A p p l e t以及昄HTML 面的S e r v l e tl成。调用S e r v l e t或者JSP 面的HTML 面在应用程序组装时与Web lg打包在一赗就像客户层一PWeb 层可能包括一个JavaBeans cL理用户输入Qƈ输入发送到在业务层中运行的Enterprise Beans cLq行处理。运行在客户层的Web lg依赖容器来支持诸如客戯求和响应及Enterprise Bean 查询{?br />(3) 业务?br />        作ؓ解决或满x个特定业务领域(比如银行、零售或金融业)需要的逻辑的业务代码由q行在业务层的Enterprise Beans 来执行。一个Enterprise Bean 从客L序处接收数据Q对数据q行处理Q如果需要)Q再数据发送到企业信息pȝ层存储v来。一个Enterprise Beans q从存储中检索数据,q将数据送回客户E序。运行在业务层的Enterprise Beans 依赖于容器来如事务、生命期、状态管理、多U程及资源存储池{提供通常都非常复杂的pȝU代码。业务层l常被称作Enterprise JavaBeans QEJB Q层。业务层和Web 层一h成了3 层J 2 E E应用的中间层Q而其他两层是客户层和企业信息pȝ层?br />(4) 企业信息pȝ?br />企业信息pȝ层运行企业信息系lYӞq层包括企业基础设施pȝQ例如企业资源计划(E R PQ、大型机事务处理Q?mainframe transactionprocessing Q、数据库pȝ及其他遗留信息系l(legacy informationsystems Q。J2EE 应用lg因ؓ某种原因( 例如讉K数据? 可能需要访问企业信息系l。J2EE q_的未来版本将支持Connector 架构Q该架构是将J2EE q_q接C业信息系l上的一个标准A P I?br />(5) 查询服务<br />因ؓ一个J2EE 应用E序的组件是单独q行的,q且往往在不同的讑֤上运行,因此Q需要一U能让客户层和Web 层代码查询ƈ引用其他代码和资源的Ҏ。客户层和Web 层代码用Java 命名和目录接口(JNDI Q来查询用户定义的对象(例如Enterprise Beans Q、环境条目(例如一个数据库驱动器的位置Q、企业信息系l层中用于查找资源的JDBC DataSource对象Q以及消息连接?br />(6) 安全和事务管?br />诸如安全和事务管理这L应用行ؓ可以在部|时在Web 和Enterprise Beans lg上进行配|。这个特征将应用逻辑从可能随装配而变化的配置讑֮中分开了。J2EE 安全模型允许配置一个Web 或Enterprise Beans lgQɾpȝ资源只能由授权的用户讉K。例如,一个Web lg可以被配|成提示输入用户名和密码。一个Enterprise Beans lg可以被配|成只让特定团体中的成员调用其某些方法。或者,一个Servlet lg可以被配|成让某个组l中的所有h都能讉K其某些方法,同时只让该组l中的某些n有特权的问其中一些方法。同h该Servlet lgQ可以针对另外一个环境而被配置成让每个人都能访问其所有方法,或者仅让选定的少Ch讉K其所有方法?br />        J2EE 事务模型使得能够在部|时定义构成一个单一事务的方法之间的关系Q以使一个事务中的所有方法被处理成一个单一的单元。这是我们所希望的,因ؓ一个事务是一pd步骤Q这些步骤要么全部完成,要么全部取消。例如,一个Enterprise Beans 可能有一l方法,使我们可以通过从第一个̎户借出q存入第二个账户的方式而将׃W一个̎戯{UdW二个̎戗我们希望全部的操作被作Z个单元对待,q样Q如果在借出之后存入之前发生了故障,该借出操作被取消。事务属性是在装配期间定义在一个组件上的。这使得能将来自多个应用lg的方法归C个事务中Q这说明Q我们可以轻易变更一个J2EE 应用E序中的应用lgQƈ重新指定事务属性,而不必改变代码或重新~译。在设计应用lgӞ要记住,管Enterprise Beans 有一个可使应用组件的容器自动启动多步事务的机Ӟ但是Applet 和应用的客户容器可能q不支持q一炏V然而, Applet 和应用客户容器L能够调用支持q一点的一个Enterprise Beans。还应当注意Q?JSP 面和Servlet 没有被设计成是事务的Q它们通常应当事务工作交l一个Enterprise Bean 来完成。然而,如果事务工作在一个JSP 面或Servlet 中是必须的,那么此种工作也应当是非常有限的?br />(7) 可重用应用组?br />J2EE lgQApplet 、应用的客户、Enterprise Beans 、JSP 面及Servlet Q都被打包成模块Qƈ以Java Archive QJAR Q文件的形式交付。一个模块由相关的组件、相关的文g及描q如何配|组件的配置描述文g</font> <img src ="http://m.tkk7.com/sdkdsyy/aggbug/104347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/sdkdsyy/" target="_blank">寿业?/a> 2007-03-16 20:13 <a href="http://m.tkk7.com/sdkdsyy/archive/2007/03/16/104347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Tapestry入门Q译作)http://m.tkk7.com/sdkdsyy/archive/2006/10/07/73609.html寿业?/dc:creator>寿业?/author>Sat, 07 Oct 2006 04:18:00 GMThttp://m.tkk7.com/sdkdsyy/archive/2006/10/07/73609.htmlhttp://m.tkk7.com/sdkdsyy/comments/73609.htmlhttp://m.tkk7.com/sdkdsyy/archive/2006/10/07/73609.html#Feedback1http://m.tkk7.com/sdkdsyy/comments/commentRss/73609.htmlhttp://m.tkk7.com/sdkdsyy/services/trackbacks/73609.html ?br />
Jakarta Tapestry是一个开源的Java Web应用框架。你或许会说Q?大同异的东西Ş?"多数

情况下,我同意你的观点,然而,只要׃些许旉研究一下,你会发现Tapestry跟别的框架大Z同,它是值得严肃对待的?br />
Tapestry是一个基于控件的框架以致于用它开发Web应用cM开发传l的GUI应用。你用Tapestry开发Web应用时你无需x以操作ؓ中心?operation-centric) Servlet API.引用Tapestry|站上的一句话Q?Tapestry用对?objects),ҎQmethodsQ?属性(propertiesQ替代以往的URLs和查询参敎ͼ 重新诠释Web应用开?Tapestry 3.0卛_发布Q它有大量的改进和新的特性?br />
Tapestry的目?br />
单?br />
Tapestry应用与传l的Servlet应用相比代码量更。大多数传统的Servlet应用包含如下厌烦?br />
重复的Q务:解析查询参数Q处理HttpSession对象Q构建URLs。Tapestry消除了传lServelt应用中许多无的"衔接"代码("plumbing" code)使开发者把_֊集中到应用逻辑上来?br />
一致?br />
Tapestry为开发Web应用的页面提供了一致的方式。这h助于消除传统Servlet应用开发中臆测。由于所有Tapestry应用中的面都是用相同的可复用的控gl织而成Q所以工作方式是怼的?br />
效率

Tapestr应用拥有高度的可升性,它利用缓存和对象池每个h的处理时间最化。Tapestry应用拥有跟传lServlet应用总的性能?br />
错误反馈

M开发过Servlet/JSP应用的h毫无质疑有类似经历:Z扑ևWeb.xml文g有什么错误,不得不花费大量时间察看浏览器中的堆栈信息。Tapestry拥有优秀的错误报告方式,最值得一提的是它会指出哪个文件以及那一行导致了错误?br />
与Struts比较

既然Apache Struts可能是当今应用最q泛的Web应用框架Q拿Tapestry与它比较是唯一公^的。以下是一些观察比较,它们来源于ؓq篇文章开发的几个单的Tapestry应用和ؓ几个Struts工程的工作经历?br />
Struts的优?br />
1 一个Servlet/JSP开发者熟悉Struts无需太久。然而Tapestry的学习曲U会长一点,因ؓ它与行的Web应用框架不太相同 ?br />
2 Struts在JavaC֌里被q泛接受和用。ؓ你的目找一个好的Struts开发h员ƈ非难事,Tapestryq来在开发者社区里 赢得一些关注,然而仍有许多Java老手不知道TapestryZ物?br />
3 既然Struts被如此广泛的使用Q所以有很多Struts资源可供参考。相比大多数开源YӞTapestry拥有非常可观的资源和文档Q但跟Struts相比仍有差距?br />
Tapestry的优?br />
1 你开发一个Tapestry应用无需xServlet API,你也无须Z的Servlet应用写一些典型的"衔接"代码。虽然Struts化了工作Q然而Servlet API 仍是你需面对的?br />
2 Tapestry的页面模杉K了几个特别属性和标识是一个标准的HTML文g?如果你是一个开发小l中的HTML设计高手Q然而你不懂Java或JSP,q就l你带来很大方便?br />
3 因ؓTapestry面是标准的HTML,所以可以用HTML所见即所得(WYSIWYGQ编辑器~辑和预览该c当一个页需要修改它的外观ƈ不需要通知服务器让它重新编译JSP.

4 Tapestry不需要一个至高的Q整个应用范围的配置文g。Tapestry应用中的每一|独立的,改变一不会媄响开发其?面的开发者,因ؓq没有一个配|文件把所有页面的览_连在一赗?br />
5 Tapestry拥有极好的错误报告。如果你在一个页的模板或面规范犯了一个错误,Tapestry会指出导致错误的行号?br />
6 用Tapestry开发是U乐。这栯听上M乎老调Q然而用Tapestry开发一个Web应用相比应用其他行的框架更然有。用Tapestry开发是应用了一U基于控件的架构Q与开发传l的GUI应用非常怼?br />
Tapestry 架构

Tapestry框架是标准Servlet API的一U扩展。它需要J2SDK1.2或更高版本的J2SDK和一个与Servlet API 2.2(或更?兼容的应用服务器/Servlet容器?br />
一个Tapestry应用p多拥有唯一名称的页面组成。一个页面由一个模板和一些可复用的控件构成。模板由标准的HTML标签和一些额外的属性和标签构成Q这些额外的属性和标签是ؓ了告诉Tapestry框架q个面的那些部分是由Tapestry控gl成?br />
单的Tapestry应用

Z最好的描述构徏一个Tapestry面的方斚w面,我们可以看看q个Pig Latin译器应用的代码。这个应用只有一个页面,在这里输入一个text值把它翻译成Pig Latin,然后把翻译好的值显C给用户?br />
在Tapestry应用中每个页?个部分组成:一个HTML模板Q一个页面规范文Ӟ一个JavacR?

q里有这个页面屏q抓图:

/Develop/ArticleImages/27/27850/CSDN_Dev_Image_2004-5-15226281.jpg


面模板由标准的HTML标签和一些额外的属性和标签构成Q这些额外的属性和标签是ؓ了告诉Tapestry框架q个面的那些部分是由Tapestry控gl成。页面模板存攑֜Web应用的根context目录下。通常QTapestry在启动时会寻扑֒呈现一个名?Home"的页。虽然我们可以改变这U行为,但依照Tapestry的惯例会更简单?br />
Home.html
    <html>
    <head>
      <title>Tapestry Pig Latin Translator</title>
    </head>
    <body>
      <h1>Pig Latin Translator</h1>
      <form jwcid="@Form"?listener="ognl:listeners.submit"?gt;
      <table border="1">
        <tr>
          <td>Value to Translate:</td>
          <td>
            <input type="text" jwcid="@TextField"?value="ognl:inputValue"/>
          </td>
        </tr>
        <tr>
          <td>Pig Latin:</td>
          <td>
            <jwcid="@Insert"?value="ognl:pigLatinValue"/>
          </td>
        </tr>
      </table>
      <input type="submit" jwcid="@Submit"?value="Translate"/>
      </form>
    </body>
    </html>
   

面模板的绝大部分是普通的HTML,只有部分TapestryҎ的属性和标签。这U模板机制的优势是Tapestry面模板可以在一个可见即所得的~辑器里创徏和预览。描qTapestry控g部分的标识是有限的和H出的?br />
标识里的jwcid所指是被应用的Tapestry控g的Java Web Component ID.在上面代码断里,我们是隐式地使用控g。隐式的控g是指直接在页面模杉K声明使用的控Ӟ。jwcid的前~ '@ 'W号是通知Tapestryq里声明使用了一个隐式控件?br />
在上面的Pig Latin Translator面模板里用了四个控ӞForm? TextField? Insert?和Submit⑤。它们只是Tapestry框架提供的包含超q?0个控件的控g库里的四个。在后面的范例中Q我们将会看到如何用显式控件。显式控件是指控件在面规范文g里声明后再用的控g?br />
在前面的HTML模板里,使用控g的同Ӟ也ؓ控g指定了参数。例如控件Form①有一个listener②参数它指定了当表单提交时对应的面c调用的Ҏ名称。那个ognl:前缀的用诏IK面的HTML模板Q指向的?a >Object Graph Navigation Language (OGNL)。OGNL是一个强大的开源的表达式语aQ用于将面内控件的属性绑定到面cȝ属性?br />
现在我们看看面规范文g。页面规范文件是一个扩展名为page的XML文gQ这个文件有许多职责Q在众多职责中最基本是指定页面对应的JavacR页面规范文件存攑֜webapp的WEB_INF目录?br />
Home.page
    <?xml version="1.0"?>
    <!DOCTYPE page-specification PUBLIC
        "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
        "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd>
    <page-specification class="Home">
        <property-specification name="inputValue" type="java.lang.String"/>
        <property-specification name="pigLatinValue" type="java.lang.String"/>
    </page-specification>

   
面规范文g的根元素有一个class的属性,它指定了q个对应的JavacR这个类必须要实现org.apache.tapestry.Ipage接口。页面规范同旉定义了两个属?property)元素Q以便Tapestry在页面类里创建新的属性?br />
Tapestry框架提供了org.apache.tapestry.html.BasePage class,它实CIpage接口。页面类被存攑֜Web-INF/classes目录下,跟你的Web应用的所需要的其他cL在一赗?br />
Home.java
    import org.apache.tapestry.html.BasePage;
    import org.apache.tapestry.IRequestCycle;

    public abstract class Home extends BasePage {
        public abstract String getInputValue();
        public abstract void setInputValue(String inputValue);

        public abstract String getPigLatinValue();
        public abstract void setPigLatinValue(String pigLatinValue);

        public void submit(IRequestCycle cycle) {
            String inputValue = getInputValue();
            String pigLatinValue = new PigLatinTranslator().translate(inputValue);
            setPigLatinValue(pigLatinValue);
        }
    }
   

你要提醒的第一件事或许是这个类Z么是抽象cR它q有几个抽象Ҏ讉KinputValueQpigLatinValue属性。这里利用了Tapestry会在q行时刻创徏子类的功能,q个子类会创Z在页面规范里声明的属性和生成相应的访问方法?br />
在表单提交时面cȝsubmitҎ会被调用。ؓ什么会q样Q因为我们在面模板里将Form控g的listener属性指定ؓQognl:listeners.submit。这意味着一个名叫submit的listener会通过面cȝlisteners被访问?br />
所有的面cd控gc都从org.apache.tapestry.AbstractComponentq个cȝ承来一个叫listeners的属性。当submitҎ完成后,面会显C译好的词?br />
最后讲讲Web.xmlq个Web发布描述文g。Tapestry,像许多其他的行的Web应用框架一P׃个Servlet构成Q但是还需要一个发布描q文件。那个发布描q文件应该被存放在WEB-INF目录?br />
web.xml
    <?xml version="1.0"?>
    <!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd>
    <web-app>
        <display-name>Tapestry Pig Latin Translator</display-name>

        <servlet>
            <servlet-name>tapestry</servlet-name>
            <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>

        <servlet-mapping>
            <servlet-name>tapestry</servlet-name>
            <url-pattern>/app</url-pattern>
        </servlet-mapping>
    </web-app>
   

虽然Pig Latin译应用非常单,但是它会让你对在Tapestry应用中一个页面的3个组成部分有了基本的了解。它也展CZ创徏一个Tapestry应用的一个页面只需写多么少的代码?br />
表单输入验证

Tapestry 提供了一些控件以便校验用L输入。校验子pȝ是ValidField控g的核心。在下面的登录应用中我们用ValidField控g。ValidField控g位于表单内,对用户在客户端的校验提供了有用的反馈和视觉上的错误提C?br />
区域?br />
在Tapestry中,区域化是相当单的。Tapestry允许文字和图形的区域化。ؓ了区域化面的内容,你可以ؓ每一个添加一个properties文gQ或者提供一个区域化的模ѝؓ每个面提供一个资源文件的方式q比理和维护一个巨大的全局的应用范围的资源文g单。如果页面的区域化ƈ不仅仅只是文字信息的区域化,例如面的布局不同或者组成的控g不同Q这h冉|供区域化的页面模板就能派上用Z。我们会在下面的d应用的用Tapestry区域化?br />
创徏控g

Tapestry发布时提供了40多个自带的控件。如果你想知道更多的关于Tapestry自带控g的信息,请参?a >Tapestry Component Reference.想看看Tapestry的控件的应用范例可访?a >Tapestry Component Workbench.如果你发C需要一个Tapestry本n没提供的控gQ你可以自己创徏一个。创Z自己的Tapestry控g跟创Z个页面是怼的。一个典型的Tapestry控g׃个控件规范文ӞXML文档Q,一个HTML控g模板Q一个实Corg.apache.tapestry.Icomponent接口的JavacR这个议题有点超出本文的范围Q但是如果你有兴学习如何创Z自己的Tapestry控gQ你可以参考Tapestry的原创hQ?a >Tapestry In Action 一书的作?-Howard Lewis Ship写的 Designing Tapestry Mega-Components ?br />
Tapestry d应用

你在Pig latin译器应用中看到了Tapestry的一些基本特性。与其用一个复杂的应用展示Tapestry所有的Ҏ以致于压得你揣不过气来Q还不如通过一些简单的应用让你扑ֈ一点对Tapestry的感觉。下面这个应用展CTapestry如何处理面DQ区域化Q验证和其他一些特性?/p>

q里有一个Home늚屏幕抓图Q下面跟着它的面模板?br />
/Develop/ArticleImages/27/27850/CSDN_Dev_Image_2004-5-15226283.jpg

Home.html
    <html>
    <head>
        <title>Welcome to the Tapestry Login Application</title>
    </head>

    <body>
        <h1>Welcome to the Tapestry Login Application</h1>
        <span jwcid="@PageLink"?page="Login">Login</span>
    </body>
    </html>
   
q个Home늚面模板除了一个jwcid属性定义用一个Tapestry PageLink①控件以外都是标准的HTML?br />
PageLink控g生成了一个指向Login늚链接。既然Home|有Q何动态的行ؓ所以它不需要页面规范和面对应的JavacR?br />
q里是Login늚屏幕抓图Q后面跟着是它的页面模ѝ?br />
/Develop/ArticleImages/27/27850/CSDN_Dev_Image_2004-5-15226285.jpg

Login.html
    <html>
    <head>
        <title>
            <span key="title">①Login</span>
        </title>
    </head>

    <body jwcid="@Body">?br />        <span jwcid="@Conditional" condition="ognl:beans.delegate.hasErrors">?br />            <div style="color: red">
                <span jwcid="@Delegator" delegate="ognl:beans.delegate.firstError">?br />                    Error Message
                </span>
            </div>
        </span>
        <p style="font-weight: bold" >
            <span key="hint">Hint: Your password is your username spelled backwards.</span>
        </p>
       
        <form jwcid="@Form" listener="ognl:listeners.login" delegate="ognl:beans.delegate">

?br />            <table>
                <tr>
                    <td align="right">
                        <span jwcid="@FieldLabel" field="ognl:components.inputUsername"?gt;
                            Username:
                        </span>
                    </td>
                    <td>
                        <input type="text" jwcid="inputUsername"?value="simpson_h"

size="30"/>
                    </td>
                </tr>

                <tr>
                    <td align="right">
                        <span jwcid="@FieldLabel" field="ognl:components.inputPassword">
                            Password:
                        </span>
                    </td>
                    <td>
                        <input type="text" jwcid="inputPassword" hidden="true" value=""

size="30"/>
                    </td>
                </tr>

                <tr>
                    <td colspan="2" align="center">
                        <input type="submit" jwcid="@Submit" value="message:login"/>
                    </td>
                </tr>
            </table>
        </form>
    </body>
    </html>
   

q个面模板大多数是通常的HTML。我们从面模板中可以看到Tapestry的区域化Ҏ:它用一个span元素Q这个span元素带有一个叫key的属性,key的值映到Login.properties文g里一个属性。一个Body控g被声明用,因ؓ它对客户端的JavaScript校验是必需的?br />
为Form component⑤设定delegate属性激z表单输入验证。delegate属性是我们在页面规范里声明的org.apache.tapestry.valid.IvalidationDelegate的实现类。如果验证错误发生了Q我们用Conditional component③控件判断delegate是否有Q何错误,如果有就把第一个错误④昄l用戗如果ognl 表达式ognl:beans.delegate.hasErrors 为true,Conditional控g显C它的内容实体。所有的面cd控gc都从AbstractComponentl承来一个叫beans的属性。这个beans属性是一个org.apache.tapestry.IbeanProvider的实例,利用它可以通过名字取得在页面规范文仉定义的beans.FieldLabel⑥被用于为inputuserName validField控g昄标签Q这个FieldLabel控g也被用来与表单的验证代理协作Q指出包含错误的输入域?br />InputUserName⑦控件是一个显C控件的例子。显式控件是指在面规范文g声明的控件。InputUsername和inputPassword控g都是昑ּ的,它们与FieldLabel联合昄它们的displayName属性?br />
下面的是Login늚资源文g。Login.properties跟页面规范一q存攑֜WEB-INF目录?br />
Login.properties
    title = Login to the Application
    hint = Hint: Your password is your username spelled backwards.
    login = Login
    username = Username:
    password = Password:
    invalidpassword = Invalid Password
   
Here is the page specification for the Login page.
Login.page
    <?xml version="1.0"?>
    <!DOCTYPE page-specification PUBLIC
        "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
        "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd>

    <page-specification class="com.ociweb.tapestry.Login">
        <bean name="delegate" class="org.apache.tapestry.valid.ValidationDelegate"/>?br />
        <bean name="requiredValidator"?br />            class="org.apache.tapestry.valid.StringValidator">
            <set-property name="required" expression="true"/>
            <set-property name="clientScriptingEnabled" expression="true"/>
        </bean>

        <property-specification name="username" type="java.lang.String"/>
        <property-specification name="password" type="java.lang.String"/>

        <component id="inputUsername" type="ValidField"> ?br />            <message-binding name="displayName" key="username"/> ?br />            <binding name="validator" expression="beans.requiredValidator"/> ?br />            <binding name="value" expression="username"/> ?br />        </component>

        <component id="inputPassword" type="ValidField"> ?br />            <message-binding name="displayName" key="password"/>
            <binding name="validator" expression="beans.requiredValidator"/>
            <binding name="value" expression="password"/>
        </component>

    </page-specification>
   

Page-specification元素的class属性和两个property-specification元素与Pig Latin译器应用是怼的?br />
你会发现W一个新东西-bean元素①,bean元素把一个org.apache.tapestry.valid.ValidationDelegate

的实例指定了名称"delegate"。页面HTML模板里的Form控g把它的参数delegate讑֮?br />ognl:beans.delegate,是指向了这个org.apache.tapestry.valid.ValidationDelegate实例?br />Bean元素②把一个org.apache.tapestry.valid.StringValidator的实例指定了名称"
requiredValidator",以用于验证。这个bean的required属性被设ؓtrue表明使用q个bean的域是必被验证的。这个bean的clientScriptingEnabled属性被讑֮为ture,表明使用q个bean的域客户端的JavaScript验证功能是激zȝ。RequiredValidator bean被用于验证inputUsername和inputPassword的内宏V?br />
控ginputUsername③被控g规范声明为ValidFieldQValidField是一U用于Tapestry验证子系l的Ҏ版本的TextField控g。Message-binding元素被用于指定inputUsername控g的displayName参数的|q个值是?username"为关键字从login.properties④文仉得到。InputUsername控g的validator参数被设定ؓrequiredValidator bean,q是我们在页面规范里声明q的⑤。控件的value参数跟页面Javacȝusername属性绑定在一起⑥。控件inputPassword的控件规范跟控ginputUsername几乎怼Q除了用于取得displayName的关键字和绑定的面Javacȝ属性不同?br />
通过使用ValidField控g和ؓ表单(form)提供一个ValidationDelegate, 我们ȀzMLogin表单的验证功能。除了服务器端的验证QTapestry也提供了客户端的验证Q利用JavaScriptQ。下面就是当用户提交一个表单而没有ؓUserName域提供值时Q一个JavaScript错误对话框弹出时的屏q抓图?br />
/Develop/ArticleImages/27/27850/CSDN_Dev_Image_2004-5-15226287.jpg

下面是当用h交一个表单而没有ؓPassword域提供值时Q一个JavaScript错误对话框弹出时的屏q抓图?br />

/Develop/ArticleImages/27/27850/CSDN_Dev_Image_2004-5-15226289.jpg


下面是Login对应的Java cR?br />
Login.java
    package com.ociweb.tapestry;

    import org.apache.tapestry.html.BasePage;
    import org.apache.tapestry.IRequestCycle;
    import org.apache.tapestry.valid.ValidationConstraint;
    import org.apache.tapestry.valid.IValidationDelegate;

    public abstract class Login extends BasePage {
        public abstract String getUsername();
        public abstract void setUsername(String username);

        public abstract String getPassword();
        public abstract void setPassword(String password);

        public void login(IRequestCycle cycle) {
            String username = getUsername();
            String password = getPassword();
            StringBuffer sb = new StringBuffer(username);
            String validPassword = sb.reverse().toString();
            if (password.equals(validPassword)) {
                cycle.activate("Success");?br />            } else {
                String errorMessage = getMessage("invalidpassword");?br />                IValidationDelegate validationDelegate =
                        (IValidationDelegate) getBeans().getBean("delegate");?br />                validationDelegate.record(errorMessage,
                                          ValidationConstraint.CONSISTENCY);?br />            }
        }
    }
   
跟Pig Latin译器应用一P我们的页面类也是抽象的,它有抽象Ҏ讉K在页面规范里定义的属?properties)。Tapestry会在q行时刻创徏username和password属性。LoginҎ只是单的验证一下用戯入的密码值是否刚好是用户名的反向。如果密码通过验证Q用户将被引领导Success page①?br />
如果密码输入有误Q我们用关键?invalidPassword"通过从org.apache.tapestry.AbstractComponent里承来的getMessage()Ҏ从Login.properties②里查找对应的资源。我们需要把密码错误信息U录到我们在面规范中定义的面validation delegate中去。我们可以利用我们在面规范中指定的名称Q从面的beans属性中扑֛validationDelegate③。最后,我们调用org.apache.tapestry.valid.IvalidationDelegate的recordҎ把将要显C给用户看的错误信息保存h。下面就是当用户输入错误密码的提交后的屏q抓图?br />
/Develop/ArticleImages/27/27850/CSDN_Dev_Image_2004-5-152262811.jpg

下面是Success늚面模板。Success늚面模板仅仅包含HTML标识Q所以它不需要页面规范和面

JavacR?br />
Success.html
    <html>
    <head>
        <title>Successful Login</title>
    </head>
    <body>
        <p>
            Congratulations! You have successfully logged on.
        </p>
    </body>
    </html>
   
ȝ

我希望这文章已l向你展CZTapestry框架在构建Web应用的是多么单,然而优雅。Tapestry与大多数LWeb应用框架最大不同在于它让你用基于控件的方式开发,而非以操作ؓ中心的方式开发。如果这文章激起了你的兴趣Q我你把它下载下来利用它你自q单的Web应用。通过感受单的应用Q这是你了解q个框架的优点的唯一途径。如果你惛_你的下一个项目里使用Tapestry,我强烈徏议你购买
Tapestry In Action q本书。我拥有q本书,对它我感到很满意?br />
References
1 Zip file with all source code and war files from the article. (12K)

                 http://www.ociweb.com/jnb/jnb2004_05.zip
2 Tapestry Home Page http://jakarta.apache.org/tapestry/
3 Tapestry In Action Page http://www.manning.com/lewisship/
4 Tapestry Wiki http://jakarta.apache.org/tapestry/wiki_frame.html
5 OGNL page http://www.ognl.org/
6 Tapestry Component Reference

                 http://jakarta.apache.org/tapestry/doc/ComponentReference/index.html
7 Tapestry Component Workbench http://www.t-deli.com/app
8 Designing Tapestry Mega-Components

                 http://www.onjava.com/pub/a/onjava/2001/11/21/tapestry.html


注:原文地址Q?a >http://www.inspiresky.com/Article/java/2006-02-14/412.html



]]>
վ֩ģ壺 һëƬȫѲ| ĻAëƬ| ҹ޾Ʒҹ³˿Ƭ| ձ| ޾Ʒ| þù˾Ʒ| ϼ˳߹ۿƵ| ޾ƷƬþò | պŷƵ| þþƷ޾Ʒ2020| ŮƷƵѹۿ| 99Ƶ߹ۿ| 츾AV| Ҹ鶹| ѾþþƷ99reѾy| ˳߲VA| ޾ƷŮ| ˳www| 999ھƷѹۿ| Ƶ߹ۿ| 츾þþƷ| ŷ޾Ʒþ| ҹҹ۲ӰԺ| ëƬۿ| Ʒһ| ֱӽѿƵվ| պĻò| þþþAVվ | ҰĻƵ| ɫwwwƵ߹ۿ| ޹AV| ޾ƷþþþþðĦ | ֳִӲƵ| 97Ƶѹۿ| Ʒѹۿ| ۺɫ߾Ʒ| ĻþþƷ2021| ޵Ӱһ| ޾Ʒþþþþο| һһëƬ| ݲƵ|