亚洲无码高清在线观看,在线观看亚洲免费,www.亚洲日本http://www.tkk7.com/jackstudio/category/12672.htmlzh-cnWed, 28 Feb 2007 03:39:29 GMTWed, 28 Feb 2007 03:39:29 GMT60struts,ajax亂碼解決方案 http://www.tkk7.com/jackstudio/archive/2006/12/10/86629.htmljackstudiojackstudioSat, 09 Dec 2006 18:38:00 GMThttp://www.tkk7.com/jackstudio/archive/2006/12/10/86629.htmlhttp://www.tkk7.com/jackstudio/comments/86629.htmlhttp://www.tkk7.com/jackstudio/archive/2006/12/10/86629.html#Feedback0http://www.tkk7.com/jackstudio/comments/commentRss/86629.htmlhttp://www.tkk7.com/jackstudio/services/trackbacks/86629.html 轉(zhuǎn)載:http://www.tkk7.com/errorfun/archive/2006/12/09/86584.html
作者:errorfun


亂碼問題好像跟我們中國程序員特別有緣,一直困擾著我們,從開始的JSP亂碼問題,STRUTS亂碼問題,到現(xiàn)在的AJAX亂碼問題,無一不是搞得許多程序員焦頭爛額的,整天罵XXX產(chǎn)品對中文支持不了,UTF-8無法使用中文啊什么的,其實這里面被罵的產(chǎn)品中其實99%以上是對中文支持非常好的,而出現(xiàn)亂碼的原因只是因為自身對國際化支持以及文件編碼等信息的認識不知造成的。要知道一個產(chǎn)品那么流行,怎么可能對中文支持不了呢,下面就開始一一幫大家解決這些問題。


1
、編碼
????? --
想要解決好中文問題,對編碼肯定是不能一概不懂了,編碼是解決中文亂碼問題的根本。
???? ?
編碼比較常用的有: UTF-8 GBK GB2312 , ISO-8859-1 ,除了 iso-8859-1 之外的其它三個編碼都能很好的支持中文,但它們都兼容 ISO-8859-1 的編碼(就是說無論編碼怎么改變,只要是 ISO-8859-1 中的字符,永遠不會出現(xiàn)亂碼)。
?????
這四種編碼中, GB2312 是中國規(guī)定的漢字編碼,也可以說是簡體中文的字符集編碼 ; GBK GB2312 的擴展 , 除了兼容 GB2312 外,它還能顯示繁體中文,還有日文的假名 ; UTF-8 雖然也支持中文,但卻 GB 碼不兼容(編碼值不同) 。 UTF-8 使用的是可變長的 UNICODE 編碼,編碼可能是 1 16 進制(即 ISO-8859-1 中的字符,其編碼也是相同的)也有可能是 2 位或 3 位的 16 進制。 UTF-8 的優(yōu)點是: 1 、 CPU 字節(jié)順序無關 , 可以在不同平臺之間交流。 2 、容錯能力高 , 任何一個字節(jié)損壞后 , 最多只會導致一個編碼碼位損失 , 不會鏈鎖錯誤 ( GB 碼錯一個字節(jié)就會整行亂碼 ) ,所以在國際化處理中基本都是建議使用 UTF-8 作為編碼。

2、文件的編碼
????? --雖然說只要設置了正確的編碼就可以使字符正確顯示了,但如果忽略了文件保存時的編碼的話,那可是會讓你走進迷霧中的。
????? 文件編碼最常使用的有兩種:ANSI和UTF-8,光看名字估計你都可以猜到了,ANSI就是我們保存文件時使用的默認編碼,而UTF-8則需自己設置。對于編碼的改變,我使用的工具是NOTEPAD和ECLIPSE,NOTEPAD使用最簡單,只要打開文件后在另存為中選擇相應的編碼就行了,而且它對編碼的支持非常好;而在ECLIPSE中,只要稍微設置一下就行了,打開首選項,然后選擇:常規(guī)->內(nèi)容類型(ContentType),在右邊選中你想改變保存編碼的文件類型,然后在下方的缺省編碼中改變其值,最后點擊更新(UPDATE)按鈕即可。



