追忆Tapstry4.0------学习笔记(四)

来源:互联网 发布:今日头条用户数据 编辑:程序博客网 时间:2024/05/21 17:26

接上例:http://blog.csdn.net/kunshan_shenbin/archive/2008/11/18/3325343.aspx

T3版本的参考对照:http://blog.csdn.net/kunshan_shenbin/archive/2008/11/14/3300185.aspx

如下图所示建立工程:

所需Jar包与上例一致。

代码如下:

GlobalPhoneBook.java

  1. package com.ttdev.phonebook;
  2. public class GlobalPhoneBook extends PhoneBook {
  3.     
  4.     public GlobalPhoneBook() {
  5.         super(makePhoneBookTable());
  6.     }
  7.     
  8.     private static PhoneBookTable makePhoneBookTable() {
  9.         PhoneBookTable phoneBookTable = new PhoneBookTable();
  10.         phoneBookTable.insert(new PhoneBookEntry(0new Name("Alan""Turing"), "111111"));
  11.         phoneBookTable.insert(new PhoneBookEntry(1new Name("Bill""Gates"), "111222"));
  12.         phoneBookTable.insert(new PhoneBookEntry(2new Name("Martin""Fowler"), "654321"));
  13.         phoneBookTable.insert(new PhoneBookEntry(3new Name("Kent""Beck"), "999001"));
  14.         phoneBookTable.insert(new PhoneBookEntry(4new Name("Howard""Ship"), "554433"));
  15.         phoneBookTable.insert(new PhoneBookEntry(5new Name("Linus""Torvalds"), "888777"));
  16.         phoneBookTable.insert(new PhoneBookEntry(6new Name("Ward""Cunningham"), "222222"));
  17.         phoneBookTable.insert(new PhoneBookEntry(7new Name("James""Gosling"), "333333"));
  18.         phoneBookTable.insert(new PhoneBookEntry(8new Name("Erich""Gamma"), "4444444"));
  19.         phoneBookTable.insert(new PhoneBookEntry(9new Name("Grady""Booch"), "5555555"));
  20.         phoneBookTable.insert(new PhoneBookEntry(10new Name("Bruce""Eckel"), "6666666"));
  21.         phoneBookTable.insert(new PhoneBookEntry(11new Name("Richard""Stallman"), "777777"));
  22.         return phoneBookTable;
  23.     }
  24. }

Home.java

  1. package com.ttdev.phonebook;
  2. import java.util.*;
  3. import org.apache.tapestry.annotations.*;
  4. import org.apache.tapestry.contrib.table.components.*;
  5. import org.apache.tapestry.contrib.table.model.*;
  6. import org.apache.tapestry.contrib.table.model.simple.*;
  7. import org.apache.tapestry.html.*;
  8. public abstract class Home extends BasePage {
  9.     
  10.     @InjectState("phoneBook")
  11.     public abstract PhoneBook getPhoneBook();
  12.     
  13.     public List<?> getSource() {
  14.         return getPhoneBook().getEntries();
  15.     }
  16.     public IBasicTableModel getModel() {
  17.         return new IBasicTableModel() {
  18.             public int getRowCount() {
  19.                 return getPhoneBook().getNoEntries();
  20.             }
  21.             public Iterator<?> getCurrentPageRows(
  22.                     int nFirst,
  23.                     int nPageSize,
  24.                     ITableColumn objSortColumn,
  25.                     boolean bSortOrder) {
  26.                 String sortColumnId = objSortColumn == null
  27.                         ? null
  28.                         : objSortColumn.getColumnName();
  29.                 return getPhoneBook().getSomeEntries(
  30.                         nFirst,
  31.                         nPageSize,
  32.                         sortColumnId,
  33.                         bSortOrder == ITableSortingState.SORT_ASCENDING).iterator();
  34.             }
  35.         };
  36.     }
  37.     public void onShowDetails(int entryId) {
  38.         System.out.println("Showing details for " + entryId);
  39.     }
  40.     @InjectComponent("table")
  41.     public abstract TableView getTable();
  42.     @InjectComponent("rows")
  43.     public abstract TableRows getTableRows();
  44.     public void onDelete() {
  45.         int id = ((PhoneBookEntry) getTableRows().getTableRow()).getId();
  46.         System.out.println("Deleting " + id);
  47.         getPhoneBook().deleteEntry(id);
  48.         SimpleTableModel tableModel = ((SimpleTableModel) getTable().getTableModel());
  49.         tableModel.setDataModel(new SimpleListTableDataModel(getSource()));
  50.         tableModel.tableDataChanged(null);
  51.         getTable().fireObservedStateChange();
  52.     }
  53. }

