一:關于例子工程 這個 Web 應用程式将提供使用者一個機會,收集他們喜愛的名人。使用者将能夠顯示的收集,添加更多的名人,修改現有的資訊等等。在為了不分散你學習 Tapestry ,最初版本的名人收藏,不會有任何真正的資料庫。反之,一個簡單的模拟資料源将可創造模仿存儲和檢索資訊。不過,如果你想創造一些貼近現實生活中,附錄 B 将解釋如何以取代這個模拟資料源與一個真正的對象資料庫,非常輕巧,非常容易的工作。 建一個新工程 , 這個工程很簡單,起始頁面是個登陸的頁面,并且有個超連結指向注冊頁面,如果一個注冊了的人登陸,那麼他将會進入展示所有名人收藏的頁面。 二:又來了—前戲 在進行到 Tapestry 具體工作之前,讓我們準備一些輔助類。首先,既然我們要處理的名人,自然是要建立一個名人類 Celebrity.class 。建立一個新的包: com.packtpub.celebrities.model ,然後添加給它的一類新的名人類。的内容,這個類的内容很簡單:
package com.packtpub.celebrities.model;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Celebrity
{
private long id;
private String firstName;
private String lastName;
private Date dateOfBirth;
private Occupation occupation;
public Celebrity()
{
}
public Celebrity(String firstName, String lastName,
Date dateOfBirth, Occupation occupation)
{
this.firstName = firstName;
this.lastName = lastName;
this.dateOfBirth = dateOfBirth;
this.occupation = occupation;
}
public String getFirstName()
{
return firstName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public String getLastName()
{
return lastName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
public Date getDateOfBirth()
{
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth)
{
this.dateOfBirth = dateOfBirth;
}
public Occupation getOccupation()
{
return occupation;
}
public void setOccupation(Occupation occupation)
{
this.occupation = occupation;
}
public long getId()
{
return id;
}
public void setId(long id)
{
this.id = id;
}
}
這是個非常簡單的類,以後我們還可能會給它增加更多的屬性。關于Occupation,我們可以通過使用一個ENUM:
package com.packtpub.celebrities.model;
public enum Occupation
{
ACTOR, ACTRESS, ARTIST, BUSINESSMAN, COMPOSER,
MUSICIAN, POLITICIAN, SCIENTIST, SINGER, WRITER
}
接下來,我們需要提供一個資料源,在我們的應用中建立一個包含不同方法的接口是個好的設計,
針對這個借口我們可以有很多不同的實作
,
在模拟的時候:我們可以簡單的實作
,
在實際應用中
,
當應用真正運作的時候,我們可以适當的編碼,将資料源切換
.
建立一個包
, com.packtpub.celebrities.data,
并添加接口:
package com.packtpub.celebrities.data;
import com.packtpub.celebrities.model.Celebrity;
import java.util.List;
public interface IDataSource
{
public List<Celebrity> getAllCelebrities();
public Celebrity getCelebrityById(long id);
public void addCelebrity(Celebrity c);
}
我們用一個很假的實作去模拟資料:
package com.packtpub.celebrities.data;
import com.packtpub.celebrities.model.Celebrity;
import com.packtpub.celebrities.model.Occupation;
import com.packtpub.celebrities.util.Formats;
import java.util.ArrayList;
import java.util.List;
public class MockDataSource implements IDataSource
{
private List<Celebrity> celebrities =
new ArrayList<Celebrity>();
public MockDataSource()
{
addCelebrity(new Celebrity("Britney", "Spearce",
Formats.parseDate("12/02/1981"),
Occupation.SINGER));
addCelebrity(new Celebrity("Bill", "Clinton",
Formats.parseDate("08/19/1946"),
Occupation.POLITICIAN));
addCelebrity(new Celebrity("Placido", "Domingo",
Formats.parseDate("01/21/1941"),
Occupation.SINGER));
addCelebrity(new Celebrity("Albert", "Einstein",
Formats.parseDate("03/14/1879"),
Occupation.SCIENTIST));
addCelebrity(new Celebrity("Ernest", "Hemingway",
Formats.parseDate("07/21/1899"),
Occupation.WRITER));
addCelebrity(new Celebrity("Luciano", "Pavarotti",
Formats.parseDate("10/12/1935"),
Occupation.SINGER));
addCelebrity(new Celebrity("Ronald", "Reagan",
Formats.parseDate("02/06/1911"),
Occupation.POLITICIAN));
addCelebrity(new Celebrity("Pablo", "Picasso",
Formats.parseDate("10/25/1881"),
Occupation.ARTIST));
addCelebrity(new Celebrity("Blaise", "Pascal",
Formats.parseDate("06/19/1623"),
Occupation.SCIENTIST));
addCelebrity(new Celebrity("Isaac", "Newton",
Formats.parseDate("01/04/1643"),
Occupation.SCIENTIST));
addCelebrity(new Celebrity("Antonio", "Vivaldi",
Formats.parseDate("03/04/1678"),
Occupation.COMPOSER));
addCelebrity(new Celebrity("Niccolo", "Paganini",
Formats.parseDate("10/27/1782"),
Occupation.MUSICIAN));
addCelebrity(new Celebrity("Johannes", "Kepler",
Formats.parseDate("12/27/1571"),
Occupation.SCIENTIST));
addCelebrity(new Celebrity("Franz", "Kafka",
Formats.parseDate("07/03/1883"),
Occupation.WRITER));
addCelebrity(new Celebrity("George", "Gershwin",
Formats.parseDate("09/26/1898"),
Occupation.COMPOSER));
}
public List<Celebrity> getAllCelebrities()
{
return celebrities;
}
public Celebrity getCelebrityById(long id)
{
for (Celebrity c : celebrities)
{
if (c.getId() == id) return c;
}
return null;
}
public void addCelebrity(Celebrity c)
{
long newId = celebrities.size();
c.setId(newId);
celebrities.add(c);
}
}
建立一個Format工具類
package com.packtpub.celebrities.util;
import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Formats
{
private static SimpleDateFormat simpleDateFormat =
new SimpleDateFormat("MM/dd/yyyy");
public static Date parseDate(String strDate)
{
Date date = null;
try
{
date = simpleDateFormat.parse(strDate);
} catch (ParseException ex)
{
throw new RuntimeException(ex);
}
return date;
}
public static Format getDateFormat()
{
return simpleDateFormat;
}
}
另外還需要一個使用者類 和一個簡單的驗證安全登入的類
package com.packtpub.celebrities.model;
public class User
{
private String firstName;
private String lastName;
public User()
{
}
public User(String firstName, String lastName)
{
this.setFirstName(firstName);
this.setLastName(lastName);
}
public String getFirstName()
{
return firstName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
public String getLastName()
{
return lastName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
}
package com.packtpub.celebrities.util;
import com.packtpub.celebrities.model.User;
public class Security
{
private static final String USERNAME = "user";
private static final String PASSWORD = "secret";
public static User authenticate(String userName,
String password)
{
if (USERNAME.equals(userName) && PASSWORD.equals(password))
{
return new User("John", "Smith");
}
return null;
}
}