从blob到带有struts2和InputStream的图像

时间:2012-08-15 17:08:45

标签: jsp struts2 inputstream

我想知道为什么我没有得到任何东西。我有一个函数谁从SQL Server 2008返回一个字节数组但我没有得到任何东西,为什么? .getWhiteLabelingLogo()是一个函数,它返回一个byte [],其中包含我想在jsp页面显示的图像。我访问这个

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.rmi.RemoteException;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.axis.MessageContext;
import org.apache.struts2.ServletActionContext;
import org.datacontract.schemas._2004._07.CCIS_Web_Services_PublicApi.PapiAccountInfo;
import org.datacontract.schemas._2004._07.CCIS_Web_Services_PublicApi.PapiUserInfo;

import Services.Web.CCIS.BasicHttpBinding_PublicApiServiceStub;
import Services.Web.CCIS.PublicApiService_PortType;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class ShowImageAction extends ActionSupport{
  Map session;
 private byte[] itemImage; 
 private InputStream str = null;
public String execute() throws RemoteException { 
    System.out.println("Estoy aquí");
        HttpServletResponse response = ServletActionContext.getResponse(); 


   session = ActionContext.getContext().getSession();
   PublicApiService_PortType puerto=(PublicApiService_PortType) session.get("puerto");
   ((BasicHttpBinding_PublicApiServiceStub)puerto).setMaintainSession(true);

   MessageContext ctx=(MessageContext) session.get("contexto");
   PapiUserInfo[] users;

    users = puerto.getUsers();
    Long accountID=users[0].getID();
    PapiAccountInfo info=puerto.getAccountInfo(accountID);
            itemImage=info.getWhiteLabelingLogo();
            str=new ByteArrayInputStream(itemImage);
        return SUCCESS;




}

  public void setItemImage(byte[] itemImage) { 
      this.itemImage = itemImage; 
   }

   public InputStream getStr() {
    return str;
   }

   public void setStr(InputStream str) {
    this.str = str;
   }

   public byte[] getItemImage() {
    return itemImage;
   } 


  }

在index.jsp我有这个:

<img src="<s:url value="ShowImageAction" />" border="0" width="100" height="100"> 

在struts.xml中我有这个:

 <action name="ShowImageAction">
  <result name="success" type="stream">
    <param name="inputName">str</param>
    <param name="contentType">image/jpeg</param>

 </result>
</action>

我做得不好,因为我什么都没有。非常感谢

1 个答案:

答案 0 :(得分:1)

嗯,首先,你根本就没有行动方法。你有一个名为execute的方法,但它是静态的并返回void。 Action方法是非静态的,并返回一个String,它映射到struts.xml中的结果。

此外,在响应中设置内容类型后,您永远不会发送任何数据。

此操作还存在其他问题,例如在操作上使用可变静态字段,这不是线程安全的。

以下是一些步骤:

  • execute方法更改为非静态方法并返回字符串
  • 在方法的最后添加return SUCCESS;
  • 更新struts.xml映射以引用结果&#34; success&#34; (SUCCESS是一个常数,其实际值为&#34;成功&#34;)
  • 使三个成员字段为非静态
  • 在struts.xml中设置内容类型,而不是在代码中(参见下面的示例)
  • 删除response.reset()和.setContentType()调用

示例:

<action name="ShowImageAction" class="package.for.ShowImageAction">
  <result name="success" type="stream">
    <param name="contentType">image/jpeg</param>
    <param name="inputName">str</param>
  </result>
</action>

然后,如果它仍然不适合你,请适当地修改你的问题。