Có 246 quốc gia trong ISO 3166, bạn có thể nhận được một enum lớn chuyển tiếp ở mặt sau của điều này. Tôi thích sử dụng tệp XML với danh sách các quốc gia, bạn có thể tải xuống tệp từ http://www.iso.org/ và tải chúng (ví dụ: khi ứng dụng bắt đầu). Hơn nữa, khi bạn cần chúng trong GWT, hãy tải chúng trở lại như cuộc gọi RPC, nhưng hãy nhớ lưu vào bộ nhớ cache (một số loại tải chậm) để bạn không hoàn thành việc tải chúng mỗi lần. Tôi nghĩ rằng điều này sẽ tốt hơn là giữ chúng trong mã, vì bạn sẽ kết thúc với tải danh sách đầy đủ mỗi khi module được truy cập, ngay cả khi người dùng sẽ không cần phải sử dụng danh sách này.
Vì vậy, bạn cần một cái gì đó mà sẽ giữ nước:
public class Country
{
private final String name;
private final String code;
public Country(String name, String code)
{
this.name = name;
this.code = code;
}
public String getName()
{
return name;
}
public String getCode()
{
return code;
}
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null || getClass() != obj.getClass())
{
return false;
}
Country country = (Country) obj;
return code.equals(country.code);
}
public int hashCode()
{
return code.hashCode();
}
}
Đối với GWT lớp này sẽ cần phải thực hiện IsSerializable. Và bạn có thể tải những, về phía máy chủ sử dụng:
import java.util.ArrayList;
import java.util.List;
import java.io.InputStream;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class CountriesService
{
private static final String EL_COUNTRY = "ISO_3166-1_Entry";
private static final String EL_COUNTRY_NAME = "ISO_3166-1_Country_name";
private static final String EL_COUNTRY_CODE = "ISO_3166-1_Alpha-2_Code_element";
private List<Country> countries = new ArrayList<Country>();
public CountriesService(InputStream countriesList)
{
parseCountriesList(countriesList);
}
public List<Country> getCountries()
{
return countries;
}
private void parseCountriesList(InputStream countriesList)
{
countries.clear();
try
{
Document document = parse(countriesList);
Element root = document.getRootElement();
//noinspection unchecked
Iterator<Element> i = root.elementIterator(EL_COUNTRY);
while (i.hasNext())
{
Element countryElement = i.next();
Element countryName = countryElement.element(EL_COUNTRY_NAME);
Element countryCode = countryElement.element(EL_COUNTRY_CODE);
String countryname = countryName.getText();
countries.add(new Country(countryname, countryCode.getText()));
}
}
catch (DocumentException e)
{
log.error(e, "Cannot read countries list");
}
catch (IOException e)
{
log.error(e, "Cannot read countries list");
}
}
public static Document parse(InputStream inputStream) throws DocumentException
{
SAXReader reader = new SAXReader();
return reader.read(inputStream);
}
}
Tất nhiên, nếu bạn cần phải tìm nước bằng ISO 2 mã thư bạn có thể wont thay đổi Danh sách vào Map lẽ. Nếu, như bạn đã đề cập, bạn cần các quốc gia riêng biệt theo lục địa, bạn có thể mở rộng XML từ ISO 3166 và thêm các phần tử của riêng bạn. Chỉ cần kiểm tra giấy phép (trang web ISO) của họ.
Một số quốc gia thuộc hai châu lục (ở châu Âu Thổ Nhĩ Kỳ, Nga và Kazakhstan), mối quan hệ M: N – mjn
đó là vấn đề của họ :). không ai sẽ muốn sử dụng 3 quốc gia cụ thể đó, và nếu họ làm họ có thể tra cứu chúng theo thứ tự bảng chữ cái thay vì theo vùng –
để bạn biết nước nào sẽ không được 'sử dụng'? bạn phải là chuyên gia thực sự ... – mjn