С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622

Spring MVC Как вытащить из модели атрибут поменять его формат и вставить обратно

17.08.2018, 10:20. Показов 3819. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется модель которая формируется из данных базы
Java
1
2
3
4
5
   @RequestMapping(value = "/", method = RequestMethod.GET)
    public String listStudents(Model model)
    {
        List<Student> students = studentDAO.getAllStudents();
        model.addAttribute("students", students);
В модели имеется такой атрибут как student.img в виде byte[]
Можно-ли вытащить его из модели поменять его формат на base64 и засунуть обратно?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.08.2018, 10:20
Ответы с готовыми решениями:

MultipartFile Spring MVC, как сохранить файл и вытащить назад на View
День добрый. У меня есть метод в сервисе, которые сохраняет файл(картинку) в базу и локально на ПК. Как вытящаить назад картинку из базы, я...

Spring MVC атрибуты модели
Добрый день! Работаю со Spring MVC, допустим есть два метода в классе контроллера: @RequestMapping(value = &quot;/&quot;,...

Выбрать из первой таблицы атрибут записи, удовлетворяющей некому условию, и вставить его во вторую
Помогите пожалуйста...Есть две таблицы, к примеру одна заполнена а вторая пуста. Необходимо выбрать из 1 таблицы атрибут...

32
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.08.2018, 11:15
Цитата Сообщение от VlGuvin Посмотреть сообщение
В модели имеется такой атрибут
как он туда попадает?
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
17.08.2018, 12:01  [ТС]
Виноват. Не совсем правильно написал.
В модель добавляется атрибут students
Java
1
model.addAttribute("students", students)
В качестве value этот атрибут имеет список студентов
Java
1
 List<Student> students = studentDAO.getAllStudents();
Они там появляются из базы.
Каждый из этих студентов имеет поле img в виде byte[], которое на .jsp не отображается правильно из-за неверного формата.
Моя мысль в том чтобы вытащить это поле из модели - преобразовать в нужный формат и запихнуть обратно на то же место.
Можно-ли это сделать?
Прошу прощения за небольшой сумбур.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.08.2018, 12:10
Цитата Сообщение от VlGuvin Посмотреть сообщение
Моя мысль в том чтобы вытащить это поле из модели
что тебе мешает?
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
17.08.2018, 12:33
VlGuvin,
Если на стороне сервера, то сделать сервис, где вы проведете свою логику, и впишете в модель еще один список с изображениями ("-" но должно быть соответствие списков, "+" картинки отдельно, и можно работать без них). Или другой сервис где ваш Student станет StudentOther с которым вы в последствии и будете работать.
Если на стороне клиента, то обрабатывать изображения, например, javascript, если это возможно.
В любом случае это все лишь мои измышления, пробуйте и пишите как получается ))

Добавлено через 8 минут
VlGuvin, Еще есть вариант тянуть логику/функциональность с сервера, а не новое представление/страницу, с помощью restTemplate. Но это я так, о своем вопросе, о наболевшем, не знаю как все это тянуть а тему не создавал так как сомневаю что кто-либо поможет.
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
17.08.2018, 14:41  [ТС]
что тебе мешает?
Плохое понимание что и как для этого нужно сделать.
Не знаю как правильно. Пытаюсь делать примерно так;
1. Вытаскиваю в строку байткод картинки и преобразовываю ее в формат Base64
Java
1
2
3
4
       List<Student> students = studentDAO.getAllStudents();
 
        byte[] imgNew = students.get(0).getImg();
        String imageBase64 = new String(Base64.getEncoder().encode(imgNew));
Далле нужно добавить в модель атрибут в виде списка List<Student> students
Java
1
model.addAttribute("students", students);
Но перед этим нужно в List<Student> students заменить поле img на imageBase64
Как это сделать не врубаюсь.
Или я вообще все делаю не так...

Добавлено через 57 минут
Да. Все не так...
Дело в том, что в списке List<Student> students каждый студент имеет элемент img в виде byte[]
И заменить его не получится на Base64, поскольку это String
Как быть в этом случае?
Создать типа копию List<Student> в которой поле img каждого студента будет уже String и туда можно добавить стринг преобразованной картинки?
Если это можно сделать то как это примерно будет выглядеть в коде?
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
17.08.2018, 16:39
Цитата Сообщение от VlGuvin Посмотреть сообщение
поскольку это String
Что мешает сделать?
Java
1
byte[] bytes = "someString".getBytes();
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
17.08.2018, 18:12  [ТС]
Так я и делаю
Java
1
2
byte[] imgNew = students.get(0).getImg();
        String imageBase64 = new String(Base64.getEncoder().encode(imgNew));
