java工程配置

tonywi888發表於2007-12-19

1、 安裝

TOMCAT最新版本是5.0.29()

如果在WINDOWS下它可以自動找到你的JDK或者set JAVA_HOME=c:/jdk

在LINUX下需要先解壓,然後設定JAVA_HOME

export JAVA_HOME=/usr/local/jdk

2、 RUN

設定完畢後就可以執行tomcat伺服器了,進入tomcat的bin目錄,WINDOWS下用startup啟動tomcat,linux下用startup.sh,相應的關閉tomcat的命令為shutdown和shutdown.sh。

啟動服務後在瀏覽器裡輸入來測試一下

3、 目錄結構

Bin:存放啟動和關閉tomcat指令碼。

Conf:包含不同的配置檔案,server.xml(Tomcat的主要配置檔案)。

Work:存放jsp編譯後產生的class檔案。

Webapp:存放應用程式示例,以後你要部署的應用程式也要放到此目錄。

Logs:存放日誌檔案

Comm./server/shared:這三個資料夾下的LIB資料夾放jar檔案。

1、 配置server.xml檔案

沒有什麼好說的,看TOMCAT的文件比較有用,這裡提供一些主要的東西吧。

元素名

屬性

解釋

server

port

指定一個埠,這個埠負責監聽關閉tomcat的請求

shutdown

指定向埠傳送的命令字串

service

name

指定service的名字

Connector(表示客戶端和service之間的連線)

port

指定伺服器端要建立的埠號,並在這個斷口監聽來自客戶端的請求

minProcessors

伺服器啟動時建立的處理請求的執行緒數

maxProcessors

最大可以建立的處理請求的執行緒數

enableLookups

如果為true,則可以透過呼叫request.getRemoteHost()進行DNS查詢來得到遠端客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址

redirectPort

指定伺服器正在處理http請求時收到了一個SSL傳輸請求後重定向的埠號

acceptCount

指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理

connectionTimeout

指定超時的時間數(以毫秒為單位)

Engine(表示指定service中的請求處理機,接收和處理來自Connector的請求)

defaultHost

指定預設的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的

Context(表示一個web應用程式,通常為WAR檔案,關於WAR的具體資訊見servlet規範)

docBase

應用程式的路徑或者是WAR檔案存放的路徑

path

表示此web應用程式的url的字首,這樣請求的url為****

reloadable

這個屬性非常重要,如果為true,則tomcat會自動檢測應用程式的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程式,我們可以在不重起tomcat的情況下改變應用程式

host(表示一個虛擬主機)

name

指定主機名

appBase

應用程式基本目錄,即存放應用程式的目錄

unpackWARs

如果為true,則tomcat會自動將WAR檔案解壓,否則不解壓,直接從WAR檔案中執行應用程式

Logger(表示日誌,除錯和錯誤資訊)

className

指定logger使用的類名,此類必須實現org.apache.catalina.Logger 介面

prefix

指定log檔案的字首

suffix

指定log檔案的字尾

timestamp

如果為true,則log檔名中要加入時間,如下例:localhost_log.2001-10-04.txt

Realm(表示存放使用者名稱,密碼及role的資料庫)

className

指定Realm使用的類名,此類必須實現org.apache.catalina.Realm介面

Valve(功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣)

className

指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應用程式的訪問資訊

directory

指定log檔案存放的位置

pattern

有兩個值,common方式記錄遠端主機名或ip地址,使用者名稱,日期,第一行請求的字串,HTTP響應程式碼,傳送的位元組數。combined方式比common方式記錄的值更多

2、 管理

TOMCAT管理能力很強大,進入,自己慢慢管吧。實踐出真知,我喜歡這樣搞:

^_^,一切盡在掌握 。

一、讓資料庫連線池轉起來

作為一個J2EE程式設計師大家手上可能會有現成的JDBC 資料庫連線池,其實這沒有太大的必要,因為象weblogic……企業級WEBAPP都有自己的連線池,大家不要費力直接使用吧,效率也很不錯,再也不用羨慕.NET的ADO了(以前作MS從來不擔心資料連線,ADO確實用起來很爽),如果想實現一個 JDBC connection pool 的注意事項有:

1. 有一個簡單的函式從連線池中得到一個 Connection。

2. close 函式必須將 connection 放回 資料庫連線池。

3. 當資料庫連線池中沒有空閒的 connection, 資料庫連線池必須能夠自動增加 connection 個數。

