2008年9月23日
轉自凡人足跡
參數:
options
返回值:
xmlHttpRequest
使用HTTP請求一個頁面。
這是jquery的低級ajax實現。要查看高級抽象,見$.set、$.post等,這些方法更易于理解和使用。但是功能上有限制(例如,沒有錯誤處理函數)。
警告:如果數據類型指定為"script",那么POST自動轉化為GET方法。(因為script會作為一個嵌入頁面的script標簽進行載入)
$.ajax()函數返回它創建的XMLHttpRequest對象。在大部分情況下,你不需要直接操作此對象。通常,這個XMLHttpRequest對象主要用于需要手動中斷XMLHttpRequest請求的時候。
注意:如果你指明了下面列出的數據類型,請確保服務端發送了正確的MIME響應類型(如. xml 的類型是 "text/xml")。錯誤的MIME類型能夠導致腳本出現意想不到的問題。請查看AJAX的范例來了解數據類型的更多信息。
$.ajax()函數需要一個參數,一個包含有鍵/值對的對象,用于初始化并操作請求對象。
在jQuery 1.2版本中,如果你指明了一個JSONP回調函數,你就可以從其它的域中載入JSON類型的數據,寫法類似于 "myurl?callback=?" 。jQuery會自動調用正確的方法名稱來代替查詢字符串,執行你指定的回調函數。或者,你也可以指定jsonp的數據類型的回調函數,此函數會自動添加到Ajax請求中。
參數選項:
async(true) 數據類型: Boolean
默認情況下,所有的請求都是異步發送的(默認為true)。 如果需要發送同步請求, 設置選項為false。注意,同步請求可能會暫時的鎖定瀏覽器, 當請求激活時不能進行任何操作。
beforeSend 數據類型: Function
一個預處理函數用于在發送前修改XMLHttpRequest對象,設置自定義頭部等。 XMLHttpRequest作為惟一的參數被傳遞。這是一個 Ajax 事件。 function (XMLHttpRequest) {
this; // the options for this ajax request
}cache(true) 數據類型: Boolean
jQuery 1.2中新添加的參數, 如果設為false,則會強制瀏覽器不緩存請求的頁面。
complete 數據類型: Function
當請求完成時執行的函數(在成功或失敗之后執行)。這個函數有2個參數: XMLHttpRequest對象和一個描述HTTP相應的狀態字符串。 這是一個 Ajax 事件。 function (XMLHttpRequest, textStatus) {
this; // the options for this ajax request
}contentType("application/x-www-form-urlencoded") 數據類型: String
發送到
data 數據類型: Object,String
要發送給服務器的數據。如果不是字符串,那么它會被轉化為一個查詢字符串。在GET請求中它被添加到url的末尾。要防止這種自動轉化,請查看processData選項。 數據對象必須是一組鍵/值對。如果鍵對應的值是數組,jQuery會將其值賦給同一個鍵屬性。 例如 {foo:["bar1", "bar2"]} 變為 '&foo=bar1&foo=bar2'。
dataType( Intelligent Guess (xml or html)) 數據類型: String
期待由服務器返回值類型。如果沒有明確指定,jQuery會根據實際返回的MIME類型自動的將responseXML或responseText傳遞給success指定的回調函數。有效的類型(返回的類型的結果值會作為第一個參數傳遞給success指定的回調函數)有: "xml": 返回一個可以由jQuery處理的XML文檔。
"html": 返回文本格式的HTML代碼。包括求值后的腳本標記。
"script": 將響應作為
"json": 將響應作為JSON求值,并返回一個Javascript對象。
"jsonp": 使用JSONP載入一個JSON代碼塊. 會在URL的末尾添加"?callback=?"來指明回調函數。(jQuery 1.2以上的版本支持)
"text": 文本格式的字符串
error 數據類型: Function
請求失敗時執行的函數。函數具有3個參數: XMLHttpRequest對象,一個描述產生的錯誤類型和一個可選的異常對象, 如果有的化。 這是一個Ajax 事件。function (XMLHttpRequest, textStatus, errorThrown) {
// typically only one of textStatus or errorThrown
// will have info
this; // the options for this ajax request
}global(true) 數據類型: Boolean
是否為當前的請求觸發全局AJAX事件處理函數,默認值為true。設置為false可以防止觸發像ajaxStart或ajaxStop這樣的全局事件處理函數。這可以用于控制多個不同的Ajax事件。
ifModified(false) 數據類型: Boolean
只有響應自上次請求后被修改過才承認是成功的請求。是通過檢查頭部的Last-Modified值實現的。默認值為false,即忽略對頭部的檢查
jsonp 數據類型: String
在jsonp請求中重新設置回調的函數。這個值用于代替'callback=?'中的查詢字符串。'callback=?'位于get請求中url的末尾或是post請求傳遞的數據中。因此設置 {jsonp:'onJsonPLoad'} 會將 'onJsonPLoad=?' 傳送給服務器。
processData(true) 數據類型: Boolean
在默認的情況下,如果data選項傳進的數據是一個對象而不是字符串,將會自動地被處理和轉換成一個查詢字符串,以適應默認的content-type--"application/x-www-form-urlencoded"。如果想發送domDocuments,就要把這個選項設置為false。
success 數據類型: Function
當請求成功時調用的函數。這個函數會得到二個參數:從服務器返回的數據(根據“dataType”進行了格式化)和一個描述HTTP相應的狀態字符串。這是一個 Ajax 事件。 function (data, textStatus) {
// data could be xmlDoc, jsonObj, html, text, etc...
this; // the options for this ajax request
}timeout 數據類型: Number
如果通過$.ajaxSetup設置了一個全局timeout,那么此函數使用一個局部timeout覆蓋了全局timeout(單位為毫秒)。例如,你可以設置比較長的延遲給一個特殊的請求,同時其他所有請求使用1秒的延遲。有關全局延遲,見$.ajaxTimeout()。
type("GET") 數據類型: String
請求的類型 ("POST" 或 "GET"), 默認是 "GET"。注意:其他的HTTP請求方法,如PUT和DELETE,在這里也可以使用,當時它們并不被所有的瀏覽器支持。
url(The current page) 數據類型: String
請求發送的目標URL地址
username 數據類型: String
username可用于在響應一個HTTP連接時的認證請求。 實例
載入并執行一個JavaScript文件。
$.ajax({
type: "GET",
url: "test.js",
dataType: "script"
});保存數據到服務器,完成后通知用戶。
$.ajax({
type: "POST",
url: "some.
data: "name=John&location=Boston",
success: function(msg){
alert( "Data Saved: " + msg );
}
});取得一個HTML頁面的最新版本。
$.ajax({
url: "test.html",
cache: false,
success: function(html){
$("#results").append(html);
}
});同步載入數據。在執行請求的時候阻塞瀏覽器。這是在保證數據的同步性比交互更重要的情況下的一種更好的方法。
var html = $.ajax({
url: "some.php",
async: false
}).responseText;向服務器發送xml文檔數據。通過設置processData選項為false,將數據自動轉換為string的動作被禁止了。
var xmlDocument = [create xml document];
$.ajax({
url: "page.php",
processData: false,
data: xmlDocument,
success: handleResponse
});load( url, [data], [callback] )參數:
url (String): 裝入頁面的URL地址。
params (Map): (可選)發送到服務端的鍵/值對參數。
callback (Function): (可選) 當數據裝入完成時執行的函數. function (responseText, textStatus, XMLHttpRequest) {
this; // dom element
}返回值:
jQuery
裝入一個遠程HTML內容到一個DOM結點。 默認使用get方法發送請求,但如果指定了額外的參數,將會使用post方法發送請求。在 jQuery 1.2中,可以在URL參數中指定一個jQuery選擇器,這會過濾返回的HTML文檔,只取得文檔中匹配選擇器的元素。此
實例
載入文檔的sidebar的導航部分到一個無序列表中。
$("#links").load("/Main_Page #p-Getting-Started li");將feeds.html文件載入到id為feeds的div中。
$("#feeds").load("feeds.html");同上,但是發送了附加的參數,并且在響應結束后執行一個自定義函數。
$("#feeds").load("feeds.php", {limit: 25}, function(){
alert("The last 25 entries in the feed have been loaded");
});jQuery.get( url, [data], [callback] )參數:
url (String): 裝入頁面的URL地址
Map(可選): (可選)發送到服務端的鍵/值對參數
callback (Function): (可選) 當遠程頁面裝入完成時執行的函數 function (data, textStatus) {
// data可以是xmlDoc, jsonObj, html, text, 等...
this; // the options for this ajax request
}返回值:
XMLHttpRequest
使用GET請求一個頁面。
這是向服務器發送get請求的簡單方法。它可以指定一個回調函數,在請求完成后執行(只有在請求成功時)。如果還需要設置error和success回調函數,則需要使用$.ajax。
實例
請求test.php頁,忽略返回值.
$.get("test.php");請求test.php頁并發送附加數據(忽略返回值).
$.get("test.php", { name: "John", time: "2pm" } );顯示從test.php請求的返回值(HTML 或 XML, 根據不同返回值).
$.get("test.php", function(data){
alert("Data Loaded: " + data);
});顯示向test.cgi發送附加數據請求的返回值 (HTML 或 XML, 根據不同返回值).
$.get("test.cgi", { name: "John", time: "2pm" },
function(data){
alert("Data Loaded: " + data);
});jQuery.getJSON( url, [data], [callback] )參數:
url (String): 裝入頁面的URL地址
Map(可選): (可選)發送到服務端的鍵/值對參數
callback (Function): (可選) 當數據裝入完成時執行的函數 function (data, textStatus) {
// data will be a jsonObj
this; // the options for this ajax request
}返回值:
XMLHttpRequest
使用GET請求JSON數據。
在jQuery 1.2版本中,如果你指明了一個JSONP回調函數,你就可以從其它的域中載入JSON類型的數據,寫法類似于 "myurl?callback=?" 。jQuery會自動調用正確的方法名稱來代替查詢字符串,執行你指定的回調函數。或者,你也可以指定jsonp的數據類型的回調函數,此函數會自動添加到Ajax請求中。注意: 請記住, that lines after this function will be executed before callback.
實例
從Flickr JSONP API中載入最新的四幅貓的圖片
$.getJSON("
function(data){
$.each(data.items, function(i,item){
$("<img/>").attr("src", item.media.m).appendTo("#images");
if ( i == 3 ) return false;
});
});從test.js載入JSON數據, 從返回的JSON數據讀取name值。
$.getJSON("test.js", function(json){
alert("JSON Data: " + json.users[3].name);
});從test.js載入JSON數據, 傳遞一個附加參數,從返回的JSON數據讀取name值。
$.getJSON("test.js", { name: "John", time: "2pm" }, function(json){
alert("JSON Data: " + json.users[3].name);
});顯示向test.php發送請求的返回值 (HTML 或 XML, 根據不同返回值).
$.getIfModified("test.php", function(data){
alert("Data Loaded: " + data);
});顯示向test.php發送請求的返回值 (HTML 或 XML, 根據不同返回值),提供了一個附加的參數.
$.getIfModified("test.php", { name: "John", time: "2pm" },
function(data){
alert("Data Loaded: " + data);
});列出從pages.php返回的查詢結果,將返回的數組轉化為一段HTML代碼。
var id=$("#id").attr("value");
$.getJSON("pages.php",{id:id},dates);
function dates(datos)
{
$("#list").html("Name:"+datos[1].name+"<br>"+"Last Name:"+datos[1].lastname+"<br>"+"Address:"+datos[1].address);
}jQuery.getScript( url, [callback] )參數:
url (String): 裝入頁面的URL地址
callback (Function): (可選) 當數據裝入完成時執行的函數 function (data, textStatus) {
// data應該是javascript
this; // the options for this ajax request
}返回值:
XMLHttpRequest
使用GET請求JavaScript文件并執行。
在jQuery 1.2前, getScript只能從頁面所在的主機載入腳本,1.2中, 你可以從任何主機載入腳本。警告: Safari 2 及其更老的版本不能在全局上下文中正確識別腳本。如果你通過getScript載入函數,請保證設置一個延遲來執行這個腳本。
實例
我們動態的載入一個新的官方jQuery顏色動畫插件,載入后綁定一些動畫效果到元素上。
$.getScript("
$("#go").click(function(){
$(".block").animate( { backgroundColor: 'pink' }, 1000)
.animate( { backgroundColor: 'blue' }, 1000);
});
});載入test.js JavaScript文件并執行。
$.getScript("test.js");載入test.js JavaScript文件并執行,當執行結束后顯示一條警告信息。
$.getScript("test.js", function(){
alert("Script loaded and executed.");
});jQuery.post( url, [data], [callback], [type] )參數:
url (String): 裝入頁面的URL地址
Map(可選): (可選)發送到服務端的鍵/值對參數
callback (Function): (可選) 當數據裝入完成時執行的函數 function (data, textStatus) {
// data可能是 xmlDoc, jsonObj, html, text, 等...
this; // the options for this ajax request
}String $.postJSON = function(url, data, callback) {
$.post(url, data, callback, "json");
};返回值:
XMLHttpRequest
使用POST請求一個頁面。
這是向服務器發送post請求的簡單方法。它可以指定一個回調函數,在請求完成后執行(只有在請求成功時)。如果還需要設置error和success回調函數,則需要使用$.ajax。
ajaxComplete( callback )參數:
callback (Function): 要執行的函數 function (event, XMLHttpRequest, ajaxOptions) {
this; // dom element listening
}返回值:
jQuery
當一個AJAX請求結束后,執行一個函數。這是一個Ajax事件
實例
當AJAX請求完成時顯示一條信息。
$("#msg").ajaxComplete(function(request, settings){
$(this).append("<li>Request Complete.</li>");
});ajaxError( callback )參數:
callback (Function): 要執行的函數 function (event, XMLHttpRequest, ajaxOptions, thrownError) {
// thrownError only passed if an error was caught
this; // dom element listening
}返回值:
jQuery
當一個AJAX請求失敗后,執行一個函數。這是一個Ajax事件.
實例
當AJAX請求錯誤時顯示一條信息。
$("#msg").ajaxError(function(request, settings){
$(this).append("<li>Error requesting page " + settings.url + "</li>");
});ajaxSend( callback )參數:
callback (Function): 要執行的函數 function (event, XMLHttpRequest, ajaxOptions) {
this; // dom element listening
}返回值:
jQuery
在一個AJAX請求發送時,執行一個函數。這是一個Ajax事件.
實例
當AJAX請求發出后顯示一條信息。
$("#msg").ajaxSend(function(evt, request, settings){
$(this).append("<li<Starting request at " + settings.url + "</li<");
});ajaxStart( callback )參數:
callback (Function): 要執行的函數 function () {
this; // dom element listening
}返回值:
jQuery
在一個AJAX請求開始但還沒有激活時,執行一個函數。這是一個Ajax事件.
實例
當AJAX請求開始(并還沒有激活時)顯示loading信息。
$("#loading").ajaxStart(function(){
$(this).show();
});ajaxStop( callback )參數:
callback (Function): 要執行的函數 function () {
this; // dom element listening
}返回值:
jQuery
當所有的AJAX都停止時,執行一個函數。這是一個Ajax事件.
實例
當所有AJAX請求都停止時,隱藏loading信息。
$("#loading").ajaxStop(function(){
$(this).hide();
});ajaxSuccess( callback )參數:
callback (Function): 要執行的函數 function (event, XMLHttpRequest, ajaxOptions) {
this; // dom element listening
}返回值:
jQuery
當一個AJAX請求成功完成后,執行一個函數。這是一個Ajax事件
實例
當AJAX請求成功完成時,顯示信息。
$("#msg").ajaxSuccess(function(evt, request, settings){
$(this).append("<li>Successful Request!</li>");
});jQuery.ajaxSetup( options )參數:
Options: 用于Ajax請求的鍵/值對
為所有的AJAX請求進行全局設置。查看$.ajax函數取得所有選項信息。
實例
設置默認的全局AJAX請求選項。
$.ajaxSetup({
url: "/xmlhttp/",
global: false,
type: "POST"
});
$.ajax({ data: myData });serialize( )返回值:
jQuery
以名稱和值的方式連接一組input元素。返回值類似于: single=Single2&multiple=Multiple&multiple=Multiple3&radio=radio2 。在jQuery 1.2中。serialize方法實現了正確表單元素序列,而不再需要插件支持。
實例
連接表單元素的一組查詢字符串,可用于發送Ajax請求。
function showValues() {
var str = $("form").serialize();
$("#results").text(str);
}
$(":checkbox, :radio").click(showValues);
$("select").change(showValues);
showValues();serializeArray( )返回值:
jQuery
連接所有的表單和表單元素(類似于.serialize()方法),但是返回一個JSON數據格式。
實例
從form中取得一組值,顯示出來
function showValues() {
var fields = $(":input").serializeArray();
alert(fields);
$("#results").empty();
jQuery.each(fields, function(i, field){
$("#results").append(field.value + " ");
});
}
$(":checkbox, :radio").click(showValues);
$("select").change(showValues);
showValues();
2008年9月22日
EditPlus技巧
------------------------------------------------------
技巧中,基于平時我對EditPlus的摸索實踐而成,在編譯器集成例子中參照了部分官方的文獻。有幾篇是從網上搜集來的,這里我注明了來源或原始作者。如果你是相應作者,不希望文章放在這里,請通知我,我會及時刪掉。 -----Liangjh
自己寫的一些里面,不見得有多大的技術含量,只是希望有時能夠節省大家的一些時間
------------------------------------------------------
文章或者技巧及原始作者或出處:
正則表達式類
【1】 正則表達式應用——替換指定內容到行尾
【2】 正則表達式應用——數字替換----------------------------Microshaoft@CCF,jiuk2k@CCF
【3】 正則表達式應用——刪除每一行行尾的指定字符
【4】 正則表達式應用——替換帶有半角括號的多行
【5】 正則表達式應用——刪除空行----------------------------江德華
軟件技巧類
------------------------------------------------------
【6】 軟件技巧——鍵盤記錄的注意事項
【7】 軟件技巧——關閉文檔標簽的便捷方法
【8】 軟件技巧——如何去掉 EditPlus 保存文本文件時的添加后綴提示?
【9】 軟件技巧——提示找不到語法文件的解決辦法
【10】軟件技巧——設置editplus支持其它文字,如韓文----------jackywu1978@LJF
【11】軟件技巧——FTP 上傳的設置----------------------------李應文2.11漢化版
【12】軟件技巧——如何禁用備份文件功能?
【13】軟件技巧——添加語法文件、自動完成文件、以及剪輯庫文件
工具集成類
------------------------------------------------------
【14】工具集成——編譯器集成例子(Java、Borland C++、Visual C++、Inno Setup、nsis、C#)
【15】工具集成——讓Editplus調試PHP程序----------------------avenger,aukw@CCF
【16】工具集成——打造 PHP 調試環境(二)----------------------老七2.11漢化版
【17】在 WINPE 中集成 EDITPLUS
后續添加
------------------------------------------------------
【18】支持帶UTF-8標記/不帶UTF-8標記的文件
【19】建立文件關聯,以便在資源管理器中雙擊打開對應語法文件
【20】特別應用,雙擊單詞選擇問題
【21】在Editplus中使用CVS版本控制功能---------------------sunbn@CCF
每個步驟都說得很詳細了,就沒有必要貼圖了,體積不要太大才好。
【1】正則表達式應用——替換指定內容到行尾
原始文本如下面兩行
abc aaaaa
123 abc 444
希望每次遇到“abc”,則替換“abc”以及其后到行尾的內容為“abc efg”
即上面的文本最終替換為:
abc efg
123 abc efg
解決:
① 在替換對話框,查找內容里輸入“abc.*”
② 同時勾選“正則表達式”復選框,然后點擊“全部替換”按鈕
其中,符號的含義如下:
“.” =匹配任意字符
“*” =匹配0次或更多
注意:其實就是正則表達式替換,這里只是把一些曾經提出的問題加以整理,單純從正則表達式本身來說,就可以引申出成千上萬種特例。
【2】正則表達式應用——數字替換 (Microshaoft@CCF,jiuk2k@CCF)
希望把
asdadas123asdasdas456asdasdasd789asdasd
替換為:
asdadas[123]asdasdas[456]asdasdasd[789]asdasd
在替換對話框里面,勾選“正則表達式”復選框;
在查找內容里面輸入“[0-9][0-9][0-9]”,不含引號
“替換為:”里面輸入“[\0\1\2]”,不含引號
范圍為你所操作的范圍,然后選擇替換即可。
實際上這也是正則表達式的使用特例,“[0-9]”表示匹配0~9之間的任何特例,同樣“[a-z]”就表示匹配a~z之間的任何特例
上面重復使用了“[0-9]”,表示連續出現的三個數字
“\0”代表第一個“[0-9]”對應的原型,“\1”代表第二個“[0-9]”對應的原型,依此類推
“[”、“]”為單純的字符,表示添加“[”或“]”,如果輸入“其它\0\1\2其它”,則替換結果為:
asdadas其它123其它asdasdas其它456其它asdasdasd其它789其它asdasd
■功能增強(by jiuk2k@CCF):
如果將查找內容“[0-9][0-9][0-9]”改為“[0-9]*[0-9]”,對應1 或 123 或 12345 或 ...
也可以這樣定制
查找: ([0-9]+)
替換: [\1]或 [$1]
在 \1 或大或 $1 后面加入欲替換目標
■補充(by jiuk2k@CCF)
editplut支持的只是Regular expression 的子集,如果用其它支持全集的替換軟件可以如下簡單操作
正則表達式應用——數字替換 :
search: ([\d]+)
replace: [\1] or [$1]
editplus:
search: ([0-9]+)
replace: [\1]
【3】正則表達式應用——刪除每一行行尾的指定字符
因為這幾個字符在行中也是出現的,所以肯定不能用簡單的替換實現
比如
12345 1265345
2345
需要刪除每行末尾的“345”
這個也算正則表達式的用法,其實仔細看正則表達式應該比較簡單,不過既然有這個問題提出,說明對正則表達式還得有個認識過程,解決方法如下
解決:
在替換對話框中,啟用“正則表達式”復選框
在查找內容里面輸入“345$”
這里“$”表示從行尾匹配
如果從行首匹配,可以用“^”來實現,不過 EditPlus 有另一個功能可以很簡單的刪除行首的字符串
a. 選擇要操作的行
b. 編輯-格式-刪除行注釋
c. 在彈出對話框里面輸入要清除的行首字符,確定
【4】正則表達式應用——替換帶有半角括號的多行
幾百個網頁中都有下面一段代碼:
我想把它們都去掉,可是找了很多search & replace的軟件,都是只能對“一行”進行操作。
EditPlus 打開幾百個網頁文件還是比較順暢的,所以完全可以勝任這個工作。
具體解決方法,在 Editplus 中使用正則表達式,由于“(”、“)”被用做預設表達式(或者可以稱作子表達式)的標志,所以查找
“\n”
時會提示查找不到,所以也就無法進行替換了,這時可以把“(”、“)”使用任意字符標記替代,即半角句號:“.”。替換內容為
\n
在替換對話框啟用“正則表達式”選項,這時就可以完成替換了
補充:(lucida@******)
對( ) 這樣的特殊符號,應該用\( \)來表示,這也是很標準的regexp語法,可以寫為
\n
■補充(by jiuk2k@CCF)
editplut支持的只是Regular expression 的子集,如果用其它支持全集的替換軟件可以如下簡單操作
search:
replace: 空格
【5】正則表達式應用——刪除空行
啟動EditPlus,打開待處理的文本類型文件。
①、選擇“查找”菜單的“替換”命令,彈出文本替換對話框。選中“正則表達式”復選框,表明我們要在查找、替換中使用正則表達式。然后,選中“替換范圍”中的“當前文件”,表明對當前文件操作。
②、單擊“查找內容”組合框右側的按鈕,出現下拉菜單。
③、下面的操作添加正則表達式,該表達式代表待查找的空行。(技巧提示:空行僅包括空格符、制表符、回車符,且必須以這三個符號之一作為一行的開頭,并且以回車符結尾,查找空行的關鍵是構造代表空行的正則表達式)。
直接在"查找"中輸入正則表達式“^[ \t]*\n”,注意\t前有空格符。
(1)選擇“從行首開始匹配”,“查找內容”組合框中出現字符“^”,表示待查找字符串必須出現在文本中一行的行首。
(2)選擇“字符在范圍中”,那么在“^”后會增加一對括號“[]”,當前插入點在括號中。括號在正則表達式中表示,文本中的字符匹配括號中任意一個字符即符合查找條件。
(3)按一下空格鍵,添加空格符。空格符是空行的一個組成成分。
(4)選擇“制表符”,添加代表制表符的“\t”。
(5)移動光標,將當前插入點移到“]”之后,然后選擇“匹配 0 次或更多”,該操作會添加星號字符“*”。星號表示,其前面的括號“[]”內的空格符或制表符,在一行中出現0個或多個。
(6)選擇“換行符”,插入“\n”,表示回車符。
④、“替換為”組合框保持空,表示刪除查找到的內容。單擊“替換”按鈕逐個行刪除空行,或單擊“全部替換”按鈕刪除全部空行(注意:EditPlus有時存在“全部替換”不能一次性完全刪除空行的問題,可能是程序BUG,需要多按幾次按鈕)。
■補充(by jiuk2k@CCF)
editplut支持的只是Regular expression 的子集,如果用其它支持全集的替換軟件可以如下簡單操作
search: ^\s+
replace: 空格
相關內容還有很多,可以自己參考正則表達式的語法仔細研究一下
【6】軟件技巧——鍵盤記錄的注意事項
EditPlus 的鍵盤記錄有些類似于 UltraEdit 的宏操作,不過功能相對單一,錄制的文件可編輯性較差。
由于基本無法編輯錄制的文件,所以錄制的時候為了避免錄制失敗,推薦純粹使用鍵盤操作,以下是比較關鍵的幾個鍵盤組合:
Ctrl+F = 調出查找對話框
Ctrl+H = 調出替換對話框
Alt+F4 = 關閉作用,比如,關閉查找對話框、關閉替換對話框,等等
其它鍵盤快捷鍵在“幫助-快捷鍵列表”里面可以很容易的查找到,這里就不細說了。
【7】軟件技巧——關閉文檔標簽的便捷方法
右鍵單擊文檔標簽工具條,彈出菜單中選擇“標簽選項”,選中“用鼠標中間的按鈕關閉”,這里包括鼠標的滾輪。
【8】軟件技巧——如何去掉 EditPlus 保存文本文件時的添加后綴提示?
如果你使用 EditPlus 進行文本編輯,那么每次創建文本文件,編輯后保存時,盡管文件類型下拉列表中顯示的是文本文件, EditPlus 還是詢問你是否添加".txt"后綴,是不是很煩?
解決方法:
① 在程序目錄建立一個空的文件“template.txt”
② “工具-參數設置-模板”里面,單擊“添加”按鈕添加模板,“菜單文本”這里輸入“Text”,瀏覽“template.txt”,之后確定即可
③ “文件-新建-text”,就可以建立一個空的文本文件,保存時,這個文件自動帶有擴展名".txt",也就避免了令人頭疼的確認
④ 模板設置文件名稱為“template.ini”,如果和主程序同一路徑,可以使用相對路徑
羅嗦了點,不過管用
要自動創建帶有某種后綴的文件,方法同上。
【9】軟件技巧——提示找不到語法文件 *.stx 的解決辦法
原因多為設置的語法文件不存在或者是路徑設置不對。這是因為 EditPlus 的語法是設置文件采用的是絕對路徑,而在你設置了語法文件之后,再把程序復制到其它目錄,因而導致 EditPlus 無法找到該語法文件。
解決辦法:
在主程序目錄里,找到 Setting.ini 這是 EditPlus 存放語法的文件
查找后綴為“.stx”、“acp”的文本內容,或者查找帶有驅動器符號的行,比如
Syntax file=C:\Program Files\EditPlus 2\cpp.stx
那么,就把”C:\Program Files\EditPlus 2\“替換成你當前軟件的路徑。
其它提示找不到文件的解決方法同上
【10】軟件技巧——設置editplus支持其它文字,如韓文
在editplus里打開文件,出來打開文件對話框;然后點擊“轉換器”后面的那個省略號,會出來自定義轉換器對話框;在右邊選擇你需要的編碼方式,添加到左邊,然后點確定;最后在下拉框中選擇需要的編碼方式,然后打開文件即可。
【11】軟件技巧——FTP 上傳的設置
“文件->遠程操作->FTP 上傳”在“設置”選項卡中設置好參數(“子目錄”前面應該加“/”如“/web/”),點擊“確定”回到“FTP 上傳”選項卡,然后點擊“上傳”即可;“批量上傳”的設置類似。
【12】軟件技巧——如何禁用備份文件功能?
在“參數選擇”的文件選項頁,禁用“'保存時自動創建備份文件”選項
【13】軟件技巧——添加語法文件、自動完成文件、以及剪輯庫文件
要添加 *.STX(語法文件)或 *.ACP(自動完成文件):
1. 選擇“參數選擇→語法”
2. 單擊“添加”按鈕,命名,在“擴展名”部分輸入對應擴展名(不帶“.”)
3. 瀏覽/輸入 STX(語法文件部分) 以及 ACP(自動完成文件部分)。
添加剪輯庫文件(*.CTL)
復制相應 *.CTL 文件到軟件安裝目錄,重新啟動 EditPlus ,則系統自動識別。
作者主頁有很多語法自動完成文件下載,地址
http://editplus.com/files.html
【14】工具集成——編譯器集成例子(Java、Borland C++、Visual C++、Inno Setup、nsis)
在“工具→參數選擇→用戶工具”選項頁設置,設置步驟
① 設置組名稱,這里也可以不設置
② 單擊“添加工具→應用程序”按鈕并進行如下設置
③ 各種類似"$(FilePath)"的參數可以在文本框右側的箭頭下拉菜單中獲取,具體含義如下
參數 描述
$(FilePath) 文件路徑(文件全名,含目錄和文件名)
$(FileDir) 文件目錄(不帶文件名)
$(FileName) 文件名(不帶目錄)
$(FileNameNoExt) 不帶擴展名的文件名(不帶目錄)
$(FileExt) 擴展名(當前文件)
$(ProjectName) 工程名稱(當前工程名)
$(CurLine) 當前行號(光標位置處的行號)
$(CurCol) 當前列號(光標位置處的列號)
$(CurSel) 當前文本(插入當前選定文本)
$(CurWord) 當前單詞(插入當前單詞)
$(WindowList) 顯示當前窗口列表并選擇特定文件
例子 1. Java 編譯器
菜單文本:Java 編譯器
命令:c:\java\bin\javac.exe
參數:"$(FilePath)"
初始目錄:$(FileDir)
捕獲輸出:開啟
要運行已編譯的 Java 類文件,你可以進行如下設置:
菜單文本:Java
命令:c:\java\bin\java.exe
參數:$(FileNameNoExt)
初始目錄:$(FileDir)
“命令”部分應當替換為實際的 Java 解釋器的路徑。
例子 2. Borland C++
菜單文本:Borland C
命令:c:\bc\bin\bcc32.exe
參數:-Ic:\bc\include -Lc:\bc\lib -n$(FileDir) $(FilePath)
初始目錄:c:\bc\bin
捕獲輸出:開啟
例子 3. Visual C++
菜單文本:Visual C++
命令:c:\msdev\vc98\bin\cl.exe
參數:"$(FilePath)"
初始目錄:$(FileDir)
捕獲輸出:開啟
例子 4. Inno Setup
菜單文本:編譯 Inno
命令:C:\Program Files\Inno Setup 4\Compil32.exe”
參數:/cc $(FileName)
初始目錄:$(FileDir)
捕獲輸出:開啟
例子 5. nsis
菜單文本:編譯 nsis
命令:C:\NSIS\makensis.exe
參數:$(FileName)
初始目錄:$(FileDir)
捕獲輸出:開啟
例子 6. C#
菜單文本:編譯 C#
命令:C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\csc.exe
參數:$(FileName)
初始目錄:$(FileDir)
捕獲輸出:開啟
在上面設置中,在命令部分,必須使用系統中各自編譯器的絕對路徑。
設置完畢后,你可以在“工具”菜單運行對應工具了,運行結果會顯示在底部的輸出窗口,你也可以通過快捷鍵(Ctrl + 0-9) 運行,或者是通過“用戶工具欄”的快捷按鈕運行。
要運行已編譯的 *.exe 文件,你可以進行如下設置(此時可執行文件需要和編譯文件同名):
菜單文本:Run
命令:$(FileNameNoExt)
參數:
初始目錄:$(FileDir)
【15】工具集成—— 讓Editplus調試PHP程序
1:打開Editplus,選擇"工具->配置用戶工具..."菜單。
2:在彈出的窗口中選擇"添加工具->應用程序",給新程序起一個好記的名字,比如這里我們用"Debug PHP",在"菜單文本"中輸入"Debug PHP"。點擊"命令行"右邊的按鈕,找到你的php.exe所在的路徑,例如這里是"c:\php\php.exe"。再點擊"參數"右邊的下拉按鈕選擇"文件路徑",最后再把"捕獲輸出"前面的復選框選上。
3:現在測試一下,新建一個php文件,按快捷鍵Ctrl+1可以激活剛才我們設置的工具(如果你設置了多個工具,快捷鍵可能會有所不同),現在你可以看到它已經能正常工作了。但是還有一點不太理想:如果你的PHP程序出錯,在輸出窗口會提示你第幾行出錯 ,單擊這一行提示,Editplus老是提示你找不到某某文件,是否新建。接下下我們要修正這個功能。
4:打開剛才用戶工具設置窗口,找到剛才設置的"Debug PHP"工具。點擊"捕獲輸出"復選框旁邊的"輸出模式"按鈕,會彈出一個定義輸出模式的窗體,把"使用默認輸出模式"前面的復選框去掉, 在"正則表達式"這一項的文本框中輸入" ^.+ in (.+) line ([0-9]+) "(不包括引號),細心的朋友可能會發現,這里使用的也正則表達式的語法。然后,在下面的"文件名"下拉菜單中選擇"預設表達式 1",即上邊正則表達式中的第一個參數,"行"下拉菜單項選擇"預設表達式 2","列"下拉項保持為空。然后保存設置。
5:好了,現在再來試一下吧,雙擊出錯的行數,Editplus就會自動激活出錯文件,并把光標定位到出錯行,是不是特別方便呢?!
現在,Editplus經過我們的"改造",已經可以即時的調試PHP文件了,雖然還不是"可視化"界面的,但對于一些平常的小程序來查錯還是非常好用的。Editplus真是不款不可多得的好工具,如果你有什么使用技巧,不要忘了大家一起分享哦。^O^
如果不能切換錯誤行號,請嘗試作如下修改: (by aukw@CCF)
1.php.ini 中html_errors = Off打開
//如果你不打開,3.中的表達式要修改
2.參數改成:-q -f "$(FilePath)"
//不加"符號的話文件名有空格的文件調試失敗。。
//-q不輸出html頭信息,你去掉也行,不過調試時候你一般用不到那些header信息
3." ^.+ in (.+) line ([0-9]+) " 改成 "^.+ in (.+) on line ([0-9]+)$"
//如果還是不行,請注意調試結果,自己修改表達式來取出文件名和行號
【16】工具集成——打造 PHP 調試環境(二)
1: 把剪輯庫定位在 PHP4 Functions 上就可以在編輯時, 利用[插入]->[匹配剪輯]命令,就可以自動完成末輸入完整的 PHP 函數(或直接按 F2 鍵)
2: 類似上面,在選擇部分文字后,同樣可以自動完成。(同 F2)
3: 在[參數選擇]->[設置和語法]->PHP->自動完成, 選擇目錄下的 php.acp 文件,你可以定制自己的自動完成方式.
4: 想要即時預覽文件,可在[參數選擇]->[工具]->WEB 服務器中添加本地目錄,(注意不要加 http:// , 應是一個有效的站點)。
如: 主機->localhost/php | 根目錄->D:\php
主機->localhost/asp | 根目錄->D:\asp
主機->localhost/cgi | 根目錄->D:\cgi
完成設置后只要腳本文件位于這些目錄下(子目錄也沒問題), 就能夠正確解釋.
5: 各種語法和模板文件可以在 http://editplus.com/files.html 獲得,可根據需要選用和編輯。
6: Ctrl+F11 可顯示當前文件中的函數列表.
7: 添加各種用戶工具.如:
啟動MYSQL服務器管理工具->C:\mysql\bin\winmysqladmin.exe
啟動Apache服務器->C:\Apache\bin\Apache.exe -k start
啟動Apache服務器->C:\Apache\bin\Apache.exe -k stop (shutdown)
8: DBG 附帶有一個 prof_results.php 文件,可剖析 PHP 程序的性能.
雖不是真正的調試器,但已經夠了.
OK! 經過改造后,是不是有點象一個 IDE 什么?還差點,沒有即時幫助...看我的,再來:
9: 把 php_manual_en.chm (最好是擴展幫助手冊)加入到用戶工具中, 當遇到需要參考的關鍵字時, 把光標定位其上, 按下快捷鍵 Ctrl+1, 看到了嗎.
在輸入時有想不起來的函數名時, 先按照第 1 條的方法調出函數, 然后...怎么樣?
以上有的是對于調試工具的設置,由于此類工具比較多,大家設置時參考以上的基本就差不多了,所以就不過多的列舉了。
【17】在 WINPE 中集成 EDITPLUS
可以基于目前的bartpe做得WINPE中,菜單使用nu2menu制作
默認位置為 \programs\editplus\
默認系統位置為光盤的 i386 目錄
i386/system32 的 autorun.bat 中添加外殼集成(系統右鍵)
regedit /s %SystemDrive%\programs\editplus\REG.REG
regsvr32 /s \programs\editplus\EPPSHELL.DLL
(reg.reg保存了epp的工具欄信息,當然注冊用戶也可以放置注冊信息)
復制editplus安裝包里面的文件到programs\editplus\,注意,如果有setting.ini,刪掉該文件,在nu2menu里面加入以下句子(可以根據需要安排位于特定菜單條目下)
FUNC="@GetProgramDrive()\Programs\EditPlus\editplus.exe">EditPlus 文本編輯
【18】支持帶UTF-8標記/不帶UTF-8標記的文件 Lei@******提出并測試
這里Byte Order Mark翻譯為標記/文件頭/標簽
參數選擇-文件-里面設置“支持不帶有UTF-8文件頭的UTF-8文件”,我這里翻譯標簽為UTF-8文件頭,如果復選該項,應該是保存為不帶標簽的Utf-8,如果不復選,應該是保存成帶有BOM的UTF-8。
這樣就可以打開帶簽名的UTF-8文件,并且可以正常編輯,但是又不能打開不帶簽名的了,想要打開不帶簽名的還需要改回來...不過雖然有點麻煩,但是總算能用了
【19】建立文件關聯,以便在資源管理器中雙擊打開對應語法文件
Editplus中可以設置各種語法,如果希望建立文件關聯:
在“參數選擇-語法”對話框中,選擇一個語法,如C++,在下面的“語法設置”標簽里面,選擇“關聯到資源管理器中”,以后雙擊對應文件后綴的時候,就會直接啟用EditPlus打開了。
【20】特別應用,雙擊單詞選擇問題
比如對于下面文本,希望雙擊“1234”位置,就可以選擇“1234”,而不是選擇整行
ABCD-1234-EFGH-ACDE
軟件默認是選擇整行,這時可以自己進行設置,打開“參數選擇”,在“常規”選項頁的第三個選項里面(雙擊單詞截止府),添加輸入“-“,確認,以后就可以實現截止符之間的內容了
【21】在Editplus中使用CVS版本控制功能 sunbn@CCF
CVS是開放源代碼的版本控制系統,CVS作為一個免費的優秀的版本管理工具被廣泛的使用在許多的軟件公司的軟件配置管理過程中。
我們經常使用的CVS客戶端是WinCVS,或者JBuilder/Eclipse內置的CVS功能。可是有時候編輯html文件、PHP/Perl文件或者Java文件的時候經常使用到輕便的編輯工具——Editplus2.x,往往編輯完了之后需要使用WinCVS再進行更新或者提交操作,來回切換程序窗口很是麻煩。如何讓Editplus也能夠方便的使用CVS功能呢,其實利用Edit plus的“User Tool”——“用戶工具”功能就可以實現。其方便程度甚至快追上一些IDE了,而且經過測試,進行簡單的CVS提交和更新動作比WinCVS要快一些。
在設置之前我們還是要安裝WinCVS的客戶端,因為要用到cvs.exe這個命令行工具完成我們的工作,安裝好WinCVS之后,需要將WinCVS的安裝路徑寫到系統的全局變量“Path”中,使系統可以找到cvs.exe這個可執行程序。或者在下面 的設置中指定cvs程序的絕對路徑。
具體設置方法如下:
1、菜單中Tools>>Preference,在設置對話框選擇“Files”,勾選“reload modified files automatically”,即自動載入被修改的文件。
2、菜單中Tools>>Configure User Tools,點擊Group Name,將一個Group名稱設置為CVS。
3、在“Group and tool items”下拉框中選擇我們新建的CVS Group
4、點擊“Add Tool >> ”按鈕新增一個Tool并設置相關選項。
login的設置注意要取消掉“Capture Output”因為要在下面的彈出窗口中輸入登錄的密碼。
我們可以在“Output Window”窗口看到以上工具執行的結果:
以上是拋磚引玉,希望能對大家有所幫助,其實在UltraEdit/Emedit等中也可以使用外部工具設置CVS的使用。
另外,需要注意的幾點:
1。首先您所編輯的文件是處于CVS控制下的文件,即還是需要使用WinCVS來Checkout你的module(用cvs命令行也可),在Editplus中也可以設置User Tools進行checkout,但是并不常用也不方便。
2。向CVS添加文件和從CVS刪除文件也是可以放到User Tools中的,這個大家可以自己試著配置一下。
您正在看的文章來自番禺論壇 http://bbs.pyyrf.com/,原文地址:http://bbs.pyyrf.com/thread-16024-1-1.htmlrn原文來自:http://www.sb1987.cn/post/360/
pageEncoding是jsp文件本身的編碼
contentType的charset是指服務器發送給客戶端時的內容編碼
JSP要經過兩次的“編碼”,第一階段會用pageEncoding,第二階段會用utf-8至utf-8,第三階段就是由Tomcat出來的網頁, 用的是contentType。
第一階段是jsp編譯成.java,它會根據pageEncoding的設定讀取jsp,結果是由指定的編碼方案翻譯成統一的UTF-8 JAVA源碼(即.java),如果pageEncoding設定錯了,或沒有設定,出來的就是中文亂碼。
第二階段是由JAVAC的JAVA源碼至java byteCode的編譯,不論JSP編寫時候用的是什么編碼方案,經過這個階段的結果全部是UTF-8的encoding的java源碼。
JAVAC用UTF-8的encoding讀取java源碼,編譯成UTF-8 encoding的二進制碼(即.class),這是JVM對常數字串在二進制碼(java encoding)內表達的規范。
第三階段是Tomcat(或其的application container)載入和執行階段二的來的JAVA二進制碼,輸出的結果,也就是在客戶端見到的,這時隱藏在階段一和階段二的參數contentType就發揮了功效
contentType的設定.
pageEncoding 和contentType的預設都是 ISO8859-1. 而隨便設定了其中一個, 另一個就跟著一樣了(TOMCAT4.1.27是如此). 但這不是絕對的, 這要看各自JSPC的處理方式. 而pageEncoding不等于contentType, 更有利亞洲區的文字 CJKV系JSP網頁的開發和展示, (例pageEncoding=GB2312 不等于 contentType=utf-8)。其他的語言也對應不同的charset,比如日文的字符集是“iso-2022-jp ”,韓文的是“ks_c_5601”。Content-Type的Content還可以是:text/xml等文檔類型;Charset選項:ISO-8859-1(英文)、BIG5、UTF-8、SHIFT-Jis、Euc、Koi8-2、us-ascii, x-mac-roman, iso-8859-2, x-mac-ce, iso-2022-jp, x-sjis, x-euc-jp,euc-kr, iso-2022-kr, gb2312, gb_2312-80, x-euc-tw,x-cns11643-1,x-cns11643-2等字符集;Content-Language的Content還可以是:EN、FR等語言代碼。
ContentType屬性指定了MIME類型和JSP頁面回應時的字符編碼方式。MIME類型的默認值是“text/html”; 字符編碼方式的默認值是“ISO-8859-1”. MIME類型和字符編碼方式由分號隔開
pageEncoding的內容只是用于jsp輸出時的編碼,不會作為header發出去的。
pageEncoding 是通知web server jsp的編碼。
jsp文件不像.java,.java在被編譯器讀入的時候默認采用的是操作系統所設定的locale所對應的編碼,比如中國大陸就是GBK,臺灣就是BIG5或者MS950。而一般我們不管是在記事本還是在ue中寫代碼,如果沒有經過特別轉碼的話,寫出來的都是本地編碼格式的內容。所以編譯器采用的方法剛好可以讓虛擬機得到正確的資料。
但是jsp文件不是這樣,它沒有這個默認轉碼過程,但是指定了pageEncoding就可以實現正確轉碼了。
舉個例子:
<%@ page contentType="text/html;charset=utf-8" %>
大都會打印出亂碼,因為輸入的“你好”是gbk的,但是服務器是否正確抓到“你好”不得而知。
但是如果更改為
<%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%>
這樣就服務器一定會是正確抓到“你好”了。
2008年9月21日
tomcat中的context.xml元素詳解小人物,大博客 Q'e ^ L0J*J4h
元素名
|
屬性
|
解釋
|
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為http://localhost:8080/path/****
|
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方式記錄的值更多
|
2008年8月19日
1、Navicat
Navicat是一個強大的MySQL數據庫管理和開發工具。Navicat導航為專業開發者提供了一套強大的足夠尖端的工具,但它對于新用戶仍然是易于學習。Navicat,使用了極好的圖形用戶界面(GUI),可以讓你用一種安全和更為容易的方式快速和容易地創建、組織、存取和共享信息。
用戶可完全控制 MySQL 數據庫和顯示不同的管理資料,包括一個多功能的圖形化管理用戶和訪問權限的管理工具,方便將數據從一個數據庫移轉到另一個數據庫中(Local to Remote、Remote to Remote、Remote to Local),進行檔案備份。
下載:
http://www.navicat.com.cn/
2、Mysql Front
一款小巧的管理Mysql的應用程序. 主要特性包括多文檔界面, 語法突出, 拖拽方式的數據庫和表格, 可編輯/可增加/刪除的域, 可編輯/可插入/刪除的記錄, 可顯示的成員, 可執行的SQL 腳本, 提供與外程序接口, 保存數據到CSV文件等。之前用過,好像已經商業化了。
下載:
http://www.mysqlfront.de/download.html
3、SQLyog
一個易于使用的、快速而簡潔的圖形化管理MYSQL數據庫的工具,它能夠在任何地點有效地管理你的數據庫,而且它本身是完全免費的。
下載:
http://www.webyog.com/
4、EMS MySQL Manager Lite
圖形界面的EMS MySQL Manager給您更方便的管理。
下載:
http://www.ems-hitech.com/
5、Mysql Studio
MySQL是一套穩定、小而美的數據庫系統,但是它的管理界面卻較為薄弱。MySQL Studio是一套圖形化界面的MySQL管理與監視系統,方便的瀏覽與管理數據庫、數據表與資料、權限管理、備份還原、資料導入導出、Agent計劃任務等等,讓你的MySQL變得更完善。
下載:
http://www.mysqlstudio.com/
6、 MySQL Maestro
是一個管理MYSQL數據庫的圖形化工具。
下載:
http://www.sqlmaestro.com/
2008年8月16日
1、
UltraEdit(簡稱:UE,下同)必備!因為這個是修改EXE不可缺少的工具,改兵種名字什么的就靠它了。備選工具WinHex,個人覺得比UE還好用……可能是習慣問題。
2、OllyDbg,這個嘛……是反匯編工具,高級修改需要,一般新人又不懂匯編的就無所謂了,備選工具W32dsm。
3、ExeScope,用來修改游戲中對話框和裝備顯示的,很多人都改了兵種名字,但忘了改這個,導致在游戲中明明沒有這個兵種,但裝備卻是這個兵種的。(舉例:說岳-_\\……1.30和11.24版都有這個問題,說岳中的君主類改為豪杰類了,但是在游戲裝備列表中依舊是君主,使人看了覺得奇怪。)備選工具ResHacker.exe(全面超越Exescope的工具)。
4、Stud_PE,怕是有很多朋友都沒有用這個工具,也不知道這個工具吧,這個是PE綜合工具,功能很強大,支持方面很多就不一一詳述了。
2008年7月18日
在Web應用程序開發中,除了將請求參數自動設置到Action的字段中,我們往往也需要在Action里直接獲取請求(Request)或會話(Session)的一些信息, 甚至需要直接對JavaServlet Http的請求(HttpServletRequest),響應(HttpServletResponse)操作.
我們需要在Action中取得request請求參數"username"的值:
ActionContext context = ActionContext.getContext();
Map params = context.getParameters();
String username = (String) params.get("username");
ActionContext(com.opensymphony.xwork.ActionContext)是Action執行時的上下文,上下文可以看作是一個容器(其實我們這里的容器就是一個Map而已),它存放放的是Action在執行時需要用到的對象
一般情況,我們的ActionContext都是通過:ActionContext context = (ActionContext) actionContext.get();來獲取的.我們再來看看這里的actionContext對象的創建:static ThreadLocal actionContext = new ActionContextThreadLocal();,ActionContextThreadLocal是實現ThreadLocal的一個內部類.ThreadLocal可以命名為"線程局部變量",它為每一個使用該變量的線程都提供一個變量值的副本,使每一個線程都可以獨立地改變自己的副本,而不會和其它線程的副本沖突.這樣,我們ActionContext里的屬性只會在對應的當前請求線程中可見,從而保證它是線程安全的.
下面我們看看怎么通過ActionContext取得我們的HttpSession:
Map session = ActionContext.getContext().getSession();
ServletActionContext
ServletActionContext(com.opensymphony.webwork. ServletActionContext),這個類直接繼承了我們上面介紹的ActionContext,它提供了直接與JavaServlet相關對象訪問的功能,它可以取得的對象有:
1, javax.servlet.http.HttpServletRequest:HTTPservlet請求對象
2, javax.servlet.http.HttpServletResponse;:HTTPservlet相應對象
3, javax.servlet.ServletContext:Servlet 上下文信息
4, javax.servlet.ServletConfig:Servlet配置對象
5, javax.servlet.jsp.PageContext:Http頁面上下文
下面我們看看幾個簡單的例子,讓我們了解如何從ServletActionContext里取得JavaServlet的相關對象:
1, 取得HttpServletRequest對象:
HttpServletRequest request = ServletActionContext. getRequest();
2, 取得HttpSession對象:
HttpSession session = ServletActionContext. getRequest().getSession();
ServletActionContext和ActionContext有著一些重復的功能,在我們的Action中,該如何去抉擇呢?我們遵循的原則是:如果ActionContext能夠實現我們的功能,那最好就不要使用ServletActionContext,讓我們的Action盡量不要直接去訪問JavaServlet的相關對象.在使用ActionContext時有一點要注意:不要在Action的構造函數里使用ActionContext.getContext(),因為這個時候ActionContext里的一些值也許沒有設置,這時通過ActionContext取得的值也許是null.
如果我要取得Servlet API中的一些對象,如request,response或session等,應該怎么做?這里的execute不像Struts 1.x的那樣在參數中引入."開發Web應用程序當然免不了跟這些對象打交道.在Strutx 2.0你可以有兩種方式獲得這些對象:非IoC(控制反轉Inversion of Control)方式和IoC方式.
非IoC方式
要獲得上述對象,關鍵Struts 2.0中com.opensymphony.xwork2.ActionContext類.我們可以通過它的靜態方法getContext()獲取當前Action的上下文對象. 另外,org.apache.struts2.ServletActionContext作為輔助類(Helper Class),可以幫助您快捷地獲得這幾個對象.
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
如果你只是想訪問session的屬性(Attribute),你也可以通過ActionContext.getContext().getSession()獲取或添加session范圍(Scoped)的對象.
IoC方式
要使用IoC方式,我們首先要告訴IoC容器(Container)想取得某個對象的意愿,通過實現相應的接口做到這點.具體實現,請參考例6 IocServlet.java.
例6 classes/tutorial/NonIoCServlet.java
package tutorial;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
publicclass NonIoCServlet extends ActionSupport {
private String message;
public String getMessage() {
return message;
}
@Override
public String execute() {
ActionContext.getContext().getSession().put("msg", "Hello World from Session!");
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
StringBuffer sb =new StringBuffer("Message from request: ");
sb.append(request.getParameter("msg"));
sb.append("<br>Response Buffer Size: ");
sb.append(response.getBufferSize());
sb.append("<br>Session ID: ");
sb.append(session.getId());
message = sb.toString();
return SUCCESS;
}
}
例6 classes/tutorial/IoCServlet.java
package tutorial;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
publicclass IoCServlet extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {
private String message;
private Map att;
private HttpServletRequest request;
private HttpServletResponse response;
public String getMessage() {
return message;
}
publicvoid setSession(Map att) {
this.att = att;
}
publicvoid setServletRequest(HttpServletRequest request) {
this.request = request;
}
publicvoid setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public String execute() {
att.put("msg", "Hello World from Session!");
HttpSession session = request.getSession();
StringBuffer sb =new StringBuffer("Message from request: ");
sb.append(request.getParameter("msg"));
sb.append("<br>Response Buffer Size: ");
sb.append(response.getBufferSize());
sb.append("<br>Session ID: ");
sb.append(session.getId());
message = sb.toString();
return SUCCESS;
}
}
例6 Servlet.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h2>
<s:property value="message" escape="false"/>
<br>Message from session: <s:property value="#session.msg"/>
</h2>
</body>
</html>
例6 classes/struts.xml中NonIocServlet和IoCServlet Action的配置
<action name="NonIoCServlet" class="tutorial.NonIoCServlet">
<result>/Servlet.jsp</result>
</action>
<action name="IoCServlet" class="tutorial.IoCServlet">
<result>/Servlet.jsp</result>
</action>
運行Tomcat,在瀏覽器地址欄中鍵入http://localhost:8080/Struts2_Action/NonIoCServlet.action?msg=Hello%20World! 或http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello%20World!
在Servlet.jsp中,我用了兩次property標志,第一次將escape設為false為了在JSP中輸出<br>轉行,第二次的value中的OGNL為"#session.msg",它的作用與session.getAttribute("msg")等同.
2008年6月23日
準備java運行環境
Tomcat6運行需要Java環境,需要先下載并安裝J2SE5.0以上的版本。
下載地址:http://java.sun.com/javase/downloads/index.jsp
注意:tomcat6.0已經不再需要jdk,而只要jre就可以了,因為它采用了自帶的Eclipse JDT來編譯jsp,而不是jdk。
如果JDK是zip解壓,而不是install安裝的,請設置系統環境JAVA_HOME:
在桌面上右鍵點擊【我的電腦】,選擇【屬性】命令,在出現的對話框中選擇【高級】選項卡,然后單擊【環境變量】按鈕,添加一個環境變量:JAVA_HOME,它的值為JDK所在根目錄(比如:c:\jdk,而不是c:\jdk\bin)
tomcat下載安裝
tomcat下載地址:http://tomcat.apache.org/
右側有從3.3到6.x各個版本的下載鏈接。
windows下tomcat的安裝很簡單,可以采用exe安裝包的方式進行安裝。基本上一路確定就可以了,安裝用到了java環境,從jdk的安裝注冊表或者JAVA_HOME這個系統變量里面獲得jdk所在位置(這就是為什么非安裝的jdk需要配置JAVA_HOME的原因,當然在后面tomcat運行時也是需要的)。
安裝后的目錄如下:
c:\tomcat6.0
|---bin
|---conf
|---lib
|---logs
|---temp
|---webapps
|---work
相比之前的版本,在bin和lib這兩個目錄改動比較大,bin目錄不再有一堆的bat文件,精簡為4個文件。而jar文件統一放到新增的lib目錄下,先前版本中下面的3個目錄被刪除合并(參考tomcat5.0.28的結構):
common(含lib,classes,endorsed三個目錄)
share(含lib和classes兩個目錄)
server(含lib,classes,webapps三個目錄)
此外,examples增加了
啟動運行tomcat
安裝的最后一個步驟,可以選擇立即啟動;
默認情況下,是通過系統的服務進行啟動的,可以把啟動方式設置為“自動”
命令行啟動:
tomcat/bin/tomcat6 或者tomcat/bin/tomcat6 //TS//tomcat6(注意大寫!下同) 二者是等價的。
其他的參數還有:
tomcat/bin/tomcat6 //RS//tomcat6 ---啟動tomcat6服務
tomcat/bin/tomcat6 //US//tomcat6 ---更新tomcat6服務參數
tomcat/bin/tomcat6 //IS//tomcat6 ---安裝tomcat6服務
tomcat/bin/tomcat6 //DS//tomcat6 ---刪除tomcat6服務
安裝后的bin目錄共有一下幾個文件:
bootstrap.jar
tomcat-juli.jar
tomcat6.exe
tomcat6w.exe
其中tomcat6w.exe是監控tomcat運行的,可以直接運行,或者縮小到屏幕右下角成為一個小圖標。
直接運行tomcat6w.exe或者“tomcat6w //ES//” 都可以進入監控配置窗口;
或者運行“tomcat6w //MS//”把它縮小到右下角。
web訪問測試
啟動后,可以通過瀏覽器進行訪問,測試運行是否正常。
用IE或者Firefox等瀏覽器,輸入地址:
http://localhost:8080/ --如果安裝時修改了端口,請把8080用修改后的值替換。
如果能夠正常瀏覽到tomcat歡迎信息,就是正確了,否則就要檢查安裝是否正確、防火墻的設置等。
經常遇到的一個問題是端口沖突,最常見的就是80端口被占用,導致服務無法正常啟動。如果通過tomcat6 //TS//tomcat6來啟動,馬上就能夠發現提示信息。修改一下tomcat6\conf\server.xml中的端口就能夠解決。
通常使用80端口的有:
1. IIS服務器,因為在windows服務器上,很多都安裝了IIS,而IIS默認的端口就是80.
2. skype即時聊天工具,skype的可以穿透防火墻的本領,也是通過占用80端口實現的。
查看端口占用的命令:
進入windows命令行,輸入:
netstat -an
這個命令返回有4列:protocol協議、local address本機地址、foreign address來訪者地址、status狀態
瀏覽本機地址一列,可以看到當前主機對外服務的IP地址、端口都有哪些。
如果一臺機器有192.168.1.100和192.168.1.101兩個地址,那么:
0.0.0.0:80表示這臺機器上所有80端口都被使用
127.0.0.1:80表示127.0.0.1的80被使用,但.100和.101IP地址的80還未使用。
192.168.1.100:80表示.100IP地址的80端口被使用
192.168.1.101:80表示.101IP地址的80端口被使用
想知道哪個程序使用了某個端口,可以通過天網防火墻或者是卡巴斯基獲得。
Tomcat.5.5.16 安裝 web 項目時執行的代碼主要是 HostConfig 類,其中 deployApps() 執行部署 web 應用的功能;
protected void deployApps() {
File appBase = appBase();
File configBase = configBase();
// Deploy XML descriptors from configBase
deployDescriptors(configBase, configBase.list());
// Deploy WARs, and loop if additional descriptors are found
deployWARs(appBase, appBase.list());
// Deploy expanded folders
deployDirectories(appBase, appBase.list());
}
從上面這段代碼,我們可以知道 tomcat 在部署 web 項目是按如下順序依次部署的;
1.首先部署 $CATALINA_HOME/conf/Catalina/localhost 目錄下面的 .xml 文件;
deployDescriptors(configBase, configBase.list());
(1)configBase 的值是通過調用 configBase() 獲取的,
File file = new File(System.getProperty("catalina.base"), "conf");
Container parent = host.getParent();
if ((parent != null) && (parent instanceof Engine)) {
file = new File(file, parent.getName());
}
file = new File(file, host.getName());
可以看出 configBase 是由四部分內容組成 ;
System.getProperty("catalina.base") + “conf” + parent.getName()+host.getName()
parent.getName() 和 host.getName() 是分別取 server.xml 中
<Engine name="Catalina" defaultHost="localhost"> 和
<Host name="localhost" appBase="webapps" … 對應的 name 屬性值;
由此可以得出 configBase 的值為 $CATALINA_HOME/conf/Catalina/localhost
(2) 按文件名順序依次讀取 configBase 目錄下面的 xml 文件部署 web 應用;
第一步,首先獲取文件名(不包含 .xml )作為上下文路徑
String nameTmp = files[i].substring(0, files[i].length() - 4);
String contextPath = "/" + nameTmp.replace('#', '/');
第二步,解析 xml 文件,分析 docBase 的值;
注意這里的 docBase 的判斷很重要,采用和以前版本完全不同的做法;
if (!docBase.isAbsolute()) {
docBase = new File(appBase(), context.getDocBase());
}
首先判斷 docBase 是否為絕對路徑,如果不是絕對路徑,在改為
$CATALINA_HOME/webapps+docBase
// If external docBase, register .xml as redeploy first
if(!docBase.getCanonicalPath().startsWith(appBase().getAbsolutePath()))
{
// 這個判斷很重要,這里是判斷如果 docBase 路徑是以
$ CATALINA_HOME/webapps+docBase 開頭的字符串,則忽略掉了
isExternal = true;
...
if (docBase.getAbsolutePath().toLowerCase().endsWith(".war")) {
isWar = true;
}
} else{
// Ignore specified docBase
context.setDocBase(null);
}
從上面可以看出, <Context path="/xxxx" docBase="xxxx" . 中 docBase 只有為絕對路徑并且該路徑不是以 $CATALINA_HOME/webapps 開頭,才會生效;否則就忽略掉了;
2.接下來部署 $CATALINA_HOME/webapps/ 目錄下以。 War 結尾的文件
deployWARs(appBase, appBase.list());
(1) 首先仍是把文件名 ( 不用 .war) 作為其應用的上下文路徑 ;
if (files[i].toLowerCase().endsWith(".war")) {
// Calculate the context path and make sure it is unique
String contextPath = "/" + files[i];
int period = contextPath.lastIndexOf(".");
(2) 接下來判斷以該上下文路徑 contextPath 是否已經裝載過了,如果是則直接退出; if (deploymentExists(contextPath))
return;
( 3 ) 繼續判斷以該上下文命名的部署文件是否存在,如 war 文件為 AAA.war, 則判斷在 $CATALINA_HOME/conf/Catalina/localhost/AAA.xml 文件是否存在,如果不存在繼續執行以下操作;
File xml = new File
(configBase, file.substring(0, file.lastIndexOf(".")) + ".xml");
if (deployXML && !xml.exists()) {
entry = jar.getJarEntry(Constants.ApplicationContextXml);
configBase.mkdirs();
。。。
先從 wart 文件中讀取 META-INF/context.xml 文件,然后把它 copy 到
$CATALINA_HOME/conf/Catalina/localhost/AAA.xml, 注意 war 文件部署文件必須為
context.xml ,且在 META-INF 目錄下;
( 4 )接下來操作和上面類似,部署該 web 應用;
3. 最后是以 $CATALINA_HOME/webapps 目錄下的文件夾為目標按文件夾名順序進行部署;
deployDirectories(appBase, appBase.list());
(1)同樣先把該文件夾名作為上下文路徑進行部署;
File dir = new File(appBase, files[i]);
if (dir.isDirectory()) {
// Calculate the context path and make sure it is unique
String contextPath = "/" + files[i];
(2)接下來的步驟就基本上是一樣了,首先判斷該上下文路徑是否已經部署過,如果是則直接退出,否則和上面一樣,讀取 META-INF/context.xml 文件進行部署;
注意這里和上面的 war 文件部署稍微有點不同,就是它不會 copy 部署文件 context.xml 文件到 $CATALINA_HOME/conf/Catalina/localhost 中去;
TOMCAT部署項目有3種方法:1、直接把項目web文件夾放在webapps里2、修改conf里server.xml文件,添加一個Context,
<Context path="/projectName" reloadable="true" docBase="工程所在路徑\web" workdir="工程所在路徑\work"></Context>3、在Catalina/localhost目錄里,新增一個xml文件,添加一個Context內容,指向項目的目錄。<Context path="/目錄名" docBase="e:\example" debug="0" reloadable="true" />
優先級別為:3>2>1
第3個方法有個優點,可以定義別名。服務器端運行的項目名稱為path,外部訪問的URL則使用XML的文件名。這個方法很方便的隱藏了項目的名稱,對一些項目名稱被固定不能更換,但外部訪問時又想換個路徑,非常有效。
第2、3還有優點,可以定義一些個性配置,如數據源的配置等
<Server port="8005" shutdown="SHUTDOWN" debug="0">
<!-- 這些指令組件關閉JMX MBeans支持 -->
<!-- 你也可以通過包含你自己的mbean描述文件配置自定義的組件,然后設置
“descriptors”屬性為以“;”為分隔的文件名列表嚴將它添加到默認列表
中,例如:descriptors="/com/myfirm/mypackage/mbean-descriptor.xml"。
-->
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0" />
<!-- Global JNDI resources -->
<!-- 全局JNDI資源 -->
<GlobalNamingResources>
<!-- 出于示例目的的測試入口 -->
<Environment name="simpleValue" type="java.lang.Integer" value="30" />
<!-- 可編輯的,用來通過UserDatabaseRealm認證用戶的用戶數據庫 -->
<Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved">
</Resource>
<ResourceParams name="UserDatabase">
<parameter>
<name>factory</name>
<value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
</parameter>
<parameter>
<name>pathname</name>
<value>conf/tomcat-users.xml</value>
</parameter>
</ResourceParams>
</GlobalNamingResources>
<!-- 一個“Service”是一個或多個共用一個單獨“Container”(容器)的“Connectors”
組合(因此,應用程序在容器中可見)。通常,這個容器是一個“Engine”
(引擎),但這不是必須的。
注意:一個“Service”自身不是一個容器,因此,在這個級別上你不可定義
諸如“Valves”或“Loggers”子組件。
-->
<!-- 定義Tomcat的標準獨立服務 -->
<Service name="Catalina">
<!-- 一個“Connector”(連接器)代表一個請求被接收和應答所需要的端點。每個連
接器通過相關的“Container”(容器)處理請求。
默認情況下,一個非SSL的HTTP/1.1的連接器被綁定在端口8080。你也可以通過
根據后面的使用說明并取消第二個連接器入口的注釋,在端口8443上建立一個
SSL HTTP/1.1的連接器。開放SSL支持需要下面幾步(參見Tomcat 5文檔中怎樣
配置SSL的說明以取得更多的詳細信息):
* 如果你的JDK是1.3或1.3以前的版本,下載安裝JSSE 1.0.2或以后版本,并放
置JAR文件到“$JAVA_HOME/jre/lib/ext”目錄下。
* 帶一個“changeit”的口令值執行:
%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA (UNIX)
來生成它自己的證書私鑰。
默認情況下,當一個web應用程序調用請求時,DNS查詢是可行的。這將對性能造
成一些不利的影響,因此,你可以將“enableLookups”設置為“false”來關閉DNS
查詢。當DNS查詢被關閉時,request.getRemoteHost()將返回包含遠程客戶IP地
址的字符串。
-->
<!-- 在8080端口上定義一個非SSL的HTTP/1.1連接器 -->
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" disableUploadTimeout="true" />
<!-- 注意,要關閉連接超時,將connectionTimeout設置為0 -->
<!-- 注意:要使用gzip壓縮需要設置如下屬性:
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla,traviata"
compressableMimeType="text/html,text/xml"
-->
<!-- 在端口8443上定義一個SSL的HTTP/1.1的連接器 -->
<!--
<Connector port="8443"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" debug="0" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
<!-- 在端口8009上定義一個Coyote/JK2 AJP 1.3連接器 -->
<Connector port="8009" enableLookups="false" redirectPort="8443"
debug="0" protocol="AJP/1.3" />
<!-- 在8082端口上定義一個代理HTTP/1.1連接器 -->
<!-- 參見代理文檔以取得這里使用屬性的更多的信息。 -->
<!--
<Connector port="8082"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false"
acceptCount="100" debug="0" connectionTimeout="20000"
proxyPort="80" disableUploadTimeout="true" />
-->
<!-- 一個“Engine”(引擎)代表處理每個請求的入口點(在Catalina內)。這個Tomcat
的標準獨立引擎實現分析包含在請求中的HTTP頭信息,并將請求傳送到適當的主機
或虛擬主機上。-->
<!-- 你應該這樣設置jvmRoute以便在JK/JK2通道上支持負載平衡:
<Engine name="Standalone" defaultHost="localhost" debug="0" jvmRoute="jvm1">
-->
<!-- 在我們的容器體系中定義最高級別的容器 -->
<Engine name="Catalina" defaultHost="localhost" debug="0">
<!-- 請求轉儲器值轉儲非常有用的通過Tomcat這個實例接收到的所有請求的,關于
接收到的請求頭和cookies,以及發送出的回應頭和cookies的調試信息。如果
你只在意一個特定的虛擬主機或者一個特定應用程序的請求,在對應的<Host>
或<Context>入口中套用這個元素。
對于所有的Servlet(小服務程序)2.4來所,在示例程序中檢驗
“RequestDumperFilter”過濾是非常容易的(這個過濾器源代碼可以在
“$CATALINA_HOME/webapps/examples/WEB-INF/classes/filters”下找到。
請求轉儲默認情況下是關閉的,如果要使用它,取消下面行的注釋符。-->
<!--
<Valve className="org.apache.catalina.valves.RequestDumperValve"/>
-->
<!-- 全局日志設置,除非在更低的級別上覆蓋它的設置 -->
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="catalina_log." suffix=".txt" timestamp="true" />
<!-- 因為這個Realm(區域)在這兒,因此這個實例將被全局共享。 -->
<!-- 這個Realm(區域)使用在全局JNDI資源下,由“UserDatabase”配置的用戶
數據庫。通過使用Realm將使對于這個用戶數據庫的任何編輯都將會立即可用
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
debug="0" resourceName="UserDatabase"/>-->
<!-- 注釋掉舊有的Realm以便我們能很快速的恢復舊有配置。 -->
<!--
<Realm className="org.apache.catalina.realm.MemoryRealm" />
-->
<!-- 下面的屬性用于從儲存在數據庫或從JDBC通道中得到的Realm以取代上面的
Realm配置。-->
<!--
<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
driverName="oracle.jdbc.driver.OracleDriver"
connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL"
connectionName="scott" connectionPassword="tiger"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" />
-->
<!--
<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
driverName="sun.jdbc.odbc.JdbcOdbcDriver"
connectionURL="jdbc:odbc:CATALINA"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name" />
-->
<!-- 定義默認的虛擬主機
注意:XML模式確認將不能與Xerces 2.2同工作。
-->
<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true"
autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<!--
為這個結點定義一個群集,通過定義這個元素,意味著每個管理員都將被改變。
因此,當運行一個群集時,只有確認在必須被聚集和移除其他的地方有你的
web軟件。
一個群集有下面這些參數:
className = 這個群集類的全限定名
name = 你的群集的描述名,可以是任何描述
debug = 調試級別,更高意味著更多的輸出
mcastAddr = 多播地址,所有的節點都必須有同樣的多播地址
mcastPort = 多播端口,對所有的節點都必須有同樣的多播端口
mcastBindAddr = 綁定多播套接字到一個指定的地址
mcastTTL = 多播生存期,如果你想要限制你的廣播的話
mcastSoTimeout = 多播讀取超時
mcastFrequency = 發送“I'm alive”(我還活著)信息的間隔毫秒數
mcastDropTime = 多長時間沒有收到“I'm alive”就將這個節點標識為死節點(單位:毫秒)
tcpThreadCount = 用于處理重復引入請求的線程數,最好是每個節點都有相同的線程數
tcpListenAddress = 在有多塊以太網卡的主機上的監聽TCP群集請求的地址(綁定地址),auto意味著地址由InetAddress.getLocalHost().getHostAddress()取得。
tcpListenPort = tcp監聽端口
tcpSelectorTimeout = 在操作系統中有java.nio喚醒錯的情況下,使用Selector.select()的超時
毫秒數。設為0則沒有超時限制
printToScreen = true意味著管理員的相關信息也將打印輸出到std.out
expireSessionsOnShutdown = true 意味著
useDirtyFlag = true意味著我們只能在調用setAttribute,removeAttribute后才能復制一個會話;
false意味著在每個請求后復制會話。
false意味著復制將以下列代碼方式工作:
<%
HashMap map = (HashMap)session.getAttribute("map");
map.put("key","value");
%>
replicationMode = 可以是“pooled”、“synchronous”或者“asynchronous”
* Pooled意味著在多個套接字上同步進行復制。例如,先復制數據,然后請求返回。
這與“synchronous”相同,除了它使用一個套接字池,因此,它是多線程的。它是
最快和最高級的設置,使用這個配置也增加了處理復制的tcp線程的域。
* Synchronous指執行請求的線程,它也是向其他節點復制數據的線程,并且直到
所有的節點都己經收到信息后才返回。
* Asynchronous,對每個群集節點而言,這是一個特別的“sender”(發送者)線程,
因此請求線程將復制請求排隊到一個小隊列中,然后,返回給用戶。
這個小隊列是一個當會話被添加到隊列中,而從先前的請求中,同一個會話己經存在
,這個會話將被放置在隊列中以代替重復的兩個請求。這幾乎從不會發生,除非存在
較大的網絡延遲。
-->
<!-- 當配置群集時,你也添加一個值來捕獲所有傳入的請求,在請求結束時,這個會話可能被子復制,
也可能不被復制。一個會話是否復制取決于下列條件是否發生:
1. useDirtyFlag為真,或者setAttribute或者removeAttribute己經被調用。
2. 會話己經存在(己經被創建了)。
3. 請求沒有被“filter”屬性所捕獲。
這個filter(過濾器)屬性用于過濾那些不能修改會話的請求,因此,我們在這個請求結束后不復制
會主。這個過濾器是消極的,例如,你向過濾器發送了一些東西,然后被過濾出去,在那個匹配的過
濾器上不會發生復制。
過濾器屬性以分號為分隔,因此你不能換行,即使你想這么做。
filter=".*\.gif;.*\.js;"意味著在進行以.gif和.js結束的URI請求后不復制會話。
-->
<!--
<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
managerClassName="org.apache.catalina.cluster.session.DeltaManager"
expireSessionsOnShutdown="false"
useDirtyFlag="true">
<Membership
className="org.apache.catalina.cluster.mcast.McastService"
mcastAddr="228.0.0.4"
mcastPort="45564"
mcastFrequency="500"
mcastDropTime="3000"/>
<Receiver
className="org.apache.catalina.cluster.tcp.ReplicationListener"
tcpListenAddress="auto"
tcpListenPort="4001"
tcpSelectorTimeout="100"
tcpThreadCount="6"/>
<Sender
className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
replicationMode="pooled"/>
<Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
</Cluster>
-->
<!-- 通常,對每一個應用程序,用戶必須逐個的認證他們自己。當他們遇到被
某種安全約束所保護的資源時,如果你想讓用戶只在第一次被認證,那么,
取消下面入口行的注釋,然后在這個虛擬主機中包含這個用戶的,橫跨所有
web應用程序的用戶身份識別。-->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn"
debug="0"/>
-->
<!-- 這個虛擬主機的所有請求的訪問日志過程。默認情況下,日志文件被創建在相對
于$CATALINA_HOME目錄下的logs目錄下。通過directory屬性,你也可以指定一個
不同的目錄,如果你想的話。可以使用相對路徑(相對于$CATALINA_HOME),也
可以使用絕對路徑。-->
<!--
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="common" resolveHosts="false"/>
-->
<!-- 與這個虛擬主機有關系所有上下文所共享的日志。默認情況下(使用FileLogger時),
日志文件被創建在相對于$CATALINA_HOME目錄下的logs目錄下。如果你希望,你也可
以給directory指定一個不同的路徑。可以使用相對于$CATALINA_HOME的相對路徑,也
可以使用絕對路徑。-->
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs"
prefix="localhost_log." suffix=".txt" timestamp="true" />
<Context path="web上下文路徑" docBase="虛擬目錄路徑" reloadable="true" debug="0"> </Context>
</Host>
</Engine>
</Service>
</Server>
在tomcat文件夾的conf\catalina\localhost(對于Tomcat6版本及其以上,需要自己創建catalina和localhost這兩個文件夾)
增加project .xml文件(該文件名的project要和下面的“path=“/xxx"”的xxx相同)
文件內容:
<Context path="/project" reloadable="true" docBase="E:\javastudio\oob" workDir="E:\javastudio\oob\work" />
docBase是項目文件夾的web-inf文件夾的上一層目錄 workDir是指Tomcat解析Jsp轉換為Java文件,并編譯為class存放的文件夾,設置在項目文件夾里面,可以避免移植到其他地方首次讀取jsp文件需要重新解析 。一般格式:項目文件夾\work reloadable是指可以重新加載,一般設置為true,方便使用,不需要經常重啟Tomcat。 以后啟動Tomcat,在瀏覽器輸入http://localhost:8080/project就能訪問該項目的welcome文件。
***************
為什么要不修改server.xml呢?在Tomcat6的doc幫助文檔中,官方是不提倡修改server.xml來添加虛擬目錄的!
而我認為,以上使用的方法,非常方便于項目的移植,移植后,只有修改docBase和workDir的值就行了,甚至可以去掉workDir這個屬性