而在其它的編輯器中,默認保存的內(nèi)容都是GB2312或者GBK(NOTEPAD中對應ANSI).而根據(jù)前面所說的UTF-8和GBK,GB2312等的編碼值是不同的這一點,可以知道,如果文件使用了UTF-8,那么字符編碼就必須使用UTF-8,否則編碼值的不同就可能造成亂碼。而這也就是為什么那么多的人使用了UTF-8編碼后還會產(chǎn)生亂碼的根本原因。(JS和JSP都是這個道理)

3、JSP,STRUTS等的中文亂碼解決方案
?????其實解決的方法只有一個:

?request.setCharacterEncoding(encoding);

???方法只有一種,但處理方式就多種多樣了,初學者會在JSP頁面上直接使用,而有經(jīng)驗的程序員會使用過濾器。而現(xiàn)在所要說的方法也是過濾器。這里以統(tǒng)一使用UTF-8作為編碼作為例子說明。具體過程就不多說了,網(wǎng)上有很多教程。偷懶一點的,到TOMCAT中復制就行了。在TOMCAT的目錄下的\webapps\jsp-examples\WEB-INF\classes\filters\找到SetCharacterEncodingFilter.java 這個類,放到你的程序中并配置好映射路徑。配置好后基本上你的亂碼問題就解決了。但要映射路徑中需要注意的就是不能使用 '*'

?? < filter-mapping >
????
< filter-name > Set?Character?Encoding </ filter-name >
????
< servlet-name > * </ servlet-name >
??
</ filter-mapping >

像上面這樣配置的話(可能也是網(wǎng)上大多教程的做法,想當年也是害苦了我),可能你只有JSP的亂碼解決了,要解決STRUTS的亂碼需要映射 *.do 或者 servletActionName。然后在初始化參數(shù)中設置encoding的值就行了。

< init-param >
??????
< param-name > encoding </ param-name >
??????
< param-value > UTF-8 </ param-value >
</ init-param >

當然,最重要的是要記得根據(jù)前面所說的方法,改變你所使用的編輯器保存文件的編碼要與使用的字符編碼一致。
而在JSP內(nèi)容中,還是使用如網(wǎng)上教程所說的那種技倆,在所有頁面的頁首加入:

<% @?page?language = "java"?contentType = " text / html;?charset = UTF - 8 "
????pageEncoding
= "UTF - 8 " %>

至此,相信JSP,ACTION都不太可能出現(xiàn)亂碼了。

4、資源文件的亂碼解決方案
????? 資源文件誰都知道是國際化支持不可或缺的一部分,如果資源文件都出現(xiàn)亂碼了那還了得?其實資源文件的亂碼是很好解決的,其原因也是因為使用了UTF-8做為JSP編碼后,沒有相應地改變資源文件的文件編碼造成的,所以只要對資源文件保存的編碼進行更正后,亂碼問題也就解決了。當然,你的中文要使用 native2ascii 命令進行正確的轉(zhuǎn)換。

5、調(diào)用JS時,JS內(nèi)容亂碼的解決方案。
???? 其實JS的亂碼還是跟文件的編碼有關系的,如果JS中有中文的話,那JS文件保存的編碼就必須跟調(diào)用此JS的頁面編碼相同,否則,你的所有中文都要從JSP頁面?zhèn)鹘oJS才會顯示正常。可以看出對于調(diào)用JS出現(xiàn)的亂碼是最容易解決的(也是建立在前面的辛苦之下的)。

6、AJAX提交數(shù)據(jù)亂碼,返回數(shù)據(jù)亂碼的解決方案
???? 隨著AJAX的流行,亂碼問題也開始困擾著許多剛開始使用它的程序員,幸好我之前對JSP亂碼有過一點研究,在遇到AJAX后,并沒有給我?guī)矶啻蟮睦_,在此將我的一些心得共享給大家。
???? 萬變不離其宗,AJAX的亂碼問題自然跟編碼有關了,其實很多人跟我一樣想到了對文件編碼進行設置,并且在接數(shù)據(jù)時設置了requet的編碼,在返回的數(shù)據(jù)時設置了response的編碼一切都以為會很順利,可是這一切都是徒勞無功的,討厭的亂碼再一次出現(xiàn)在你眼前。在你試了N多種方法,包括JS自身的escape,unescape方法后,你發(fā)現(xiàn)亂碼仍然猖狂地出現(xiàn)在屏幕上。
??? 其實在試過這N多方法后,很多人都沒發(fā)現(xiàn),解決的方法其實很簡單,而且其答案就在我們之前處理的JSP亂碼之中。讓我們先看一下AJAX的經(jīng)典請求代碼