Name.java

  1. package com.ttdev.phonebook;
  2. import java.io.*;
  3. public class Name implements Serializable {
  4.     
  5.     private static final long serialVersionUID = -6056490677438712843L;
  6.     private String firstName;
  7.     private String lastName;
  8.     public Name(String firstName, String lastName) {
  9.         this.firstName = firstName;
  10.         this.lastName = lastName;
  11.     }
  12.     public String getFirstName() {
  13.         return firstName;
  14.     }
  15.     public String getLastName() {
  16.         return lastName;
  17.     }
  18. }

PhoneBook.java

  1. package com.ttdev.phonebook;
  2. import java.util.*;
  3. public class PhoneBook {
  4.     
  5.     private PhoneBookTable table;
  6.     public PhoneBook(PhoneBookTable table) {
  7.         this.table = table;
  8.     }
  9.     public List<PhoneBookEntry> getEntries() {
  10.         List<PhoneBookEntry> result = new ArrayList<PhoneBookEntry>();
  11.         ResultSet rs = table.selectAll();
  12.         while (rs.next()) {
  13.             result.add(rs.readEntry());
  14.         }
  15.         return result;
  16.     }
  17.     public int getNoEntries() {
  18.         return table.selectCount();
  19.     }
  20.     public List<PhoneBookEntry> getSomeEntries(
  21.             int startIdx,
  22.             int noEntries,
  23.             String sortColumnId,
  24.             boolean isAscending) {
  25.         ResultSet rs = table.selectLimit(startIdx,  noEntries, sortColumnId, isAscending);
  26.         List<PhoneBookEntry> result = new ArrayList<PhoneBookEntry>();
  27.         while (rs.next()) {
  28.             result.add(rs.readEntry());
  29.         }
  30.         return result;
  31.     }
  32.     public void deleteEntry(int id) {
  33.         table.delete(id);       
  34.     }
  35. }

PhoneBookEntry.java

  1. package com.ttdev.phonebook;
  2. import java.io.*;
  3. public class PhoneBookEntry implements Serializable {
  4.     
  5.     private static final long serialVersionUID = 639860023393294698L;
  6.     private int id;
  7.     private Name name;
  8.     private String telNo;
  9.     public PhoneBookEntry(int id, Name name, String telNo) {
  10.         this.id = id;
  11.         this.name = name;
  12.         this.telNo = telNo;
  13.     }
  14.     public Name getName() {
  15.         return name;
  16.     }
  17.     public int getId() {
  18.         return id;
  19.     }
  20.     public String getTelNo() {
  21.         return telNo;
  22.     }
  23.     public String getFirstName() {
  24.         return getName().getFirstName();
  25.     }
  26. }

PhoneBookEntryComparator.java

  1. package com.ttdev.phonebook;
  2. import java.util.*;
  3. public class PhoneBookEntryComparator implements Comparator<Object> {
  4.     
  5.     private String columnName;
  6.     public PhoneBookEntryComparator(String columnName) {
  7.         this.columnName = columnName;
  8.     }
  9.     public int compare(Object obj1, Object obj2) {
  10.         PhoneBookEntry entry1 = (PhoneBookEntry) obj1;
  11.         PhoneBookEntry entry2 = (PhoneBookEntry) obj2;
  12.         if (columnName.equals("id")) {
  13.             return entry1.getId()-entry2.getId();
  14.         } else  if (columnName.equals("firstName")) {
  15.             return entry1.getFirstName().compareTo(entry2.getFirstName());
  16.         } else {
  17.             //Similar for other columns.
  18.             return 0;
  19.         }
  20.     }
  21. }

PhoneBookTable.java

  1. package com.ttdev.phonebook;
  2. import java.util.*;
  3. public class PhoneBookTable {
  4.     
  5.     private List<PhoneBookEntry> entries;
  6.     public PhoneBookTable() {
  7.         entries = new ArrayList<PhoneBookEntry>();
  8.     }
  9.     public void insert(PhoneBookEntry entry) {
  10.         entries.add(entry);
  11.     }
  12.     public ResultSet selectAll() {
  13.         System.out.println("Selecting all");
  14.         return new ResultSet(entries);
  15.     }
  16.     public int selectCount() {
  17.         return entries.size();
  18.     }
  19.     public ResultSet selectLimit(
  20.             int startIdx,
  21.             int noRecords,
  22.             String columnName,
  23.             boolean isAscending) {
  24.         System.out.println("Selecting with limit");
  25.         List<PhoneBookEntry> sortedEntries = new ArrayList<PhoneBookEntry>(entries);
  26.         if (columnName != null) {
  27.             Collections.sort(sortedEntries, new PhoneBookEntryComparator(columnName));
  28.             if (!isAscending) {
  29.                 Collections.reverse(sortedEntries);
  30.             }
  31.         }
  32.         List<PhoneBookEntry> subList = sortedEntries.subList(startIdx, startIdx + noRecords);
  33.         return new ResultSet(subList);
  34.     }
  35.     public void delete(int id) {
  36.         for (Iterator<PhoneBookEntry> iter = entries.iterator(); iter.hasNext();) {
  37.             PhoneBookEntry entry = (PhoneBookEntry) iter.next();
  38.             if (entry.getId()==id) {
  39.                 iter.remove();
  40.                 return;
  41.             }           
  42.         }
  43.     }
  44. }

