接上例: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
- package com.ttdev.shop;
- import java.util.*;
- import org.apache.tapestry.annotations.*;
- import org.apache.tapestry.html.*;
- public abstract class Cart extends BasePage {
- private Product currentProduct;
- @InjectState("cart")
- public abstract List<?> getCart();
- public List<Product> getProducts() {
- List<?> cart = getCart();
- List<Product> products = new ArrayList<Product>();
- for (Iterator<?> iter = cart.iterator(); iter.hasNext();) {
- String productId = (String) iter.next();
- products.add(Catalog.getGlobalCatalog().lookup(productId));
- }
- return products;
- }
- public Product getCurrentProduct() {
- return currentProduct;
- }
- public void setCurrentProduct(Product currentProduct) {
- this.currentProduct = currentProduct;
- }
- public String onCheckout() {
- return "Confirm";
- }
- public String continueShopping() {
- return "Home";
- }
- }
Catalog.java
- package com.ttdev.shop;
- import java.util.*;
- public class Catalog {
- private List<Product> products;
- private static Catalog globalCatalog;
- public Catalog() {
- products = new ArrayList<Product>();
- }
- public List<Product> getProducts() {
- return products;
- }
- public void add(Product product) {
- products.add(product);
- }
- public static Catalog getGlobalCatalog() {
- if (globalCatalog == null) {
- globalCatalog = new Catalog();
- globalCatalog.add(new Product("p01", "Pencil", "a", 1.20));
- globalCatalog.add(new Product("p02", "Eraser", "b", 2.00));
- globalCatalog.add(new Product("p03", "Ball pen", "c", 3.50));
- }
- return globalCatalog;
- }
- public Product lookup(String productId) {
- for (Iterator<Product> iter = products.iterator(); iter.hasNext();) {
- Product product = (Product) iter.next();
- if (product.getId().equals(productId)) {
- return product;
- }
- }
- throw new IllegalArgumentException("Unknown product id: " + productId);
- }
- }
Confirm.java
- package com.ttdev.shop;
- import java.util.*;
- import org.apache.tapestry.*;
- import org.apache.tapestry.annotations.*;
- import org.apache.tapestry.callback.*;
- import org.apache.tapestry.event.*;
- import org.apache.tapestry.html.*;
- public abstract class Confirm extends BasePage implements PageValidateListener {
- @InjectState("cart")
- public abstract List<?> getCart();
- @InjectState("user")
- public abstract User getUser();
- @InjectStateFlag("user")
- public abstract boolean getUserExists();
- @InjectPage("Login")
- public abstract Login getLoginPage();
- public void pageValidate(PageEvent event) {
- if (!getUserExists()) {
- Login login = getLoginPage();
- login.setNextPage(new PageCallback("Confirm"));
- throw new PageRedirectException(login);
- }
- }
- public double getTotal() {
- double total = 0;
- for (Iterator<?> iter = getCart().iterator(); iter.hasNext();) {
- String productId = (String) iter.next();
- total += Catalog.getGlobalCatalog().lookup(productId).getPrice();
- }
- return total;
- }
- public String getCreditCardNo() {
- return getUser().getCreditCardNo();
- }
- public String onConfirm() {
- //place the order.
- System.out.println("Placing the order...");
- return "Home";
- }
- public String onContinueShopping() {
- return "Home";
- }
- }
Home.java
- package com.ttdev.shop;
- import java.util.*;
- import org.apache.tapestry.annotations.*;
- import org.apache.tapestry.html.*;
- public abstract class Home extends BasePage {
- public List<?> getProducts() {
- return Catalog.getGlobalCatalog().getProducts();
- }
- @InjectPage("ProductDetails")
- public abstract ProductDetails getDetailsPage();
- public ProductDetails onClickDetailsLink(String productId) {
- getDetailsPage().setProductId(productId);
- return getDetailsPage();
- }
- }
Login.java
- package com.ttdev.shop;
- import org.apache.tapestry.*;
- import org.apache.tapestry.annotations.*;
- import org.apache.tapestry.callback.*;
- import org.apache.tapestry.html.*;
- import org.apache.tapestry.valid.*;
- public abstract class Login extends BasePage {
- abstract public String getEmail();
- abstract public String getPassword();
- @Persist("client")
- public abstract void setNextPage(ICallback callback);
- public abstract ICallback getNextPage();
- @InjectState("user")
- public abstract User getUser();
- @Bean
- public abstract ValidationDelegate getDelegate();
- public void onLogin(IRequestCycle cycle) {
- try {
- User user = Users.getKnownUsers().getUser(getEmail(), getPassword());
- getUser().copyFrom(user);
- ICallback callback = getNextPage();
- if (callback != null) {
- callback.performCallback(cycle);
- } else {
- cycle.activate("Home");
- }
- } catch (RuntimeException e) {
- ValidationDelegate delegate = getDelegate();
- delegate.setFormComponent(null);
- delegate.record("Login failed", null);
- }
- }
- }
Product.java
- package com.ttdev.shop;
- public class Product {
- private String id;
- private String name;
- private String desc;
- private double price;
- public Product(String id, String name, String desc, double price) {
- this.id = id;
- this.name = name;
- this.desc = desc;
- this.price = price;
- }
- public String getId() {
- return id;
- }
- public String getName() {
- return name;
- }
- public double getPrice() {
- return price;
- }
- public String getDesc() {
- return desc;
- }
- }
ProductDetails.java
- package com.ttdev.shop;
- import java.util.*;
- import org.apache.tapestry.*;
- import org.apache.tapestry.annotations.*;
- import org.apache.tapestry.callback.*;
- import org.apache.tapestry.html.*;
- public abstract class ProductDetails extends BasePage implements IExternalPage {
- @Persist("client")
- public abstract String getProductId();
- public abstract void setProductId(String productId);
- public String getName() {
- return lookup().getName();
- }
- public String getDesc() {
- return lookup().getDesc();
- }
- private Product lookup() {
- return Catalog.getGlobalCatalog().lookup(getProductId());
- }
- @InjectState("cart")
- public abstract List<String> getCart();
- public String addToCart() {
- getCart().add(getProductId());
- return "Cart";
- }
- public String continueShopping() {
- return "Home";
- }
- public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {
- setProductId((String) parameters[0]);
- }
- @InjectPage("Login")
- public abstract Login getLoginPage();
- public Login login() {
- getLoginPage().setNextPage(new ExternalCallback(this, new String[] { getProductId() }));
- return getLoginPage();
- }
- }
User.java
- package com.ttdev.shop;
- import java.io.*;
- public class User implements Serializable {
- private static final long serialVersionUID = 1858318434177120215L;
- private String id;
- private String email;
- private String password;
- private String creditCardNo;
- public User() {
- }
- public User(String id, String email, String password, String creditCardNo) {
- this.id = id;
- this.email = email;
- this.password = password;
- this.creditCardNo = creditCardNo;
- }
- public boolean authenticate(String email, String password) {
- return this.email.equals(email) && this.password.equals(password);
- }
- public void copyFrom(User user) {
- this.id = user.id;
- this.email = user.email;
- this.password = user.password;
- this.creditCardNo = user.creditCardNo;
- }
- public String getCreditCardNo() {
- return creditCardNo;
- }
- }
Users.java
- package com.ttdev.shop;
- import java.util.*;
- public class Users {
- private List<User> users;
- private static Users knownUsers;
- public Users() {
- users = new ArrayList<User>();
- }
- public void add(User user) {
- users.add(user);
- }
- public User getUser(String email, String password) {
- for (Iterator<User> iter = users.iterator(); iter.hasNext();) {
- User user = (User) iter.next();
- if (user.authenticate(email, password)) {
- return user;
- }
- }
- throw new RuntimeException();
- }
- public static Users getKnownUsers() {
- if (knownUsers == null) {
- knownUsers = new Users();
- knownUsers.add(new User("u001", "paul@yahoo.com", "aaa", "1111 2222 3333 4444"));
- knownUsers.add(new User("u002", "john@hotmail.com", "bbb", "2222 3333 4444 5555"));
- knownUsers.add(new User("u003", "mary@gmail.com", "aaa", "3333 4444 5555 6666"));
- }
- return knownUsers;
- }
- }
- <?xml version="1.0"?>
- <module id="com.ttdev.shop" version="1.0.0">
- <contribution configuration-id="tapestry.state.ApplicationObjects">
- <state-object name="cart" scope="session">
- <create-instance class="java.util.ArrayList"/>
- </state-object>
- </contribution>
- <contribution configuration-id="tapestry.state.ApplicationObjects">
- <state-object name="user" scope="session">
- <create-instance class="com.ttdev.shop.User"/>
- </state-object>
- </contribution>
- </module>
Cart.html
- <html>
- <head>
- <title>Shopping cart</title>
- </head>
- <body>
- <h1>Shopping cart</h1>
- <table border="1">
- <tr jwcid="products">
- <td><span jwcid="id">p01</span></td>
- <td><span jwcid="name">Pencil</span></td>
- <td><span jwcid="price">1.20</span></td>
- </tr>
- </table>
- <form jwcid="cartActionForm">
- <input type="submit" value="Checkout" jwcid="checkout"/>
- <input type="submit" value="Continue shopping" jwcid="continueShopping"/>
- </form>
- </body>
- </html>
Cart.page
- <?xml version="1.0"?>
- <!DOCTYPE page-specification PUBLIC
- "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
- "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
- <page-specification>
- <component id="products" type="For">
- <binding name="source" value="products"/>
- <binding name="value" value="currentProduct"/>
- <binding name="element" value="literal:tr"/>
- </component>
- <component id="id" type="Insert">
- <binding name="value" value="currentProduct.id"/>
- </component>
- <component id="name" type="Insert">
- <binding name="value" value="currentProduct.name"/>
- </component>
- <component id="price" type="Insert">
- <binding name="value" value="currentProduct.price"/>
- </component>
- <component id="cartActionForm" type="Form"/>
- <component id="checkout" type="Submit">
- <binding name="listener" value="listener:onCheckout"/>
- </component>
- <component id="continueShopping" type="Submit">
- <binding name="listener" value="listener:continueShopping"/>
- </component>
- </page-specification>
Confirm.html
- <html>
- <head>
- <title>Confirmation</title>
- </head>
- <body>
- <h1>Confirm your order</h1>
- You're going to pay <span jwcid="total">100</span> with your
- credit card <span jwcid="creditCardNo">xxxx yyyy zzzz</span>.
- <p>
- <form jwcid="confirmForm">
- <input type="submit" value="Confirm" jwcid="confirm"/>
- <input type="submit" value="Continue shopping" jwcid="continueShopping"/>
- </form>
- </body>
- </html>
Confirm.page
- <?xml version="1.0"?>
- <!DOCTYPE page-specification PUBLIC
- "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
- "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
- <page-specification>
- <component id="total" type="Insert">
- <binding name="value" value="total"/>
- </component>
- <component id="creditCardNo" type="Insert">
- <binding name="value" value="creditCardNo"/>
- </component>
- <component id="confirmForm" type="Form"/>
- <component id="confirm" type="Submit">
- <binding name="listener" value="listener:onConfirm"/>
- </component>
- <component id="continueShopping" type="Submit">
- <binding name="listener" value="listener:onContinueShopping"/>
- </component>
- </page-specification>
Home.html
- <html>
- <head>
- <title>Shop</title>
- </head>
- <body>
- <h1>Product listing</h1>
- <table border="1">
- <tr jwcid="products">
- <td><span jwcid="id">p01</span></td>
- <td><a href="" jwcid="detailsLink"><span jwcid="name">Pencil</span></a></td>
- <td><span jwcid="price">1.20</span></td>
- </tr>
- </table>
- <p>
- <a href="" jwcid="loginLink">Login</a>
- <a href="" jwcid="logoutLink">Logout</a>
- </body>
- </html>
Home.page
- <?xml version="1.0"?>
- <!DOCTYPE page-specification PUBLIC
- "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
- "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
- <page-specification>
- <property name="currentProduct"/>
- <component id="products" type="For">
- <binding name="source" value="products"/>
- <binding name="value" value="currentProduct"/>
- <binding name="element" value="literal:tr"/>
- </component>
- <component id="id" type="Insert">
- <binding name="value" value="currentProduct.id"/>
- </component>
- <component id="name" type="Insert">
- <binding name="value" value="currentProduct.name"/>
- </component>
- <component id="price" type="Insert">
- <binding name="value" value="currentProduct.price"/>
- </component>
- <component id="detailsLink" type="DirectLink">
- <binding name="listener" value="listener:onClickDetailsLink"/>
- <binding name="parameters" value="currentProduct.id"/>
- </component>
- <component id="loginLink" type="PageLink">
- <binding name="page" value="literal:Login"/>
- </component>
- <component id="logoutLink" type="ServiceLink">
- <binding name="service" value="literal:restart"/>
- </component>
- </page-specification>
Login.html
- <html>
- <head>
- <title>Login</title>
- </head>
- <body>
- <h1>Login</h1>
- <span style="color: red"><span jwcid="errorMsg"/></span>
- <form jwcid="loginForm">
- <table border="0">
- <tr><td>Email:</td><td><input type="text" jwcid="email"/></td></tr>
- <tr><td>Password:</td><td><input type="password" jwcid="password"/></td></tr>
- <tr><td></td><td><input type="submit" value="Login"/></td></tr>
- </table>
- </form>
- </body>
- </html>
- <!--<html>
- <head>
- <title>Login</title>
- </head>
- <body>
- <h1>Login</h1>
- <span style="color: red"><span jwcid="errorMsg"/></span>
- <form jwcid="loginForm">
- <table border="0">
- <tr><td>Email:</td><td><input type="text" jwcid="email"/></td></tr>
- <tr><td>Password:</td><td><input type="password" jwcid="password"/></td></tr>
- <tr><td></td><td><input type="submit" value="Login"/></td></tr>
- </table>
- </form>
- </body>
- </html>-->
Login.page
- <?xml version="1.0"?>
- <!DOCTYPE page-specification PUBLIC
- "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
- "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
- <page-specification>
- <component id="loginForm" type="Form">
- <binding name="listener" value="listener:onLogin"/>
- </component>
- <component id="email" type="TextField">
- <binding name="value" value="email"/>
- </component>
- <component id="password" type="TextField">
- <binding name="value" value="password"/>
- <binding name="hidden" value="true"/>
- </component>
- <component id="errorMsg" type="Delegator">
- <binding name="delegate" value="beans.delegate.firstError"/>
- </component>
- </page-specification>
ProductDetails.html
- <html>
- <head>
- <title><span jwcid="name">Pencil</span></title>
- </head>
- <body>
- <h1><span jwcid="name2">Pencil</span></h1>
- <span jwcid="desc">xxx</span>
- <form jwcid="productActionForm">
- <input type="submit" value="Add to cart" jwcid="addToCart"/>
- <input type="submit" value="Continue shopping" jwcid="continueShopping"/>
- </form>
- <a href="" jwcid="refresh">Refresh</a>
- <p>
- <a href="" jwcid="loginLink">Login</a>
- </body>
- </html>
- <!--<html>
- <head>
- <title><span jwcid="name">Pencil</span></title>
- </head>
- <body>
- <h1><span jwcid="name2">Pencil</span></h1>
- <span jwcid="desc">xxx</span>
- <form jwcid="productActionForm">
- <input type="submit" value="Add to cart" jwcid="addToCart"/>
- <input type="submit" value="Continue shopping" jwcid="continueShopping"/>
- </form>
- <a href="" jwcid="refresh">Refresh</a>
- <p>
- <a href="" jwcid="loginLink">Login</a>
- </body>
- </html>-->
ProductDetails.page
- <?xml version="1.0"?>
- <!DOCTYPE page-specification PUBLIC
- "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
- "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
- <page-specification>
- <component id="name" type="Insert">
- <binding name="value" value="name"/>
- </component>
- <component id="name2" copy-of="name"/>
- <component id="desc" type="Insert">
- <binding name="value" value="desc"/>
- </component>
- <component id="productActionForm" type="Form">
- </component>
- <component id="addToCart" type="Submit">
- <binding name="listener" value="listener:addToCart"/>
- </component>
- <component id="continueShopping" type="Submit">
- <binding name="listener" value="listener:continueShopping"/>
- </component>
- <component id="refresh" type="PageLink">
- <binding name="page" value="literal:ProductDetails"/>
- </component>
- <component id="loginLink" type="DirectLink">
- <binding name="listener" value="listener:login"/>
- </component>
- </page-specification>
Shop.application
- <?xml version="1.0"?>
- <!DOCTYPE application PUBLIC
- "-//Apache Software Foundation//Tapestry Specification 4.0//EN"
- "http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
- <application>
- <meta key="org.apache.tapestry.page-class-packages" value="com.ttdev.shop"/>
- </application>
web.xml
- <?xml version="1.0"?>
- <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/TR/xmlschema-1/"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
- <display-name>Shop</display-name>
- <servlet>
- <servlet-name>Shop</servlet-name>
- <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>Shop</servlet-name>
- <url-pattern>/app</url-pattern>
- </servlet-mapping>
- </web-app>