4. 當資料庫連線池中的 connection 個數在某一個特別的時間變得很大,但是以後很長時間只用其中一小部分,應該可以自動將多餘的 connection 關閉掉。

5. 如果可能,應該提供debug 資訊報告沒有關閉的 new Connection 。

網上有各種各樣的連線池程式碼,抄過來改改吧,嘿嘿~

這裡介紹如何配置TOMCAT的連線池,以SQLSERVER為例:

步驟1:安裝SQLSERVER的JDBC驅動

SQLSERVER的JDBC驅動其實就是三個JAR檔案,msbase.jar/mssqlserver.jar/msutil.jar,將這三個檔案複製到你的/tomcat_home/common/lib目錄下去就可以了。

步驟2:修改server.xml檔案

具體程式碼如下:

factory

org.apache.commons.dbcp.BasicDataSourceFactory

<!-- Maximum number of dB connections in pool. Make sure you configure your mysqld max_connections large enough to handle all of your db connections. Set to 0 for no limit.--&gt

maxActive

50

<!-- Maximum number of idle dB connections to retain in pool. Set to 0 for no limit.--&gt

maxIdle

20

<!-- Maximum time to wait for a dB connection to become available in ms, in this example 0.5 seconds. An Exception is thrown if this timeout is exceeded. Set to -1 to wait indefinitely. --&gt

maxWait

500

<!-- msSQL dB username and password for dB connections --&gt

username

sa

password

sa

<!-- Class name for SQLServer2000 JDBC driver --&gt

driverClassName

com.microsoft.jdbc.sqlserver.SQLServerDriver

<!-- The JDBC connection url for connecting to your MS SQL Server dB.The autoReconnect=true argument to the url makes sure that the mm.Sql Server JDBC Driver will automatically reconnect if mysqld closed the connection. mysqld by default closes idle connections after 8 hours.--&gt

url

jdbc:microsoft:sqlserver://10.0.254.11:1433;databaseName=yourdb

<!--must use & not use & --&gt

步驟三:程式呼叫

package dbmanage;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.Date;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Enumeration;

import java.util.Hashtable;

import java.util.Vector;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.DataSource;

import util.smartDateFormat;

public class dbManager {

/************************************

* @param static private boolean VERBOSE ;

* @param Statement theStatement;

* @param PreparedStatement thePstmt;

* @param Connection theConnection;

************************************/

final static private boolean VERBOSE = true; //列印控制檯控制

//static Logger logger = Logger.getLogger(dbManager.class.getName());

private Context initCtx = null;

private Context ctx = null;

private DataSource ds = null;

private long timeout = 5000;

private Statement theStatement = null;

private PreparedStatement thePstmt = null;

/************************************

* 初試化initCtx

* 取得資料來源物件

************************************/

public

dbManager() {

try {

initCtx = new InitialContext();

//init context,read config web.xml

if (initCtx == null) {

throw new Exception("Initial Failed!");

}

ctx = (Context) initCtx.lookup("java:comp/env");

//find "jdbc/SqlServerDB" object this configruation in the SERVER.XML of Tomcat

if (ctx != null) {

ds = (DataSource) ctx.lookup("jdbc/SqlServerDB");

}

if (ds == null) {

throw new Exception("Look up DataSource Failed!");

}

}

catch (Exception e) {

log(e, "Can’t get the Context!");

}

}

/************************************

* get Connection

* @return Connection

************************************/

public synchronized

Connection getConnection() {

//get connection and set to delay time

long startTime = new java.util.Date().getTime();

Connection con = null;

while (con == null) {

con = newConnection();

if (con != null) {

//log("Create New Connection!");

break;

}

try {

log("連線超時,重新連線,等待" + timeout + "ms");

wait(timeout);

}

catch (InterruptedException e) {

log(e, "連線超時!");

}

if ( (new java.util.Date().getTime() - startTime) >= timeout) {

log("Connection timeout!");

break;

}

}

return con;

}

private

Connection newConnection() {

Connection con = null;

try {

con = ds.getConnection();

if (con == null) {

throw new Exception("Create Connection Failed!");

}

}

catch (Exception e) {

log("Create Connection Failed!");

System.out.println(e.getMessage());

}

return con;

}

/************************************

* release the connection

* @param conn Connection

* @param stmt Statement

* @param pstmt PreparedStatement

************************************/

public synchronized

void freeConnection(Connection conn,

Statement stmt,

PreparedStatement pstmt) {

try {

//close Statement

if (stmt != null) {

stmt.close();

stmt = null;

//log("Close Statement......");

}

//close PreparedStatement

if (pstmt != null) {

pstmt.close();

pstmt = null;

//log("Close PreparedStatement......");

}

}

catch (Exception e) {

System.out.println(e.getMessage());

}

try {

//close Connection

if (conn != null) {

conn.close();

conn = null;

//log("Close Connection......");

}

}

catch (SQLException e) {

log(e, "釋放資源出錯!");

}

}

/************************************

* write log file.

* @param s String

************************************/

private

void log(String s) {

if (VERBOSE) {

System.out.println(new java.util.Date() + ":" + s);

//logger.info(new java.util.Date()+s);

}

}

/************************************

* write log file.

* @param ex Object

************************************/

private

void logerr(Object ex) {

if (VERBOSE) {

//System.out.println(new java.util.Date()+":"+s);

//logger.error(ex);

}

}

/************************************

* write log file.

* @param e Throwable

* @param msg String

************************************/

private

void log(Throwable e, String msg) {

System.out.println(new java.util.Date() + ": " + msg);

//logger.info(new java.util.Date() + ": " + msg, e);

}

……

}