xmlhttp.open(?"post",?url,?async?);
xmlhttp.setRequestHeader(?
"Content-Type",?"text/html"
?);
xmlhttp.send(?params?);

通過前面的說明,不知道你現(xiàn)在看出端倪了沒有。不知道是受了網(wǎng)上教程的影響還是其它方面影響,setRequestHeader并是萬年不變的,也沒人想過去改它,而問題就正好出在這個地方?;叵胍粋€JSP頁面內(nèi)容的編碼設置,其中有這么一節(jié):
contentType="text/html;?charset=UTF-8"

現(xiàn)在知道問題了吧,所以我們要把第二句代碼改為:
xmlhttp.setRequestHeader(?"Content-Type",?"text/html;charset=UTF-8"?);

最后別忘了在返回數(shù)據(jù)時也設置上:
response.setContentType(?"text/xml"?);
response.setCharacterEncoding(?
"UTF-8"?);

是不是很簡單,一點都不麻煩呢?
如果要問為什么的話,其實我們可以把xmlhttp看成是一個臨時頁面,它由瀏覽器動態(tài)生成,主要作用是在后臺獲得請求的數(shù)據(jù)(可以看成是一個高級的iframe)。所以對于普通頁面設置的編碼,對它也要同樣設置。而在servlet中返回數(shù)據(jù)為什么要設置contentType和encoding其道理也是一樣的。眾所周知,jsp的最后形態(tài)就是servlet,而jsp頁首設置的那個內(nèi)容其實也就是讓生成的servlet中生成這么兩句話:
response.setContentType(?"text/html"?);
response.setCharacterEncoding(?
"UTF-8"?);

而pageEncoding則是跟jvm說明了這個頁面的內(nèi)容要使用什么編碼保存(這跟之后生成的CLASS有關系)。所以在servlet設置response的編碼也是理所當然的了。

一口氣把自己一年以來遇到的亂碼問題和解決的方案寫出來了,希望對你有所幫助。


jackstudio 2006-12-10 02:38 發(fā)表評論
]]>
spring有三種啟動方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.http://www.tkk7.com/jackstudio/archive/2006/11/09/80060.htmljackstudiojackstudioThu, 09 Nov 2006 02:40:00 GMThttp://www.tkk7.com/jackstudio/archive/2006/11/09/80060.htmlhttp://www.tkk7.com/jackstudio/comments/80060.htmlhttp://www.tkk7.com/jackstudio/archive/2006/11/09/80060.html#Feedback0http://www.tkk7.com/jackstudio/comments/commentRss/80060.htmlhttp://www.tkk7.com/jackstudio/services/trackbacks/80060.htmlspring有三種啟動方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.
看一下ContextLoaderListener的源碼,這是一個ServletContextListener
/**
? * Initialize the root web application context.
? */
?public void contextInitialized(ServletContextEvent event) {
? this.contextLoader = createContextLoader();
? this.contextLoader.initWebApplicationContext(event.getServletContext());
?}
?
? /**
? * Create the ContextLoader to use. Can be overridden in subclasses.
? * @return the new ContextLoader
? */
?protected ContextLoader createContextLoader() {
? return new ContextLoader();
?}

