追忆Tapstry4.0------综合示例演示

本文介绍了一个使用Tapestry框架实现的网上商店应用程序。该应用包括产品展示、购物车管理、用户登录验证及订单确认等功能。通过示例代码展示了如何进行页面组件的设计与交互逻辑的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上例:http://blog.youkuaiyun.com/kunshan_shenbin/archive/2008/11/18/3325762.aspx

T3版本演示参考:http://blog.youkuaiyun.com/kunshan_shenbin/archive/2008/11/17/3318060.aspx

如下图所示建立工程:

所需jar包与上例一致。

代码如下:

Cart.java

  1. package com.ttdev.shop;
  2. import java.util.*;
  3. import org.apache.tapestry.annotations.*;
  4. import org.apache.tapestry.html.*;
  5. public abstract class Cart extends BasePage {
  6.     private Product currentProduct;
  7.     @InjectState("cart")
  8.     public abstract List<?> getCart();
  9.     
  10.     public List<Product> getProducts() {
  11.         List<?> cart = getCart();
  12.         List<Product> products = new ArrayList<Product>();
  13.         for (Iterator<?> iter = cart.iterator(); iter.hasNext();) {
  14.             String productId = (String) iter.next();
  15.             products.add(Catalog.getGlobalCatalog().lookup(productId));
  16.         }
  17.         return products;
  18.     }
  19.     public Product getCurrentProduct() {
  20.         return currentProduct;
  21.     }
  22.     public void setCurrentProduct(Product currentProduct) {
  23.         this.currentProduct = currentProduct;
  24.     }
  25.     public String onCheckout() {
  26.         return "Confirm";
  27.     }
  28.     public String continueShopping() {
  29.         return "Home";
  30.     }
  31. }

Catalog.java

  1. package com.ttdev.shop;
  2. import java.util.*;
  3. public class Catalog {
  4.     private List<Product> products;
  5.     private static Catalog globalCatalog;
  6.     public Catalog() {
  7.         products = new ArrayList<Product>();
  8.     }
  9.     public List<Product> getProducts() {
  10.         return products;
  11.     }
  12.     public void add(Product product) {
  13.         products.add(product);
  14.     }
  15.     public static Catalog getGlobalCatalog() {
  16.         if (globalCatalog == null) {
  17.             globalCatalog = new Catalog();
  18.             globalCatalog.add(new Product("p01""Pencil""a"1.20));
  19.             globalCatalog.add(new Product("p02""Eraser""b"2.00));
  20.             globalCatalog.add(new Product("p03""Ball pen""c"3.50));
  21.         }
  22.         return globalCatalog;
  23.     }
  24.     public Product lookup(String productId) {
  25.         for (Iterator<Product> iter = products.iterator(); iter.hasNext();) {
  26.             Product product = (Product) iter.next();
  27.             if (product.getId().equals(productId)) {
  28.                 return product;
  29.             }
  30.         }
  31.         throw new IllegalArgumentException("Unknown product id: " + productId);
  32.     }
  33. }

Confirm.java

  1. package com.ttdev.shop;
  2. import java.util.*;
  3. import org.apache.tapestry.*;
  4. import org.apache.tapestry.annotations.*;
  5. import org.apache.tapestry.callback.*;
  6. import org.apache.tapestry.event.*;
  7. import org.apache.tapestry.html.*;
  8. public abstract class Confirm extends BasePage implements PageValidateListener {
  9.     
  10.     @InjectState("cart")
  11.     public abstract List<?> getCart();
  12.     
  13.     @InjectState("user")
  14.     public abstract User getUser();
  15.     @InjectStateFlag("user")
  16.     public abstract boolean getUserExists();
  17.     @InjectPage("Login")
  18.     public abstract Login getLoginPage();
  19.     public void pageValidate(PageEvent event) {
  20.         if (!getUserExists()) {
  21.             Login login = getLoginPage();
  22.             login.setNextPage(new PageCallback("Confirm"));
  23.             throw new PageRedirectException(login);
  24.         }
  25.     }
  26.     public double getTotal() {
  27.         double total = 0;
  28.         for (Iterator<?> iter = getCart().iterator(); iter.hasNext();) {
  29.             String productId = (String) iter.next();
  30.             total += Catalog.getGlobalCatalog().lookup(productId).getPrice();
  31.         }
  32.         return total;
  33.     }
  34.     public String getCreditCardNo() {
  35.         return getUser().getCreditCardNo();
  36.     }
  37.     public String onConfirm() {
  38.         //place the order.
  39.         System.out.println("Placing the order...");
  40.         return "Home";
  41.     }
  42.     public String onContinueShopping() {
  43.         return "Home";
  44.     }
  45. }