Как теперь создать например List<String> newStudents так чтобы он был клоном от List<Student> students
но в нем на месте поля img(byte[]) разместить поле imageBase64 (String)
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
17.08.2018, 18:18
Получили картинку; поменяли ее у студента; отдали коллекцию студентов. Менять так:
Java
1
2
3
byte[] imageBase64 = new String(Base64.getEncoder().encode(imgNew)).getBytes();
Student student = new Student();  //тут должен быть объект, у которого необходимо заменить изображение
student.setImg(imageBase64);
1
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
18.08.2018, 09:33  [ТС]
Спасибо.
Преобразование работает.
Но далее нужно сделать клон от List<String> students (например List<String> studentsClon) и уже в клоне сделать
Java
1
studentsClon.get(номер).setImg(setImg(imageBase64))
Как правильно сделать клон из List<String>?

Добавлено через 22 минуты
Да клон примерно так
Java
1
2
3
4
List<Student> students = studentDAO.getAllStudents();
...
List<Student> studentsClon = new ArrayList<>(students);
studentsClon.get(номер).setImg(imageBase64);
Вроде работает. Но на .jsp всеравно не отображается
HTML5
1
<img src="${student.img}">
Может img должно быть String (формат Base64)?
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
18.08.2018, 09:55
Цитата Сообщение от VlGuvin Посмотреть сообщение
studentsClon.get(номер).setImg(imageBase 64);
Зачем это делать каждый раз, когда необходимо отдать картинку?

Что сейчас получается в html?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
18.08.2018, 10:26
VlGuvin, надо отдавать на клиент не объект из БД а dto с нужными полями и там уже делать любые преобразования.
1
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
18.08.2018, 11:07  [ТС]
Зачем это делать каждый раз, когда необходимо отдать картинку?