OK,你現在可以方便的使用連線池了,想要一個得一個,記得要釋放哦,連線池的數量總是有限的。

二、中文問題照樣很簡單

每個國家(或區域)都規定了計算機資訊交換用的字元編碼集,如美國的擴充套件 ASCII碼, 中國的 GB2312-80,日本的 JIS 等,作為該國家/區域內資訊處理的基礎,有著統一編碼的重要作用。字元編碼集按長度分為 SBCS(單位元組字符集),DBCS(雙位元組字符集)兩大類。早期的軟體(尤其是作業系統),為了解決本地字元資訊的計算機處理,出現了各種本地化版本(L10N),為了區分,引進了 LANG, Codepage 等概念。但是由於各個本地字符集程式碼範圍重疊,相互間資訊交換困難;軟體各個本地化版本獨立維護成本較高。因此有必要將本地化工作中的共性抽取出來,作一致處理,將特別的本地化處理內容降低到最少。這也就是所謂的國際化(I18N)。各種語言資訊被進一步規範為 Locale 資訊。處理的底層字符集變成了幾乎包含了所有字形的 Unicode。

現在大部分具有國際化特徵的軟體核心字元處理都是以 Unicode 為基礎的,在軟體執行時根據當時的 Locale/Lang/Codepage 設定確定相應的本地字元編碼設定,並依此處理本地字元。在處理過程中需要實現 Unicode 和本地字符集的相互轉換,甚或以 Unicode 為中間的兩個不同本地字符集的相互轉換。這種方式在網路環境下被進一步延伸,任何網路兩端的字元資訊也需要根據字符集的設定轉換成可接受的內容。

Java 語言內部是用 Unicode 表示字元的,遵守 Unicode V2.0。Java 程式無論是從/往檔案系統以字元流讀/寫檔案,還是往 URL 連線寫 HTML 資訊,或從 URL 連線讀取引數值,都會有字元編碼的轉換。這樣做雖然增加了程式設計的複雜度,容易引起混淆,但卻是符合國際化的思想的。從理論上來說,這些根據字符集設定而進行的字元轉換不應該產生太多問題。而事實是由於應用程式的實際執行環境不同,Unicode 和各個本地字符集的補充、完善,以及系統或應用程式實現的不規範,轉碼時出現的問題時時困擾著程式設計師和使用者。

其實解決 JAVA 程式中的漢字編碼問題的方法往往很簡單,但理解其背後的原因,定位問題,還需要了解現有的漢字編碼和編碼轉換。相信這樣的東西大家都見過了

new String(request.getParameter("test").getBytes("iso-8859-1"),"GBK")

但這樣的程式碼相信不是一個解決的辦法,這樣會增加程式的複雜度,寫資料庫,提交表單,URL中傳中文引數,到處都是中文問題!作為一個連走路都要算計最短距離的懶人,當然不願天天叨唸著new String(request.getParameter("test").getBytes("iso-8859-1"),"GBK"),然漢戰戰兢兢的處理各種字元轉換的問題,我跋山涉水,翻山越嶺,終於找到了完美的解決方式,在TOMCAT中只需要簡單的配置,引入2個檔案就可以輕鬆搞定。