Home.java

  1. package com.ttdev.shop;
  2. import java.util.*;
  3. import org.apache.tapestry.annotations.*;
  4. import org.apache.tapestry.html.*;
  5. public abstract class Home extends BasePage {
  6.     
  7.     public List<?> getProducts() {
  8.         return Catalog.getGlobalCatalog().getProducts();
  9.     }
  10.     @InjectPage("ProductDetails")
  11.     public abstract ProductDetails getDetailsPage();
  12.     public ProductDetails onClickDetailsLink(String productId) {
  13.         getDetailsPage().setProductId(productId);
  14.         return getDetailsPage();
  15.     }
  16. }

Login.java

  1. package com.ttdev.shop;
  2. import org.apache.tapestry.*;
  3. import org.apache.tapestry.annotations.*;
  4. import org.apache.tapestry.callback.*;
  5. import org.apache.tapestry.html.*;
  6. import org.apache.tapestry.valid.*;
  7. public abstract class Login extends BasePage {
  8.     abstract public String getEmail();
  9.     abstract public String getPassword();
  10.     @Persist("client")
  11.     public abstract void setNextPage(ICallback callback);
  12.     public abstract ICallback getNextPage();
  13.     @InjectState("user")
  14.     public abstract User getUser();
  15.     
  16.     @Bean
  17.     public abstract ValidationDelegate getDelegate();
  18.     
  19.     public void onLogin(IRequestCycle cycle) {
  20.         try {
  21.             User user = Users.getKnownUsers().getUser(getEmail(), getPassword());
  22.             getUser().copyFrom(user);
  23.             ICallback callback = getNextPage();
  24.             if (callback != null) {
  25.                 callback.performCallback(cycle);
  26.             } else {
  27.                 cycle.activate("Home");
  28.             }
  29.         } catch (RuntimeException e) {
  30.             ValidationDelegate delegate = getDelegate(); 
  31.             delegate.setFormComponent(null);
  32.             delegate.record("Login failed"null);
  33.         }
  34.     }
  35. }

Product.java

  1. package com.ttdev.shop;
  2. public class Product {
  3.     private String id;
  4.     private String name;
  5.     private String desc;
  6.     private double price;
  7.     public Product(String id, String name, String desc, double price) {
  8.         this.id = id;
  9.         this.name = name;
  10.         this.desc = desc;
  11.         this.price = price;
  12.     }
  13.     public String getId() {
  14.         return id;
  15.     }
  16.     public String getName() {
  17.         return name;
  18.     }
  19.     public double getPrice() {
  20.         return price;
  21.     }
  22.     public String getDesc() {
  23.         return desc;
  24.     }
  25. }

ProductDetails.java

  1. package com.ttdev.shop;
  2. import java.util.*;
  3. import org.apache.tapestry.*;
  4. import org.apache.tapestry.annotations.*;
  5. import org.apache.tapestry.callback.*;
  6. import org.apache.tapestry.html.*;
  7. public abstract class ProductDetails extends BasePage implements IExternalPage {
  8.     @Persist("client")
  9.     public abstract String getProductId();
  10.     public abstract void setProductId(String productId);
  11.     public String getName() {
  12.         return lookup().getName();
  13.     }
  14.     public String getDesc() {
  15.         return lookup().getDesc();
  16.     }
  17.     private Product lookup() {
  18.         return Catalog.getGlobalCatalog().lookup(getProductId());
  19.     }
  20.     @InjectState("cart")
  21.     public abstract List<String> getCart();
  22.     public String addToCart() {
  23.         getCart().add(getProductId());
  24.         return "Cart";
  25.     }
  26.     public String continueShopping() {
  27.         return "Home";
  28.     }
  29.     public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {
  30.         setProductId((String) parameters[0]);
  31.     }
  32.     @InjectPage("Login")
  33.     public abstract Login getLoginPage();
  34.     
  35.     public Login login() {
  36.         getLoginPage().setNextPage(new ExternalCallback(thisnew String[] { getProductId() }));
  37.         return getLoginPage();
  38.     }
  39. }