?contextLoader的源碼
?public WebApplicationContext initWebApplicationContext(ServletContext servletContext)
?? throws BeansException {

? long startTime = System.currentTimeMillis();
? if (logger.isInfoEnabled()) {
?? logger.info("Root WebApplicationContext: initialization started");
? }
? servletContext.log("Loading Spring root WebApplicationContext");

? try {
?? // Determine parent for root web application context, if any.
?? ApplicationContext parent = loadParentContext(servletContext);

?? WebApplicationContext wac = createWebApplicationContext(servletContext, parent);
?? servletContext.setAttribute(
???? WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);

?? if (logger.isInfoEnabled()) {
??? logger.info("Using context class [" + wac.getClass().getName() +
????? "] for root WebApplicationContext");
?? }
?? if (logger.isDebugEnabled()) {
??? logger.debug("Published root WebApplicationContext [" + wac +
????? "] as ServletContext attribute with name [" +
????? WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]");
?? }

?? if (logger.isInfoEnabled()) {
??? long elapsedTime = System.currentTimeMillis() - startTime;
??? logger.info("Root WebApplicationContext: initialization completed in " + elapsedTime + " ms");
?? }

?? return wac;
? }
? catch (RuntimeException ex) {
?? logger.error("Context initialization failed", ex);
?? servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);
?? throw ex;
? }
? catch (Error err) {
?? logger.error("Context initialization failed", err);
?? servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err);
?? throw err;
? }
?}
?注意WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,這里面放了WebApplicationContext,需要使用時從ServletContext取出
?可以使用WebApplicationContextUtils得到WebApplicationContext
?public static WebApplicationContext getWebApplicationContext(ServletContext sc) {
? Object attr = sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
? if (attr == null) {
?? return null;
? }
? if (attr instanceof RuntimeException) {
?? throw (RuntimeException) attr;
? }
? if (attr instanceof Error) {
?? throw (Error) attr;
? }
? if (!(attr instanceof WebApplicationContext)) {
?? throw new IllegalStateException("Root context attribute is not of type WebApplicationContext: " + attr);
? }
? return (WebApplicationContext) attr;
?}
?關鍵的問題在于struts如何啟動的spring的,ContextLoaderPlugIn的源碼
?
?// Publish the context as a servlet context attribute.
? String attrName = getServletContextAttributeName();
? getServletContext().setAttribute(attrName, wac);
?
?public String getServletContextAttributeName() {
? return SERVLET_CONTEXT_PREFIX + getModulePrefix();
?}
?不同加載的Key竟然不同,原因就是WebApplicationContext放在那里的問題,可spring調(diào)用的時候會根據(jù)WebApplicationContext里面定義的那個名字去找的,問題出在這里


?在struts-config.xml中配置
??? <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
????? <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
??? </plug-in>

??? <controller>
??????? <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor" />
??? </controller>


?原理是這樣的,Struts雖然只能有一個ActionServlet實例,但是對于不同的子應用分別能有自己的RequestProcessor實例每個RequestProcessor實例分別對應不同的struts配置文件。
?? 子應用的ProcessorClass類必須重寫一般就是繼承RequestProcessor類,然后再其配置文件的controller元素中的<processorClass>屬性中作出修改。那么當
? getRequestProcessor(getModuleConfig(request)).process(request,response);就能根據(jù)request選擇相應的moduleconfig,再根據(jù)其<processorClass>屬性選擇相應的RequestProcessor子類來處理相應的請求了。

?



jackstudio 2006-11-09 10:40 發(fā)表評論
]]>
使用ServletContextListener在服務器啟動和關閉時創(chuàng)建和關閉緩存http://www.tkk7.com/jackstudio/archive/2006/11/09/80058.htmljackstudiojackstudioThu, 09 Nov 2006 02:39:00 GMThttp://www.tkk7.com/jackstudio/archive/2006/11/09/80058.htmlhttp://www.tkk7.com/jackstudio/comments/80058.htmlhttp://www.tkk7.com/jackstudio/archive/2006/11/09/80058.html#Feedback0http://www.tkk7.com/jackstudio/comments/commentRss/80058.htmlhttp://www.tkk7.com/jackstudio/services/trackbacks/80058.html

ServletContext 被 Servlet 程序用來與 Web 容器通信。例如寫日志,轉(zhuǎn)發(fā)請求。每一個 Web 應用程序含有一個Context,被Web應用內(nèi)的各個程序共享。因為Context可以用來保存資源并且共享,所以我所知道的 ServletContext 的最大應用是Web緩存----把不經(jīng)常更改的內(nèi)容讀入內(nèi)存,所以服務器響應請求的時候就不需要進行慢速的磁盤I/O了。

ServletContext 被 Servlet 程序用來與 Web 容器通信。例如寫日志,轉(zhuǎn)發(fā)請求。每一個 Web 應用程序含有一個Context,被Web應用內(nèi)的各個程序共享。因為Context可以用來保存資源并且共享,所以我所知道的 ServletContext 的最大應用是Web緩存----把不經(jīng)常更改的內(nèi)容讀入內(nèi)存,所以服務器響應請求的時候就不需要進行慢速的磁盤I/O了。

ServletContextListener 是 ServletContext 的監(jiān)聽者,如果 ServletContext 發(fā)生變化,如服務器啟動時 ServletContext 被創(chuàng)建,服務器關閉時 ServletContext 將要被銷毀。

