![JSP亂碼解決思路總結(jié).docx_第1頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/9/6ce39cac-3a2d-4856-a6d3-2e9ae04ca45a/6ce39cac-3a2d-4856-a6d3-2e9ae04ca45a1.gif)
![JSP亂碼解決思路總結(jié).docx_第2頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/9/6ce39cac-3a2d-4856-a6d3-2e9ae04ca45a/6ce39cac-3a2d-4856-a6d3-2e9ae04ca45a2.gif)
![JSP亂碼解決思路總結(jié).docx_第3頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/9/6ce39cac-3a2d-4856-a6d3-2e9ae04ca45a/6ce39cac-3a2d-4856-a6d3-2e9ae04ca45a3.gif)
![JSP亂碼解決思路總結(jié).docx_第4頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/9/6ce39cac-3a2d-4856-a6d3-2e9ae04ca45a/6ce39cac-3a2d-4856-a6d3-2e9ae04ca45a4.gif)
![JSP亂碼解決思路總結(jié).docx_第5頁(yè)](http://file.renrendoc.com/FileRoot1/2020-1/9/6ce39cac-3a2d-4856-a6d3-2e9ae04ca45a/6ce39cac-3a2d-4856-a6d3-2e9ae04ca45a5.gif)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
JSP亂碼解決思路總結(jié)JAVA學(xué)習(xí) 2009-10-24 08:55:47 閱讀127 評(píng)論0 字號(hào):大中小訂閱 對(duì)于Java由于默認(rèn)的編碼方式是 UNICODE,所以用中文也易出問(wèn)題,常見(jiàn)的解決是String s2 = new String(s1.getBytes(ISO-8859-1),GBK);前三種方法是我比較常用的方法,別人的經(jīng)驗(yàn)告訴我:通常get方法通過(guò)改server.xml解決,post方法通過(guò)過(guò)濾器或者設(shè)置字符集解決,呵呵,不知道是否可行!1、utf8解決JSP中文亂碼問(wèn)題一般說(shuō)來(lái)在每個(gè)頁(yè)面的開(kāi)始處,加入:% page language=java contentType=text/html; charset=UTF-8pageEncoding=UTF-8%request.setCharacterEncoding(UTF-8);%charset=UTF-8 的作用是指定JSP向客戶(hù)端輸出的編碼方式為UTF-8pageEncoding=UTF-8 為了讓JSP引擎能正確地解碼含有中文字符的JSP頁(yè)面,這在LINUX中很有效request.setCharacterEncoding(UTF-8); 是對(duì)請(qǐng)求進(jìn)行了中文編碼有時(shí),這樣仍不能解決問(wèn)題,還需要這樣處理一下:String msg = request.getParameter(message);String str=new String(msg.getBytes(ISO-8859-1),UTF-8);out.println(st);2、Tomcat 5.5 中文亂碼(利用tomcat已經(jīng)寫(xiě)好的字符集過(guò)濾器)1)只要把%TOMCAT安裝目錄%/ webappsservlets-examplesWEB-INFclassesfiltersSetCharacterEncodingFilter.class 文件拷到你的webapp目錄/filters下,如果沒(méi)有filters目錄,就創(chuàng)建一個(gè)。2)在你的web.xml里加入如下幾行:filterfilter-nameSet Character Encoding/filter-namefilter-classfilters.SetCharacterEncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueGBK/param-value/init-param/filterfilter-mappingfilter-nameSet Character Encoding/filter-nameurl-pattern/*/url-pattern/filter-mapping3、 get方式的解決辦法(修改tomcat server.xml,但是不建議使用的說(shuō))1) 打開(kāi)tomcat的server.xml文件,找到區(qū)塊,加入如下一行:URIEncoding=GBK完整的應(yīng)如下:Connectorport=80 maxThreads=150 minSpareThreads=25 maxSpareThreads=75enableLookups=false redirectPort=8443 acceptCount=100debug=0 connectionTimeout=20000disableUploadTimeout=trueURIEncoding=GBK/4、xmlHttpRequest中文問(wèn)題頁(yè)面jsp用的GBK編碼% page contentType=text/html; charset=GBK%javascript部分function addFracasReport() var url=controler?actionId=0_06_03_01&actionFlag=0010;var urlmsg=&reportId=+fracasReport1.textReportId.value; /故障報(bào)告表編號(hào)var xmlHttp=Common.createXMLHttpRequest();xmlHttp.onreadystatechange = Common.getReadyStateHandler(xmlHttp, eval(turnAnalyPage);xmlHttp.open(POST,url,true);xmlHttp.setRequestHeader( Content-Type , application/x-www-form-urlencoded);xmlHttp.send(urlmsg);后臺(tái)java中獲得的reportId是亂碼,不知道該怎么轉(zhuǎn),主要是不知道xmlHttp.send(urlmsg); 以后是什么編碼?在后面用java來(lái)轉(zhuǎn),試了幾種,都沒(méi)有成功,其中有:public static String UTF_8ToGBK(String str) try return new String(str.getBytes(UTF-8), GBK); catch (Exception ex) return null;public static String UTF8ToGBK(String str) try return new String(str.getBytes(UTF-16BE), GBK); catch (Exception ex) return null;public static String GBK(String str) try return new String(str.getBytes(GBK),GBK); catch (Exception ex) return null;public static String getStr(String str) try String temp_p = str;String temp = new String(temp_p.getBytes(ISO8859_1), GBK);temp = sqlStrchop(temp);return temp; catch (Exception e) return null;5、Solaris下Servlet編程的中文問(wèn)題及解決辦法在使用Java開(kāi)發(fā)Internet上的一個(gè)應(yīng)用系統(tǒng)時(shí),發(fā)現(xiàn)在Windows下調(diào)試完全正常的Servlet,上傳到Solaris 服務(wù)器上,運(yùn)行卻出現(xiàn)故障-返回的網(wǎng)頁(yè)不能顯示中文,應(yīng)為中文的信息全為亂碼;用中文信息做關(guān)鍵字,不能正確檢索數(shù)據(jù)庫(kù)。后來(lái)采用加入檢查代碼等方法探知故障原因如下:顯示亂碼主要是因?yàn)橥ㄟ^(guò)類(lèi) HttpServletResponse提供的方法setContentType 無(wú)法改變返回給客戶(hù)的數(shù)據(jù)的編碼方式,正確的編碼方式應(yīng)為GB2312或者GBK,而事實(shí)上為缺省的ISO8859-1。無(wú)法檢索中文信息則是因?yàn)?,客?hù)提交的中文信息經(jīng)瀏覽器編碼到達(dá)服務(wù)器后,Servlet無(wú)法將其正確解碼。舉例說(shuō)明顯示亂碼解決方法Servlet 一般通常做法如下:public class ZldTestServlet extends HttpServlet public void doGet (HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException/在使用 Writer向?yàn)g覽器返回?cái)?shù)據(jù)前,設(shè)置 content-type header ,在這里設(shè)置相應(yīng)的字符集gb2312response.setContentType(text/html; charset=gb2312);PrintWriter out = response.getWriter(); /*/ 正式返回?cái)?shù)據(jù)out.println(htmlheadtitleServlet test/title/head );out.println(這是一個(gè)測(cè)試頁(yè)!);out.println(/body/html);out.close();.解決頁(yè)面顯示亂碼問(wèn)題,需將*處代碼換成如下內(nèi)容:PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(),gb2312);Solaris中文信息檢索問(wèn)題的解決瀏覽器利用表單向服務(wù)器提交信息時(shí),一般采用x-www-form-urlencoded 的MIME格式對(duì)數(shù)據(jù)進(jìn)行編碼。如果使用get方法,參數(shù)名稱(chēng)和參數(shù)值經(jīng)編碼后附加在URL后,在Java中稱(chēng)作查詢(xún)串(query string)。在Servlet程序中,如果采用ServletRequest的方法getParameter取得參數(shù)值,在Solaris環(huán)境下,對(duì)漢字卻不能正確解碼。因而無(wú)法正確檢索數(shù)據(jù)庫(kù)。在Java 1.2的包-中提供了URLEncode和URLDecode類(lèi)。類(lèi)URLEncode提供了按x-www-form-urlencoded格式對(duì)給定串進(jìn)行轉(zhuǎn)換的方法。類(lèi)URLEncode則提供了逆方法。6、Common Mail亂碼問(wèn)題common mail是一個(gè)小而方便的mail包,他實(shí)現(xiàn)了對(duì)Java Mail的封裝,使用起來(lái)十分的方便,但是我在使用他的時(shí)候發(fā)現(xiàn),使用純文本的內(nèi)容發(fā)送,結(jié)果是亂碼,代碼如下:public class TestCommonMail public static void main(String args) throws EmailException, MessagingException SimpleEmail email = new SimpleEmail();email.setCharset(GB2312);email.setHostName();email.setSubject(test);email.addTo();email.setFrom();email.setMsg(我的測(cè)試);email.setAuthentication(test, test);email.send();分析了一下commons mail的源碼找到了原因。源碼如下:public class SimpleEmail extends Emailpublic Email setMsg(String msg) throws EmailException, MessagingExceptionif (EmailUtils.isEmpty(msg)throw new EmailException(Invalid message supplied);setContent(msg, TEXT_PLAIN);return this;Email代碼片段public void setContent(Object aObject, String aContentType)this.content = aObject;if (EmailUtils.isEmpty(aContentType)this.contentType = null;else/ set the content typethis.contentType = aContentType;/ set the charset if the input was properly formedString strMarker = ; charset=;int charsetPos = aContentType.toLowerCase().indexOf(strMarker);if (charsetPos != -1)/ find the next space (after the marker)charsetPos += strMarker.length();int intCharsetEnd =aContentType.toLowerCase().indexOf( , charsetPos);if (intCharsetEnd != -1)this.charset =aContentType.substring(charsetPos, intCharsetEnd);elsethis.charset = aContentType.substring(charsetPos);email.send(); 的send方法將調(diào)用public void buildMimeMessage() throws EmailExceptiontrythis.getMailSession();this.message = new MimeMessage(this.session);if (EmailUtils.isNotEmpty(this.subject)if (EmailUtils.isNotEmpty(this.charset)this.message.setSubject(this.subject, this.charset);elsethis.message.setSubject(this.subject);/ =/ Start of replacement codeif (this.content != null)this.message.setContent(this.content, this.contentType);/ end of replacement code/ =else if (this.emailBody != null)this.message.setContent(this.emailBody);elsethis.message.setContent(, Email.TEXT_PLAIN);if (this.fromAddress != null)this.message.setFrom(this.fromAddress);elsethrow new EmailException(Sender address required);if (this.toList.size() + this.ccList.size() + this.bccList.size() = 0)throw new EmailException(At least one receiver address required);if (this.toList.size() 0)this.message.setRecipients(Message.RecipientType.TO,this.toInternetAddressArray(this.toList);if (this.ccList.size() 0)this.message.setRecipients(Message.RecipientType.CC,this.toInternetAddressArray(this.ccList);if (this.bccList.size() 0)this.message.setRecipients(Message.RecipientType.BCC,this.toInternetAddressArray(this.bccList);if (this.replyList.size() 0)this.message.setReplyTo(this.toInternetAddressArray(this.replyList);if (this.headers.size() 0)Iterator iterHeaderKeys = this.headers.keySet().iterator();while (iterHeaderKeys.hasNext()String name = (String) iterHeaderKeys.next();String value = (String) headers.get(name);this.message.addHeader(name, value);if (this.message.getSentDate() = null)this.message.setSentDate(getSentDate();if (this.popBeforeSmtp)Store store = session.getStore(pop3);store.connect(this.popHost, this.popUsername, this.popPassword);catch (MessagingException me)throw new EmailException(me);由代碼可以知道純文本方式最終調(diào)用了Java Mail的message.setContent(this.content, this.contentType);content是內(nèi)容contentType是類(lèi)型,如text/plain,(我們可以試試直接用Java mail發(fā)郵件,設(shè)置文本內(nèi)容不使用setText方法,也使用setContent(測(cè)試, text/plain)方式,你可以看到內(nèi)容也是亂碼)關(guān)鍵就在于text/plain,我們改成text/plain; charset=gb2312,ok亂碼解決了。在commons mail我們看SimpleEmail 類(lèi)中setMsg方法調(diào)用的就是 setContent(msg, TEXT_PLAIN); 我們只需要將Email類(lèi)中的常量TEXT_PLAIN修改一下加入 charset=你的字符集 ,重新打包jar,這樣就可以了7、toad的字符集的設(shè)置與oracle的安裝oracle數(shù)據(jù)庫(kù)服務(wù)器的安裝一般是中文字符集,有時(shí)安裝在不同的平臺(tái)下,設(shè)置為ISO編碼,toad是oracle開(kāi)發(fā)的最好工具,不是我說(shuō)的,可是中文環(huán)境下安裝的toad,打開(kāi)英文字符的oracle時(shí),中文全是亂碼。必須進(jìn)行設(shè)置環(huán)境變量-系統(tǒng)變量加NLS_lANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK或NLS_lANG=AMERICAN_AMERICA.WE8ISO8859P1AMERICAN_AMERICA.WE8MSWIN1252或者打開(kāi)注冊(cè)表,點(diǎn)擊HKEY_LOCAL_MATHINE再點(diǎn)擊Software,再點(diǎn)擊ORACLE在點(diǎn)擊HOME(ORACLE所在目錄)在注冊(cè)表的右半面有NLS_LANG,雙擊它,將你想要的覆蓋掉原來(lái)的就可以了最好記下舊的,以便可以改回來(lái)。connect sys/chang_on_installupdate props$set value$=ZHS16CGB231280where name=NLS_CHARACTERSET;commit;這樣就OK了8、如何解決GWT(google web toolkit)中文的問(wèn)題GWT 中文亂碼解決方法1.把你要顯示的中文測(cè)試字符串輸入到一個(gè)文件,如:1.txt2.進(jìn)入命令行,進(jìn)入1.txt所在的目錄,敲入以下命令:native2ascii.exe 1.txt 2.txt 回車(chē)。這樣就生成了另外一個(gè)文件2.txt。3.2.txt的內(nèi)容如下:u6d4bu8bd5u5b57u7b26u4e324.然后用上面的編碼,在gwt中使用,就可以了.9、xmlHttp得到的網(wǎng)頁(yè)怎么是亂碼?(1)在服務(wù)器端使用WebRequest而不是xmlHttp(2) 將StreamReader sr = new StreamReader(stream);對(duì)于簡(jiǎn)體中文改成:StreamReader sr = new StreamReader(stream , Encoding.Default );對(duì)于utf-8改成:StreamReader sr = new StreamReader(stream , Encoding.UTF8 );當(dāng)然,Encoding枚舉還有很多其他的成員,對(duì)于不同的編碼content-type可以有選擇的應(yīng)用(3)后來(lái)我發(fā)現(xiàn)無(wú)論是content-type是gb2312還是utf-8,用StreamReader sr = new StreamReader(stream , Encoding.Default );都可以返回正常的漢字,所以統(tǒng)一的改成Encoding.Default-最后,在服務(wù)器端從一個(gè)url獲得網(wǎng)頁(yè)的源代碼的代碼如下:/ summary/ post一個(gè)指定的url,獲得網(wǎng)頁(yè)的源代碼(用WebRequest實(shí)現(xiàn))/ /summary/ param name=url/param/ returns/ 如果請(qǐng)求失敗,返回null/ 如果請(qǐng)求成功,返回網(wǎng)頁(yè)的源代碼/ /returnspublic static string GetContentFromUrl2( string url )/變量定義string respstr;WebRequest myWebRequest=WebRequest.Create(url);/ myWebRequest.PreAuthenticate=true;/ NetworkCredential networkCredential=new NetworkCredential( username , password , domain );/ myWebRequest.Credentials=networkCredential;/ Assign the response object of WebRequest to a WebResponse variable.WebResponse myWebResponse=myWebRequest.GetResponse();System.IO.Stream stream = myWebResponse.GetResponseStream();StreamReader sr = new StreamReader(stream , Encoding.Default );/以字符串形式讀取數(shù)據(jù)流respstr = sr.ReadToEnd();sr.Close();return respstr;Java開(kāi)發(fā)者需堅(jiān)守的十大基本準(zhǔn)則有許多標(biāo)準(zhǔn)和實(shí)踐準(zhǔn)則可適用于Java開(kāi)發(fā)者,但此處要說(shuō)的,是每個(gè)Java開(kāi)發(fā)者需堅(jiān)守的基本原則。 一、為代碼加注釋。雖然每個(gè)人都知道這點(diǎn),但有時(shí)卻不自覺(jué)忘了履行,今天你“忘了”加注釋了嗎?雖然注釋對(duì)程序的功能沒(méi)什么“貢獻(xiàn)”,但過(guò)一段時(shí)間,比如說(shuō)兩星期之后或者更長(zhǎng),回過(guò)頭來(lái)看看自己的代碼,說(shuō)不定已經(jīng)記不住它是干什么的了。如果這些代碼是你個(gè)人的,那還算是走運(yùn)了,不幸的是,當(dāng)然了,大多數(shù)時(shí)候都是別人的不幸,很多時(shí)候大家都是在為公司寫(xiě)代碼,寫(xiě)代碼的人也許早已經(jīng)離開(kāi)了公司,但別忘了一句古話(huà),有來(lái)有往嘛,為他人,也為我們自己,請(qǐng)為你的代碼加上注釋。 二、不要讓事情復(fù)雜化。程序員有時(shí)候總是對(duì)簡(jiǎn)單問(wèn)題想出復(fù)雜的解決方案,比如說(shuō),在只有五個(gè)用戶(hù)的程序中引入EJB、對(duì)程序?qū)崿F(xiàn)了并不需要的框架(framework),之類(lèi)的還有屬性文件、面向?qū)ο蠼鉀Q方案、多線(xiàn)程等等。為什么要這樣做呢?也許我們并不知道是否這樣會(huì)更好,但這樣做也許可以學(xué)到一些新東西,或者讓自己更感興趣一些。如果是不知道為什么這樣做,建議多請(qǐng)教經(jīng)驗(yàn)豐富的程序員,如果是為了個(gè)人的目的,麻煩讓自己更專(zhuān)業(yè)一點(diǎn)。 三、始終牢記“少即是好(Less is more)并不總是對(duì)的”。代碼效率雖然很重要,但在許多解決方案中,編寫(xiě)更少的代碼并不能改善這些代碼的效率,請(qǐng)看下面這個(gè)簡(jiǎn)單的例子:if(newStatusCode.equals(SD) & (sellOffDate = null | todayDpareTo(sellOffDate)0) | (newStatusCode.equals(OBS) & (OBSDate = null | todayDpareTo(OBSDate)0) newStatusCode = NYP; 能看明白if條件語(yǔ)句是干什么的嗎?能想出來(lái)是誰(shuí)寫(xiě)的這段代碼嗎?如果把它分成兩段獨(dú)立的if語(yǔ)句,是不是更容易理解呢,下面是修改后的代碼:if(newStatusCode.equals(SD) & (sellOffDate = null | todayDpareTo(sellOffDate)0) newStatusCode = NYP; else if(newStatusCode.equals(OBS) & (OBSDate = null | todayDpareTo(OBSDate)0) newStatusCode = NYP; 是不是讀起來(lái)容易多了呢,在此只是多加了一個(gè)if和兩個(gè)花括號(hào),但代碼的可讀性與可理解性就一下子提高了一大截。 四、請(qǐng)不要硬編碼。開(kāi)發(fā)者經(jīng)常有意“忘記”或忽略掉這點(diǎn),因?yàn)橛行r(shí)候開(kāi)發(fā)日程逼得實(shí)在太緊。其實(shí),多寫(xiě)一行定義靜態(tài)變量的代碼能花多少時(shí)間呢?public class A public static final String S_CONSTANT_ABC = ABC; public boolean methodA(String sParam1) if (A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1) return true; return false; 現(xiàn)在,每次需要將“ABC”與其他變量進(jìn)行比較時(shí),不必記住實(shí)際代碼,直接引用A.S_CONSTANT_ABC就行了,而且在今后需要進(jìn)行修改時(shí),也可在一處修改,不會(huì)翻遍整個(gè)源代碼逐個(gè)修改了。五、不要“創(chuàng)造”自己的框架(framework)。確切來(lái)說(shuō),有數(shù)以千計(jì)的各種框架存在,而且大多數(shù)是開(kāi)源的,這些框架都是優(yōu)秀的解決方案,可用于日常程序開(kāi)發(fā)中,我們只需使用這些框架的最新版本就行了,至少表面上要跟上形勢(shì)吧。被大家廣為接受的最為明顯的一個(gè)例子就是Struts了,這個(gè)開(kāi)源web框架非常適合用在基于web的應(yīng)用程序中。是不是想開(kāi)發(fā)出自己的Struts呢,還是省點(diǎn)力氣吧,回頭看看第二條不要讓事情復(fù)雜化。另外,如果正在開(kāi)發(fā)的程序只有3個(gè)窗口,就不要使用Struts了,對(duì)這種程序來(lái)說(shuō),不需要那么多的“控制”。 六、不要使用println及字符串連接。通常為了調(diào)試方便,開(kāi)發(fā)者喜歡在可能的所有地方都加上System.out.println,也許還會(huì)提醒自己回過(guò)頭來(lái)再來(lái)刪除,但有些時(shí)候,經(jīng)常會(huì)忘了刪除或者不愿意刪除它們。既然使用System.out.println是為了測(cè)試,那么測(cè)試完之后,為什么還要留著它們呢,因?yàn)樵趧h除時(shí),很可能會(huì)刪除掉真正有用的代碼,所以不能低估System.out.println危害啊,請(qǐng)看下面的代碼:public class BadCode public static void calculationWithPrint() double someValue = 0D; for (int i = 0; i 10000; i+) System.out.println(someValue = someValue + i); public static void calculationWithOutPrint() double someValue = 0D; for (int i = 0; i 10000; i+) someValue = someValue + i; public static void main(String n) BadCode.calculationWithPrint(); BadCode.calculationWithOutPrint(); 從測(cè)試中可以發(fā)現(xiàn),方法calculationWithOutPrint()執(zhí)行用了0.001204秒,作為對(duì)比,方法calculationWithPrint()執(zhí)行可是用了10.52秒。要避免浪費(fèi)CPU時(shí)間,最好的方法是引入像如下的包裝方法:public class BadCode public static final int DEBUG_MODE = 1; public static final int PRODUCTION_MODE = 2; public static void calculationWithPrint(int logMode) double someValue = 0D; for (int i = 0; i BadCode.DEBUG_MODE) return; System.out.println(value); public static void main(String n) BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE); 另外,字符串連接也是浪費(fèi)CPU時(shí)間的一個(gè)大頭,請(qǐng)看下面的示例代碼:public static void concatenateStrings(String startingString) for (int i = 0; i 20; i+) startingString = startingString + startingString; public static void concatenateStringsUsingStringBuffer(String startingString) StringBuffer sb = new StringBuffer(); sb.append(startingString); for (int i = 0; i 20; i+) sb.append(sb.toString(); 在測(cè)試中可發(fā)現(xiàn),使用StringBuffer的方法只用了0.01秒執(zhí)行完畢,而使用連接的方法則用了0.08秒,選擇顯而易見(jiàn)了。七、多關(guān)注GUI(用戶(hù)界面)。再三強(qiáng)調(diào),GUI對(duì)商業(yè)客戶(hù)來(lái)說(shuō),與程序的功能及效率同等重要,GUI是一個(gè)成功程序的最基本部分,而很多IT經(jīng)理往往都沒(méi)注意到GUI的重要性。在現(xiàn)實(shí)生活中,許多公司可能為了節(jié)省開(kāi)支,沒(méi)有雇用那些有著設(shè)計(jì)“用戶(hù)友好”界面豐富經(jīng)驗(yàn)的網(wǎng)頁(yè)設(shè)計(jì)者,此時(shí)Java開(kāi)發(fā)者只能依賴(lài)他們自身的HTML基本功及在此領(lǐng)域有限的知識(shí),結(jié)果,很多開(kāi)發(fā)出來(lái)的程序都是“計(jì)算機(jī)友好”甚于“用戶(hù)友好”。很少有開(kāi)發(fā)者同時(shí)精通軟件開(kāi)發(fā)及GUI設(shè)計(jì),如果你在公司“不幸”被分配負(fù)責(zé)程序界面,就應(yīng)該遵守下面三條原則:1、 不要再發(fā)明一次輪子,即不做無(wú)用功?,F(xiàn)有的程序可能會(huì)有類(lèi)似的界面需求。2、 先創(chuàng)建一個(gè)原型。這是非常重要一步,用戶(hù)一般想看到他們將使用的東西,而且可以先利用這個(gè)原型征求用戶(hù)的意見(jiàn),再慢慢修改成用戶(hù)想要的樣子。3、 學(xué)會(huì)換位思考。換句話(huà)來(lái)說(shuō),就是從用戶(hù)的角度來(lái)審查程序的需求。舉例來(lái)講,一個(gè)匯總的窗口可以跨頁(yè)或者不跨頁(yè),作為一個(gè)軟件開(kāi)發(fā)者,可能會(huì)傾向于不跨頁(yè),因?yàn)檫@樣簡(jiǎn)單一些。但是,從用戶(hù)的角度來(lái)看,可能不希望看到上百行數(shù)據(jù)都擠在同一頁(yè)上。 八、文檔需求不放松。每個(gè)商業(yè)需求都必須記錄在案,這可能聽(tīng)上去像童話(huà),似乎在現(xiàn)實(shí)生活中很難實(shí)現(xiàn)。而我們要做的是,不管開(kāi)發(fā)時(shí)間多緊迫,不管最終期限多臨近,對(duì)每個(gè)商業(yè)需求都必須記錄在案。 九、單元測(cè)試、單元測(cè)試、單元測(cè)試。關(guān)于什么是單元測(cè)試的最好方法,在此不便細(xì)說(shuō),只是強(qiáng)調(diào),單元測(cè)試一定要完成,這也是編程中最基本的原則。當(dāng)然了,如果有人幫你做單元測(cè)試自然是最好,如果沒(méi)有,就自己來(lái)做吧,當(dāng)創(chuàng)建一個(gè)單元測(cè)試計(jì)劃時(shí),請(qǐng)遵守以下三條最基本的原則:1、 先于編寫(xiě)類(lèi)代碼之前編寫(xiě)單元測(cè)試。2、 記錄單元測(cè)試中的代碼注釋。3、 測(cè)試所有執(zhí)行關(guān)鍵功能的公有方法,這里不是指set和get方法,除非它們是以自己獨(dú)特方式執(zhí)行set和get方法。 十、質(zhì)量,而不是數(shù)量。有些時(shí)候因?yàn)楫a(chǎn)品問(wèn)題、期限緊迫、或一些預(yù)料之外的事情,導(dǎo)致常常不能按時(shí)下班,但一般而言,公司不會(huì)因?yàn)楣蛦T經(jīng)常加班而對(duì)之表?yè)P(yáng)和獎(jiǎng)勵(lì),公司只看重高質(zhì)量的工作。如果遵守了前九條原則,你會(huì)發(fā)現(xiàn)自己寫(xiě)出的代碼bug少且可維護(hù)性高,無(wú)形中質(zhì)量提高了一大步。Hibernate包作用總結(jié)Hibernate一共包括了23個(gè)jar包,令人眼花繚亂。本文將詳細(xì)講解Hibernate每個(gè)jar包的作用,便于你在應(yīng)用中根據(jù)自己的需要進(jìn)行取舍。下載Hibernate,例如2.0.3穩(wěn)定版本,解壓縮,可以看到一個(gè)hibernate2.jar和lib目錄下有22個(gè)jar包:hibernate2.jar:Hibernate的庫(kù),沒(méi)有什么可說(shuō)的,必須使用的jar包c(diǎn)glib-asm.jar:CGLIB庫(kù),Hibernate用它來(lái)實(shí)現(xiàn)PO字節(jié)碼的動(dòng)態(tài)生成,非常核心的庫(kù),必須使用的jar包dom4j.jar:dom4j是一個(gè)Java的XML API,類(lèi)似于jdom,用來(lái)讀寫(xiě)XML文件的。dom4j是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開(kāi)放源代碼的軟件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,對(duì)主流的Java XML API進(jìn)行的性能、功能和易用性的評(píng)測(cè),dom4j無(wú)論在那個(gè)方面都是非常出色的。我早在將近兩年之前就開(kāi)始使用dom4j,直到現(xiàn)在。如今你可以看到越來(lái)越多的Java軟件都在使用dom4j來(lái)讀寫(xiě)XML,特別值得一提的是連Sun的JAXM也在用dom4j。這是必須使用的jar包, Hibernate用它來(lái)讀寫(xiě)配置文件。odmg.jar:ODMG是一個(gè)ORM的規(guī)范,Hibernate實(shí)現(xiàn)了ODMG規(guī)范,這是一個(gè)核心的庫(kù),必須使用的jar包。commons-collections.jar:Apache Commons包中的一個(gè),包含了一些Apache開(kāi)發(fā)的集合類(lèi),功能比java.util.*強(qiáng)大。必須使用的jar包。commons-beanutils.jar:Apache Commons包中的一個(gè),包含了一些Bean工具類(lèi)類(lèi)。必須使用的jar包。commons-lang.jar:Apache Commons包中的一個(gè),包含了一些數(shù)據(jù)類(lèi)型工具類(lèi),是java.lang.*的擴(kuò)展。必須使用的jar包。commons-logging.jar:Apache Commons包中的一個(gè),包含了日志功能,必須使用的jar包。這個(gè)包本身包含了一個(gè)Simple Logger,但是功能很弱。在運(yùn)行的時(shí)候它會(huì)先在CLASSPATH找log4j,如果有,就使用log4j,如果沒(méi)有,就找JDK1.4帶的 java.util.logging,如果也找不到就用Simple Lmons-logging.jar的出現(xiàn)是一個(gè)歷史的的遺留的遺憾,當(dāng)初Apache極力游說(shuō)Sun把log4j加入JDK1.4,然而JDK1.4項(xiàng)目小組已經(jīng)接近發(fā)布JDK1.4產(chǎn)品的時(shí)間了,因此拒絕了Apache的要求,使用自己的java.util.logging,這個(gè)包的功能比log4j差的很遠(yuǎn),性能也一般。后來(lái)Apache就開(kāi)發(fā)出來(lái)了commons-logging.jar用來(lái)兼容兩個(gè) logger。因此用commons-logging.jar寫(xiě)的log程序,底層的Logger是可以切換的,你可以選擇log4j, java.util.logging或者它自帶的Simple Logger。不過(guò)我仍然強(qiáng)烈建議使用log4j,因?yàn)閘og4j性能很高,log輸出信息時(shí)間幾乎等于System.out,而處理一條log平均只需要5us。你可以在Hibernate的src目錄下找到Hibernate已經(jīng)為你準(zhǔn)備好了的log4j的配置文件,你只需要到Apache 網(wǎng)站去下載log4j就可以了。commons-logging.jar也是必須的jar包。使用Hibernate必須的jar包就是以上的這幾個(gè),剩下的都是可選的。ant.jar:Ant編譯工具的jar包,用來(lái)編譯Hibernate源代碼的。如果你不準(zhǔn)備修改和編譯Hibernate源代碼,那么就沒(méi)有什么用,可選的jar包optional.jar:Ant的一個(gè)輔助包。c3p0.jar:C3PO是一個(gè)數(shù)據(jù)庫(kù)連接池,Hibernate可以配置為使用C3PO連接池。如果你準(zhǔn)備用這個(gè)連接池,就需要這個(gè)jar包。proxool.jar:也是一個(gè)連接池,同上。commons-pool.jar, commons-dbcp.jar:DBCP數(shù)據(jù)庫(kù)連接池,Apache的Jakarta組織開(kāi)發(fā)的,Tomcat4的連接池也是DBCP。實(shí)際上Hibernate自己也實(shí)現(xiàn)了一個(gè)非常非常簡(jiǎn)單的數(shù)據(jù)庫(kù)連接池,加上上面3個(gè),你實(shí)際上可以在Hibernate上選擇4種不同的數(shù)據(jù)庫(kù)連接池,選擇哪一個(gè)看個(gè)人的偏好,不過(guò)DBCP可能更通用一些。另外強(qiáng)調(diào)一點(diǎn),如果在EJB中使用Hibernate,一定要用App Server的連接池,不要用以上4種連接池,否則容器管理事務(wù)不起作用。connector.jar:JCA 規(guī)范,如果你在A(yíng)pp Server上把Hibernate配置為Connector的話(huà),就需要這個(gè)jar。不過(guò)實(shí)際上一般App Server肯定會(huì)帶上這個(gè)包,所以實(shí)際上是多余的包。jaas.jar:JAAS是用來(lái)進(jìn)行權(quán)限驗(yàn)證的,已經(jīng)包含在JDK1.4里面了。所以實(shí)際上是多余的包。jcs.jar:如果你準(zhǔn)備在Hibernate中使用JCS的話(huà),那么必須包括它,否則就不用。jdbc2_0-stdext.jar:JDBC2.0的擴(kuò)展包,一般來(lái)說(shuō)數(shù)據(jù)庫(kù)連接池會(huì)用上它。不過(guò)App Server都會(huì)帶上,所以也是多余的。jta.jar:JTA規(guī)范,當(dāng)Hibernate使用JTA的時(shí)候需要,不過(guò)App Serv
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度辦公樓租賃合同全新版
- 2025年度體育場(chǎng)館清潔工勞動(dòng)合同范本(含設(shè)施清潔與保養(yǎng))
- 2025年度租賃型公寓退房協(xié)議
- 二零二五年度電商企業(yè)客服外包智能服務(wù)系統(tǒng)合作協(xié)議
- 交通監(jiān)控設(shè)施安裝合同書(shū)樣本
- 二手房交易合同定金協(xié)議范本
- 二手房按揭貸款購(gòu)房合同
- 二手車(chē)輛買(mǎi)賣(mài)合同范本
- 個(gè)人股權(quán)轉(zhuǎn)讓合同范本標(biāo)準(zhǔn)
- 交通事故賠償協(xié)議合同范本大全
- 跨領(lǐng)域安檢操作標(biāo)準(zhǔn)化的現(xiàn)狀與挑戰(zhàn)
- 大模型落地應(yīng)用實(shí)踐方案
- 催收質(zhì)檢報(bào)告范文
- 2024山東一卡通文化旅游一卡通合作協(xié)議3篇
- 2024-2025年江蘇專(zhuān)轉(zhuǎn)本英語(yǔ)歷年真題(含答案)
- 投標(biāo)廢標(biāo)培訓(xùn)
- 腦卒中課件完整版本
- 藥房保潔流程規(guī)范
- 電子信息工程基礎(chǔ)知識(shí)單選題100道及答案解析
- 血液透析器課件
- 2024屆清華大學(xué)強(qiáng)基計(jì)劃數(shù)學(xué)學(xué)科筆試試題(附答案)
評(píng)論
0/150
提交評(píng)論