国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JSP > 正文

如何避免JSP亂碼

2019-11-15 00:03:38
字體:
供稿:網(wǎng)友
如何避免jsp亂碼如何解決javaWeb亂碼問題

作為一個合格的web開發(fā)人員應(yīng)該是什么問題都遇到過的,尤其是亂碼問題。大家也許都體會到了,我們中國人學(xué)編程,很大的一個不便就是程序的編碼問題,無論學(xué)習(xí)什么技術(shù),我們都需要探討他的編碼問題。

今天來講一下關(guān)于解決javaweb亂碼出現(xiàn)的原因與解決辦法,歡迎大家交流指正。

首先,先明確兩個問題,為什么會出現(xiàn)亂碼?我們在編寫web應(yīng)用時(shí)什么時(shí)候會出現(xiàn)亂碼?

第一個問題:很多初學(xué)者會發(fā)現(xiàn),我們在自己的客戶機(jī)上編寫的web應(yīng)用程序時(shí),明明是正常的漢字,但是發(fā)布到服務(wù)器上訪問的時(shí)候?yàn)g覽器就會看到亂碼。

出現(xiàn)這種問題的原因是:通常中文windows系統(tǒng)中系統(tǒng)默認(rèn)的編碼是GBK(大家可以進(jìn)入DOS窗口下,輸入chcp進(jìn)行查詢),而我們編寫web應(yīng)用時(shí),myeclipse默認(rèn)的編碼通常是iso8859-1,瀏覽器也會有自己的編碼選擇。。。這么多地方使用的不同編碼,如果兩個編碼不對口,當(dāng)然就會出現(xiàn)亂碼。

第二個問題:出現(xiàn)亂碼的地方可以歸結(jié)為三類:1.基本jsp頁面顯示亂碼,2.表單提交亂碼,3.數(shù)據(jù)庫亂碼

下面為大家依次講解:

1.基本jsp頁面顯示亂碼

這種情況比較簡一般只有初學(xué)者會出現(xiàn),原因是因?yàn)閖sp頁面保存,轉(zhuǎn)換時(shí)的編碼與瀏覽器解析的編碼不一樣。這里涉及到三個解決方案

1).<%@pagelanguage="java"pageEncoding="UTF-8"%> 我們都知道,jsp就是servlet,jsp會轉(zhuǎn)換成servlet之后轉(zhuǎn)換為相關(guān)的java代碼再發(fā)給客戶端。

那么jsp中就需要有語句可以控制jsp是以什么編碼轉(zhuǎn)換為servlet的。上述編碼就是控制,jsp以UTF-8的編碼方式保存,也就是說以UTF-8的編碼方式轉(zhuǎn)換成servlet。

2).<%@pagecontentType="text/html;charset=UTF-8"%> 熟悉HTTP協(xié)議的朋友都不陌生這一句代碼,charset="UTF-8",就是設(shè)置響應(yīng)頭編碼方式為UTF-8。

3).<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"> 同上一句代碼,只不過這一句使用HTML控制瀏覽器解析方式。

示例:

我們在一個簡單的jsp頁面中寫下這樣的代碼,頁面中有漢字,卻默認(rèn)pageEncoding="iso8859-1"

復(fù)制代碼
<%@ page language="java" import="java.util.*" pageEncoding="iso8859-1"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>My JSP 'index.jsp' starting page</title>  </head>  <body>        <form action="encoding.jsp" method="get">            username:<input type="text" name="name" /><br>            性別:<input type="text" name="sex" /><br>            <input type="submit" value="submit" />        </form>  </body></html>
復(fù)制代碼

頁面顯示:

HTTP報(bào)文請求頭:

大家只要按照上述修改響應(yīng)時(shí)的默認(rèn)編碼即可。

2.表單提交亂碼

我們在使用表單提交中文時(shí)也會出現(xiàn)亂碼,原因就是Tomcat服務(wù)器內(nèi)部編碼默認(rèn)是iso8859-1,Tomcat會以編碼的缺省方式利用iso8859-1來解析中文。