在JSP文件中,application 是 ServletContext 的實例,由JSP容器默認創(chuàng)建。Servlet 中調(diào)用 getServletContext()方法得到 ServletContext 的實例。

我們使用緩存的思路大概是:

  1. 服務器啟動時,ServletContextListener 的 contextInitialized()方法被調(diào)用,所以在里面創(chuàng)建好緩存??梢詮奈募谢蛘邚臄?shù)據(jù)庫中讀取取緩存內(nèi)容生成類,用 ervletContext.setAttribute()方法將緩存類保存在 ServletContext 的實例中。

  2. 程序使用 ServletContext.getAttribute()讀取緩存。如果是 JSP,使用a pplication.getAttribute()。如果是 Servlet,使用 getServletContext().getAttribute()。如果緩存發(fā)生變化(如訪問計數(shù)),你可以同時更改緩存和文件/數(shù)據(jù)庫。或者你等 變化積累到一定程序再保存,也可以在下一步保存。

  3. 服務器將要關閉時,ServletContextListener 的 contextDestroyed()方法被調(diào)用,所以在里面保存緩存的更改。將更改后的緩存保存回文件或者數(shù)據(jù)庫,更新原來的內(nèi)容。

import User; //my own class
import DatabaseManager; // my own class
import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;

public class MyContextListener

implements ServletContextListener {
private ServletContext context = null;

public void contextInitialized(ServletContextEvent event) {
context = event.getServletContext();
User user = DatabaseManager.getUserById(1);
context.setAttribute("user1", user);
}

public void contextDestroyed(ServletContextEvent event) {
User user = (User)context.getAttribute("user1");
DatabaseManager.updateUserData(user);
this.context = null;
}
}

布署 ServletContextListener

你實現(xiàn)(implements)了 ServletContextListener 編譯后,把它放在正確的WEB-INF/classes目錄下,更改WEB-INF目錄下的 web.xml文件,在web-app節(jié)點里添加

<listener>
<listener-class>MyServletContextListener</listener-class>
</listener>
?來自:


jackstudio 2006-11-09 10:39 發(fā)表評論
]]>
關于Spring , Struts結合學習http://www.tkk7.com/jackstudio/archive/2006/09/21/71106.htmljackstudiojackstudioThu, 21 Sep 2006 07:04:00 GMThttp://www.tkk7.com/jackstudio/archive/2006/09/21/71106.htmlhttp://www.tkk7.com/jackstudio/comments/71106.htmlhttp://www.tkk7.com/jackstudio/archive/2006/09/21/71106.html#Feedback0http://www.tkk7.com/jackstudio/comments/commentRss/71106.htmlhttp://www.tkk7.com/jackstudio/services/trackbacks/71106.html閱讀全文

jackstudio 2006-09-21 15:04 發(fā)表評論
]]>
主站蜘蛛池模板: 最近最好的中文字幕2019免费 | 蜜臀AV免费一区二区三区| avtt天堂网手机版亚洲| 免费国产a国产片高清网站| a级毛片毛片免费观看久潮喷| 亚洲国产成人超福利久久精品| 日本v片免费一区二区三区| 99精品免费视品| 亚洲一区二区三区在线观看网站 | 日本免费一区二区三区| 亚洲欧美成人一区二区三区| 亚洲精品无码成人片久久| 成人免费福利电影| 女人体1963午夜免费视频| 男女猛烈无遮掩视频免费软件| 亚洲国产成人精品电影| 亚洲精品蜜桃久久久久久| 国产精品久久久久影院免费| 91av在线免费视频| 免费国产99久久久香蕉| 一区二区免费在线观看| 亚洲免费福利在线视频| 亚洲天堂一区二区三区| 亚洲色大成网站WWW久久九九| 麻豆精品国产免费观看| 亚洲一级免费毛片| 国产性生大片免费观看性| 精品免费AV一区二区三区| 亚洲人成毛片线播放| 亚洲AV综合色区无码另类小说| 国产一区二区免费在线| 麻豆国产VA免费精品高清在线| 麻豆一区二区免费播放网站| 5555在线播放免费播放| 免费A级毛片无码A∨| 1000部拍拍拍18勿入免费视频下载 | 国产成人高清精品免费软件| 免费黄色app网站| 日本一区免费电影| 亚洲黄黄黄网站在线观看| www.亚洲色图.com|