request.setAttribute внутри цикла - PullRequest
0 голосов
/ 06 мая 2018

У меня есть сервлет в моем проекте j2EE, где я рассчитываю некоторые материалы для проекта лиственных пород. У меня есть ArrayList, куда я добавляю необходимое количество необходимых материалов. Я хочу установить ArrayList в качестве атрибута reqeust, чтобы в конечном итоге я мог отобразить их на странице jsp.

  String execute(HttpServletRequest request, HttpServletResponse response) throws LoginSampleException {

  //here is going to a mehtod to acces to database and get the information

    ArrayList<Tree> trees = new ArrayList<>();
    for(Tree tree: trees){
         int amount = tree.calculate(tree.getLength(), tree.getLengthPrUnit());
         ArrayList <Integer> amountMaterials = new ArrayList<>();
         amountMaterials.add(amount);
         request.setAttribute("amountMaterials", amountMaterials);
    }

return null; // here I'm eventually going to redirect to my jsp-page
}

Должен ли я поместить атрибут request.setAttribute вне цикла или это не имеет значения

вот альтернативная версия

  ArrayList<Integer> amountMaterials = null; 

    ArrayList<Tree> trees = new ArrayList<>();
    for(Tree tree: trees){
         int amount = tree.calculate(tree.getLength(), tree.getLengthPrUnit());
         amountMaterials.add(amount);

    }
    request.setAttribute("amountMaterials", amountMaterials);

return null; 
}

1 Ответ

0 голосов
/ 07 мая 2018

См. Объяснение ниже:

Первая версия:

ArrayList<Tree> trees = new ArrayList<>();
for(Tree tree: trees) {
     int amount = tree.calculate(tree.getLength(), tree.getLengthPrUnit());
     ArrayList <Integer> amountMaterials = new ArrayList<>();
     amountMaterials.add(amount);
     request.setAttribute("amountMaterials", amountMaterials);
}
  1. В этой версии кода вы каждый раз пытаетесь создать новый ArrayList, если у вас больше Tree объектов, то будет создано много объектов ArrayList.

  2. request.setAttribute() если вы поместите этот код в цикл с тем же именем атрибута amountMaterials предыдущие значения будут переопределены новыми значениями, и, наконец, у вас будет только одно значение, и это будет последнее вычисленное значение.

Итак, первая версия не предлагается.

Вторая версия:

ArrayList<Integer> amountMaterials = null; 

ArrayList<Tree> trees = new ArrayList<>();
for(Tree tree: trees){
     int amount = tree.calculate(tree.getLength(), tree.getLengthPrUnit());
     amountMaterials.add(amount);

}
request.setAttribute("amountMaterials", amountMaterials);

В этом случае вы создаете объект ArrayList вне цикла, поэтому он будет создавать только один экземпляр и будет иметь все значения, а request.setAttribute() находится вне цикла, что означает, что ваши предыдущие значения не будут переопределены.

По этому объяснению теперь вы знаете, какую версию использовать;).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...