User.java

  1. package com.ttdev.shop;
  2. import java.io.*;
  3. public class User implements Serializable {
  4.     private static final long serialVersionUID = 1858318434177120215L;
  5.     private String id;
  6.     private String email;
  7.     private String password;
  8.     private String creditCardNo;
  9.     public User() {     
  10.     }
  11.     public User(String id, String email, String password, String creditCardNo) {
  12.         this.id = id;
  13.         this.email = email;
  14.         this.password = password;
  15.         this.creditCardNo = creditCardNo;
  16.     }
  17.     public boolean authenticate(String email, String password) {
  18.         return this.email.equals(email) && this.password.equals(password);
  19.     }
  20.     public void copyFrom(User user) {
  21.         this.id = user.id;
  22.         this.email = user.email;
  23.         this.password = user.password;
  24.         this.creditCardNo = user.creditCardNo;
  25.     }
  26.     public String getCreditCardNo() {
  27.         return creditCardNo;
  28.     }
  29. }

Users.java

  1. package com.ttdev.shop;
  2. import java.util.*;
  3. public class Users {
  4.     private List<User> users;
  5.     private static Users knownUsers;
  6.     
  7.     public Users() {
  8.         users = new ArrayList<User>();
  9.     }
  10.     public void add(User user) {
  11.         users.add(user);
  12.     }
  13.     public User getUser(String email, String password) {
  14.         for (Iterator<User> iter = users.iterator(); iter.hasNext();) {
  15.             User user = (User) iter.next();
  16.             if (user.authenticate(email, password)) {
  17.                 return user;
  18.             }
  19.         }
  20.         throw new RuntimeException();
  21.     }
  22.     public static Users getKnownUsers() {
  23.         if (knownUsers == null) {
  24.             knownUsers = new Users();
  25.             knownUsers.add(new User("u001""paul@yahoo.com""aaa""1111 2222 3333 4444"));
  26.             knownUsers.add(new User("u002""john@hotmail.com""bbb""2222 3333 4444 5555"));
  27.             knownUsers.add(new User("u003""mary@gmail.com""aaa""3333 4444 5555 6666"));
  28.         }
  29.         return knownUsers;
  30.     }
  31. }
hivemodule.xml

 

  1. <?xml version="1.0"?>
  2. <module id="com.ttdev.shop" version="1.0.0">
  3.     <contribution configuration-id="tapestry.state.ApplicationObjects">
  4.         <state-object name="cart" scope="session">
  5.             <create-instance class="java.util.ArrayList"/>
  6.         </state-object>
  7.     </contribution>
  8.     <contribution configuration-id="tapestry.state.ApplicationObjects">
  9.         <state-object name="user" scope="session">
  10.             <create-instance class="com.ttdev.shop.User"/>
  11.         </state-object>
  12.     </contribution>
  13. </module>

Cart.html

  1. <html>
  2. <head>
  3. <title>Shopping cart</title>
  4. </head>
  5. <body>
  6. <h1>Shopping cart</h1>
  7. <table border="1">
  8.     <tr jwcid="products">
  9.         <td><span jwcid="id">p01</span></td>
  10.         <td><span jwcid="name">Pencil</span></td>
  11.         <td><span jwcid="price">1.20</span></td>
  12.     </tr>
  13. </table>
  14. <form jwcid="cartActionForm">
  15.     <input type="submit" value="Checkout" jwcid="checkout"/>
  16.     <input type="submit" value="Continue shopping" jwcid="continueShopping"/>
  17. </form>
  18. </body>
  19. </html>

Cart.page

  1. <?xml version="1.0"?>
  2. <!DOCTYPE page-specification PUBLIC
  3.   "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
  5. <page-specification>
  6.     <component id="products" type="For">
  7.         <binding name="source" value="products"/>
  8.         <binding name="value" value="currentProduct"/>
  9.         <binding name="element" value="literal:tr"/>
  10.     </component>
  11.     <component id="id" type="Insert">
  12.         <binding name="value" value="currentProduct.id"/>
  13.     </component>
  14.     <component id="name" type="Insert">
  15.         <binding name="value" value="currentProduct.name"/>
  16.     </component>
  17.     <component id="price" type="Insert">
  18.         <binding name="value" value="currentProduct.price"/>
  19.     </component>
  20.     <component id="cartActionForm" type="Form"/>
  21.     <component id="checkout" type="Submit">
  22.         <binding name="listener" value="listener:onCheckout"/>
  23.     </component>
  24.     <component id="continueShopping" type="Submit">
  25.         <binding name="listener" value="listener:continueShopping"/>
  26.     </component>
  27. </page-specification>

