使用Spring MVC和Hibernate在JSP中显示jpg图像列表

时间:2015-05-26 13:45:06

标签: java spring hibernate jsp spring-mvc

我寻找类似的问题,但不了解一些事情。我的代码似乎也有效,但它不是jpg图像,而是显示一些图标。如果你能帮到解决它会很棒。

首先,控制器:

@Controller
public class MainController {

@Autowired
private MasterpieceService masterpieceService;

@RequestMapping(value={ "/", "/home" }, method = RequestMethod.GET)
public ModelAndView firstPage(){
    ModelAndView model = new ModelAndView();
    model.addObject("masterpiece", new Masterpiece());
    model.addObject("masterpieceList", masterpieceService.getMasterpieces());
    model.setViewName("home");
    return model;
}

(...other methods...)


    @RequestMapping(value = {"/uploadMasterpiece"}, method = RequestMethod.POST)
public ModelAndView uploadMasterpiece(@RequestParam("name") String name,
                                      @RequestParam("file") MultipartFile file,
                                      @RequestParam("comment") String comment) {
    ModelAndView model = new ModelAndView();

    if(file.isEmpty()){
        // oh no.
        model.setViewName("home");
    }else {
        Masterpiece masterpiece = new Masterpiece();
        try {
            masterpiece.setName(name);
            masterpiece.setImage(file.getBytes());
            masterpiece.setComment(comment);
            masterpieceService.addMasterpiece(masterpiece);

            model.setViewName("admin");
        }catch (Exception e){
            e.printStackTrace();
            model.setViewName("home");
        }
    }
    return model;
}}

和我的JSP:

<c:if test="${!empty masterpieceList}">
<table>

    <c:forEach items="${masterpieceList}" var="masterpiece">
        <tr>
            <td>${masterpiece.name},</td>
            <td><img src="${pageContext.request.contextPath}/masterpiece/${masterpiece.image}" /> </td>
            <td>${masterpiece.comment} </td>
        </tr>
    </c:forEach>
</table>

最后它应该像一个艺术家画廊,代表第一页上的图像表。现在我没有任何CSS并没有搜索如何从输出中创建一个好的表,但问题是关于图像。它看起来像:

enter image description here

,用图标代替图片,我想知道为什么......

经过评论和回答,我最终找到了解决方案。以前我试图直接传递图像,而不是作为网址值,这似乎是一种不好的做法。以下是控制器中的代码:

@RequestMapping(value = "/something/getImg{masterpieceId}", method = RequestMethod.GET,
        produces = MediaType.IMAGE_JPEG_VALUE)
public ResponseEntity<byte[]> ListImage(@PathVariable long masterpieceId) throws IOException{
    Masterpiece m = masterpieceService.getMasterpieceById(masterpieceId);
    byte [] image = m.getImage();
    final HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.IMAGE_JPEG);
    return new ResponseEntity<byte[]>(image, headers, HttpStatus.CREATED);
}

我的更新表格:

 <c:if test="${!empty masterpieceList}">
<table>

    <c:forEach items="${masterpieceList}" var="masterpiece">
        <tr>
            <td>${masterpiece.name},</td>
            <td><img src="/something/getImg${masterpiece.masterpieceId}" /> </td>
            <td>${masterpiece.comment} </td>
        </tr>
    </c:forEach>
</table>

2 个答案:

答案 0 :(得分:3)

图像不能(不应该)像HTML中的数据那样插入。应该通过URL加载图像。

  1. 让HTML像这样:img src =“/ something / getImg?id = 123”
  2. 创建一个接受URL“something / getImg”的控制器。
  3. 在Controller中,使用Servlet的response.Outputstream
  4. 返回Image

    对于要显示的每个图像,创建一个IMG html元素。每个IMG的“src”属性将指向该图像的特定URL:.. getImage?id = 111,getImage?id = 112等。控制器方法将查找请求参数“id”,并返回该id的图像

答案 1 :(得分:2)

图像损坏表示图像的网址错误。你能告诉我们页面中这个图像的href值是多少吗?