天天看點

Tapestry學習六:關于元件(一)前戲

  一:關于例子工程 這個 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; 

}

}

           

繼續閱讀