#java #jakarta-ee
#java #джакарта-ee
Вопрос:
У меня есть сервлет, в котором я использую Map<Integer, String>
для отображения месяца, дня и года Select tag
с помощью тега JSTL.
Как, например, в коде сервлета:
// Storing month in key-value pair
Map<Integer, String> months = new LinkedHashMap<Integer,String>();
months.put(1, new String("Jan"));
months.put(2, new String("Feb"));
months.put(3, new String("Mar"));
months.put(4, new String("Apr"));
...
// Putting month in request scope to be accessed in JSP
request.setAttribute("months", months);
Но я хочу написать код структуры данных карты на другом Helper class
языке и вызвать его в сервлете, чтобы мой сервлет стал менее утомительным
Вопрос:
- Как делегировать вспомогательному классу / методу?
- Как вызвать это в области запроса в сервлете?
Ответ №1:
Просто:
Map<Integer, String> months = new Helper().months();
В зависимости от ваших потребностей вы можете реализовать это также как статический метод. Использование DI с использованием обычного метода более приемлемо (большую часть времени).
Нет необходимости жестко определять месяцы в методе. SimpleDateFormat может справиться с этим. (Было бы немного приятнее использовать joda time вместо GregorianCalendar.)
public static Map<Integer, String> months() {
Map<Integer, String> months = new HashMap<Integer, String>();
for(int i=0;i<12;i ){
GregorianCalendar cal = new GregorianCalendar(2000, i, 1);
String month = new SimpleDateFormat("MMM", Locale.ENGLISH).format(cal.getTime());
months.put(i 1, month);
}
return months;
}
Область запроса: Ваш сервлет вызывается для каждого запроса. Пока вы добавляете месяц в качестве атрибута к запросу, все должно быть в порядке. На самом деле нет необходимости создавать карту для каждого запроса. Месяцы не так уж сильно меняются. Вы должны сохранить карту в контексте приложения при запуске.
Ответ №2:
Я не уверен, правильно ли я вас понял, но вот оно —
вы можете написать класс, скажем, Helper
и в нем может быть, скажем, статический метод, getMonths
который вернет эту карту. Нравится —
public class Helper {
private Helper(){ }
private static Map<Integer, String> months = new LinkedHashMap<Integer, String>();
static{
months.put(1, "Jan");
months.put(2, "Feb");
months.put(3, "Mar");
months.put(4, "Apr");
...
}
public static Map<Integer, String> getMonths(){
return months;
}
}
и вы можете вызвать этот метод из своего сервлета, например —
Map<Integer, String> months = Helper.getMonths();
поскольку эта карта постоянна, но изменчива, вы можете использовать ImmutableMap для этой цели из Guava.
Ответ №3:
Не совсем уверен, но может:
String[] months = DateFormatSymbols.getInstance().getMonths();
Реализация метода:
public static Map<Integer, String> months() {
Map<Integer, String> months = new HashMap<Integer, String>();
String[] instance = DateFormatSymbols.getInstance(Locale.ENGLISH).getShortMonths();
for (int i = 0; i < instance.length; i ) {
months.put(i 1, instance[i]);
}
return months;
}
Комментарии:
1. @Alexander Это даже лучше, чем моя версия. Не знал этого.
2. @Alexander не хотел красть вашу идею, поэтому я включил метод impl в ваш ответ. Пожалуйста, удалите это, если вам это не нравится.