ResultSet.java

  1. package com.ttdev.phonebook;
  2. import java.util.*;
  3. public class ResultSet {
  4.     
  5.     private List<?> entriesInResultSet;
  6.     private int currentIdx;
  7.     public ResultSet(List<?> entriesInResultSet) {
  8.         this.entriesInResultSet = entriesInResultSet;
  9.         this.currentIdx = -1;
  10.     }
  11.     public boolean next() {
  12.         if (currentIdx < entriesInResultSet.size() - 1) {
  13.             currentIdx++;
  14.             return true;
  15.         } else {
  16.             return false;
  17.         }
  18.     }
  19.     public PhoneBookEntry readEntry() {
  20.         PhoneBookEntry entry = (PhoneBookEntry) entriesInResultSet.get(currentIdx);
  21.         System.out.println("Reading entry with id " + entry.getId());
  22.         return entry;
  23.     }
  24. }

hivemodule.xml

  1. <?xml version="1.0"?>
  2. <module id="com.ttdev.phonebook" version="1.0.0">
  3.     <contribution configuration-id="tapestry.state.ApplicationObjects">
  4.         <state-object name="phoneBook" scope="application">
  5.             <create-instance class="com.ttdev.phonebook.GlobalPhoneBook"/>
  6.         </state-object>
  7.     </contribution>
  8. </module>

PhoneBook.css

  1. tr.odd {background-color: RoyalBlue}
  2. tr.even {background-color: GreenYellow}
  3. th.title {background-color: Pink}

Home.html

  1. <html jwcid="@Shell" title="Phone Book" stylesheet="asset:phoneBook">
  2. <head jwcid="$remove$">
  3. <title>Phone Book</title>
  4. <link rel="stylesheet" text="text/css" href="../css/PhoneBook.css"/>
  5. </head>
  6. <body>
  7. <span jwcid="table">
  8.     <table border="1">
  9.         <tr><span jwcid="@Contrib:TableColumns" class="title"/></tr>
  10.         <tr jwcid="rows@Contrib:TableRows" class="ognl:beans.evenOdd.next">
  11.             <td jwcid="@Contrib:TableValues"/>
  12.         </tr>
  13.     </table>
  14.     <span jwcid="@Contrib:TablePages"/>
  15. </span>
  16. <table border="1" jwcid="$remove$">
  17.     <tr><th>ID</th><th>First name</th><th>Last name</th><th>Tel #</th><th>Delete</th></tr>
  18.     <tr class="odd">
  19.         <td>1</td>
  20.         <td>Britney</td>
  21.         <td>Spears</td>
  22.         <td>376926</td>
  23.         <td>
  24.             <form>
  25.                 <input type="submit" value="Delete"/>
  26.             </form>
  27.         </td>
  28.     </tr>
  29.     <tr class="even"><td>2</td><td>Elton</td><td>John</td><td>285984</td><td>Delete</td></tr>
  30.     <tr class="odd"><td>3</td><td>David</td><td>Letterman</td><td>877357</td><td>Delete</td></tr>
  31. </table>
  32. <span jwcid="deleteColumnValue">
  33.         <form jwcid="deleteForm">
  34.             <input type="submit" value="Delete"/>
  35.         </form>
  36. </span>
  37. <span jwcid="firstNameColumnValue">
  38.     <a href="" jwcid="firstNameLink"><span jwcid="firstName">Britney</span></a>
  39. </span>
  40. </body>
  41. </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 class="com.ttdev.phonebook.Home">
  6.     <asset name="phoneBook" path="context:/css/PhoneBook.css"/>
  7.     <bean name="evenOdd" class="org.apache.tapestry.bean.EvenOdd">
  8.         <set name="even" value="false"/>
  9.     </bean>
  10.     <component id="table" type="Contrib:TableView">
  11.         <binding name="source" value="source"/>
  12.         <binding name="columns"
  13.             value="literal:id, firstName:First name:name.firstName, lastName:name.lastName, telNo, !delete"/>
  14.         <binding name="pageSize" value="3"/>
  15.         <binding name="tableSessionStateManager" 
  16.             value="new org.apache.tapestry.contrib.table.model.common.FullTableSessionStateManager()"/>
  17.     </component>
  18.     <component id="deleteColumnValue" type="Block"/>
  19.     <component id="deleteForm" type="Form">
  20.         <binding name="listener" value="listener:onDelete"/>
  21.         <binding name="direct" value="false"/>
  22.     </component>
  23.     <component id="firstNameColumnValue" type="Block"/>
  24.     <component id="firstNameLink" type="DirectLink">
  25.         <binding name="listener" value="listener:onShowDetails"/>
  26.         <binding name="parameters" value="components.rows.tableRow.id"/>
  27.     </component>
  28.     <component id="firstName" type="Insert">
  29.         <binding name="value" value="components.rows.tableRow.firstName"/>
  30.     </component>
  31. </page-specification>

PhoneBook.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 name="PhoneBook">
  6.     <library id="Contrib" specification-path="/org/apache/tapestry/contrib/Contrib.library"/>
  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>PhoneBook</display-name>
  6.     <servlet>
  7.         <servlet-name>PhoneBook</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>PhoneBook</servlet-name>
  13.         <url-pattern>/app</url-pattern>
  14.     </servlet-mapping>
  15. </web-app>

============================================================

实际测试中发现,启动Tomcat时发生如下错误,但工程仍然可以访问。哪位高手可以帮忙解疑。

2008/11/18 14:36:33 org.apache.catalina.core.AprLifecycleListener init
情報: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:/Java/MyEclipse 6.0/bin;D:/Java/MyEclipse 6.0/myeclipse/eclipse/plugins/com.genuitec.eclipse.easie.tomcat.myeclipse_6.0.0.zmyeclipse60020070820/tomcat/bin
2008/11/18 14:36:33 org.apache.coyote.http11.Http11Protocol init
情報: Coyote HTTP/1.1を http-8080 で初期化します
2008/11/18 14:36:33 org.apache.catalina.startup.Catalina load
情報: Initialization processed in 1735 ms
2008/11/18 14:36:34 org.apache.catalina.core.StandardService start
情報: サービス Catalina を起動します
2008/11/18 14:36:34 org.apache.catalina.core.StandardEngine start
情報: Starting Servlet Engine: Apache Tomcat/6.0.13
2008/11/18 14:36:35 org.apache.catalina.session.StandardManager doLoad
致命的: 持続されたセッションをロード中のIOExceptionです: java.io.EOFException
java.io.EOFException
 at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
 at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
 at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
 at java.io.ObjectInputStream.<init>(Unknown Source)
 at org.apache.catalina.util.CustomObjectInputStream.<init>(CustomObjectInputStream.java:58)
 at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:362)
 at org.apache.catalina.session.StandardManager.load(StandardManager.java:321)
 at org.apache.catalina.session.StandardManager.start(StandardManager.java:637)
 at org.apache.catalina.core.ContainerBase.setManager(ContainerBase.java:438)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4255)
 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
 at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
 at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
 at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
 at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
 at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
 at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
 at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
 at org.apache.catalina.core.StandardService.start(StandardService.java:516)
 at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2008/11/18 14:36:35 org.apache.catalina.session.StandardManager start
致命的: 永続記憶装置からセッションをロード中の例外です
java.io.EOFException
 at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
 at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
 at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
 at java.io.ObjectInputStream.<init>(Unknown Source)
 at org.apache.catalina.util.CustomObjectInputStream.<init>(CustomObjectInputStream.java:58)
 at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:362)
 at org.apache.catalina.session.StandardManager.load(StandardManager.java:321)
 at org.apache.catalina.session.StandardManager.start(StandardManager.java:637)
 at org.apache.catalina.core.ContainerBase.setManager(ContainerBase.java:438)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4255)
 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
 at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
 at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
 at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
 at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
 at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
 at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
 at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
 at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
 at org.apache.catalina.core.StandardService.start(StandardService.java:516)
 at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2008/11/18 14:36:42 org.apache.tapestry.ApplicationServlet init
情報: Initialized application servlet 'PhoneBook': 2,672 millis to create HiveMind Registry, 6,141 millis overall.
2008/11/18 14:36:42 org.apache.coyote.http11.Http11Protocol start
情報: Coyote HTTP/1.1を http-8080 で起動します
2008/11/18 14:36:42 org.apache.jk.common.ChannelSocket init
情報: JK: ajp13 listening on /0.0.0.0:8009
2008/11/18 14:36:42 org.apache.jk.server.JkMain start
情報: Jk running ID=0 time=0/62  config=null
2008/11/18 14:36:42 org.apache.catalina.startup.Catalina start
情報: Server startup in 8502 ms

原创粉丝点击