Как делегировать структуру данных карты вспомогательному классу?

#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. Как делегировать вспомогательному классу / методу?
  2. Как вызвать это в области запроса в сервлете?

Ответ №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 в ваш ответ. Пожалуйста, удалите это, если вам это не нравится.