揭秘5種JSP頁(yè)面顯示為亂碼的解決方法_JSP教程
教程Tag:暫無Tag,歡迎添加,賺取U幣!
推薦:解密21種Java開發(fā)中應(yīng)避免的錯(cuò)誤新手在Java開發(fā)中經(jīng)常犯各種錯(cuò)誤,筆者就吃過不少苦頭,現(xiàn)從網(wǎng)上收集整理了常見 應(yīng)避免的一些錯(cuò)誤,希望 對(duì)大家有所幫助。 1.DuplicatedCode 代碼重復(fù)幾乎是最常見的異味了。他也是Refactoring的主要目標(biāo)之一。代碼重復(fù)往往來自于copy-and-paste的編程風(fēng)格。
JSP編程中網(wǎng)頁(yè)顯示出現(xiàn)亂碼的情況,基本可以歸為5類:1. JSP頁(yè)面顯示亂碼。
2. Servlet接收Form/Request傳遞的參數(shù)時(shí)顯示為亂碼
3. JSP接收Form/Request傳遞的參數(shù)時(shí)顯示為亂碼
4. 用<jsp:forward page="catalog2.html"></jsp:forward>時(shí)頁(yè)面顯示亂碼
5. 數(shù)據(jù)庫(kù)存取的時(shí)候產(chǎn)生亂碼。
下面給出全部解決方法:
1. JSP頁(yè)面顯示亂碼。
第一種為在頁(yè)面的開頭加上:
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
<!--這里的 GBK可以由 gb2312代替,此處以GBK為例。下同 -->
注:有時(shí)候如果不再頁(yè)面開頭加上這句,則頁(yè)面中無法保存中文字符,并提示:中文字符在不能被iso-8859-1字符集mapped,這是由于默認(rèn)情況下,JSP是用iso-8859-1來編碼的,可以在Window->Preferences->General->Content Type選項(xiàng)下,在右邊的窗口選擇Text->Jsp,然后在下面的Default Encoding由默認(rèn)的iso-8859-1改為GBK,然后點(diǎn)擊update即可解決。
然而這種方式會(huì)帶來一些問題:由于這一句在其他文件include該文件的時(shí)候不能被繼承,所以include它的文件也需要在文件開頭加上這句話,此時(shí)如果用的是pageEncoding="gbk"則會(huì)出現(xiàn)問題。類似于org.apache.jasper.JasperException: /top.jsp(1,1) Page directive: illegal to have multiple occurrences of contentType with different values (old: text/html;charset=GBK, new: text/html;charset=gbk).
類似地,如果兩個(gè)文件一個(gè)用的是gbk,一個(gè)用的是gb2312也會(huì)出現(xiàn)問題。
另一種更好的解決方式為:
在項(xiàng)目的web.xml中添加以下片段:
| <!-- 下面的代碼為解決頁(yè)面亂碼問題而加入 --> <jsp-config> <jsp-property-group> <description> Special property group for JSP Configuration JSP example. </description> <display-name>JSPConfiguration</display-name> <url-pattern>*.jsp</url-pattern> <el-ignored>true</el-ignored> <page-encoding>GBK</page-encoding> <scripting-invalid>false</scripting-invalid> <include-prelude></include-prelude> <include-coda></include-coda> </jsp-property-group> <jsp-property-group> <description> Special property group for JSP Configuration JSP example. </description> <display-name>JSPConfiguration</display-name> <url-pattern>*.html</url-pattern> <el-ignored>true</el-ignored> <page-encoding>GBK</page-encoding> <scripting-invalid>false</scripting-invalid> <include-prelude></include-prelude> <include-coda></include-coda> </jsp-property-group> </jsp-config> <!-- 添加的代碼結(jié)束 --> |
2. Servlet接收Form/Request傳遞的參數(shù)時(shí)顯示為亂碼的解決方式:
第一種解決方式為在用到request方法的前面加上這條語(yǔ)句:
request.setCharacterEncoding("GBK");
同樣地,這也會(huì)由于頁(yè)面設(shè)置中GbK或gB2312大小寫不同或者采用不同的漢語(yǔ)字符集而發(fā)生錯(cuò)誤。
另一種更好的解決方式為:添加一個(gè)名為SetCharacterEncodingFilter的filter。
filter的源文件為(參見apach安裝目錄下\webapps\jsp-examples\WEB-INF\classes\filters中的SetCharacterEncodingFilter.java文件):
| package com.filters;import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.UnavailableException; public class SetCharacterEncodingFilter implements Filter { protected String encoding = null; protected FilterConfig filterConfig = null; protected boolean ignore = true; public void destroy() { this.encoding = null; this.filterConfig = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Conditionally select and set the character encoding to be used if (ignore || (request.getCharacterEncoding() == null)) { String encoding = selectEncoding(request); if (encoding != null) request.setCharacterEncoding(encoding); } // Pass control on to the next filter chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding"); String value = filterConfig.getInitParameter("ignore"); if (value == null) this.ignore = true; else if (value.equalsIgnoreCase("true")) this.ignore = true; else if (value.equalsIgnoreCase("yes")) this.ignore = true; else this.ignore = false; } protected String selectEncoding(ServletRequest request) { return (this.encoding); } } |
同時(shí)在web.xml中添加一下片段:
| <!-- 為解決亂碼問題而添加 --> <filter> <filter-name>SetCharacterEncoding</filter-name> <filter-class>com.filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>SetCharacterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 添加代碼結(jié)束 --> |
當(dāng)我們按照第二種亂碼的解決方式修改了web.xml并添加了filter之后,有時(shí)候并不一定就對(duì)亂碼問題高枕無憂了,有時(shí)候我們會(huì)奇怪的發(fā)現(xiàn)Sevlet接收Form/Request傳遞的參數(shù)可以正常顯示了,但是jsp頁(yè)面接受Form/Request傳遞的參數(shù)卻仍然顯示為亂碼。這是為什么呢?
對(duì)于我遇到的情況而言,我發(fā)現(xiàn)是由于我在用Form發(fā)送信息的頁(yè)面采用了這樣的html:
<form action="getParam.jsp" >
姓名<input type="text" name ="UserName"> <br>
選出你喜歡吃的水果:
<input type ="checkbox" name = "checkbox1" value = "蘋果"> 蘋果
<input type ="checkbox" name = "checkbox1" value = "西瓜"> 西瓜
<input type ="checkbox" name = "checkbox1" value = "桃子"> 桃子
<input type ="checkbox" name = "checkbox1" value = "葡萄"> 葡萄
<input type = "submit" value = "提交">
</form>
也就是說沒有指定form的method屬性。而問題就發(fā)生在此,F(xiàn)orm的默認(rèn)mothod屬性為get.
而get是通過在發(fā)送請(qǐng)求的url后面加?然后加參數(shù)和值來傳遞數(shù)據(jù)的的,編碼格式為ASCII.這就要求我們?cè)趥鬟f的數(shù)據(jù)中有非ASCII字符或是超過了100個(gè)字符,那么你必須使用method="post",否則就會(huì)出現(xiàn)亂碼。
所以解決方式為:第二種亂碼的解決方式+在發(fā)送頁(yè)面的Form中指定method為post.
4. 用<jsp:forward page="catalog2.html"></jsp:forward>時(shí)頁(yè)面顯示亂碼的解決方式
此時(shí)實(shí)際上亂碼的原因和產(chǎn)生其他幾種亂碼的原因不同,它的原因在于我們用eclipse編輯要forward的html或者jsp文件時(shí),采用的編碼是可以產(chǎn)生中文亂碼的編碼而不是GBK或者GB2312.所以解決方式就是把eclipse編輯器的編碼方式改為GBK或者GB2312.
具體操作方式見:上文紅色字體部分。
5. 數(shù)據(jù)庫(kù)存取的時(shí)候產(chǎn)生亂碼的解決方式
當(dāng)然,在寫數(shù)據(jù)庫(kù)時(shí),也要保正數(shù)據(jù)庫(kù)的編碼與其它一致:
我們可以在系統(tǒng)盤windows目錄下的my.ini文件,在文件中插入一行default-character-set=GBK,但上面說了這么多,大家也應(yīng)該明白些了吧,改動(dòng)太多的默認(rèn)設(shè)置不是我的風(fēng)格,因此上,這一行還是不要加的好。
但不管怎么樣,我們還是要?jiǎng)?chuàng)建一個(gè)基于中文編碼的數(shù)據(jù)庫(kù),當(dāng)然,用客戶端登錄的時(shí)候,某些客戶用自動(dòng)把字體編碼轉(zhuǎn)換成中文編碼。在這里,我想說一下在DOS下創(chuàng)建中文編碼數(shù)據(jù)庫(kù)的方法:
在進(jìn)入數(shù)據(jù)庫(kù)的時(shí)候,用mysql --default-character-set=gbk -u root -p 這句話進(jìn)入mysql,然后創(chuàng)建數(shù)據(jù)庫(kù),如:create database admin;這樣創(chuàng)建起來的數(shù)據(jù)庫(kù)就是基于中文編碼的了。
用連接數(shù)據(jù)庫(kù)的時(shí)候,讀出的數(shù)據(jù)也可能是亂碼,解決這個(gè)問題的方法非常簡(jiǎn)單,只要在你建立數(shù)據(jù)庫(kù)連接的時(shí)候把URL設(shè)置成下面這個(gè)樣子就可以了:URL= jdbc:mysql://localhost:3306/my_database?useUnicode=true&characterEncoding=GBK
最后總結(jié),把各種地方的編碼統(tǒng)一起來,所在的亂碼問題就都解決了。
分享:揭秘學(xué)習(xí)Java必須了解的30個(gè)基本概念Java 的學(xué)習(xí)是比較復(fù)雜的,主要表現(xiàn)在相關(guān)的一系列平臺(tái)、規(guī)范和協(xié)議上,本文從初學(xué)者的角度總結(jié)了30條基本的概念,以便大家在以后的學(xué)習(xí)過程中更好的理解java的精髓。 Java概述: Java的白皮書為我們提出了Java語(yǔ)言的11個(gè)關(guān)鍵特性。 (1)Easy:Java的語(yǔ)法比C++
相關(guān)JSP教程:
- jsp response.sendRedirect不跳轉(zhuǎn)的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復(fù)習(xí)整理
- JSP腳本元素和注釋復(fù)習(xí)總結(jié)示例
- JSP FusionCharts Free顯示圖表 具體實(shí)現(xiàn)
- 網(wǎng)頁(yè)模板:關(guān)于jsp頁(yè)面使用jstl的異常分析
- JSP頁(yè)面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項(xiàng)目中連接Access數(shù)據(jù)庫(kù)的配置方法
- JDBC連接Access數(shù)據(jù)庫(kù)的幾種方式介紹
- 網(wǎng)站圖片路徑的問題:絕對(duì)路徑/虛擬路徑
- (jsp/html)網(wǎng)頁(yè)上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對(duì)路徑下的圖片解決方法
JSP教程Rss訂閱編程教程搜索
JSP教程推薦
猜你也喜歡看這些
- jsp 自定義分頁(yè)標(biāo)簽
- JSP頁(yè)面自動(dòng)生成html頁(yè)面或任何格式頁(yè)面
- JSP由淺入深7—— JSP Directives
- CNET JSP BASICJSP與JavaBean
- JSP處理異常及一些高級(jí)主題
- 揭秘幾個(gè)提升JSP應(yīng)用程序效率的小方法
- JSP由淺入深11—— 標(biāo)記庫(kù)
- 詳細(xì)講解Linux系統(tǒng)下JDK、Tomcat的安裝
- JSP實(shí)例程序統(tǒng)計(jì)當(dāng)前在線人數(shù)
- JSP將動(dòng)態(tài)頁(yè)面轉(zhuǎn)換為靜態(tài)頁(yè)面
- 相關(guān)鏈接:
- 教程說明:
JSP教程-揭秘5種JSP頁(yè)面顯示為亂碼的解決方法
。