表單get方式提交時(shí),服務(wù)器會用默認(rèn)的編碼對提交的數(shù)據(jù)進(jìn)行解析,并添加到url后面?zhèn)鞯较乱粋€頁面。

解決方法:在Tomcat 服務(wù)器的server.xml文件中進(jìn)行配置,在Connector節(jié)點(diǎn)中加入useBodyEncodingForURI="true" URIEncoding=”UTF-8”,這樣接收頁面就會利用UTF-8進(jìn)行解碼了。

表單post方式提交時(shí),提交的數(shù)據(jù)不再加入到url中,我們可以在web應(yīng)用中添加一個servlet過濾器來設(shè)置編碼統(tǒng)一(servlet過濾器會在訪問設(shè)置的相關(guān)url之前執(zhí)行)。

過濾器相關(guān)代碼:

復(fù)制代碼
public class ConvertEncoding implements Filter {    PRivate String encoding;    @Override    public void destroy() {    }    @Override    public void doFilter(ServletRequest req, ServletResponse resp,            FilterChain chain) throws IOException, ServletException {        req.setCharacterEncoding(encoding);//設(shè)置請求編碼        resp.setContentType("text/html;charset="+encoding);//設(shè)置響應(yīng)編碼        chain.doFilter(req,resp);    }    @Override    public void init(FilterConfig config) throws ServletException {        this.encoding = config.getInitParameter("encoding");//讀取默認(rèn)編碼    }}
復(fù)制代碼

相關(guān)配置web.xml:

復(fù)制代碼
<filter>        <filter-name>Encoding</filter-name>        <filter-class>Filters.ConvertEncoding</filter-class>        <init-param>            <param-name>encoding</param-name>            <param-value>UTF-8</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>Encoding</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>
復(fù)制代碼

這樣我們會發(fā)現(xiàn)即使是post方式提交的數(shù)據(jù),也不會出現(xiàn)亂碼情況。、

3.數(shù)據(jù)庫亂碼

對于大多數(shù)數(shù)據(jù)庫的JDBC驅(qū)動程序,在Java程序和數(shù)據(jù)庫之間傳遞數(shù)據(jù)都是以ISO8859-1為默認(rèn)編碼格式,所以,在程序中向數(shù)據(jù)庫存儲包含中 文的數(shù)據(jù)時(shí),驅(qū)動程序受限把程序內(nèi)部Unicode編碼格式的數(shù)據(jù)轉(zhuǎn)換為ISO8859-1編碼,然后傳遞到數(shù)據(jù)庫中,如果要解決數(shù)據(jù)庫亂碼問題,最簡單的就是更改數(shù)據(jù)庫默認(rèn)編碼格式。

后記:

關(guān)于UTF-8編碼:UTF-8編碼在寫的時(shí)候要規(guī)范一律寫為大寫(在MySQL數(shù)據(jù)庫中需要使用別名utf8)。編碼的書寫格式在windows下一律是部分大小寫的,但是有的ide是嚴(yán)格區(qū)分大小寫的,有些朋友可能遇見過ide告訴你 utf-8和UTF-8 不一樣的情況,說起來感覺很費(fèi)解,編碼格式的解析是分大小寫的,所以大家在寫編碼時(shí)一定要規(guī)范來寫。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 东辽县| 灵武市| 金沙县| 安阳市| 杭锦旗| 当涂县| 凉山| 收藏| 泽库县| 九江市| 巴青县| 怀集县| 鹤庆县| 任丘市| 东光县| 凉山| 荥经县| 台东市| 通江县| 丽江市| 郧西县| 南宁市| 突泉县| 阿拉善左旗| 长兴县| 申扎县| 武宁县| 芜湖县| 尖扎县| 桐城市| 永福县| 桓台县| 广河县| 前郭尔| 中宁县| 公主岭市| 普兰店市| 六安市| 雷山县| 石柱| 禹州市|