当前位置: 首页 > 图文教程 > 网络编程 > JSP > 用servlet显示图片

JSP
我认为JSP有问题(上)
我认为JSP有问题(下)
jsp“抓”网页代码的程序
关于在bean里面打印html的利弊看法
bean里面如何打印到html页面
jdbc3中的RowSet 接口规范
Apusic Application Server1.0中jsp源代码泄漏漏洞
Unify的eWave ServletExec拒绝服务漏洞
通过提交超长的GET请求导致IBM HTTP Server远程溢出
在HTTP请求中添加特殊字符导致暴露JSP源代码文件
Resin 1.2 重要源代码暴露漏洞
多中WEB服务器的通用JSp源代码暴露漏洞
Tomcat 暴露JSP文件内容
IBM WebSphere Application Server 暴露JSP文件内容
JRun 2.3.x 范例文件暴露站点安全信息
BEA WebLogic 暴露源代码漏洞
IBM WebSphere Application Server 3.0.2 存在暴露源代码漏洞
Tomcat 3.1 存在暴露网站路径问题
Sun Java Web Server 能让攻击者远程执行任意命令
Netscape 修复 JAVA 安全漏洞

JSP 中的 用servlet显示图片


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-03   浏览: 242 ::
收藏到网摘: n/a

[pre]    最近,公司用servlet做一个跟踪图片点击技术的模块,我个人略有心得想和大家分享,
 不知大家愿意审视。
 这个模块挺大,我仅说说用servlet显示图片部分。我先说说用servlet显示图片的一个流程:
 1. 设置response的输出类型:
    对应的语句--response.setContentType("image/gif;charset=GB2312") ,response  
    便能输出gif图片,"image/gif;charset=GB2312"便是输出类型,当然你可以输出
    "image/jpg;charset=GB2312"类型文件。
 2. 得到文件流:
    servlet是以流的形式件图片文件从服务器读出,通过response将流发到浏览器的。
 3. 得到输出流:
    对应的语句--OutputStream output = response.getOutputStream();
    当然,处理图片文件需要以二进制形式的流。
 4. 文件流的编码(但也不一定必须编码的,如果不是文件流,则必须编码)
    所以我给大家一个用编码的代码和不用编码的代码.
  顺便说一句,sun公司仅提供了jpg图片文件的编码api。
    
    我想基本流程都讲完了,下面我把代码拿给大家看一下,大家自然一目了然了:
package xjw.personal.servet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.sun.image.codec.jpeg.*;//sun公司仅提供了jpg图片文件的编码api
import javax.imageio.stream.*;
import java.awt.*;
import java.awt.image.BufferedImage;
public class ShowPicture  extends HttpServlet
{
     private static final String GIF="image/gif;charset=GB2312";//设定输出的类型
     private static final String JPG="image/jpeg;charset=GB2312";
     public void init()  throws ServletException
     {
     }
     public void doGet(HttpServletRequest request, HttpServletResponse response)
                  throws IOException, ServletException
     {
        doPost(request, response);
     }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
                 throws IOException, ServletException
   {
        
        String spec=request.getParameter("spec");//输出图片的类型的标志
     int int_spec=Integer.parseInt(spec);
        if(spec==1)    
        {
            String imagePath="/jfgg/b1.jpg";//图片相对web应用的位置
        }
        else
        {
              String imagePath="/jfgg/b2.gif";//图片相对web应用的位置
        }    
        
       OutputStream output = response.getOutputStream();//得到输出流
       if(imagePath.toLowerCase().endsWith(".jpg"))//使用编码处理文件流的情况:
      {
     response.setContentType(JPG);//设定输出的类型
          //得到图片的真实路径      
          imagePath = getServletContext().getRealPath(imagePath);
         //得到图片的文件流
          InputStream imageIn = new FileInputStream(new File(imagePath));
         //得到输入的编码器,将文件流进行jpg格式编码
     JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
         //得到编码后的图片对象
         BufferedImage image = decoder.decodeAsBufferedImage();
         //得到输出的编码器
          JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
          encoder.encode(image);//对图片进行输出编码
          imageIn.close();//关闭文件流
       }
       if(imagePath.toLowerCase().endsWith(".gif"))//不使用编码处理文件流的情况:
      {
    response.setContentType(GIF);
    ServletContext context = getServletContext();//得到背景对象
    InputStream imageIn=context.getResourceAsStream(imagePath);//文件流
         BufferedInputStream bis=new BufferedInputStream(imageIn);//输入缓冲流
    BufferedOutputStream bos=new BufferedOutputStream(output);//输出缓冲流
    byte data[]=new byte[4096];//缓冲字节数
    int size=0; 
    size=bis.read(data);
    while (size!=-1)
    {
       bos.write(data,0,size);
            size=bis.read(data);
    }
    bis.close();
    bos.flush();//清空输出缓冲流
         bos.close();
    }
      output.close();
            
     }
}
    最后是如何调用,你可以简单的映射一下servelt,我就将servet的名映射为
       ShowPic,  于是下代码调用
    <html>
    <body>
    <img src="ShowPic?spec=2"></a>
    </body>
    </html>
        这样图片便显示在htm上了,本人研究java的时间不长,如有问题,尽情指正。[/pre]