圖片名字是中文的解決方案
馬克-to-win:馬克 java社區(qū):防盜版實名手機尾號: 73203。
當我寫到本章第七節(jié)(jsp一些其它相關話題)的時候,我有一個話題就是解決jsp下面的所有的中文的問題。但當圖片名字是中文的時候,怎么都顯示不出來圖片。上網(wǎng)查了很長時間,也都沒有理想的解決方案。有的說改變服務器的設置,有的說把圖片的中文名字改成數(shù)字名字,之后把相關的信息存在數(shù)據(jù)庫當中。有一個人建議用html的img標簽指向Servlet。這個技術我早就知道,但是用在這里,這個想法還真是富有啟發(fā)性。不過在那個人的例子里,中文圖片名是硬編碼進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");
}
}
運行輸出結果: