本文記錄如果在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 "----------------------"
訂閱:
意見 (Atom)