Confirm.html

  1. <html>
  2. <head>
  3. <title>Confirmation</title>
  4. </head>
  5. <body>
  6. <h1>Confirm your order</h1>
  7. You're going to pay <span jwcid="total">100</span> with your
  8. credit card <span jwcid="creditCardNo">xxxx yyyy zzzz</span>.
  9. <p>
  10. <form jwcid="confirmForm">
  11.     <input type="submit" value="Confirm" jwcid="confirm"/>
  12.     <input type="submit" value="Continue shopping" jwcid="continueShopping"/>
  13. </form>
  14. </body>
  15. </html>

Confirm.page

  1. <?xml version="1.0"?>
  2. <!DOCTYPE page-specification PUBLIC
  3.   "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
  5. <page-specification>
  6.     <component id="total" type="Insert">
  7.         <binding name="value" value="total"/>
  8.     </component>
  9.     <component id="creditCardNo" type="Insert">
  10.         <binding name="value" value="creditCardNo"/>
  11.     </component>
  12.     <component id="confirmForm" type="Form"/>
  13.     <component id="confirm" type="Submit">
  14.         <binding name="listener" value="listener:onConfirm"/>
  15.     </component>
  16.     <component id="continueShopping" type="Submit">
  17.         <binding name="listener" value="listener:onContinueShopping"/>
  18.     </component>
  19. </page-specification>

Home.html

  1. <html>
  2. <head>
  3. <title>Shop</title>
  4. </head>
  5. <body>
  6. <h1>Product listing</h1>
  7. <table border="1">
  8.     <tr jwcid="products">
  9.         <td><span jwcid="id">p01</span></td>
  10.         <td><a href="" jwcid="detailsLink"><span jwcid="name">Pencil</span></a></td>
  11.         <td><span jwcid="price">1.20</span></td>
  12.     </tr>
  13. </table>
  14. <p>
  15. <a href="" jwcid="loginLink">Login</a>
  16. <a href="" jwcid="logoutLink">Logout</a>
  17. </body>
  18. </html>

Home.page

  1. <?xml version="1.0"?>
  2. <!DOCTYPE page-specification PUBLIC
  3.   "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
  5. <page-specification>
  6.     <property name="currentProduct"/>
  7.     <component id="products" type="For">
  8.         <binding name="source" value="products"/>
  9.         <binding name="value" value="currentProduct"/>
  10.         <binding name="element" value="literal:tr"/>
  11.     </component>
  12.     <component id="id" type="Insert">
  13.         <binding name="value" value="currentProduct.id"/>
  14.     </component>
  15.     <component id="name" type="Insert">
  16.         <binding name="value" value="currentProduct.name"/>
  17.     </component>
  18.     <component id="price" type="Insert">
  19.         <binding name="value" value="currentProduct.price"/>
  20.     </component>
  21.     <component id="detailsLink" type="DirectLink">
  22.         <binding name="listener" value="listener:onClickDetailsLink"/>
  23.         <binding name="parameters" value="currentProduct.id"/>
  24.     </component>
  25.     <component id="loginLink" type="PageLink">
  26.         <binding name="page" value="literal:Login"/>
  27.     </component>
  28.     <component id="logoutLink" type="ServiceLink">
  29.         <binding name="service" value="literal:restart"/>
  30.     </component>
  31. </page-specification>

Login.html

  1. <html>
  2. <head>
  3. <title>Login</title>
  4. </head>
  5. <body>
  6. <h1>Login</h1>
  7. <span style="color: red"><span jwcid="errorMsg"/></span>
  8. <form jwcid="loginForm">
  9.     <table border="0">
  10.     <tr><td>Email:</td><td><input type="text" jwcid="email"/></td></tr>
  11.     <tr><td>Password:</td><td><input type="password" jwcid="password"/></td></tr>
  12.     <tr><td></td><td><input type="submit" value="Login"/></td></tr>
  13.     </table>
  14. </form>
  15. </body>
  16. </html>
  17. <!--<html>
  18. <head>
  19. <title>Login</title>
  20. </head>
  21. <body>
  22. <h1>Login</h1>
  23. <span style="color: red"><span jwcid="errorMsg"/></span>
  24. <form jwcid="loginForm">
  25.     <table border="0">
  26.     <tr><td>Email:</td><td><input type="text" jwcid="email"/></td></tr>
  27.     <tr><td>Password:</td><td><input type="password" jwcid="password"/></td></tr>
  28.     <tr><td></td><td><input type="submit" value="Login"/></td></tr>
  29.     </table>
  30. </form>
  31. </body>
  32. </html>-->

