Tapestry学习六:关于组件(一)前戏

来源:互联网 发布:linux中安装ipython 编辑:程序博客网 时间:2024/05/17 17:41
 
一:关于例子工程
这个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; }}