ModelAndView и byte [] в контроллере Spring MVC - PullRequest
1 голос
/ 12 декабря 2010

У меня есть следующее сопоставление, которое извлекает некоторые детали «сцены» и показывает их на странице jsp.

 @RequestMapping(value="/{id}",method = RequestMethod.GET)
     public ModelAndView showScene(@PathVariable String id){
         ModelAndView mv = new ModelAndView("/Scene/scene");
                 //retrieving Scene using Hibernate                 
                 Scene scene = service.getScene(Long.parseLong(id));
         mv.addObject("name", scene.getName());
                 mv.addObject("desc", scene.getDescription());
                 //etc....
         return mv;
     }

Моя проблема заключается в том, что одним из полей в объекте сцены является изображение png как byte [] иМне нужно показать это.Я понимаю, что могу создать еще один контроллер, который будет обрабатывать все запросы расширений .png и возвращать байт [].Что-то вроде:

<servlet-mapping>
    <servlet-name>PNGHandler</servlet-name>
    <url-pattern>*.png</url-pattern>
  </servlet-mapping>   

и отправьте ссылку на изображение как:

mv.add("image", "image/"+scene.getId()+".png");

, но тогда мне нужно будет снова получить байт [] в контроллере png, и это будет стоить мне дополнительных затрат.Спящая транзакция.Можно ли как-нибудь обойтись, чтобы сохранить эту транзакцию и не получить байт [] дважды?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 12 декабря 2010

Самое простое решение - для первого запроса сохранить byte[] (или весь объект Scene) в сеансе, а для второго запроса извлечь его из сеанса и направить его обратно клиенту.Вы можете хранить данные в сеансе под фиксированным ключом или каждый раз генерировать новый ключ, сохранять его в сеансе под этим ключом, а затем кодировать ключ в URL-адрес <img> при отображении страницы.

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

1 голос
/ 13 декабря 2010

Я бы сказал - разделите байты с другим отображенным объектом Hibernate (возможно, Image?), И заставьте Scene ссылаться на него через лениво-загруженное отношение.

Тогда у вас будет возможность загружать только изображениякогда они тебе действительно нужны.Как уже упоминалось, Контроллеру, выполняющему showScene, не нужно загружать изображения, они могут обрабатываться другим Контроллером.

Преимуществами этого будут:

  • Вы можете повысить производительность своих приложений, настроив кэширование изображений на определенное время в браузерах.Это означает, что ваши контроллеры, которые загружают образы, не будут попадать постоянно, что снижает нагрузку на сервер.Однако если вы сохраняете изображения в сеансе, они будут загружаться постоянно, независимо от установленных для них настроек кэша.
  • Не все запросы к showScenes завершатся успешно или потребуют показа изображений.Принуждение загрузки изображений постоянно требует больших усилий.
  • Это может быть личным предпочтением, но мне нравится, когда сеансы должны быть максимально чистыми и легкими.
  • Кэширование на стороне сервераэто хорошая идея, но не делайте этого на сессии.Как насчет кэширования второго уровня Hibernate - что-то, что будет доступно всем пользователям?
1 голос
/ 12 декабря 2010

Hibernate обеспечивает ленивую загрузку атрибутов http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching-lazyproperties

Я верю, что весенний способ заключается в использовании двух методов контроллера, один из которых содержит страницу, как вы, а второй возвращает только изображение.

Если вы боитесь производительности, вы можете использовать свойство hibernate lazyloading для вашего байтового массива.Поэтому массив не будет загружен, когда вы используете только имя и другие вещи (кроме массива).

Но, насколько я знаю, свойство отложенной загрузки требует некоторого улучшения байтового кода.Так что, если это огромная проблема, вы можете подумать о загрузке атрибутов напрямую с помощью запроса, а не о загрузке его сопоставленным классом.

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