一. Linux下啟動Tomcat拋異常
Java應(yīng)用部署到tomcat上后单默,啟動時(shí)運(yùn)行正常,但在運(yùn)行過程中熙侍,是不是拋出如下異常:
嚴(yán)重: Error, processing connection
java.lang.IndexOutOfBoundsException
at java.io.BufferedInputStream.read(BufferedInputStream.java:310)
at org.apache.jk.common.ChannelSocket.read(ChannelSocket.java:620)
at org.apache.jk.common.ChannelSocket.receive(ChannelSocket.java:577)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:685)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Thread.java:662)
通過日志錯誤信息吁朦,可以判定不是程序問題撕氧。而可能是有一些不是AJP協(xié)議的請求,請求了這個端口喇完。
1. 解決辦法一:
用端口掃描工具(優(yōu)化大師,防火墻剥啤,ewido等都可以)掃描系統(tǒng)網(wǎng)絡(luò)連接狀態(tài)锦溪,查看了一下是否有訪問8009端口的程序。關(guān)閉對應(yīng)的程序就OK了府怯。
2. 解決辦法二:
把tomcat配置文件service.xml中的相關(guān)內(nèi)容注解掉刻诊。
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> -->
結(jié)果這個錯誤就不會出現(xiàn)了。
二. 指定tomcat運(yùn)行時(shí)JDK版本
tomcat作為日常開發(fā)的web應(yīng)用服務(wù)器牺丙,給開發(fā)測試帶來了很多便利则涯,tomcat的運(yùn)行依賴JDK的支持,在安裝JDK時(shí)經(jīng)常會配置環(huán)境變量:JAVA_HOME冲簿、CLASSPAT粟判,且需要添加path變量。把應(yīng)用部署到tomcat下時(shí)大多數(shù)不需要修改運(yùn)行環(huán)境峦剔,但是有時(shí)候需要修改JDK的版本档礁,從可以修改tomcat運(yùn)行時(shí)的JDK版本,我們可以知道使用tomcat時(shí)不時(shí)必須要配置JDK環(huán)境變量吝沫,因?yàn)槲覀兛梢酝ㄟ^修改tomcat的文件呻澜,指定tomcat運(yùn)行時(shí)的JDK版本。
下面說明如何修改tomcat運(yùn)行時(shí)JDK版本
1. windows
解壓下載的tomcat;
-
找到bin下的catalina.bat文件惨险;在文件的開始出添加如下代碼:
set JAVA_HOME=D:\Program Files\Java\jdk7\jdk1.7.0_51 set JRE_HOME=D:\Program Files\Java\jdk7\jre7
上面的意思是設(shè)定JAVA_HOME和JRE_HOME的路徑羹幸;
通過這里我們可以看出可以不設(shè)置JDK的環(huán)境變量;
2. linux
在bin下找到setclasspath.sh和catalina.sh辫愉,在文件的最開始加入如下代碼:
export JAVA_HOME=/home/jdk/Java/jdk7/jdk1.7.0_51
export JRE_HOME=/home/jdk/Java/jdk7/jre7
修改了setclasspath文件之后栅受,tomcat在啟動時(shí)便使用設(shè)定的JDK。
但是為什么這樣設(shè)置之后就可以呢?
我們都知道啟動tomcat可以通過運(yùn)行bin下的startup.bat窘疮,startup.bat會調(diào)用catalina.bat文件袋哼,而catalina.bat會調(diào)用setclasspath.bat文件來獲取JAVA_HOME和JRE_HOME這兩個環(huán)境變量的值,因此若要在tomcat啟動時(shí)指向特定的JDK闸衫,則需在setclasspath.bat文件的開頭處加上JAVA_HOME和JRE_HOME涛贯。
三. Oracle中字符串截取方法
substr 函數(shù):截取字符串
語法:SUBSTR(string,start蔚出, [length])
string:表示源字符串弟翘,即要截取的字符串。
start:開始位置骄酗,從1開始查找稀余。如果start是負(fù)數(shù),則從string字符串末尾開始算起趋翻。
length:可選項(xiàng)睛琳,表示截取字符串長度。
示例:
SELECT SUBSTR('Hello SQL!', 1) FROM dual --截取所有字符串踏烙,返回'Hello SQL!'
SELECT SUBSTR('Hello SQL!', 2) FROM dual --從第2個字符開始师骗,截取到末尾。返回'ello SQL!'
SELECT SUBSTR('Hello SQL!', -4) FROM dual --從倒數(shù)第4個字符開始讨惩,截取到末尾辟癌。返回'SQL!'
SELECT SUBSTR('Hello SQL!', 3, 6) FROM dual --從第3個字符開始,截取6個字符荐捻。返回'llo SQ'
SELECT SUBSTR('Hello SQL!', -4, 3) FROM dual --從倒數(shù)第4個字符開始黍少,截取3個字符。返回'SQL'
instr 函數(shù)
返回字符串在源字符串中的位置
語法:INSTR(string处面,child_string厂置,[start],[show_time])
string:表示源字符串鸳君。
child_string:子字符串农渊,即要查找的字符串。
start:可選項(xiàng)或颊,開始位置砸紊,默認(rèn)從1開始。如果為負(fù)數(shù)囱挑,則從右向左檢索醉顽。
show_time:可選項(xiàng),表示子字符串第幾次出現(xiàn)在源字符串當(dāng)中平挑,默認(rèn)第1次游添,負(fù)數(shù)則報(bào)錯系草。
示例:
--表示從源字符串'city_company_staff'中第1個字符開始查找子字符串'_'第1次出現(xiàn)的位置
SELECT INSTR('city_company_staff', '_') FROM dual --返回5
--表示從源字符串'city_company_staff'中第5個字符開始查找子字符串'_'第1次出現(xiàn)的位置
SELECT INSTR('city_company_staff', '_', 5) FROM dual --返回5
--表示從源字符串'city_company_staff'中第5個字符開始查找子字符串'_'第1次出現(xiàn)的位置
SELECT INSTR('city_company_staff', '_', 5, 1) FROM dual --返回5
--表示從源字符串'city_company_staff'中第3個字符開始查找子字符串'_'第2次出現(xiàn)的位置
SELECT INSTR('city_company_staff', '_', 3, 2) FROM dual --返回13
--start參數(shù)為-1,從右向左檢索唆涝,查找'_'字符串在源字符串中第1次出現(xiàn)的位置
SELECT INSTR('city_company_staff', '_', -1, 1) FROM dual --返回13
--start參數(shù)為-6找都,從右向左檢索,查找'_'字符串在源字符串中第2次出現(xiàn)的位置
SELECT INSTR('city_company_staff', '_', -6, 2) FROM dual --返回5
substr函數(shù)與instr函數(shù)截取
現(xiàn)有需求:數(shù)據(jù)查詢處理需要對code進(jìn)行"拆分"
code命名規(guī)則類似:城市所屬公司員工職位_員工姓名
其中廊酣,城市能耻、公司、職位亡驰、姓民字符串長度不固定晓猛,由于字符串長度不固定,只使用substr函數(shù)無法實(shí)現(xiàn)需求凡辱,需配合instr函數(shù)定位到字符'_'的位置戒职,然后使用substr函數(shù)進(jìn)行截取。詳細(xì)見下面例子透乾。
表數(shù)據(jù)如下:
SOURCE_CODE |
---|
BJ_BAIDU_CEO_LY |
SH_BOKE_MANAGER_LWX |
HRB_WM_CASHIER_OYZY |
獲取城市:
SELECT
SUBSTR (SOURCE_CODE, 1, INSTR (SOURCE_CODE, '_', 1, 1) - 1) AS CITY
FROM
TABLE_CODE_TEST
結(jié)果:
解釋:此處截取源字符串SOURCE_CODE洪燥,從第1個字符開始,由于代表城市的code長度不固定乳乌,我們無法確定截取幾個字符蚓曼,所以使用instr函數(shù)判斷第一個'_'字符的位置,進(jìn)而確定每個SOURCE_CODE截取幾個字符串钦扭。
那為什么減1呢?
是因?yàn)?strong>INSTR (SOURCE_CODE, '_', 1, 1)獲取的是源字符串中'_'字符第一次出現(xiàn)的位置床绪,再減1就得出了CITY字符個數(shù)客情。
獲取公司:
SELECT
SUBSTR (
SOURCE_CODE,
INSTR (SOURCE_CODE, '_', 1, 1) + 1,
INSTR (SOURCE_CODE, '_', 1, 2) - INSTR (SOURCE_CODE, '_', 1, 1)-1
) AS COMPANY
FROM
TABLE_CODE_TEST
結(jié)果:
解釋:截取源字符串,從(第一個''出現(xiàn)位置+1)開始癞己,截取個數(shù)為:第2個''出現(xiàn)位置減去第1個''出現(xiàn)位置膀斋,此時(shí)還多了一個下劃線'',再減去1即可得到代表公司字符串痹雅。
獲取姓名:
SELECT
SUBSTR (SOURCE_CODE, INSTR (SOURCE_CODE, '_', 1, 3) + 1) AS STF_NAME
FROM
TABLE_CODE_TEST
結(jié)果:
解釋:截取源字符串仰担,從('_'第3次出現(xiàn)位置+1)開始截取,截取到末尾绩社。