我想使用response输出图片
jsp端:
     <s:iterator value="#session.goodstablelist">
     <tr>
        <td><s:property value="name"/></td>
        <td><s:property value="price"/></td> 
        <td><s:property value="tp"/></td> 
        <s:set name="tpvalue" value="tp" scope="session"></s:set>       
        <td ><img src="getimage.action" width=300 height=300 align="center"/></td>       
     </tr>
     </s:iterator>
java端:
public String getImage()
{
                String str="from Goodstable";
Session se=HibernateSessionFactory.getSession();
Query query=se.createQuery(str);
List list=query.list();
if(list.size()>0)
{
int j=0;
while(j<list.size())
{
Goodstable findid=(Goodstable)list.get(j);
byte[] zp=(byte[])findid.getTp();
System.out.println(zp);
HttpServletResponse  response=ServletActionContext.getResponse();
response.setContentType("image/*");
//得到输出流
try {


ServletOutputStream ot = response.getOutputStream();

if(zp!=null&&zp.length>0){
for(int i=0;i<zp.length;i++){
ot.write(zp[i]);
}
ot.flush();
ot.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
j++;

}
HibernateSessionFactory.closeSession(); return NONE;

}
但是这里只能输出最后一张图片,根据输出的zp来看,发现getimage这个方法只执行了一次,所以session的值也就是最后存进去的那个值,所以只输出最后一张图片。
为什么getimage这个方法只执行了一次呢?servletjavaiteratorsession

解决方案 »

  1.   

    好好学习下jsp的四个域的知识page.session.request.application
      

  2.   

    getImage()方法是必然只执行一次的,因为它是对于<img src="getimage.action" width=300 height=300 align="center"/>发起的页面请求的回复,既然请求只有一次,回复必然只有一次。
    最好的解决办法是把图片列表的数量传到前台页面,然后在页面上根据图片数量遍历生成<img/>标签,将每次遍历的下标i当做参数传到后台,类似于src="getimage.action?index=0",在后台通过下表参数取出图片列表中图片,去掉循环即可。
      

  3.   

    遍历生成image标签,然后后进输出,同楼上
      

  4.   


    if(zp!=null&&zp.length>0){
    for(int i=0;i<zp.length;i++){
    ot.write(zp[i]);
    }
    ot.flush();
    ot.close();

    改成
    if(zp!=null&&zp.length>0){
    for(int i=0;i<zp.length;i++){
    ot.write(zp[i]);
    ot.flush();
    }
    } 试试看,就是把close语句去掉,把flush语句挪到循环内部
      

  5.   

    仔细看了一下,我前面说的不太对。
    首先,java端List list=query.list();获取出来的是多个元素吗?如果是多个,那么while循环就会循环超过一次。如果你在第一次循环中,调用了ot.close();那么后面的几次循环都无法将数据写到客户端,即使不关闭,将数据写到客户端,也只能显示第一个写入的图片。也就是说,一次掉用getimage最多在客户端显示一个图片。
    然后看jsp端,在jsp中如果#session.goodstablelist中有多个元素,那么会循环多次,每次循环中将(<s:set name="tpvalue" value="tp" scope="session"></s:set>)tpvalue设置成当前的tp值,所以最终tpvalue中保存的是最后一个tp值。而图片显示部分<img src="getimage.action" width=300 height=300 align="center"/>,由于链接地址相同,虽然循环了多次,只会在第一次的时候与服务器交互,调用getimage方法,剩下的几次循环,直接从缓存中取得前面或得的图片。所以getimage必然只调用一次。你可以再getimage.action后面加上参数,比如时间戳之类的,这样就可以多次调用getimage了。