Java 使用SpringMVC和Hibernate在JSP中显示jpg图像列表

Java 使用SpringMVC和Hibernate在JSP中显示jpg图像列表,java,spring,hibernate,jsp,spring-mvc,Java,Spring,Hibernate,Jsp,Spring Mvc,我想问类似的问题,但有些问题我不懂。我的代码似乎也能工作,但它显示的不是jpg图像,而是一些图标。如果你能帮我弄清楚就好了 首先,控制器: @Controller public class MainController { @Autowired private MasterpieceService masterpieceService; @RequestMapping(value={ "/", "/home" }, method = RequestMethod.GET) public Mod

我想问类似的问题,但有些问题我不懂。我的代码似乎也能工作,但它显示的不是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>

${maxient.name},
${magest.comment}

最后,它应该像一个艺术家画廊,在第一页上展示一张图片表。现在我没有任何css,也没有搜索如何利用输出制作一个好的表格,但问题是关于图像的。它看起来像:

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

解决方案

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

@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);
}
@RequestMapping(value=“/something/getImg{masterpieceId}”,method=RequestMethod.GET,
products=MediaType.IMAGE\u JPEG\u值)
public ResponseEntity ListImage(@PathVariable long masterpieceId)引发IOException异常{
杰作m=masterpieceService.getMasterpieceById(masterpieceId);
字节[]image=m.getImage();
最终HttpHeaders=新HttpHeaders();
headers.setContentType(MediaType.IMAGE\u JPEG);
返回新的响应属性(图像、标题、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>

${maxient.name},
${magest.comment}

损坏的图像表示图像的url错误。您能否告诉我们,对于页面中的此图像,href的值是多少。

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

  • 使HTML如下:img src=“/something/getImg?id=123”
  • 创建一个接受URL“something/getImg”的控制器
  • 在控制器中,使用Servlet的response.Outputstream返回图像

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

    您是指图像文件名吗?它是一个字节数组(byte[]),在MYSQL中作为BLOB存储。图像服务获取一个杰作列表,其中两个字符串是name和comment,字节数组是一个图像。或者你的意思是别的?我会用另一种方法来解决这个问题,而不是在jsp页面中返回字节流,让杰作类返回一个指向图像的url。例如,是的,它似乎是一个选项,但不合适。在这里,我需要提供一个带有注释的图像列表,因此,自然最好获得一个杰作列表并放入模型中,您仍然可以将杰作添加到模型中,并添加您的描述和注释。唯一的变化是您使用url引用图像,并添加一个新的控制器来处理浏览器获取图像的操作,如所提供的答案所示。好的,是的。您和Mecon是对的,现在我明白了,并将尝试实现它。当HTML(JSP)在浏览器上呈现时,${majorite.image}解析为什么?我的majorite实体类具有字符串名称和注释以及名为image的字节数组(byte[])。因此,magive.image=byte[]image,我想你可以看看你网页的HTML源代码(即“查看源代码”)并告诉我们标签的HTML是什么样子的吗?浏览器中的inspect元素选项为我提供了图片的HTML,如下所示:…奇怪,是的。图像不可能(不应该)像HTML中的数据一样插入。图像应通过URL加载。1.使HTML如下:img src=“/something/getImg?id=123”2。创建一个接受URL“something/getImg”的控制器。3.在控制器中,使用Servlet的response.Outputstream返回图像