• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Spring MVC控制器中的ModelAndView和byte []

java 来源:danny.lesnik 4次浏览

我有一个下面的映射,它检索一些“场景”细节并在jsp页面中显示它。Spring MVC控制器中的ModelAndView和byte []

@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图像作为字节[],我需要显示它。我知道我可以创建另一个控制器来处理所有的.png扩展请求并返回byte []。喜欢的东西:

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

,并发送参考图像为:

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

但后来我需要在PNG控制器再次检索的byte [],它会花费我额外的Hibernate事务。是否有任何解决办法可以保存此事务,而不是两次检索byte []?

预先感谢您。

===========解决方案如下:

我会说 – 将字节分隔到不同的Hibernate映射实体(可能是Image?),并让Scene通过延迟加载关系来引用它。

然后,您将有权在您确实需要它们时才加载图像。如前所述,执行showScene的控制器不需要加载图像,它们可以由不同的控制器来处理。

这样做的好处是:

  • 可以改善图像设置您的应用程序的性能被缓存的时间在浏览器中一个特定的金额。这意味着您的控制器加载图像不会一直点击,从而减少服务器端的负载。但是,如果您将图像存储在会话中,则无论为其设置了哪些缓存设置,它们都会一直加载。
  • 并非所有showScenes的请求最终都会成功或者需要显示图片。强制图像加载所有的时间似乎很费力。
  • 这可能是个人偏好,但我喜欢将会话保持干净和尽可能轻。
  • 服务器端缓存是一个好主意,但不要在会话中这样做。 Hibernate的第二层缓存如何 – 所有用户都可以共享?

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)