Что сейчас получается в html?
Попробую детальнее ()
Картинка в базе находится в byte[]
При получении данных из базы
Java
1
2
3
4
5
   @RequestMapping(value = "/", method = RequestMethod.GET)
    public String listStudents(Model model)
    {
List<Student> students = studentDAO.getAllStudents();
...
в students картика в byte[] Затем students добавляется в модель (добавляется атрибут)
Java
1
model.addAttribute("students", students);
которая затем и отображается на .jsp примерно так
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<table class="table table-striped">
            <thead>
            <tr>
                <th scope="col">
                    <div class="checkbox">
                        <input type="checkbox" value="option1">
                    </div>
                </th>
                <th scope="col">Picture</th>
                <th scope="col">Name</th>
                <th scope="col">Birth Day</th>
                <th scope="col">Gender</th>
                <th scope="col">Address</th>
            </tr>
            </tr>
            </thead>
            <tbody>
            <c:forEach items="${students}" var="student">
                <tr>
                    <th scope="col">
                        <div class="checkbox">
                            <input type="checkbox" value="option1">
                        </div>
                    </th>
                    <td><img srg="${student.img}"/></td>
                    <td>${student.firstName} ${student.lastName}</td>
                    <td>${student.dateOfBirth}</td>
                    <td>${student.gender}</td>
                    <td>${student.address.address}</td>
                    <td>
                        <a class="btn btn-primary" href="#" role="button">Edit</a> 
                        <a class="btn btn-primary" href="#" role="button">Add Mark</a>
                    </td>
                </tr>
            </c:forEach>
            </tbody>
        </table>
Но картинки не отображается вообще на ,jsp
Поэтому и возникла мысль перед добавлением атрибута students, в модель сделать клон из List<Student> students (например List<Student> studentsClon) в котором поменять содержимое всех полей img на imageBase64 (img преобразованное в формат Base64)
и уже только теперь добавить в виде атрибута в модель не students, а studentsClon
model.addAttribute("students", studentsClon)
В модели теперь все поля img будут в нужном формате Base64.
Так и сделал. Но на .jsp всеравно пусто.

Добавлено через 5 минут
Но на .jsp картики всеравно не отображаются. Проверял в отладчике поля student.img заполнены преобразованными байтиками

Добавлено через 2 минуты
dto с нужными полями
Это как? Я добавляю в модельку List<students>
На .jsp все вынимается из этой модельки. Как по другому?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
18.08.2018, 12:22
Пишешь класс StudentDto с нужным тебе набором полей, в модель отдаешь экземпляры этого класса, а не Entity
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
18.08.2018, 12:31  [ТС]
Пишешь класс StudentDto с нужным тебе набором полей, в модель отдаешь экземпляры этого класса, а не Entity
А поля как заполнять? Доставать из базы List<Student> students = studentDAO.getAllStudents();?
Как-бы двойная работа. Получается что моделька будет формироваться как-бы через прокладку StudentDto?
Вроде все логично.. Всякие разные поля можно добавить...
Если не сложно покажите пожалуйста в коде на простом примере или ссылку.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
18.08.2018, 13:17
Цитата Сообщение от VlGuvin Посмотреть сообщение
Как-бы двойная работа.
циклы процессора экономишь?

Цитата Сообщение от VlGuvin Посмотреть сообщение
Если не сложно покажите пожалуйста в коде на простом примере
Java
1
2
3
studentDto.setName(student.getName());
studentDto.setBlabla(student.getBlabla());
...
0
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
18.08.2018, 14:12  [ТС]
Спасибо.
Но пока не врубился.
1. Создать класс
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class StudentDto {
 
    private Long id;
    private String firstName;
    private String lastName;
    private Date dateOfBirth;
 
    private String gender;
    private Address address = new Address();
 
    private byte[] img;
    private String imgBase64;
   
 
}
В этом класса поля такие же как и в класса Entity + private String imgBase64;
А что дельше. Как скопировать Entity под названием Student в StudentDto?
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
18.08.2018, 14:24
Цитата Сообщение от VlGuvin Посмотреть сообщение
Как скопировать Entity под названием Student в StudentDto?
Использовать геттеры класса Student и сеттеры класса StudentDTO.
1
-13 / 6 / 6
Регистрация: 04.08.2015
Сообщений: 622
18.08.2018, 15:36  [ТС]
Пока еще не понял
Создал класс StudentDto с нужными полями, геттерами и сеттерами.
Где теперь делать копию Student? В классе контроллера?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Controller
public class StudentController {
 
    @Resource
    private StudentDAO studentDAO;
 
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String listStudents(Model model)
    {
        List<Student> students = studentDAO.getAllStudents();
        model.addAttribute("students", students);
 
        return "home";
    }
 
}
В классе контроллера создается модель из данных полученных из базы.

Добавлено через 24 минуты
Типа так?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Controller
public class StudentController {
 
    @Resource
    private StudentDAO studentDAO;
 
    private int i;
 
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String listStudents(Model model)
    {
        List<Student> students = studentDAO.getAllStudents();
        List<StudentDto> studentsDto = new ArrayList<>();
 
        for (i = 0; i < students.size(); i++) {
            Long id = students.get(i).getId();
           studentsDto.get(i).setId(id)
            .....
        }
0
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
18.08.2018, 15:43
Цитата Сообщение от VlGuvin Посмотреть сообщение
Типа так?
Да. Хотя логичней из Сервиса отдавать DTO. Конечно если слой сервисов есть.

Вот только for я бы советовал на for each заменить. Меньше писать и понятней читать. Вместо
Java
1
2
3
4
5
for (i = 0; i < students.size(); i++) {
   Long id = students.get(i).getId();
   studentsDto.get(i).setId(id);  //i-го элемента ж в коллекции studentsDto еще нет. Сначала его добавить надо
   .....
}
делать так:
Java
1
2
3
4
5
6
7
for (Student student : Students) {
   StudentDto studentDto = new StudentDto();
   Long id = student.getId();
   studentDto.setId(id);
   .....
   studentsDto.add(studentDto);
}
Или можно на стримах переписать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.08.2018, 15:43
Помогаю со студенческими работами здесь

Spring MVC. 404 ошибка при включении Spring Data JPA в проект
Добрый день. Есть простой шаблонный проект с использованием Spring MVC и Maven. С зависимостями Spring MVC проект собирается нормально и...

Перевод проекта из Spring Maven в обычный Spring MVC
Здравствуйте. Подскажите, реально ли взять готовый проект, например -...

задания по spring core и spring mvc для новичков
Какие задания можно предложить новичкам для выполнения после знакомства их с spring core и mvc ?

Jetty embedded + Spring MVC + Spring Security
Добрый день. По роду работы приходилось писать на JavaSE, в том числе и сложные клиент/серверные программы. Использовал Netty, Apache...

Как добавить атрибут к XML элементу в модели?
Есть такая модель: public class RootObject { public const string Namespace = &quot;http://schemas.xmlsoap.org/soap/envelope/&quot;;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru