接上例: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
- package com.ttdev.phonebook;
- public class GlobalPhoneBook extends PhoneBook {
- public GlobalPhoneBook() {
- super(makePhoneBookTable());
- }
- private static PhoneBookTable makePhoneBookTable() {
- PhoneBookTable phoneBookTable = new PhoneBookTable();
- phoneBookTable.insert(new PhoneBookEntry(0, new Name("Alan", "Turing"), "111111"));
- phoneBookTable.insert(new PhoneBookEntry(1, new Name("Bill", "Gates"), "111222"));
- phoneBookTable.insert(new PhoneBookEntry(2, new Name("Martin", "Fowler"), "654321"));
- phoneBookTable.insert(new PhoneBookEntry(3, new Name("Kent", "Beck"), "999001"));
- phoneBookTable.insert(new PhoneBookEntry(4, new Name("Howard", "Ship"), "554433"));
- phoneBookTable.insert(new PhoneBookEntry(5, new Name("Linus", "Torvalds"), "888777"));
- phoneBookTable.insert(new PhoneBookEntry(6, new Name("Ward", "Cunningham"), "222222"));
- phoneBookTable.insert(new PhoneBookEntry(7, new Name("James", "Gosling"), "333333"));
- phoneBookTable.insert(new PhoneBookEntry(8, new Name("Erich", "Gamma"), "4444444"));
- phoneBookTable.insert(new PhoneBookEntry(9, new Name("Grady", "Booch"), "5555555"));
- phoneBookTable.insert(new PhoneBookEntry(10, new Name("Bruce", "Eckel"), "6666666"));
- phoneBookTable.insert(new PhoneBookEntry(11, new Name("Richard", "Stallman"), "777777"));
- return phoneBookTable;
- }
- }
Home.java
- package com.ttdev.phonebook;
- import java.util.*;
- import org.apache.tapestry.annotations.*;
- import org.apache.tapestry.contrib.table.components.*;
- import org.apache.tapestry.contrib.table.model.*;
- import org.apache.tapestry.contrib.table.model.simple.*;
- import org.apache.tapestry.html.*;
- public abstract class Home extends BasePage {
- @InjectState("phoneBook")
- public abstract PhoneBook getPhoneBook();
- public List<?> getSource() {
- return getPhoneBook().getEntries();
- }
- public IBasicTableModel getModel() {
- return new IBasicTableModel() {
- public int getRowCount() {
- return getPhoneBook().getNoEntries();
- }
- public Iterator<?> getCurrentPageRows(
- int nFirst,
- int nPageSize,
- ITableColumn objSortColumn,
- boolean bSortOrder) {
- String sortColumnId = objSortColumn == null
- ? null
- : objSortColumn.getColumnName();
- return getPhoneBook().getSomeEntries(
- nFirst,
- nPageSize,
- sortColumnId,
- bSortOrder == ITableSortingState.SORT_ASCENDING).iterator();
- }
- };
- }
- public void onShowDetails(int entryId) {
- System.out.println("Showing details for " + entryId);
- }
- @InjectComponent("table")
- public abstract TableView getTable();
- @InjectComponent("rows")
- public abstract TableRows getTableRows();
- public void onDelete() {
- int id = ((PhoneBookEntry) getTableRows().getTableRow()).getId();
- System.out.println("Deleting " + id);
- getPhoneBook().deleteEntry(id);
- SimpleTableModel tableModel = ((SimpleTableModel) getTable().getTableModel());
- tableModel.setDataModel(new SimpleListTableDataModel(getSource()));
- tableModel.tableDataChanged(null);
- getTable().fireObservedStateChange();
- }
- }
Name.java
- package com.ttdev.phonebook;
- import java.io.*;
- public class Name implements Serializable {
- private static final long serialVersionUID = -6056490677438712843L;
- private String firstName;
- private String lastName;
- public Name(String firstName, String lastName) {
- this.firstName = firstName;
- this.lastName = lastName;
- }
- public String getFirstName() {
- return firstName;
- }
- public String getLastName() {
- return lastName;
- }
- }
PhoneBook.java
- package com.ttdev.phonebook;
- import java.util.*;
- public class PhoneBook {
- private PhoneBookTable table;
- public PhoneBook(PhoneBookTable table) {
- this.table = table;
- }
- public List<PhoneBookEntry> getEntries() {
- List<PhoneBookEntry> result = new ArrayList<PhoneBookEntry>();
- ResultSet rs = table.selectAll();
- while (rs.next()) {
- result.add(rs.readEntry());
- }
- return result;
- }
- public int getNoEntries() {
- return table.selectCount();
- }
- public List<PhoneBookEntry> getSomeEntries(
- int startIdx,
- int noEntries,
- String sortColumnId,
- boolean isAscending) {
- ResultSet rs = table.selectLimit(startIdx, noEntries, sortColumnId, isAscending);
- List<PhoneBookEntry> result = new ArrayList<PhoneBookEntry>();
- while (rs.next()) {
- result.add(rs.readEntry());
- }
- return result;
- }
- public void deleteEntry(int id) {
- table.delete(id);
- }
- }
PhoneBookEntry.java
- package com.ttdev.phonebook;
- import java.io.*;
- public class PhoneBookEntry implements Serializable {
- private static final long serialVersionUID = 639860023393294698L;
- private int id;
- private Name name;
- private String telNo;
- public PhoneBookEntry(int id, Name name, String telNo) {
- this.id = id;
- this.name = name;
- this.telNo = telNo;
- }
- public Name getName() {
- return name;
- }
- public int getId() {
- return id;
- }
- public String getTelNo() {
- return telNo;
- }
- public String getFirstName() {
- return getName().getFirstName();
- }
- }
PhoneBookEntryComparator.java
- package com.ttdev.phonebook;
- import java.util.*;
- public class PhoneBookEntryComparator implements Comparator<Object> {
- private String columnName;
- public PhoneBookEntryComparator(String columnName) {
- this.columnName = columnName;
- }
- public int compare(Object obj1, Object obj2) {
- PhoneBookEntry entry1 = (PhoneBookEntry) obj1;
- PhoneBookEntry entry2 = (PhoneBookEntry) obj2;
- if (columnName.equals("id")) {
- return entry1.getId()-entry2.getId();
- } else if (columnName.equals("firstName")) {
- return entry1.getFirstName().compareTo(entry2.getFirstName());
- } else {
- //Similar for other columns.
- return 0;
- }
- }
- }
PhoneBookTable.java
- package com.ttdev.phonebook;
- import java.util.*;
- public class PhoneBookTable {
- private List<PhoneBookEntry> entries;
- public PhoneBookTable() {
- entries = new ArrayList<PhoneBookEntry>();
- }
- public void insert(PhoneBookEntry entry) {
- entries.add(entry);
- }
- public ResultSet selectAll() {
- System.out.println("Selecting all");
- return new ResultSet(entries);
- }
- public int selectCount() {
- return entries.size();
- }
- public ResultSet selectLimit(
- int startIdx,
- int noRecords,
- String columnName,
- boolean isAscending) {
- System.out.println("Selecting with limit");
- List<PhoneBookEntry> sortedEntries = new ArrayList<PhoneBookEntry>(entries);
- if (columnName != null) {
- Collections.sort(sortedEntries, new PhoneBookEntryComparator(columnName));
- if (!isAscending) {
- Collections.reverse(sortedEntries);
- }
- }
- List<PhoneBookEntry> subList = sortedEntries.subList(startIdx, startIdx + noRecords);
- return new ResultSet(subList);
- }
- public void delete(int id) {
- for (Iterator<PhoneBookEntry> iter = entries.iterator(); iter.hasNext();) {
- PhoneBookEntry entry = (PhoneBookEntry) iter.next();
- if (entry.getId()==id) {
- iter.remove();
- return;
- }
- }
- }
- }
ResultSet.java
- package com.ttdev.phonebook;
- import java.util.*;
- public class ResultSet {
- private List<?> entriesInResultSet;
- private int currentIdx;
- public ResultSet(List<?> entriesInResultSet) {
- this.entriesInResultSet = entriesInResultSet;
- this.currentIdx = -1;
- }
- public boolean next() {
- if (currentIdx < entriesInResultSet.size() - 1) {
- currentIdx++;
- return true;
- } else {
- return false;
- }
- }
- public PhoneBookEntry readEntry() {
- PhoneBookEntry entry = (PhoneBookEntry) entriesInResultSet.get(currentIdx);
- System.out.println("Reading entry with id " + entry.getId());
- return entry;
- }
- }
hivemodule.xml
- <?xml version="1.0"?>
- <module id="com.ttdev.phonebook" version="1.0.0">
- <contribution configuration-id="tapestry.state.ApplicationObjects">
- <state-object name="phoneBook" scope="application">
- <create-instance class="com.ttdev.phonebook.GlobalPhoneBook"/>
- </state-object>
- </contribution>
- </module>
PhoneBook.css
- tr.odd {background-color: RoyalBlue}
- tr.even {background-color: GreenYellow}
- th.title {background-color: Pink}
Home.html
- <html jwcid="@Shell" title="Phone Book" stylesheet="asset:phoneBook">
- <head jwcid="$remove$">
- <title>Phone Book</title>
- <link rel="stylesheet" text="text/css" href="../css/PhoneBook.css"/>
- </head>
- <body>
- <span jwcid="table">
- <table border="1">
- <tr><span jwcid="@Contrib:TableColumns" class="title"/></tr>
- <tr jwcid="rows@Contrib:TableRows" class="ognl:beans.evenOdd.next">
- <td jwcid="@Contrib:TableValues"/>
- </tr>
- </table>
- <span jwcid="@Contrib:TablePages"/>
- </span>
- <table border="1" jwcid="$remove$">
- <tr><th>ID</th><th>First name</th><th>Last name</th><th>Tel #</th><th>Delete</th></tr>
- <tr class="odd">
- <td>1</td>
- <td>Britney</td>
- <td>Spears</td>
- <td>376926</td>
- <td>
- <form>
- <input type="submit" value="Delete"/>
- </form>
- </td>
- </tr>
- <tr class="even"><td>2</td><td>Elton</td><td>John</td><td>285984</td><td>Delete</td></tr>
- <tr class="odd"><td>3</td><td>David</td><td>Letterman</td><td>877357</td><td>Delete</td></tr>
- </table>
- <span jwcid="deleteColumnValue">
- <form jwcid="deleteForm">
- <input type="submit" value="Delete"/>
- </form>
- </span>
- <span jwcid="firstNameColumnValue">
- <a href="" jwcid="firstNameLink"><span jwcid="firstName">Britney</span></a>
- </span>
- </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 class="com.ttdev.phonebook.Home">
- <asset name="phoneBook" path="context:/css/PhoneBook.css"/>
- <bean name="evenOdd" class="org.apache.tapestry.bean.EvenOdd">
- <set name="even" value="false"/>
- </bean>
- <component id="table" type="Contrib:TableView">
- <binding name="source" value="source"/>
- <binding name="columns"
- value="literal:id, firstName:First name:name.firstName, lastName:name.lastName, telNo, !delete"/>
- <binding name="pageSize" value="3"/>
- <binding name="tableSessionStateManager"
- value="new org.apache.tapestry.contrib.table.model.common.FullTableSessionStateManager()"/>
- </component>
- <component id="deleteColumnValue" type="Block"/>
- <component id="deleteForm" type="Form">
- <binding name="listener" value="listener:onDelete"/>
- <binding name="direct" value="false"/>
- </component>
- <component id="firstNameColumnValue" type="Block"/>
- <component id="firstNameLink" type="DirectLink">
- <binding name="listener" value="listener:onShowDetails"/>
- <binding name="parameters" value="components.rows.tableRow.id"/>
- </component>
- <component id="firstName" type="Insert">
- <binding name="value" value="components.rows.tableRow.firstName"/>
- </component>
- </page-specification>
PhoneBook.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 name="PhoneBook">
- <library id="Contrib" specification-path="/org/apache/tapestry/contrib/Contrib.library"/>
- </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>PhoneBook</display-name>
- <servlet>
- <servlet-name>PhoneBook</servlet-name>
- <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>PhoneBook</servlet-name>
- <url-pattern>/app</url-pattern>
- </servlet-mapping>
- </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