#
如下問題:
java.sql.SQLException: 類型長度大于最大值
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:124)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:161)
at oracle.jdbc.driver.DatabaseError.check_error(DatabaseError.java:884)
at oracle.jdbc.driver.T4CMAREngine.buffer2Value(T4CMAREngine.java:2230)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB4(T4CMAREngine.java:1146)
at oracle.jdbc.driver.T4CMAREngine.unmarshalDALC(T4CMAREngine.java:2097)
at oracle.jdbc.driver.T4C8TTIuds.unmarshal(T4C8TTIuds.java:127)
at oracle.jdbc.driver.T4CTTIdcb.receiveCommon(T4CTTIdcb.java:125)
at oracle.jdbc.driver.T4CTTIdcb.receiveFromRefCursor(T4CTTIdcb.java:103)
at oracle.jdbc.driver.T4CResultSetAccessor.unmarshalOneRow(T4CResultSetAccessor.java:165)
at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:787)
at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:704)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:526)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:179)
at oracle.jdbc.driver.T4CCallableStatement.execute_for_rows(T4CCallableStatement.java:782)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1027)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2887)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:2978)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4102)
at getConnection.TestProcedure.main(TestProcedure.java:37)
java.sql.SQLException: 違反協(xié)議
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:124)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:161)
at oracle.jdbc.driver.DatabaseError.check_error(DatabaseError.java:884)
at oracle.jdbc.driver.T4C7Ocommoncall.receive(T4C7Ocommoncall.java:132)
at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:384)
at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:1035)
at getConnection.TestProcedure.closeConn(TestProcedure.java:70)
at getConnection.TestProcedure.main(TestProcedure.java:47)
我的數(shù)據(jù)庫是9.2.0.4.0版本1.12M的驅(qū)動有問題,必須要下對應(yīng)的1.13M的驅(qū)動。下載網(wǎng)址:http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html
本文將告訴你學(xué)習(xí)Java需要達(dá)到的30個目標(biāo),希望能夠?qū)δ愕膶W(xué)習(xí)有所幫助。對比一下自己,你已經(jīng)掌握了這30條中的多少條了呢?
1.你需要精通面向?qū)ο蠓治雠c設(shè)計(OOA/OOD)、涉及模式(GOF,J2EEDP)以及綜合模式。你應(yīng)該十分了解UML,尤其是class,object,interaction以及statediagrams。
2.你需要學(xué)習(xí)JAVA語言的基礎(chǔ)知識以及它的核心類庫(collections,serialization,streams,networking, multithreading,reflection,event,handling,NIO,localization,以及其他)。
3.你應(yīng)該了解JVM,classloaders,classreflect,以及垃圾回收的基本工作機制等。你應(yīng)該有能力反編譯一個類文件并且明白一些基本的匯編指令。
4.如果你將要寫客戶端程序,你需要學(xué)習(xí)WEB的小應(yīng)用程序(applet),必需掌握GUI設(shè)計的思想和方法,以及桌面程序的SWING,AWT, SWT。你還應(yīng)該對UI部件的JAVABEAN組件模式有所了解。JAVABEANS也被應(yīng)用在JSP中以把業(yè)務(wù)邏輯從表現(xiàn)層中分離出來。
5.你需要學(xué)習(xí)java數(shù)據(jù)庫技術(shù),如JDBCAPI并且會使用至少一種persistence/ORM構(gòu)架,例如Hibernate,JDO, CocoBase,TopLink,InsideLiberator(國產(chǎn)JDO紅工廠軟件)或者iBatis。
6.你還應(yīng)該了解對象關(guān)系的阻抗失配的含義,以及它是如何影響業(yè)務(wù)對象的與關(guān)系型數(shù)據(jù)庫的交互,和它的運行結(jié)果,還需要掌握不同的數(shù)據(jù)庫產(chǎn)品運用,比如:oracle,mysql,mssqlserver。
7.你需要學(xué)習(xí)JAVA的沙盒安全模式(classloaders,bytecodeverification,managers,policyandpermissions,
codesigning, digitalsignatures,cryptography,certification,Kerberos,以及其他)還有不同的安全/認(rèn)證 API,例如JAAS(JavaAuthenticationandAuthorizationService),JCE (JavaCryptographyExtension),JSSE(JavaSecureSocketExtension),以及JGSS (JavaGeneralSecurityService)。
8.你需要學(xué)習(xí)Servlets,JSP,以及JSTL(StandardTagLibraries)和可以選擇的第三方TagLibraries。
9.你需要熟悉主流的網(wǎng)頁框架,例如JSF,Struts,Tapestry,Cocoon,WebWork,以及他們下面的涉及模式,如MVC/MODEL2。
10.你需要學(xué)習(xí)如何使用及管理WEB服務(wù)器,例如tomcat,resin,Jrun,并且知道如何在其基礎(chǔ)上擴展和維護(hù)WEB程序。
11.你需要學(xué)習(xí)分布式對象以及遠(yuǎn)程API,例如RMI和RMI/IIOP。
12.你需要掌握各種流行中間件技術(shù)標(biāo)準(zhǔn)和與java結(jié)合實現(xiàn),比如Tuxedo、CROBA,當(dāng)然也包括javaEE本身。
13.你需要學(xué)習(xí)最少一種的XMLAPI,例如JAXP(JavaAPIforXMLProcessing),JDOM(JavaforXMLDocumentObjectModel),DOM4J,或JAXR(JavaAPIforXMLRegistries)。
14.你應(yīng)該學(xué)習(xí)如何利用JAVAAPI和工具來構(gòu)建WebService。例如JAX-RPC(JavaAPIforXML/RPC),SAAJ (SOAPwithAttachmentsAPIforJava),JAXB(JavaArchitectureforXMLBinding),JAXM(JavaAPIforXMLMessaging), JAXR(JavaAPIforXMLRegistries),或者JWSDP(JavaWebServicesDeveloperPack)。
15.你需要學(xué)習(xí)一門輕量級應(yīng)用程序框架,例如Spring,PicoContainer,Avalon,以及它們的IoC/DI風(fēng)格(setter,constructor,interfaceinjection)。
16.你需要熟悉不同的J2EE技術(shù),例如JNDI(JavaNamingandDirectoryInterface),JMS (JavaMessageService),JTA/JTS(JavaTransactionAPI/JavaTransactionService),JMX (JavaManagementeXtensions),以及JavaMail。
17.你需要學(xué)習(xí)企業(yè)級JavaBeans(EJB)以及它們的不同組件模式:Stateless/StatefulSessionBeans,EntityBeans(包含Bean- ManagedPersistence[BMP]或者Container-ManagedPersistence[CMP]和它的EJB-QL),或者 Message-DrivenBeans(MDB)。
18.你需要學(xué)習(xí)如何管理與配置一個J2EE應(yīng)用程序服務(wù)器,如WebLogic,JBoss等,并且利用它的附加服務(wù),例如簇類,連接池以及分布式處理支援。你還需要了解如何在它上面封裝和配置應(yīng)用程序并且能夠監(jiān)控、調(diào)整它的性能。
19.你需要熟悉面向方面的程序設(shè)計以及面向?qū)傩缘某绦蛟O(shè)計(這兩個都被很容易混淆的縮寫為AOP),以及他們的主流JAVA規(guī)格和執(zhí)行。例如AspectJ和AspectWerkz。
20.你需要熟悉對不同有用的API和frame\u001E\u001Ework等來為你服務(wù)。例如Log4J(logging/tracing),Quartz (scheduling),JGroups(networkgroupcommunication),JCache(distributedcaching), Lucene(full-textsearch),JakartaCommons等等。
21.如果你將要對接或者正和舊的系統(tǒng)或者本地平臺,你需要學(xué)習(xí)JNI (JavaNativeInterface) and JCA (JavaConnectorArchitecture)。
22.你需要熟悉JINI技術(shù)以及與它相關(guān)的分布式系統(tǒng),比如掌握CROBA。
23.你需要JavaCommunityProcess(JCP)以及他的不同JavaSpecificationRequests(JSRs),例如Portlets(168),JOLAP(69),DataMiningAPI(73),等等。
24.你應(yīng)該熟練掌握一種JAVAIDE例如sunOne,netBeans,IntelliJIDEA或者Eclipse。(有些人更喜歡VI或EMACS來編寫文件。隨便你用什么了:)
25.JAVA(精確的說是有些配置)是冗長的,它需要很多的人工代碼(例如EJB),所以你需要熟悉代碼生成工具,例如XDoclet。
26.你需要熟悉一種單元測試體系(JNunit),并且學(xué)習(xí)不同的生成、部署工具(Ant,Maven)。
27.你需要熟悉一些在JAVA開發(fā)中經(jīng)常用到的軟件工程過程。例如RUP(RationalUnifiedProcess)andAgilemethodologies。
28.你需要能夠深入了解加熟練操作和配置不同的操作系統(tǒng),比如GNU/linux,sunsolaris,macOS等,做為跨平臺軟件的開發(fā)者。
29.你還需要緊跟java發(fā)展的步伐,比如現(xiàn)在可以深入的學(xué)習(xí)javaME,以及各種java新規(guī)范,技術(shù)的運用,如新起的web富客戶端技術(shù)。
30.你必需要對opensource有所了解,因為至少java的很多技術(shù)直接是靠開源來驅(qū)動發(fā)展的,如java3D技術(shù)。
oracle的體系太龐大了,對于初學(xué)者來說,難免會有些無從下手的感覺,什么都想學(xué),結(jié)果什么都學(xué)不好,所以把學(xué)習(xí)經(jīng)驗共享一下,希望讓剛剛?cè)腴T的人對oracle有一個總體的認(rèn)識,少走一些彎路。
一、定位
oracle分兩大塊,一塊是開發(fā),一塊是管理。開發(fā)主要是寫寫存儲過程、觸發(fā)器什么的,還有就是用Oracle的Develop工具做form。有點類似于程序員,需要有較強的邏輯思維和創(chuàng)造能力,個人覺得會比較辛苦,是青春飯J;管理則需要對oracle數(shù)據(jù)庫的原理有深刻的認(rèn)識,有全局操縱的能力和緊密的思維,責(zé)任較大,因為一個小的失誤就會down掉整個數(shù)據(jù)庫,相對前者來說,后者更看重經(jīng)驗。
因為數(shù)據(jù)庫管理的責(zé)任重大,很少公司愿意請一個剛剛接觸oracle的人去管理數(shù)據(jù)庫。對于剛剛畢業(yè)的年輕人來說,可以先選擇做開發(fā),有一定經(jīng)驗后轉(zhuǎn)型,去做數(shù)據(jù)庫的管理。當(dāng)然,這個還是要看人個的實際情況來定。
二、學(xué)習(xí)方法
我的方法很簡單,就是:看書、思考、寫筆記、做實驗、再思考、再寫筆記
看完理論的東西,自己靜下心來想想,多問自己幾個為什么,然后把所學(xué)和所想的知識點做個筆記;在想不通或有疑問的時候,就做做實驗,想想怎么會這樣,同樣的,把實驗的結(jié)果記下來。思考和做實驗是為了深入的了解這個知識點。而做筆記的過程,也是理清自己思路的過程。
學(xué)習(xí)的過程是使一個問題由模糊到清晰,再由清晰到模糊的過程。而每次的改變都代表著你又學(xué)到了一個新的知識點。
學(xué)習(xí)的過程也是從點到線,從線到網(wǎng),從網(wǎng)到面的過程。當(dāng)點變成線的時候,你會有總豁然開朗的感覺。當(dāng)網(wǎng)到面的時候,你就是高手了
很多網(wǎng)友,特別是初學(xué)的人,一碰到問題就拿到論壇上來問,在問前,你有沒有查過書,自己有沒有研究過,有沒有搜索一下論壇?這就叫思維惰性。由別人來回答你的問題,會讓你在短時間內(nèi)不費勁地弄懂這個知識點,然而通過自己的努力去研究它,不但會更深入的了解這個知識點,更重要的是在研究的過程會提高你解決問題和分析問題的能力。總的來說,沒有鉆研的學(xué)習(xí)態(tài)度,不管學(xué)什么東西,都不會成功的。
當(dāng)然,初學(xué)的人很多時候是因為遇到問題時,無從下手,也不知道去哪里找資料,才會到論壇上提問題的。但我認(rèn)為,在提問的時候,是不是可以問別人是如何分析這個問題?從哪里可以找到相關(guān)的資料?而不是這個問題的答案是什么?授人以魚不如授人以漁。
下面我講下我處理問題的過程
首先要知道oracle的官方網(wǎng)站:www.oracle.com 這里有oracle的各種版本的數(shù)據(jù)庫、應(yīng)用工具和權(quán)威的官方文檔。其次,還要知道http://metalink.oracle.com/這里是買了oracle服務(wù)或是oracle的合作伙伴才可以進(jìn)去的,里面有很多權(quán)威的解決方案和補丁。然后就是一些著名網(wǎng)站:asktom.oracle.com www.orafaq.net, www.dbazine.com。這里有很多經(jīng)驗之談。
遇到問題了。如果是概念上的問題,第一時間可以找tahiti.oracle.com,這里會給你最詳細(xì)的解釋。如果在運行的過程中出了什么錯誤。可以去metalink看看。如果是想知道事務(wù)的處理的經(jīng)驗之談。可以去asktom。當(dāng)然。這里只是相對而言。
三、oracle的體系
oracle的體系很龐大,要學(xué)習(xí)它,首先要了解oracle的框架。在這里,簡要的講一下oracle的架構(gòu),讓初學(xué)者對oracle有一個整體的認(rèn)識。
1、物理結(jié)構(gòu)(由控制文件、數(shù)據(jù)文件、重做日志文件、參數(shù)文件、歸檔文件、密碼文件組成)
控制文件:包含維護(hù)和驗證數(shù)據(jù)庫完整性的必要信息、例如,控制文件用于識別數(shù)據(jù)文件和重做日志文件,一個數(shù)據(jù)庫至少需要一個控制文件
數(shù)據(jù)文件:存儲數(shù)據(jù)的文件
重做日志文件:含對數(shù)據(jù)庫所做的更改記錄,這樣萬一出現(xiàn)故障可以啟用數(shù)據(jù)恢復(fù)。一個數(shù)據(jù)庫至少需要兩個重做日志文件
參數(shù)文件:定義Oracle 例程的特性,例如它包含調(diào)整SGA 中一些內(nèi)存結(jié)構(gòu)大小的參數(shù)
歸檔文件:是重做日志文件的脫機副本,這些副本可能對于從介質(zhì)失敗中進(jìn)行恢復(fù)很必要。
密碼文件:認(rèn)證哪些用戶有權(quán)限啟動和關(guān)閉Oracle例程
2、邏輯結(jié)構(gòu)(表空間、段、區(qū)、塊)
表空間:是數(shù)據(jù)庫中的基本邏輯結(jié)構(gòu),一系列數(shù)據(jù)文件的集合。
段:是對象在數(shù)據(jù)庫中占用的空間
區(qū):是為數(shù)據(jù)一次性預(yù)留的一個較大的存儲空間
塊:ORACLE最基本的存儲單位,在建立數(shù)據(jù)庫的時候指定
3、內(nèi)存分配(SGA和PGA)
SGA:是用于存儲數(shù)據(jù)庫信息的內(nèi)存區(qū),該信息為數(shù)據(jù)庫進(jìn)程所共享。它包含Oracle 服務(wù)器的數(shù)據(jù)和控制信息, 它是在Oracle 服務(wù)器所駐留的計算機的實際內(nèi)存中得以分配,如果實際內(nèi)存不夠再往虛擬內(nèi)存中寫。
PGA:包含單個服務(wù)器進(jìn)程或單個后臺進(jìn)程的數(shù)據(jù)和控制信息,與幾個進(jìn)程共享的SGA 正相反PGA 是只被一個進(jìn)程使用的區(qū)域,PGA 在創(chuàng)建進(jìn)程時分配在終止進(jìn)程時回收
4、后臺進(jìn)程(數(shù)據(jù)寫進(jìn)程、日志寫進(jìn)程、系統(tǒng)監(jiān)控、進(jìn)程監(jiān)控、檢查點進(jìn)程、歸檔進(jìn)程、服務(wù)進(jìn)程、用戶進(jìn)程)
數(shù)據(jù)寫進(jìn)程:負(fù)責(zé)將更改的數(shù)據(jù)從數(shù)據(jù)庫緩沖區(qū)高速緩存寫入數(shù)據(jù)文件
日志寫進(jìn)程:將重做日志緩沖區(qū)中的更改寫入在線重做日志文件
系統(tǒng)監(jiān)控:檢查數(shù)據(jù)庫的一致性如有必要還會在數(shù)據(jù)庫打開時啟動數(shù)據(jù)庫的恢復(fù)
進(jìn)程監(jiān)控:負(fù)責(zé)在一個Oracle 進(jìn)程失敗時清理資源
檢查點進(jìn)程:負(fù)責(zé)在每當(dāng)緩沖區(qū)高速緩存中的更改永久地記錄在數(shù)據(jù)庫中時,更新控制文件和數(shù)據(jù)文件中的數(shù)據(jù)庫狀態(tài)信息。
歸檔進(jìn)程:在每次日志切換時把已滿的日志組進(jìn)行備份或歸檔
服務(wù)進(jìn)程:用戶進(jìn)程服務(wù)。
用戶進(jìn)程:在客戶端,負(fù)責(zé)將用戶的SQL 語句傳遞給服務(wù)進(jìn)程,并從服務(wù)器段拿回查詢數(shù)據(jù)。
5、oracle例程:Oracle 例程由SGA 內(nèi)存結(jié)構(gòu)和用于管理數(shù)據(jù)庫的后臺進(jìn)程組成。例程一次只能打開和使用一個數(shù)據(jù)庫。
6、SCN(System Change Number):系統(tǒng)改變號,一個由系統(tǒng)內(nèi)部維護(hù)的序列號。當(dāng)系統(tǒng)需要更新的時候自動增加,他是系統(tǒng)中維持?jǐn)?shù)據(jù)的一致性和順序恢復(fù)的重要標(biāo)志。
四、深入學(xué)習(xí)
管理:可以考OCP證書,對oracle先有一個系統(tǒng)的學(xué)習(xí),然后看Oracle Concepts、oracle online document,對oracle的原理會有更深入的了解,同時可以開始進(jìn)行一些專題的研究如:RMAN、RAS、STATSPACT、DATAGUARD、TUNING、BACKUP&RECOVER等等。
開發(fā):對于想做Oracle開發(fā)的,在了解完Oracle基本的體系結(jié)構(gòu)之后,可以重點關(guān)注PL/SQL及Oracle的開發(fā)工具這一部分。 PL/SQL主要是包括怎么寫SQL語句,怎么使用Oracle本身的函數(shù),怎么寫存儲過程、存儲函數(shù)、觸發(fā)器等。 Oracle的開發(fā)工具主要就是Oracle自己的Developer Suite(Oracle Forms Developer and Reports Developer這些),學(xué)會如何熟練使用這些工具。
介紹幾本oracle入門的好書
oracle官方文檔:《concept》上面講了oracle的體系和概念,很適合初學(xué)者看。
OCP的教學(xué)用書,也就是STUDY GUIDE(SG)。
Oracle8i 備份恢復(fù)手冊
Oracle8高級管理與優(yōu)化
Oracle8i PLSQL程序設(shè)計
Oracle8數(shù)據(jù)庫管理員手冊
以上書本都是機械工業(yè)出版社出版。
介紹幾個網(wǎng)站
http://tahiti.oracle.com/ oracle的官方文檔
http://metalink.oracle.com/ oracle的技術(shù)支持網(wǎng)站。需要購買Oracle服務(wù)才能有一個帳號,才能登陸,有大量的Knowledge Base,大量問題解決經(jīng)驗。
http://www.oracle.com/ oracle的官方網(wǎng)站,可以在這里down oracle的軟件、官方文檔和獲得最新的消息
http://www.dbazine.com/ Oracle的雜志
http://asktom.oracle.com/ http://www.orafaq.net/ http://www.ixora.com.au/ http://www.oracle-base.com/ http://www.dba-oracle.com/oracle_links.htm
今天碰見一個問題:
sql-1:
SELECT temp.*, ROWNUM num
FROM (select a.vcCityId,
a.vcCountryId,
a.vcCityName,
a.vcInitial,
a.vcCityDesc,
b.vcCountryName
from web2city a, web2country b
where a.vcCountryId = b.vcCountryId
order by to_number(a.vcCountryId),
a.vcInitial)temp
sql-2:
SELECT temp.*, ROWNUM num
FROM (select a.vcCityId,
a.vcCountryId,
a.vcCityName,
a.vcInitial,
a.vcCityDesc,
b.vcCountryName
from web2city a, web2country b
where a.vcCountryId = b.vcCountryId
order by to_number(a.vcCountryId),
a.vcInitial)temp
where ROWNUM <= 40
這兩個sql的前40行結(jié)果不一樣,為什么呢,其實是因為排序字段的結(jié)果不確定的緣故,由于這兩個sql出來的結(jié)果有很多都是并列的,所以oracle給出的結(jié)果集列表不一定都是固定的。oracle會給出他以最快速度查到的滿足條件的結(jié)果,但是卻并不一定滿足你的要求。修改需要加入一個唯一的字段進(jìn)行排就不會出問題。
sql-3:(正解)
SELECT temp.*, ROWNUM num
FROM (select a.vcCityId,
a.vcCountryId,
a.vcCityName,
a.vcInitial,
a.vcCityDesc,
b.vcCountryName
from web2city a, web2country b
where a.vcCountryId = b.vcCountryId
order by to_number(a.vcCountryId),
a.vcInitial,
to_number(a.vccityid)) temp
where ROWNUM <= 40
webwork的xwork.xml里面配置的轉(zhuǎn)發(fā)帶中文參數(shù)就是亂碼,這里的vcStatus是中文就亂。
<result name="success" type="redirect">
/haplayadmin/initManageThread.action?vcStatus=${vcStatus}
</result>
1.我們都知道tomcat的默認(rèn)編碼是iso8859
2.webwor的默認(rèn)編碼是iso8859,而webwork.i18n.encoding = utf-8這里配置的是希望轉(zhuǎn)換成的字符集
3.在轉(zhuǎn)換前的action中得到的參數(shù),如果是以get方式得到的那么應(yīng)該是iso8859(tomcat進(jìn)行了從utf-8(這個是頁面中的contentType決定的)到iso8859的轉(zhuǎn)換)。
如果是post方式得到的則應(yīng)該是utf-8(因為webwork把從tomcat得到的參數(shù)setCharactorEncoding為webwork.properties配置的字符集,通常我們設(shè)置的和頁面字符集一樣)。
4.這樣我們在以redirect的方式轉(zhuǎn)換到actionB的時候顯然是以get方式提交了,webwork會執(zhí)行從iso8859到utf-8的轉(zhuǎn)換(webwork.properties里面的配置進(jìn)行轉(zhuǎn)換)。這時就會出問題:假設(shè)前面是以get方式提交的,那么就會從iso8859到utf-8,記住這時我們得到了utf-8編碼的字符集.
5.接著,tomcat很老實的把參數(shù)按照頁面中contentType設(shè)定的值(這里是utf-8)轉(zhuǎn)換成iso8859字符集,由于是get方式提交則不會經(jīng)過webwork的setCharactorEncoding,那么我們得到的是iso8859字符集。
6.在轉(zhuǎn)發(fā)后的action中就得到了iso8859編碼的字符集,我們只要把這個字符集進(jìn)行從iso8859到utf-8的轉(zhuǎn)換即可得到需要的參數(shù)。
7.然而假設(shè)第三步假設(shè)是以post方式提交的,我們則得到的是utf-8的字符集編碼,在第四步webwork在執(zhí)行從iso8859到utf-8的轉(zhuǎn)換中就把參數(shù)的原始字符集寫錯了,因為我們得到的是utf-8的原始字符集而不是iso8859。這時轉(zhuǎn)換編碼的參數(shù)永遠(yuǎn)也轉(zhuǎn)不回來了。
注:實際上webwork在解析xml中的轉(zhuǎn)發(fā)表達(dá)式的時候進(jìn)行的字符集轉(zhuǎn)換,在其他地方則不會出現(xiàn)這樣的問題。
一.已知一個類的名字及其class文件,如何使用此類?
1.如果此類位于一個已打包的jar文件中,按如下方法調(diào)用:
URL url = new URL("file:/E:/Work/Projects/Output/FrameWork.jar");
URLClassLoader ul = new URLClassLoader(new URL[]{url});
Class aClass = ul.loadClass("com.hdpan.exercise.loader.ProduceObject");
Object obj = aClass.newInstance();
注意的是URLClassLoader.loadClass()方法的參數(shù)要包括package的名字,例如這里面如果寫成ProduceObject就是錯誤的。
2.如果此類是一個class文件,位于一個文件夾中,按如下方法調(diào)用:
首先要確認(rèn)的是class的package的名字與目錄名應(yīng)該一致。
URL url = new URL("file:/E:/Work/Projects/FrameWork/bin");
URLClassLoader ul = new URLClassLoader(new URL[]{url});
Class aClass = ul.loadClass("com.hdpan.exercise.loader.ProduceObject");
Object obj = aClass.newInstance();
這里面的URL的路徑指到package名的上一層目錄位置,例如這里如果寫成file:/E:/Work/Projects/FrameWork/bin/com/hdpan/exercise/loader就是錯誤的
Class這個類中還有許多的get方法可以使用。
二.如何打印class中的所有方法?
Method[] md = aClass.getDeclaredMethods();
for (int i = 0; i < md.length; i++){
System.out.println(md.getName());
}
md.getModifiers();
md.getReturnType();
md.getParameterTypes();
md.getExceptionTypes();
Method這個類中還有許多的屬性可以get得到。
如果有兩個方法的Name是一樣的,但是參數(shù)不一樣:
Method md = aClass.getMethod("setField1",new Class[]{Integer.TYPE});
第一個參數(shù)是方法的名字,第二個參數(shù)是一個數(shù)組,如果是基本數(shù)據(jù)類型的話,使用其外覆類的類型,例如int使用Integer.Type,float使用Float.Type
例如,如果類中是這樣的定義的:
public void setField1(int field1,String info) {
this.field1 = field1;
System.out.println(info);
}
那么在使用的時候:
Method md = clas.getMethod("setField1",new Class[]{Integer.TYPE,String.class});
三.如何調(diào)用class中的方法?
調(diào)用方法:
Object obj = aClass.newInstance();
Method mds = aClass.getMethod("setField1",new Class[]{Integer.TYPE});
mds.invoke(obj,new Object[]{new Integer(5)});
對invoke方法,第一個參數(shù)是方法所在的對象,如果方法是static的,那么此處可以是null,如果方法不是static的,但是此處是Null的話將會出現(xiàn)NullPointerException
第二參數(shù)是方法所需要的參數(shù)的對象數(shù)組,如果是基本數(shù)據(jù)類型的話,使用其外覆類的類型,例如int使用Integer.Type,float使用Float.Type
例如,如果類中是這樣的定義的::
public void setField1(int field1,String info) {
this.field1 = field1;
System.out.println(info);
}
那么在使用的時候:
Object obj = aClass.newInstance();
Method md = aClass.getMethod("setField1",new Class[]{Integer.TYPE,String.class});
md.invoke(obj,new Object[]{new Integer(5),"This is a Test"});
如果想取得方法的返回值:
public int getField1() {
return field1;
}
那么在使用的時候:
mds = aClass.getMethod("getField1",null);
Integer integer = (Integer)mds.invoke(obj,null);
System.out.println(integer.intValue());
Method方法返回的類型是Object,根據(jù)具體的方法返回值類型,將其下溯到具體的類型。
源程序:
ProduceObject.java
=================================
//ProduceObject.java開始
package com.hdpan.exercise.loader;
public class ProduceObject {
public int getField1() {
return field1;
}
public void setField1(int field1) {
this.field1 = field1;
}
public void setField1(int field1,String info) {
this.field1 = field1;
System.out.println(info);
}
public static double getField2() {
return field2;
}
public static void setField2(double field2) {
ProduceObject.field2 = field2;
}
private int field1;
private static double field2;
public static void main(String[] args) {
}
}
//ProduceObject.java結(jié)束
=========================
TestLoader.java
=========================
//TestLoader.java開始
package com.hdpan.exercise.loader;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class TestLoader {
public static void main(String[] args) throws Exception {
try {
//URL url = new URL("file:/E:/Work/Projects/Output/FrameWork.jar");
URL url = new URL("file:/E:/Work/Projects/FrameWork/bin/com/hdpan/exercise/loader");
URLClassLoader ul = new URLClassLoader(new URL[]{url});
//Class clas = ul.loadClass("ProduceObject");
Class aClass = ul.loadClass("com.hdpan.exercise.loader.ProduceObject");
Object obj = aClass.newInstance();
Method mds = aClass.getMethod("setField1",new Class[]{Integer.TYPE,String.class});
mds.invoke(obj,new Object[]{new Integer(5),"haha"});
mds = aClass.getMethod("getField1",null);
Integer integer = (Integer)mds.invoke(obj,null);
System.out.println(integer.intValue());
//System.out.println(((com.hdpan.exercise.loader.ProduceObject)obj).getField1());
Method[] md = aClass.getDeclaredMethods();
for (int i = 0; i < md.length; i++){
System.out.println(md.getName());
}
} catch (Exception e) {
System.out.println(e);
}
}
}
//TestLoader.java開始
1.什么是pv PV(page view),即頁面瀏覽量,或點擊量;通常是衡量一個網(wǎng)絡(luò)新聞頻道或網(wǎng)站甚至一條網(wǎng)絡(luò)新聞的主要指標(biāo)。
高手對pv的解釋是,一個訪問者在24小時(0點到24點)內(nèi)到底看了你網(wǎng)站幾個頁面。這里需要強調(diào):同一個人瀏覽你網(wǎng)站同一個頁面,不重復(fù)計算pv量,點100次也算1次。說白了,pv就是一個訪問者打開了你的幾個頁面。
PV之于網(wǎng)站,就像收視率之于電視,從某種程度上已成為投資者衡量商業(yè)網(wǎng)站表現(xiàn)的最重要尺度。
pv的計算:當(dāng)一個訪問著訪問的時候,記錄他所訪問的頁面和對應(yīng)的IP,然后確定這個IP今天訪問了這個頁面沒有。如果你的網(wǎng)站到了23點,單純IP有60萬條的話,每個訪問者平均訪問了3個頁面,那么pv表的記錄就要有180萬條。
有一個可以隨時查看PV流量以及你的網(wǎng)站世界排名的工具alexa工具條,安裝吧!網(wǎng)編們一定要安裝這個。
2.什么是uv
uv(unique visitor),指訪問某個站點或點擊某條新聞的不同IP地址的人數(shù)。
在同一天內(nèi),uv只記錄第一次進(jìn)入網(wǎng)站的具有獨立IP的訪問者,在同一天內(nèi)再次訪問該網(wǎng)站則不計數(shù)。獨立IP訪問者提供了一定時間內(nèi)不同觀眾數(shù)量的統(tǒng)計指標(biāo),而沒有反應(yīng)出網(wǎng)站的全面活動。
3.什么是PR值
PR值,即PageRank,網(wǎng)頁的級別技術(shù)。取自Google的創(chuàng)始人Larry Page,它是***運算法則(排名公式)的一部分,用來標(biāo)識網(wǎng)頁的等級/重要性。級別從1到10級,10級為滿分。PR值越高說明該網(wǎng)頁越受歡迎(越重要)。
例如:一個PR值為1的網(wǎng)站表明這個網(wǎng)站不太具有流行度,而PR值為7到10則表明這個網(wǎng)站非常受歡迎(或者說極其重要)。
我們可以這樣說:一個網(wǎng)站的外部鏈接數(shù)越多其PR值就越高;外部鏈接站點的級別越高(假如Macromedia的網(wǎng)站鏈到你的網(wǎng)站上),網(wǎng)站的PR值就越高。例如:如果ABC.COM網(wǎng)站上有一個XYZ.COM網(wǎng)站的鏈接,那為ABC.COM網(wǎng)站必須提供一些較好的網(wǎng)站內(nèi)容,從而Google會把來自XYZ.COM的鏈接作為它對ABC.COM網(wǎng)站投的一票。
你可以下載和安裝Google工具條來檢查你的網(wǎng)站級別(PR值)。
平原總結(jié):對于網(wǎng)編來說,你的瀏覽器上有沒有alexa工具條,有沒有g(shù)oogle工具條,是判斷一個網(wǎng)編是否懂推廣的一個重要標(biāo)準(zhǔn)。如果你沒有,那么從今天開始,趕快裝上吧!
寫這個的文章太多了,為了防止忘記,我還是記一下吧,年紀(jì)大了,記性不太好):
1.將tomcat/bin目錄下的catalina.sh文件加上這兩行:
JAVA_OPTS='-server -Xms512m -Xmx512m? -XX:PermSize=32M -XX:MaxNewSize=128m -XX:MaxPermSize=64m -Djava.awt.headless=true'
CATALINA_OPTS="-server -Xms256m -Xmx256m"
設(shè)置一下資源大小。
2.如果配了apache的一定要把url轉(zhuǎn)發(fā)的轉(zhuǎn)發(fā)規(guī)則定好,不能全部轉(zhuǎn)發(fā)給tomcat去處理。
圖片,樣式,js等要發(fā)給apache去處理:
JkMount /*不能有,有些apache配置了workers.properties的就去掉[uri:/*.jsp]worker=ajp13:localhost:8009
context=/
昨天升級了jre更新到update10,遇到版本不匹配的問題:
bad class file: /usr/java/jdk1.5.0_06/jre/lib/rt.jar(java/lang/Object.class)
class file has wrong version 49.0, should be 48.0
Please remove or make sure it appears in the correct subdirectory of the classpath.
這是因為編譯環(huán)境和運行環(huán)境的不一致造成的,比如tomcat和jdk1.5配合的時候,可能就會出現(xiàn)。解決這個問題的方法:copy jdk1.5的lib/tools.jar到tomcat的common/lib/tools.jar,覆蓋掉原有文件就可以了。
做了個簡單的測試.
1.用webwork做了個action,直接導(dǎo)入到SUCCESS.
2.用struts做了個action,直接導(dǎo)入到SUCCESS.
然后用LoadRunner測試,設(shè)定用戶數(shù)30個,一開始就30個.開始以后觀察發(fā)現(xiàn):
1.webwork的最高His/Second為170
2.struts的最高His/Second為480
有哪位大俠能夠告訴我為啥差別這么大,還是可能我的webwork的配置有問題.
我在這個action上面沒有添加任何攔截器.
<package name="aaa" extends="webwork-default" namespace="/aaa">
這個模塊繼承于webwork-default,我將webwork-default.xml里面的<default-interceptor-ref name="defaultStack"/>也刪除了,也就是說現(xiàn)在沒有經(jīng)過任何攔截器的.
該貼被javaeye上的前輩們認(rèn)為是陳年老話題.建議我去搜一下.可是我找不到,真郁悶.
有哪位好心人看到了,請幫我解決一下,不勝感激.http://www.javaeye.com/topic/40306
我對google也在使用webwork的話不置可否,且不論到底是否在用webwork,即時用了你也不知道它被用來在做什么項目,畢竟google的項目太多了.而且確如robbin所說,我所做的測試不是具體應(yīng)用,不可作為參考.關(guān)于測試的結(jié)果我感到無所適從,唯有報以苦笑了.