0

我正在执行一项任务,我必须提供一个用户登录名,之后他将被定向到一个页面,他可以在该页面上上传图像,并且他以前的所有 + 新图像都将显示在下面的表格中。所以我的应用程序的结构是这样的......

(为了清楚起见,修剪了大部分代码)

允许上传和显示图像的 JSP 文件

<p>Please select an image file to upload(Max file size 1 MB)</p>

<%
    Integer userId = 0;
    userId = (Integer) session.getAttribute("userId");
%>
<%
    String errorMessage = (String) request.getAttribute("error");
    if (errorMessage != null) {
        out.print("<h4> " + errorMessage + "</h4>");
    }
%>
<form action="imageupload" enctype="multipart/form-data" method="post">
    <br /> <input type="file" name="uploader" id="uploader" /> <br /> <br />
    <input type="submit" />&nbsp;&nbsp;&nbsp; <input type="button"
        value="clear" onClick="clear()" />


</form>
<br />
<h4>Uploaded Images</h4>
<br />
<table width="80%">
    <tr>
        <th>S No.</th>
        <th>Name</th>
        <th>size</th>
        <th>Preview</th>
        <th>Actions</th>
    </tr>
    <%
        UserImagesDAOImplementation userImages = new UserImagesDAOImplementation();

        List<Image> images = (List<Image>) userImages.getUserImages(userId);

        for (Image image : images) {
    %>
    <tr>
        <td><%=image.getSn()%></td>
        <td><%=image.getImageName()%></td>
        <td><%=image.getSize()%></td>
        <td><% session.setAttribute("image",image.getImage() ); %><img src="toimage" height="100px" width="100px" /></td>
        <td><img src="img/edit.png" />&nbsp;&nbsp;<img src="img/url.png" /></td>
    </tr>
    <%
        }
    %>
</table>
<br />
Total space used: <%= (userImages.getSizeUsage(userId)/1024) %> KB / 10 MB

返回图像的“toimage”servlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    HttpSession session = request.getSession();
    Byte[] image = (Byte[]) session.getAttribute("image");
    int len = image.length;
    byte[] imageData = new byte[len];

    for(int i=0; i < len; i++) {
        imageData[i] = image[i];
    }

    response.setContentType("image/jpg");
    response.getOutputStream().write(imageData);
    response.getOutputStream().flush();
    response.getOutputStream().close();

}

我的问题是它在所有表格行中显示列表中的最后一个图像,并且在上传其他图像后,它会在每一行中显示该新图像。

我对我的网站设计不是很有信心,但这是我第一次使用 JSP。我决定在 JSP 中获取图像列表,因为稍后我将不得不对其执行更多操作。我猜问题出在设置会话变量或最终调用的 src servlet 中。不管是什么,有人能解释一下这个设计中典型的事件流程吗?

编辑:在“toimage”servlet 中放置一个打印语句证明它只被调用一次。那么如何让 JSP 循环每次都调用图像 src 呢?

4

1 回答 1

2

您使用单个会话属性来存储每个图像。因此,在循环结束时,此会话属性包含最后一个。

您根本不应该使用会话。相反,您应该将 ID 或名称或任何标识图像的内容作为 URL 参数传递:

<img src="toimage?imageId=<%= image.getId() %>" height="100px" width="100px" />

servlet 现在应该使用这个参数来判断它必须加载哪个图像并将其发送到浏览器。

另外,学习 JSTL 和 EL。不应使用小脚本。

于 2013-02-12T12:14:59.250 回答