本文記錄如果在Window安裝Tomcat伺服器
1.下載tomcat 這裡,下載解壓放在你想放的目錄下
本文是統一放在Apache自動安裝的AppServ目錄下,以方便管理
Tip:現在還有提供Windows Service Installer方便Windows的用戶
2.安裝JAVA JDK 這裡
目前版本為Java 6
3.設定JAVA 環境變數
我的電腦->右鍵->內容-> 進階系統設定(Vista) ->進階 -> 環境變數
在PATH變數里的最後面貼上你JAVA安裝的路徑
;C:\Program Files\Java\jdk1.6.0_19
(注意每個變數前面要用分號隔開)
新增下列所有的環境變數值
變數名稱 變數值
JAVA_HOME C:\Program Files\Java\jdk1.6.0_19\
CLASSPATH C:\Program Files\Java\jdk1.6.0_19\lib
CATALINA_HOME C:\AppServ\apache-tomcat-6.0.32
註:第三個是選擇性設定
4.測試你的java環境
C:\Program Files\apache-tomcat-6.0.32\bin>java -version
java version "1.6.0_19"
Java(TM) SE Runtime Environment (build 1.6.0_19-b04)
Java HotSpot(TM) 64-Bit Server VM (build 16.2-b04, mixed mode)
5.啟動你的Tomcat
C:\Program Files\apache-tomcat-6.0.32\bin>startup.bat
關掉的話就是將命令提示字元(終端機)關掉即可
6.測試Tomcat
瀏覽器開啟http://127.0.0.1:8080/ 測試tomcat是否有啟動,讀到Tomcat首頁你就完成了 :)
星期六, 4月 30, 2011
星期六, 4月 23, 2011
[JAVA] 快快樂樂學JAVA JDBC 連接 MySQL
JDBC連接MySQL
使用JDBC連接資料庫存取資料時,必須執行以下三個步驟:
1.用DriverManager載入及註冊適當的JDBC驅動程式
如果發生Driver not found錯誤訊息改改用
2.用JDBC URL定義驅動程式與資料來源之間的連結,並且建立一個連結物
3.建立一個sql陳述句,並利用它來執行SQL語法
執行陳述句有三種方法:
方法一:取回結果集
方法二:新增、更新、刪除等等使用
使用JDBC連接資料庫存取資料時,必須執行以下三個步驟:
1.用DriverManager載入及註冊適當的JDBC驅動程式
Class.forName("com.mysql.jdbc.Driver");
如果發生Driver not found錯誤訊息改改用
Class.forName("com.mysql.jdbc.Driver").newInstance();
2.用JDBC URL定義驅動程式與資料來源之間的連結,並且建立一個連結物
//option1 String jdbcUrl = "jdbc:mysql://[hostname]:[port]/[dbname]?user=[username]&password=[pwd]"; Connection conn = DriverManager.getConnection(jdbcUrl);
//option2 String jdbcUrl = ""jdbc:mysql://[hostname]:[port]/[dbname]"; Connection conn = DriverManager.getConnection(jdbcUrl,"username","password");
3.建立一個sql陳述句,並利用它來執行SQL語法
Statement stmt = conn.createStatement();
執行陳述句有三種方法:
方法一:取回結果集
ResultSet rs = stmt.executeQuery("sql語法") //取得每一列資訊 while(rs.next()){ //取得這筆資料的結果 rs.getString(1); rs.getInt(2); }
方法二:新增、更新、刪除等等使用
//updateRow為執行成功的列數 int updateRow = stmt.excuteUpdate("sql語法"); 方法三:單純判斷執行有無成功使用,回傳boolean bool success = stmt.execute("sql語法");
[JAVA] 快快樂樂學JAVA RESTful Service using Jersey
本文記錄如何在JAVA+TOMCAT下使用Jersey快速建立RESTful WebService :
感謝Owen血尿付出。
第一步:安裝Eclipse跟Tomcat 6.0.32
第二步:下載Jersey Library 1.6。官網http://jersey.java.net/
第三步:將下載的.jar檔放到Tomcat/lib
核心的lib asm-3.1.jar, jersey-core.jar, jersey-server.jar, jsr-311-api-1.0.jar
第四步:開啟Eclipse,新建一個Dynamic Web Project
第五步:修改專案內的YourProjectName/WebContent/WEB-INF/web.xml,新增以下內容
感謝Owen血尿付出。
第一步:安裝Eclipse跟Tomcat 6.0.32
第二步:下載Jersey Library 1.6。官網http://jersey.java.net/
第三步:將下載的.jar檔放到Tomcat/lib
核心的lib asm-3.1.jar, jersey-core.jar, jersey-server.jar, jsr-311-api-1.0.jar
第四步:開啟Eclipse,新建一個Dynamic Web Project
第五步:修改專案內的YourProjectName/WebContent/WEB-INF/web.xml,新增以下內容
<servlet> <servlet-name>JerseyServlet</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JerseyServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>第六步:第一個HelloWorld Restful API (支援GET / POST)
星期三, 4月 20, 2011
[Linux] 快快樂樂學Linux指令筆記
如何mount裝置內的共享資料夾
1.設定共用資料夾
裝置->共用資料夾->加入共用資料夾
2.在ubuntu建立一個暫存的目錄
$cd /home
$mkdir temp
3.掛載裝置:D_DRIVE為共用資料夾的名稱
#掛載的共享資料夾目錄名稱 ./要掛載的目錄
$sudo mount -t vboxsf D_DRIVE ./temp
4.卸載所有裝置
$umount -a
=====================================================================
Symbol Link
unlink 其實就跟 rm 一樣罷了,當要移除一個 symbolic link ,有時發現怎樣移不掉,一直說 "unkink: my_symbolic_link/ : is a directory" ,這個訊息就跟使用 rm 去移除一個目錄時的錯誤訊息!原來,在移除一個 symbolic link 時,要留意後面不能加個 "/" !這樣,若 symbolic link 是連到一個目錄時,等同於在對那個目錄做 rm 的動作,才會顯示 "is a directory" 訊息。這時可不能一氣之下用 rm -rf !可會將 link 到的目錄給移除掉的!要額外小心。
#目的地是一個檔案
$ ln -s target_file_path my_file_link
$ unlink my_file_link
目的地是一個目錄
$ln -s target_dir my_dir_link
例如:產生在當前目錄下的symbol link
$sudo ln -s /home/temp/mysite.war
$unlink my_dir_link/
$unlink: my_dir_link/: is a directory
$unlink my_dir_link
Done
=====================================================================
1.設定共用資料夾
裝置->共用資料夾->加入共用資料夾
2.在ubuntu建立一個暫存的目錄
$cd /home
$mkdir temp
3.掛載裝置:D_DRIVE為共用資料夾的名稱
#掛載的共享資料夾目錄名稱 ./要掛載的目錄
$sudo mount -t vboxsf D_DRIVE ./temp
4.卸載所有裝置
$umount -a
=====================================================================
Symbol Link
unlink 其實就跟 rm 一樣罷了,當要移除一個 symbolic link ,有時發現怎樣移不掉,一直說 "unkink: my_symbolic_link/ : is a directory" ,這個訊息就跟使用 rm 去移除一個目錄時的錯誤訊息!原來,在移除一個 symbolic link 時,要留意後面不能加個 "/" !這樣,若 symbolic link 是連到一個目錄時,等同於在對那個目錄做 rm 的動作,才會顯示 "is a directory" 訊息。這時可不能一氣之下用 rm -rf !可會將 link 到的目錄給移除掉的!要額外小心。
#目的地是一個檔案
$ ln -s target_file_path my_file_link
$ unlink my_file_link
目的地是一個目錄
$ln -s target_dir my_dir_link
例如:產生在當前目錄下的symbol link
$sudo ln -s /home/temp/mysite.war
$unlink my_dir_link/
$unlink: my_dir_link/: is a directory
$unlink my_dir_link
Done
=====================================================================
MYSQL
#安裝圖形化介面(ubuntu)
$sudo apt-get install mysql-admin
#連接資料庫
$mysql -u root -p
#離開資料庫
mysql>exit
=====================================================================
RM
#移除整個資料夾
$rm -rf 資料夾名
=====================================================================
ifconfig
#列出網路卡資訊
$ifconfig
#設定網路卡ip
$ifconfig eth10 192.168.0.112
=====================================================================
Apache Web Server
#開啟apcahe
$/etc/init.d/httpd start
#關閉apache
$/etc/init.d/httpd stop
#開機啟動檔路徑,可設定開機執行一些shell script指令
$vim /etc/rc.local
=====================================================================
VI
#搜尋
/ <搜尋的字串>
#強制執行存檔
:w ! tee %
#強制離開
:q!
#刪除一行(離開insert模式)
dd
#全刪除
dG
=====================================================================
RM
#移除整個資料夾
$rm -rf 資料夾名
=====================================================================
ifconfig
#列出網路卡資訊
$ifconfig
#設定網路卡ip
$ifconfig eth10 192.168.0.112
=====================================================================
Apache Web Server
#開啟apcahe
$/etc/init.d/httpd start
#關閉apache
$/etc/init.d/httpd stop
#開機啟動檔路徑,可設定開機執行一些shell script指令
$vim /etc/rc.local
=====================================================================
VI
#搜尋
/ <搜尋的字串>
#強制執行存檔
:w ! tee %
#強制離開
:q!
#刪除一行(離開insert模式)
dd
#全刪除
dG
星期二, 4月 19, 2011
[JQuery] getting URL parameters values
/** * * get request url parameters and values */ (function($) { $.extend({ getUrlVars: function(){ var vars = [], hash; var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); for(var i = 0; i < hashes.length; i++) { hash = hashes[i].split('='); vars.push(hash[0]); vars[hash[0]] = hash[1]; } return vars; }, getUrlVar: function(name){ return $.getUrlVars()[name]; } }); })(jQuery);Reference: Get URL parameters & values with jQuery
[JQuery Plugin] 自訂jQuery plugin 教學
記錄jQuery外掛的常見的寫作方法。
第一步:將下面的範例程式複製起來,
這是一個簡單將jQuery物件別名為$號的方法,
可以避免其他Javascript Framework別名衝突的問題!!
第一種:我偏好的方式 $.fn與$來擴充jQuery物件的方法
第二種:改用extend方法來擴充!!
什麼是extend方法請參考黑大的文章:jQuery extend 的用法
Reference:
網站製作學習誌 » [jQuery] 自製 jQuery Plugin – Part 1
網站製作學習誌 » [jQuery] 自製 jQuery Plugin – Part 2
第一步:將下面的範例程式複製起來,
這是一個簡單將jQuery物件別名為$號的方法,
可以避免其他Javascript Framework別名衝突的問題!!
(function($) { })(jQuery);
第一種:我偏好的方式 $.fn與$來擴充jQuery物件的方法
(function($) { //呼叫此方法需要帶入指定的元素,可一定綁定多個元素 $.fn.helloworld= function() { this.each(function(){ alert('helloworld'); }); }; //不需元素即可呼叫(靜態函式) $.helloworld2 = function() { alert('helloworld 2'); }; })(jQuery);
第二種:改用extend方法來擴充!!
什麼是extend方法請參考黑大的文章:jQuery extend 的用法
(function($) { $.extend({ helloworld: function(){ alert('helloworld'); }, goodbyeworld: function(){ alert('goodbyeworld'); } }); })(jQuery);
Reference:
網站製作學習誌 » [jQuery] 自製 jQuery Plugin – Part 1
網站製作學習誌 » [jQuery] 自製 jQuery Plugin – Part 2
星期一, 4月 18, 2011
[Alfresco] login using Jquery
/** * authentication */ $(function(){ //dologin $("#login_submit").click(function(){ var username = $("#username").val(); var password = $("#password").val(); if(username == "" || password == ""){ alert("Invalid UserName or Password."); }else{ //call resetful api var endpoint = "http://localhost:8080/alfresco/service/api/login?u=" + username + "&pw=" + password + "&format=json"; alert(endpoint); $.ajax({ type: "GET", headers: { "Content-Type": "application/json" }, url: endpoint, //contentType: "application/json", processData: false, //data: stringData, dataType: "jsonp", jsonp:"alf_callback", jsonpCallback:"jsonp_callback_login", statusCode: { 404: function() { alert('page not found'); }, 400: function() { alert('bad request'); } } }); } }); }); function jsonp_callback_login(data){ alert(data.data.ticket); }
[Alfresco] alf_ticket VS ticket url parameter
For all the pages under the path /faces/* and Web Scripts with the Web Client authenticator alfresco/wcservice/*, you have to use the ticket parameter.
For all the Web Scripts with a path alfresco/service/ you have to use the alf_ticket parameter and in this case you are using the HTTP Basic Authenticator.
Reference:
http://forums.alfresco.com/en/viewtopic.php?f=4&t=28524
For all the Web Scripts with a path alfresco/service/ you have to use the alf_ticket parameter and in this case you are using the HTTP Basic Authenticator.
Reference:
http://forums.alfresco.com/en/viewtopic.php?f=4&t=28524
[MSSQL] 安裝錯誤解決方法
問題:升級到 SQL Server 2005 失敗,並出現「安裝程式無法連接到資料庫服務進行伺服器組態。」錯誤訊息。
問題:如果在升級到 SQL Server 2005 期間無法使用通訊埠 1433,則 SQL Server 安裝程式會傳回下列錯誤:
SQL Server 安裝程式無法連接到資料庫服務進行伺服器組態。
解決方案:若要繼續,請終止使用通訊埠 1433 的處理序,並繼續進行 SQL Server 2005 安裝程式:
從命令提示字元執行 netstat -o。
識別使用通訊埠 1433 的應用程式或處理序。
使用 [工作管理員] 來關閉應用程式或終止處理序以釋放通訊埠 1433。
繼續 SQL Server 2005 安裝程式。
如果使用上述步驟仍無法釋放通訊埠 1433,請使用下列其他步驟:
開啟 [控制台] 的 [新增或移除程式]。
選取 [Microsoft SQL Server 2005],再按一下 [變更]。
在 [元件選擇] 頁面上,按一下要升級的 SQL Server 執行個體的選項按鈕,然後按 [下一步]。
在 [功能維護] 頁面上,按一下 [Database Engine],然後按 [下一步]。
按一下 [繼續] 來繼續 SQL Server 2005 的升級作業。
Reference:
對 SQL Server Database Engine 的安裝進行疑難排解
問題:如果在升級到 SQL Server 2005 期間無法使用通訊埠 1433,則 SQL Server 安裝程式會傳回下列錯誤:
SQL Server 安裝程式無法連接到資料庫服務進行伺服器組態。
解決方案:若要繼續,請終止使用通訊埠 1433 的處理序,並繼續進行 SQL Server 2005 安裝程式:
從命令提示字元執行 netstat -o。
識別使用通訊埠 1433 的應用程式或處理序。
使用 [工作管理員] 來關閉應用程式或終止處理序以釋放通訊埠 1433。
繼續 SQL Server 2005 安裝程式。
如果使用上述步驟仍無法釋放通訊埠 1433,請使用下列其他步驟:
開啟 [控制台] 的 [新增或移除程式]。
選取 [Microsoft SQL Server 2005],再按一下 [變更]。
在 [元件選擇] 頁面上,按一下要升級的 SQL Server 執行個體的選項按鈕,然後按 [下一步]。
在 [功能維護] 頁面上,按一下 [Database Engine],然後按 [下一步]。
按一下 [繼續] 來繼續 SQL Server 2005 的升級作業。
Reference:
對 SQL Server Database Engine 的安裝進行疑難排解
星期四, 4月 14, 2011
md5 image file
string ImageFileName = null;
string StrImageName = null;
string UploadImageFolderPath = Server.MapPath("../Upload/Images/");
string ImageFileExtension;
if (ImageUpload.HasFile)
{
StrImageName = ImageUpload.FileName.ToString();
ImageFileExtension = System.IO.Path.GetExtension(StrImageName);
// GIVE A UNIQUE FILENAME(MD5) TO THE UPLOADED FILE:
MD5CryptoServiceProvider objMD5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.UTF8.GetBytes(StrImageName);
bs = objMD5.ComputeHash(bs);
System.Text.StringBuilder s = new System.Text.StringBuilder();
foreach (byte b in bs)
{
s.Append(b.ToString("x2").ToLower());
}
StrImageName = s.ToString();
ImageFileName = StrImageName + ImageFileExtension;
// As long as the Image-File-Name is exists in the folder then we are MD5ing again the imgage-file-name:
while (System.IO.File.Exists(UploadImageFolderPath + ImageFileName))
{
MD5CryptoServiceProvider objMD5While = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bsWhile = System.Text.Encoding.UTF8.GetBytes(StrImageName);
bsWhile = objMD5.ComputeHash(bsWhile);
System.Text.StringBuilder sWhile = new System.Text.StringBuilder();
foreach (byte bWhile in bsWhile)
{
sWhile.Append(bWhile.ToString("x2").ToLower());
}
StrImageName = sWhile.ToString();
ImageFileName = StrImageName + ImageFileExtension;
}
ImageUpload.PostedFile.SaveAs(UploadImageFolderPath + ImageFileName);
}
string StrImageName = null;
string UploadImageFolderPath = Server.MapPath("../Upload/Images/");
string ImageFileExtension;
if (ImageUpload.HasFile)
{
StrImageName = ImageUpload.FileName.ToString();
ImageFileExtension = System.IO.Path.GetExtension(StrImageName);
// GIVE A UNIQUE FILENAME(MD5) TO THE UPLOADED FILE:
MD5CryptoServiceProvider objMD5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.UTF8.GetBytes(StrImageName);
bs = objMD5.ComputeHash(bs);
System.Text.StringBuilder s = new System.Text.StringBuilder();
foreach (byte b in bs)
{
s.Append(b.ToString("x2").ToLower());
}
StrImageName = s.ToString();
ImageFileName = StrImageName + ImageFileExtension;
// As long as the Image-File-Name is exists in the folder then we are MD5ing again the imgage-file-name:
while (System.IO.File.Exists(UploadImageFolderPath + ImageFileName))
{
MD5CryptoServiceProvider objMD5While = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bsWhile = System.Text.Encoding.UTF8.GetBytes(StrImageName);
bsWhile = objMD5.ComputeHash(bsWhile);
System.Text.StringBuilder sWhile = new System.Text.StringBuilder();
foreach (byte bWhile in bsWhile)
{
sWhile.Append(bWhile.ToString("x2").ToLower());
}
StrImageName = sWhile.ToString();
ImageFileName = StrImageName + ImageFileExtension;
}
ImageUpload.PostedFile.SaveAs(UploadImageFolderPath + ImageFileName);
}
星期三, 4月 13, 2011
圖片檔案hash
string hash = null; using (System.Security.Cryptography.SHA1CryptoServiceProvider sha1 = new System.Security.Cryptography.SHA1CryptoServiceProvider()) { System.Drawing.Imaging.ImageFormat format = System.Drawing.Imaging.ImageFormat.Jpeg; System.Drawing.Image myImage = System.Drawing.Image.FromFile(path + f.ToString()); myImage.Save(ms, format); hash = Convert.ToBase64String(sha1.ComputeHash(ms.ToArray())); }
星期四, 4月 07, 2011
[ZK] Image setContent using Stream
Aimage stream設定範例
URL url = new URL(avatar); AImage aimg = new AImage("avatar",url.openStream()); myPhoto.setContent(aimg);
[Alfresco] upload user avatar using resetful api
Build a uploadavatar.jsp page to test uploadavatar restful api.
The page content is shown as the below:
<form id="avatar" enctype="multipart/form-data"
action="http://ideas-cosa.dyndns.org/alfresco/service/slingshot/profile/uploadavatar?alf_ticket=TICKET_32178fa17bcf3b975e76129dccb78d646466e88d" method="post">
<input type="text" name="username" value="ken"/>
Select a file:
<input type="file" name="filedata" />
<input type="submit" name="button" value="upload" />
</form>
The page content is shown as the below:
<form id="avatar" enctype="multipart/form-data"
action="http://ideas-cosa.dyndns.org/alfresco/service/slingshot/profile/uploadavatar?alf_ticket=TICKET_32178fa17bcf3b975e76129dccb78d646466e88d" method="post">
<input type="text" name="username" value="ken"/>
Select a file:
<input type="file" name="filedata" />
<input type="submit" name="button" value="upload" />
</form>
星期三, 4月 06, 2011
[Java] Simulator to POST multipart/form-data using HttpURLConnection
使用HttlURLConnection模擬表單 multipart/form-data 動作。
找了二篇介紹比較好的作法可參考以下二篇:
Multipart form upload on Android
Useful Code of the Day: Multipart Form File Upload
找了二篇介紹比較好的作法可參考以下二篇:
Multipart form upload on Android
Useful Code of the Day: Multipart Form File Upload
[ZK] How to use undo redo button using zk
If you want to use 'undo' and 'redo' button on web browser in your zk website,you can refer to the following link:
ZK Developer's Reference/UI Patterns/Browser History Management
ZK Developer's Reference/UI Patterns/Browser History Management
星期二, 4月 05, 2011
[Asp.Net] 重新註冊IIS .NET Framework
以下程式碼為簡單的範例:請自已修正安裝的.net framework路徑
REM This batch file addresses "Server unavailable" error
@echo off
REM "Changing to the Framework install directory"
cd /d C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
echo "Stopping IIS"
iisreset /stop
echo "----------------------"
echo "Stopping the ASP.NET state service if it is running"
net stop aspnet_state
echo "----------------------"
echo "Re-registering ASP.NET"
aspnet_regiis -i
echo "----------------------"
echo "Restarting IIS"
iisreset /start
echo "----------------------"
REM This batch file addresses "Server unavailable" error
@echo off
REM "Changing to the Framework install directory"
cd /d C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
echo "Stopping IIS"
iisreset /stop
echo "----------------------"
echo "Stopping the ASP.NET state service if it is running"
net stop aspnet_state
echo "----------------------"
echo "Re-registering ASP.NET"
aspnet_regiis -i
echo "----------------------"
echo "Restarting IIS"
iisreset /start
echo "----------------------"