前提條件,每個頁面使用

地球人都知道的東西。

步驟1:新增過濾器

在TOMCAT中找到這2個檔案RequestDumperFilter.java,SetCharacterEncodingFilter.java,他們位於D:Tomcat5.0.27webappsjsp-examplesWEB-INFclassesfilters,加到你的工程檔案裡去,編譯他們。

步驟2:配置WEB.XML

在web.xml里加入這一段

……

Set Character Encoding

filters.SetCharacterEncodingFilter

encoding

GBK

Set Character Encoding

/*

……

看到沒有?這樣你就不用寫那些麻煩的轉換程式碼了,當然這樣還不足以解決問題。

步驟3:修改server.xml

在server.xml修改2個地方

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" redirectPort="8443" acceptCount="100"

debug="0" connectionTimeout="20000"

disableUploadTimeout="true" URIEncoding=’GBK’/>

port="8009" minProcessors="5" maxProcessors="75"

enableLookups="true" redirectPort="8443"

acceptCount="10" debug="0" connectionTimeout="0"

useURIValidationHack="false" protocol="AJP/1.3"

protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"

URIEncoding=’GBK’/>

OK,搞定!

三、APACHE和TOMCAT他們倆關係非同一般

Apache和tomcat都是很優秀的軟體,更可貴的是它們是免費的。其實他們2個都是jakarta專案的重要組成部分。按輩分來講,TOMCAT是APACHE的兒子,APACHE的專長是解析靜態檔案,CGI,PHP……圖片……,兒子當然不能搶了老爹的飯碗,所以TOMCAT只有在J2EE這個上面發憤圖強,其實TOMCAT並非不能幹他老爹的活,只是穩定性差點而已(偶沒有明顯的感覺,可能是商業炒作吧),現在大家明白為什麼把他們2個扯一起了吧,上陣還靠父子兵呢~

把2個傢伙整一起有大致有2種方法,一種是利用mod_jk2.so,一種是利用mod_jk_1.2.5_2.0.47.dll。這2個東東叫聯接器(TOMCAT就是透過這傢伙與apache勾搭上的)

1、 利用mod_jk_1.2.5_2.0.47.dll在WINDOWS下整合

步驟1:準備材料

apache2.0.52

tomcat5.0.27

JDK(這個不用說了吧^_^)

mod_jk_1.2.5_2.0.47.dll(關鍵是這個東東啊,找了我N久),據說在下面連線可以下到,最後在我同事那找到的。

安裝apache tomcatJDK。

步驟2:安裝後設定環境變數

設定我的電腦屬性高階環境變數新建系統變數 變數名:JAVA_HOME 變數值:C:JBuilderXjdk1.4 (指向JDK的實際安裝路徑);TOMCAT_HMOM 變數值:Tomcat5.0.27;lasspath 編輯變數值中加上 ……;%JAVA_HOME%bin;%JAVA_HOME%lib;%TOMCAT_HOME%bin;.;

測試一下,訪問和,預設安裝是不會有什麼錯誤的^_^

把聯結器mod_jk_1.2.5_2.0.47.dll COPY到D:Apache2modules下。

步驟3:apache配置

在d:Apache2conf下找到httpd.conf,找到DirectoryIndex,在index.html後新增index.jsp;查詢“listen”用於本機測試時:Listen 127.0.0.1:80,我的是這樣設定的Listen *:80

查詢AddDefaultCharset設定為AddDefaultCharset off,這樣APACHE將以你頁面定義的字符集解析頁面。

在最後新增如下程式碼:

#localhost為本機,你可用本機ip

ServerAdmin #你的mail地址

DocumentRoot F:/uutang/uutang #你的專案組根目錄

ServerName dark #你的服務名,若你的機器有域名,設為域名

ErrorLog logs/ErrorLog.txt #錯誤日誌

CustomLog logs/CustomLog.txt common #訪問日誌

JkMount /servlet/* ajp13 #讓Apache支援對servlet傳送,用以Tomcat解析

JkMount /*.jsp ajp13 #讓Apache支援對jsp傳送,用以Tomcat解析

JkMount /*.do ajp13 #讓Apache支援對struts的action傳送,用以Tomcat解析

LoadModule jk_module modules/mod_jk_1.2.5_2.0.47.dll

JkWorkersFile "D:/Tomcat5.0.27/conf/workers.properties"

JkLogFile "D:/Tomcat5.0.27/logs/mod_jk2.log"

JkLogLevel info

步驟4:tomcat配置

在d:Tomcat5conf下新建一個workers.properties檔案 .內容如下:

workers.tomcat_home=d:Tomcat5 #讓mod_jk模組知道Tomcat

workers.java_home=d:jdk1.3 #讓mod_jk模組知道j2sdk

ps=

worker.list=ajp13 #模組版本,現有ajp13了,不要修改

worker.ajp13.port=8009 #工作埠,若沒佔用則不用修改

worker.ajp13.host=localhost #主機,若上面的Apache主機不為localhost,作相應修改

worker.ajp13.type=ajp13 #型別

worker.ajp13.lbfactor=1 #代理數,不用修改

修改TOMCAT的server.xml檔案:

<!-- Define a Coyote/JK2 AJP 1.3 Connector on port 8009 --&gt

port="8009" minProcessors="5" maxProcessors="75"

enableLookups="true" redirectPort="8443"

acceptCount="10" debug="0" connectionTimeout="0"

useURIValidationHack="false" protocol="AJP/1.3"

protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"

URIEncoding=’GBK’/>

讓TOMCAT知道ajp13協議,apache和tomcat倆父子間靠這個協議溝通。

測試一下,訪問和,看到相同的頁面沒有?細心點,其實很簡單,看看E文的幫助,搞定不成問題。

2、 利用mod_jk2.so(也叫JK2)整合

jk2是一個jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip檔案,主要用的是其中的mod_jk2.so。其實利用mod_jk2.so整合和利用mod_jk_1.2.5_2.0.47.dll整合大同小異,只是換了個聯接器而已,現在一步一步整起來~

步驟1:沒有多說的,安裝好TOMCAT和APACHE

下載jakarta-tomcat-connectors-jk2.0.4-win32-apache2.0.49.zip,解壓,將mod_jk2放到apache的安裝資料夾下的modules資料夾中。

步驟2:apache配置

在/conf中加入一個work.properties檔案,其內容如下:

<!--這個檔案的作用不是很清楚,總之路徑設定正確就行了。我的apache裝在D:/Apache2,根據情況自己修改。--&gt

[shm]

file=D:/ /Apache2/logs/shm.file

size=1048576

<!--這個socket channel是必須的,port和host對應於tomcat端的設定。--&gt

#The socket channel

[channel.socket:localhost:8009]

port=8009

host=localhost

<!--worker,必須的。--&gt

#define the worker

[ajp13:localhost:8009]

channel=channel.socket:localhost:8009

<!--url mapping,我的主要是.jsp和struts的.do,servlet的話設定成[uri:/xxx/*]之類的。--&gt

#uri mapping

[uri:/*] #和第一種方式一樣吧^_^

[uri:/*.jsp]

[uri:/*.do]

worker=ajp13:localhost:8009

在httpd.conf中,在LoadModule那裡加入這句:

LoadModule jk2_module modules/mod_jk2.so

在最後加入這句:

JkSet config.file "conf/work.properties"

這是告訴apache去哪裡找jk的配置的,根據具體情況修改。

還要修改一下DirectoryIndex,DirectoryIndex index.html index.html.var index.jsp查詢“listen”用於本機測試時:Listen 127.0.0.1:80,我的是這樣設定的Listen *:80。

當然還有我們的虛擬目錄:

ServerAdmin darkxie@hotmail.com

DocumentRoot F:/uutang/uutang

ServerName dark

ErrorLog logs/ErrorLog.txt

CustomLog logs/CustomLog.txt common

#JkMount /servlet/* ajp13

#JkMount /*.jsp ajp13

#JkMount /*.do ajp13

步驟3:tomcat配置

Tomcat的埠設定為8080。

在/conf資料夾加入jk2.properties檔案,其內容如下:

# Set the desired handler list

handler.list=apr,request,channelSocket

#

# Override the default port for the socketChannel

channelSocket.port=8009

TOMCAT自己已經生成了這個檔案,找到相關的地方把注視去掉改一下就成。

注意:用這種方式整合最好是自己編譯mod_jk2.so檔案,特別是在unix/linux下,我沒有環境,製作mod_webapp.so沒有自己作過。具體方法,自己去找吧。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8570952/viewspace-995034/,如需轉載,請註明出處,否則將追究法律責任。

相關文章