Login.page

  1. <?xml version="1.0"?>
  2. <!DOCTYPE page-specification PUBLIC
  3.   "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
  5. <page-specification>
  6.     <component id="loginForm" type="Form">
  7.         <binding name="listener" value="listener:onLogin"/>
  8.     </component>
  9.     <component id="email" type="TextField">
  10.         <binding name="value" value="email"/>
  11.     </component>
  12.     <component id="password" type="TextField">
  13.         <binding name="value" value="password"/>
  14.         <binding name="hidden" value="true"/>
  15.     </component>
  16.     <component id="errorMsg" type="Delegator">
  17.         <binding name="delegate" value="beans.delegate.firstError"/>
  18.     </component>
  19. </page-specification>

ProductDetails.html

  1. <html>
  2. <head>
  3. <title><span jwcid="name">Pencil</span></title>
  4. </head>
  5. <body>
  6. <h1><span jwcid="name2">Pencil</span></h1>
  7. <span jwcid="desc">xxx</span>   
  8. <form jwcid="productActionForm">
  9.     <input type="submit" value="Add to cart" jwcid="addToCart"/>
  10.     <input type="submit" value="Continue shopping" jwcid="continueShopping"/>
  11. </form>
  12. <a href="" jwcid="refresh">Refresh</a> 
  13. <p>
  14. <a href="" jwcid="loginLink">Login</a>
  15. </body>
  16. </html>
  17. <!--<html>
  18. <head>
  19. <title><span jwcid="name">Pencil</span></title>
  20. </head>
  21. <body>
  22. <h1><span jwcid="name2">Pencil</span></h1>
  23. <span jwcid="desc">xxx</span>   
  24. <form jwcid="productActionForm">
  25. <input type="submit" value="Add to cart" jwcid="addToCart"/>
  26. <input type="submit" value="Continue shopping" jwcid="continueShopping"/>
  27. </form>
  28. <a href="" jwcid="refresh">Refresh</a>
  29. <p>
  30. <a href="" jwcid="loginLink">Login</a>
  31. </body>
  32. </html>-->

ProductDetails.page

  1. <?xml version="1.0"?>
  2. <!DOCTYPE page-specification PUBLIC
  3.   "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
  5. <page-specification>
  6.     <component id="name" type="Insert">
  7.         <binding name="value" value="name"/>
  8.     </component>
  9.     <component id="name2" copy-of="name"/>
  10.     <component id="desc" type="Insert">
  11.         <binding name="value" value="desc"/>
  12.     </component>
  13.     <component id="productActionForm" type="Form">
  14.     </component>
  15.     <component id="addToCart" type="Submit">
  16.         <binding name="listener" value="listener:addToCart"/>
  17.     </component>
  18.     <component id="continueShopping" type="Submit">
  19.         <binding name="listener" value="listener:continueShopping"/>
  20.     </component>
  21.     <component id="refresh" type="PageLink">
  22.         <binding name="page" value="literal:ProductDetails"/>
  23.     </component>
  24.     <component id="loginLink" type="DirectLink">
  25.         <binding name="listener" value="listener:login"/>
  26.     </component>
  27. </page-specification>

Shop.application

  1. <?xml version="1.0"?>
  2. <!DOCTYPE application PUBLIC
  3.   "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
  4.   "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
  5. <application>
  6.     <meta key="org.apache.tapestry.page-class-packages" value="com.ttdev.shop"/>
  7. </application>

web.xml

  1. <?xml version="1.0"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  3.     xmlns:xsi="http://www.w3.org/TR/xmlschema-1/"
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
  5.     <display-name>Shop</display-name>
  6.     <servlet>
  7.         <servlet-name>Shop</servlet-name>
  8.         <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
  9.         <load-on-startup>1</load-on-startup>
  10.     </servlet>
  11.     <servlet-mapping>
  12.         <servlet-name>Shop</servlet-name>
  13.         <url-pattern>/app</url-pattern>
  14.     </servlet-mapping>
  15. </web-app>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值