图片名字是中文的解决方案

马克-to-win:马克 java社区:防盗版实名手机尾号: 73203。
当我写到本章第七节(jsp一些其它相关话题)的时候,我有一个话题就是解决jsp下面的所有的中文的问题。但当图片名字是中文的时候,怎么都显示不出来图片。上网查了很长时间,也都没有理想的解决方案。有的说改变服务器的设置,有的说把图片的中文名字改成数字名字,之后把相关的信息存在数据库当中。有一个人建议用html的img标签指向Servlet。这个技术我早就知道,但是用在这里,这个想法还真是富有启发性。不过在那个人的例子里,中文图片名是硬编码进Servlet去的,没有实际的意义。我也就没太在意这件事。这次回来写这部分知识,还真是仔细想了想。马克-to-win:底下我这个例子的思路是:当我运行html的时候,这个html的img能够调用servlet,这是大家都知道的技术。最关键的是 Servlet可以知道是谁在调用它。这个就用Referer技术。知道了哪个html调用它以后,反过来这个Servlet可以读出这个html文件,解析它,找到img标签儿。再找到中文图片名称,Servlet读出这个图片文件,传送给html,让它显示出来就可以了。


例:4.4.2

chinesePicture.jsp:

<%@ page contentType="text/html; charset=GBK"%>
正常的中文图片应该显示不了    <img src="我们.jpg" />
<br>然而,下面的方法可以显示中文图片:
<img id="code" src="MarkToWinServlet" alt="马克.jpg"/>



ServletHello1.java:

package com;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletHello1 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) {      
        String referer = request.getHeader("Referer");
        System.out.println(referer);
        int befoPosiRef = referer.lastIndexOf("/")+1;
        String refererFile = referer.substring(befoPosiRef, referer.length());
        System.out.println("refererFile is" + refererFile);
        String ImageFi = null;
        String stdinS = null;
        ServletContext ctx = getServletContext();
        InputStream isjsp = ctx.getResourceAsStream(refererFile);
        BufferedReader stdin = new BufferedReader(new InputStreamReader(isjsp));
        for (int i = 0; i < 13; i++) {
            try {
                stdinS = stdin.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (stdinS == null)
                break;// 文件结尾
            if (stdinS.indexOf("<img") != -1) {
                if (stdinS.indexOf("alt=\"") != -1) {
                    int befoPosi = stdinS.indexOf("alt=\"") + 5;
                    int endPosi = stdinS.lastIndexOf("\"");
                    ImageFi = stdinS.substring(befoPosi, endPosi);
                    System.out.println("ImageFi is" + ImageFi);
                }
            }
            System.out.println(stdinS);
        }
        response.setContentType("image/jpeg");

        /* 图片在WebModule的根目录下 */
        InputStream is = ctx.getResourceAsStream(ImageFi);
        try {
            int len = is.available();
            // response.setContentLength(len);
            ServletOutputStream out;
            out = response.getOutputStream();
            byte[] in = new byte[4096];
            int i = 0;
            while ((i = is.read(in)) != -1) {
                out.write(in, 0, i);
            }
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("finish");
    }
}

运行输出结果: