[Logo]
Messages posted by: andowson
Forum Index » Profile for andowson » Messages posted by andowson
Message
http://blogs.sun.com/watt/resource/jvm-options-list.html
重點摘要
smilie Apache can be used to load balance Tomcat servers. This setup provides other useful features such as ‘Server affinity’ and safe removal of nodes for scheduled maintenance.
smilie Load balancing is recommended if transparent failover is not required. It is easy to setup load balancing and ‘server affinity’ with Apache.
smilie JMeter can be used to load test the configuration and to test the behaviour in case of a server crash.
smilie The load balancer can become the single point of failure. This can be reduced by using 2 load balancer and using round robin DNS to delegate request to more than one server.

參考資料
http://www.theserverside.com/tt/articles/content/LoadBalancingTomcatApache/article.html
公司採用Samba Server來進行檔案分享,平常大家也都靠它來作交工作報告前的彙整,因為走網路芳鄰方式來開同一個檔案,一次只能有一個人寫入,其他人可以用唯讀方式來開啟,滿適合一個小組的所有人一起編輯一個共同的檔案。平常大家都用得很快樂,直到今天早上當機了,上去看/var/log/messages檔,發現Samba Server(smbd)一每隔一小段時間就不斷寫出下列的錯誤訊息:
Apr 8 11:25:21 localhost smbd[3032]: [2009/04/08 11:25:21, 0] printing/print_cups.c:cups_connect(69)
Apr 8 11:25:21 localhost smbd[3032]: Unable to connect to CUPS server localhost:631 - 連線被拒絕
Apr 8 11:25:21 localhost smbd[3032]: [2009/04/08 11:25:21, 0] printing/print_cups.c:cups_connect(69)
Apr 8 11:25:21 localhost smbd[3032]: Unable to connect to CUPS server localhost:631 - 連線被拒絕

這部Samba Server並沒有接印表機,因此我們需要把設定檔/etc/samba/smb.conf調整一下,讓它不要載入printer的設定,將預設值前面加上分號,然後補上一行新的設定值,修改如下:
;   load printers = yes
load printers = no
;   printing = cups
printing = bsd


重新啟動Samba
service smb restart

再觀察/var/log/messages就沒有這個錯誤訊息了

參考資料:
http://klesmis.blogspot.com/2008/09/samba.html
http://wiki.postgresql.org/wiki/Shared_Database_Hosting
不曉得我有沒有誤解你的問題,如果是要讓<div id="fade" class="black_overlay"></div>這邊可以顯示出背景圖來,只要加上一個 &nbsp;的值進去即可:
<%@ page contentType="text/html; charset=BIG5" %>
<%
	int gERR = 0;

	//判斷是否開啟CSS背景	
	if(true)
	 	gERR = 0;
	else
		gERR = 1;
%>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<title>CSS測試</title>
</head>

<body>
<style type="text/css">
<!--
.black_overlay{   
    display: none;
    background-image:url(http://www.andowson.com/images/title.gif);
    background-color: #000000;
} 
-->
</style>
<script type="text/javascript">   
     window.onload = function() {   
          document.getElementById('fade').style.display='block';   
     }   
</script>
<%
	if( gERR == 0 ) {
%>
	<div id="fade" class="black_overlay">&nbsp;</div>

<%
	} else {
%>
	<!--網頁內容-->
<%
	}
%>
</body>

</html>

可以線上測試一下:
http://www.andowson.com/examples/csstest.jsp
cast(datepart(yyyy, birthday) as varchar)+'年'+right('00'+cast(datepart(mm, birthday) as varchar), 2)+'月'+right('00'+cast(datepart(dd, birthday) as varchar), 2)+'日' as birthday_string


datepart(yyyy, birthday) AS birth_year, right('00'+cast(datepart(mm, birthday) as varchar), 2) AS birth_month, 
right('00'+cast(datepart(dd, birthday) as varchar), 2) AS birth_day
在完成Apache 2.2 + Tomcat 6.0 + JK 1.2安裝後,接下來便是要如何新增網站(即虛擬主機)了。
我們的設計理念是:
1.為便於管理,我們將以/var/webapps作為所有網站應用程式的起始目錄,每個網站對應到/var/webapps底下的一個和網域名稱同名的目錄(實際上是一個符號連結,連結到一個OS使用者帳號的www目錄),例如DNS名稱為www.andowson.com就對應到目錄/var/webapps/www.andowson.com,Apache和Tomcat都會將網域名稱對應到這個目錄名稱。
www.andowson.com: /var/webapps/www.andowson.com->/home/andowson/www

2.Apache使用Name-based Virtual Host方式,httpd.conf裡面的設定如下:
UseCanonicalName Off
VirtualDocumentRoot /var/webapps/%0

3.Tomcat則是透過<Host>標籤來達成Virtual Host,在此我們將appBase屬性設定為"",內層包含一個網站根目錄的設定<Context path="" docBase="webapps/www.andowson.com" />。

4.為便於維護及升級Tomcat, 我們將Tomcat分為安裝目錄(放程式)及設定目錄(放資料),安裝目錄在/var下,如/var/apache-tomcat-6.0.18,我們建立一個符號連結/var/tomcat6來指向它,日後如更新版本,便只需將此符號連結指向新的安裝目錄即可。

設定目錄在/var/robust目錄下,如需要執行多部Tomcat(為日後做Cluster準備),我們可建立多個worker目錄在/var/robust目錄下,在每個worker目錄下建立conf, logs, temp, work目錄,及一個webapps的符號連結指向/var/webapps。如此一來,/var/robust/worker1/webapps及/var/robust/worker2/webapps下的內容和/var/webapps下的內容是相同的,也就是說我們只需在/var/webapps下新增新的網域名稱,每個worker就都可以存取到同樣一份的內容了。分成安裝目錄及設定目錄兩個不同路徑的好處是,日後,升級Tomcat版本時,只需將/var/tomcat6的符號連結指向新的安裝目錄,如/var/apache-tomcat-6.0.20即可,便不需要去搬移/var/apache-tomcat-6.0.18/webapps的內容。
/var/tomcat6->/var/apache-tomcat-6.0.18
/var/robust/worker1/webapps->/var/webapps
/var/robust/worker2/webapps->/var/webapps

5.接著我們讓網站的實際內容對應到一個OS使用者家目錄下的www目錄,即
/var/webapps/www.andowson.com->/home/andowson/www,
故新增一個網站時,需要新增一個OS使用者帳號,並設定好一個符號連結到該使用者的www目錄下。如果該網站有多個網址,我們只需要再多建立幾個符號連結即可,例如用andowson.com也要可以連到和www.andowson.com的內容。
andowson.com: /var/webapps/andowson.com->/home/andowson/www

6.為了安全起見,我們讓虛擬主機的使用者帳號只能透過FTP連進來更新檔案,不能透過SSH登入進來,我們可以將使用者帳號設定為/sbin/nologin。另外我們可以將該使用者帳號的群組指定為tomcat,以便Tomcat可以順利讀取該使用者目錄下的檔案。

7.為便於網站的開發和除錯,我們需要觀看網站的記錄檔,這點可以透過設定log4j將屬於該虛擬主機的記錄檔寫到其相對應的OS使用者家目錄下的logs目錄(如/home/andowson/logs)來。如果要讓使用者也可以看到網站的存取紀錄,我們可以將Tomcat的access log的目錄也指定到/home/andowson/logs下。這裡需將/home/andowson/logs設定為tomcat群組可以寫入的權限。

8.因為每次建立使用者時都需要新增www和logs的目錄,故我們可以透過在/etc/skel的目錄下建立好www和logs目錄來自動完成這個動作,我們也順便在www目錄下放一個index.html檔案作為網站的預設首頁,內容可以簡單的輸入Under construction或建置中等文字。
mkdir /etc/skel/www
mkdir /etc/skel/logs
echo "Under construction" > /etc/skel/www/index.html


9.[Optional]如果需要流量統計時,可以在新增站台時同時設定好AWStats的流量統計設定檔

新增站台
除了手動去編輯server.xml檔外,為便於動態新增站台,我們可將Tomcat的server.xml拆開成三個檔案,server.header, server.host, server.footer,存放於每個worker目錄下的conf目錄中。拆的方式主要是將第一個<Host>到最後一個</Host>的部分切割出來成為server.host,在第一個<Host>之前的部分就變成server.header,在最後一個</Host>之後的部分就變成server.footer了。接下來我們設計一個新增站台的template檔,透過取代變數的方式,將這個template檔的內容取代後合併回去到server.host,然後再將server.header, server.host, server.footer合併為server.xml。

這個template檔我們取名為server.newhost,內容如下:
      <Host name="yourdomain" appBase=""
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve"
               directory="/home/username/logs"  prefix="yourdomain_access_log." suffix=".txt"
               pattern="combined" resolveHosts="false"/>
        <Context path="" docBase="webapps/yourdomain" reloadable="false" />
      </Host>


針對網站記錄檔的template我們取名為log4.newhost,內容如下:
# VH begin: yourdomain
log4j.appender.username=org.apache.log4j.RollingFileAppender
log4j.appender.username.File=/home/username/logs/tomcat.log
log4j.appender.username.MaxFileSize=10MB
log4j.appender.username.MaxBackupIndex=10
log4j.appender.username.layout=org.apache.log4j.PatternLayout
log4j.appender.username.layout.ConversionPattern=%d - %5p (%C:%L) - %m%n

log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[yourdomain]=INFO, username
log4j.additivity.org.apache.catalina.core.ContainerBase.[Catalina].[yourdomain]=false
# VH end: yourdomain


新增站台shell script的檔就很簡單了,只需要傳入三個參數(使用者名稱,密碼,網域名稱)就會自動建立一個網站出來
newsite.sh:
#!/bin/bash
# Name: Tomcat newsite.sh
# Author: Andowson Chang (andowson [at] gmail [dot] com)
# Version: 1.5
# Last Modified: 2009-03-29
CATALINA_HOME=/var/tomcat6
WORKER_ROOT="/var/robust"
WORKER_LIST=( worker1 worker2 )
username=$1
password=$2
yourdomain=$3
useradd -s /sbin/nologin -g tomcat ${username}
echo "${username}:${password}" | chpasswd
ln -s /home/${username}/www /var/webapps/${yourdomain}
chmod 755 /home/${username}
mkdir /home/${username}/logs
chmod 775 /home/${username}/logs
# for Tomcat5
#sed -e "s/yourdomain/${yourdomain}/g" -e "s/username/${username}/g" /root/newsite/log4j.newhost >> ${CATALINA_HOME}/common/classes/log4j.properties
# for Tomcat6
sed -e "s/yourdomain/${yourdomain}/g" -e "s/username/${username}/g" /root/newsite/log4j.newhost >> ${CATALINA_HOME}/lib/log4j.properties
for (( i = 0 ; i < ${#WORKER_LIST[@]} ; i++ ))
do
    mkdir -p ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/Catalina/${yourdomain}
    # for Tomcat5 
    #cp -rf ${CATALINA_HOME}/server/webapps/manager/manager.xml ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/Catalina/${yourdomain}/.
    # for Tomcat6
    cp -rf ${CATALINA_HOME}/webapps/host-manager/manager.xml ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/Catalina/${yourdomain}/.
    sed -e "s/yourdomain/${yourdomain}/g" -e "s/username/${username}/g" /root/newsite/server.newhost >> ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/server.host
    cd ${WORKER_ROOT}/${WORKER_LIST[i]}/conf
    cat server.header server.host server.footer > server.xml
done
sed -e "s/yourdomain/${yourdomain}/g" /root/newsite/awstats.newhost > /etc/awstats/awstats.${yourdomain}.conf


注意:
1.使用前,請先將server.newhost, log4j.newhost, awstats.newhost及newsite.sh下載後存到/root/newsite目錄下,將newsite.sh設定為可執行,如果是使用Tomcat5.5的人,需自行相改對應的部分。
執行範例:
./newsite.sh andowson password www.andowson.com

2.如果遇到有多個網域名稱的狀況,就需要手動修改server.host加上Alias設定,然後再合併一次server.header, server.host, server.footer,產生server.xml,並手動建立第二個以上的域名的symbolic link。例如,假設還有一個網址andowson.com也要連到www.andowson.com:
ln -s /home/andowson/www /var/webapps/andowson.com

刪除站台
刪除網站則需要將我們先前產生的目錄或檔案回復原狀,主要就是刪除掉使用者目錄,worker內的目錄及server.xml中的設定。
使用刪除站台的shell script也是很簡單只需要輸入兩個參數(使用者名稱,網域名稱),即可
delsite.sh:
#!/bin/bash
# Name: Tomcat delsite.sh
# Author: Andowson Chang (andowson [at] gmail [dot] com)
# Version: 1.2
# Last Modified: 2009-03-29
CATALINA_HOME=/var/tomcat6
WORKER_ROOT="/var/robust"
WORKER_LIST=( worker1 worker2 )
username=$1
yourdomain=$2
userdel -r ${username}

rm -rf /var/webapps/${yourdomain}

# for Tomcat5
#sed -i -e "s/${yourdomain}/yourdomain/g" -e '/# VH begin: yourdomain/,/end: yourdomain>/d' ${CATALINA_HOME}/common/classes/log4j.properties
# for Tomcat6
sed -i -e "s/${yourdomain}/yourdomain/g" -e '/# VH begin: yourdomain/,/end: yourdomain>/d' ${CATALINA_HOME}/lib/log4j.properties

for (( i = 0 ; i < ${#WORKER_LIST[@]} ; i++ ))
do
    rm -rf ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/Catalina/${yourdomain}
    #sed -i '/<Host name="${yourdomain}"/,/Host>/d' ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/server.host    
    sed -i -e "s/${yourdomain}/yourdomain/g" -e '/<Host name="yourdomain"/,/Host>/d' ${WORKER_ROOT}/${WORKER_LIST[i]}/conf/server.host
    cd ${WORKER_ROOT}/${WORKER_LIST[i]}/conf
    cat server.header server.host server.footer > server.xml
done
rm -rf /etc/awstats/awstats.${yourdomain}.conf

注意:
1.使用範例:
./delsite.sh andowson www.andowson.com
2.由於sed無法直接刪除<Host="${yourdomain}">到</Host>這樣的變動的pattern,但固定的pattern卻可以。故我改成先將原來的${yourdomain}替換成yourdomain,再將它刪除。
3.刪除一個站台後會留下一行空行,如果覺得礙眼,日後可以找時間再一次手動刪除。
4.如果遇到有多域名的狀況,就需要手動刪除第二個以上的域名的symbolic link。
rm -rf /var/webapps/andowson.com

smilie 記得:修改完server.xml均需要重新啟動Tomcat才會生效!
service tomcat restart
我們可以寫個自動偵測Tomcat設定檔有沒有變動內容的shell script掛在cron來自動完成這個任務,例如我們每15分鐘檢查一次:
tomcat_conf_check.sh:
#!/bin/bash

RETVAL=0

WORKER_ROOT=/var/robust

CONF_CHANGED=`find ${WORKER_ROOT}/worker1/conf/*.xml -mmin -15 | grep -v tomcat-users.xml | wc -l`
if [ $CONF_CHANGED != 0 ]; then
    echo "Tomcat restart began at `date`"
    /etc/init.d/tomcat restart
    echo "Tomcat restart ended at `date`"
fi

exit $RETVAL


chmod 755 /root/newsite/tomcat_conf_check.sh
然後在/etc/crontab中設定:
# check Tomcat config change and restart (2009.04.29)
*/15 * * * * root /root/newsite/tomcat_conf_check.sh >>/var/log/tomcat_conf_check.log

參考資料:
http://tomcat.apache.org/tomcat-6.0-doc/virtual-hosting-howto.html
http://tomcat.apache.org/tomcat-6.0-doc/logging.html
一、用人機構、類組代號、擔任工作、學歷及經歷條件、待遇、工作地點及錄取名額

  全部 213名,分別如下:
  電信研究所 86名、數據分公司 49名、行通分公司 26名、企客分公司 30名、
  北區分公司 21名、國際分公司 1名
二、報名期間:98年3月14日9:00至3月27日18:00截止,逾期恕不受理。
三、遴選日期及地點:
  (一)資歷及論文審查:98年3月28日至98年4月10日
  (二)面試日期:
    1.專業性面試:98 年 4 月 18、19 日(星期六、日)
    2.一般性面試:98 年 4 月 25、26 日(星期六、日)
四、錄取名單公告:98 年 4 月 30 日(星期四) 上午10:00
五、詳細資訊請見:http://www.cht.com.tw/CompanyCat.php?CatID=4&NewsID=1725&Page=HotNewsDetail
我不是很清楚您所指的類別是哪一個,可否請您再明確地說明一下您的問題是什麼?
您可以看一下net.jforum.view.forum.PrivateMessageAction這個類別的sendSave() method:
public class PrivateMessageAction extends Command
{
...
	public void sendSave()
	{
		if (!SessionFacade.isLogged()) {
			this.setTemplateName(ViewCommon.contextToLogin());
			return;
		}
                ...
	}
...
}
要避免這種升級Tomcat到新版本時多複製不同檔名但功能相同的舊版函式庫,就要先閱讀一下RELEASE-NOTESChange Log

另外,我們可以實際分別下載一份Tomcat 5.5.27和Tomcat 6.0.18的壓縮檔,解壓縮後深入去瞭解一下可以發現:
Tomcat 5.5.27的函式庫包含:
${tomcat5.5_install_dir}/common/lib
-rw-r--r-- 1 root root 112341 8月 29 2008 commons-el.jar
-rw-r--r-- 1 root root 408842 8月 29 2008 jasper-compiler.jar
-rw-r--r-- 1 root root 1395272 8月 29 2008 jasper-compiler-jdt.jar
-rw-r--r-- 1 root root 77185 8月 29 2008 jasper-runtime.jar
-rw-r--r-- 1 root root 49889 8月 29 2008 jsp-api.jar
-rw-r--r-- 1 root root 198057 8月 29 2008 naming-factory-dbcp.jar
-rw-r--r-- 1 root root 37296 8月 29 2008 naming-factory.jar
-rw-r--r-- 1 root root 48147 8月 29 2008 naming-resources.jar
-rw-r--r-- 1 root root 93538 8月 29 2008 servlet-api.jar

${tomcat5.5_install_dir}/common/i18n
-rw-r--r-- 1 root root 51208 8月 29 2008 tomcat-i18n-en.jar
-rw-r--r-- 1 root root 42276 8月 29 2008 tomcat-i18n-es.jar
-rw-r--r-- 1 root root 38618 8月 29 2008 tomcat-i18n-fr.jar
-rw-r--r-- 1 root root 44527 8月 29 2008 tomcat-i18n-ja.jar

${tomcat5.5_install_dir}/server/lib
-rw-r--r-- 1 root root 27202 8月 29 2008 catalina-ant.jar
-rw-r--r-- 1 root root 24178 8月 29 2008 catalina-ant-jmx.jar
-rw-r--r-- 1 root root 227651 8月 29 2008 catalina-cluster.jar
-rw-r--r-- 1 root root 667864 8月 29 2008 catalina.jar
-rw-r--r-- 1 root root 116032 8月 29 2008 catalina-optional.jar
-rw-r--r-- 1 root root 63285 8月 29 2008 catalina-storeconfig.jar
-rw-r--r-- 1 root root 112005 8月 29 2008 commons-modeler-2.0.1.jar
-rw-r--r-- 1 root root 20298 8月 29 2008 servlets-cgi.renametojar
-rw-r--r-- 1 root root 19306 8月 29 2008 servlets-default.jar
-rw-r--r-- 1 root root 6010 8月 29 2008 servlets-invoker.jar
-rw-r--r-- 1 root root 52914 8月 29 2008 servlets-ssi.renametojar
-rw-r--r-- 1 root root 23519 8月 29 2008 servlets-webdav.jar
-rw-r--r-- 1 root root 168936 8月 29 2008 tomcat-ajp.jar
-rw-r--r-- 1 root root 25902 8月 29 2008 tomcat-apr.jar
-rw-r--r-- 1 root root 19392 8月 29 2008 tomcat-coyote.jar
-rw-r--r-- 1 root root 89473 8月 29 2008 tomcat-http.jar
-rw-r--r-- 1 root root 31801 8月 29 2008 tomcat-jkstatus-ant.jar
-rw-r--r-- 1 root root 266690 8月 29 2008 tomcat-util.jar

Tomcat 6.0.18的函式庫包含:
${tomcat6_install_dir}/lib
-rw-r--r-- 1 root root 10805 7月 22 2008 annotations-api.jar
-rw-r--r-- 1 root root 49145 7月 22 2008 catalina-ant.jar
-rw-r--r-- 1 root root 123115 7月 22 2008 catalina-ha.jar
-rw-r--r-- 1 root root 1129912 7月 22 2008 catalina.jar
-rw-r--r-- 1 root root 228471 7月 22 2008 catalina-tribes.jar
-rw-r--r-- 1 root root 27690 7月 22 2008 el-api.jar
-rw-r--r-- 1 root root 102282 7月 22 2008 jasper-el.jar
-rw-r--r-- 1 root root 511634 7月 22 2008 jasper.jar
-rw-r--r-- 1 root root 1395264 7月 22 2008 jasper-jdt.jar
-rw-r--r-- 1 root root 72183 7月 22 2008 jsp-api.jar
-rw-r--r-- 1 root root 83787 7月 22 2008 servlet-api.jar
-rw-r--r-- 1 root root 742085 7月 22 2008 tomcat-coyote.jar
-rw-r--r-- 1 root root 197443 7月 22 2008 tomcat-dbcp.jar
-rw-r--r-- 1 root root 45686 7月 22 2008 tomcat-i18n-es.jar
-rw-r--r-- 1 root root 42702 7月 22 2008 tomcat-i18n-fr.jar
-rw-r--r-- 1 root root 49019 7月 22 2008 tomcat-i18n-ja.jar

由Release Notes我們可以大致的瞭解這些jar檔的功能:
A standard installation of Tomcat 6.0 makes all of the following APIs available
for use by web applications (by placing them in "lib"):
* annotations-api.jar (Annotations package)
* catalina.jar (Tomcat Catalina implementation)
* catalina-ant.jar (Tomcat Catalina Ant tasks)
* catalina-ha.jar (High availability package)
* catalina-tribes.jar (Group communication)
* el-api.jar (EL 2.1 API)
* jasper.jar (Jasper 2 Compiler and Runtime)
* jasper-el.jar (Jasper 2 EL implementation)
* jasper-jdt.jar (Eclipse JDT 3.3 Java compiler)
* jsp-api.jar (JSP 2.1 API)
* servlet-api.jar (Servlet 2.5 API)
* tomcat-coyote.jar (Tomcat connectors and utility classes)
* tomcat-dbcp.jar (package renamed database connection pool based on Commons DBCP)

所以簡單來說,如果直接把${tomcat5.5_install_dir}/common/lib下的jar檔全部複製到${tomcat6_install_dir}/lib下,就可能會出現版本錯亂的問題。一些原本該使用Tomcat 6.0版本的jar檔變成了Tomcat 5.5版本的jar檔,這就是問題發生的主因了。

對於升級Tomcat 5.5到Tomcat 6.0,我的建議作法是,
1.先在一部測試機上安裝Tomcat 6
2.將原先的webapp程式碼複製過去
3.設定Tomcat server.xml或context.xml
4.起動Tomcat 6.0
5.開啟瀏覽器瀏覽網頁,並檢查是否有出現找不到的類別之類的錯誤訊息,再將需要的函式庫一一補上,此外,將這些新增的函式庫檔案記錄下來。
6.測試正常後,即可在上線機器上正式部署此webapp。
NetAdmin 網管人是一本專業介紹「網路管理」與「Linux 應用」雜誌,內容著重於「網路管理」與 Linux 在「企業方面實務應用」為主。
http://kate.babyface.com.tw/NetAdmin/
不用客氣,如果您的網站順利上線了,不妨到以下文章報到一下
http://www.andowson.com/posts/list/27.page
可以參考這幾篇
Choosing A Java Web Framework: A Comparison by Richard Pack
http://developers.sun.com/learning/javaoneonline/2008/pdf/TS-6457.pdf

Comparing Web Frameworks - JSF, Spring MVC, Stripes, Struts 2, Tapestry and Wicket by Matt Raible
http://static.raibledesigns.com/repository/presentations/ComparingJavaWebFrameworks-ApacheConEU2007.pdf
http://parleys.com/display/PARLEYS/Comparing+Java+Web+Frameworks?showComments=true

Comparing JVM Web Frameworks - Flex, Grails, GWT, Seam, Struts 2 and Wicket by Matt Raible
http://static.raibledesigns.com/repository/presentations/ComparingJVMWebFrameworks-ApacheConUS2007.pdf

Java Web Framework
http://docs.google.com/View?docID=ajgdx7ccvkxg_50ccp25f&revision=_latest
SFTP(SSH File Transfer Protocol or FTP over SSH)

預先安裝函式庫:JSch(Java Secure Channel)
程式碼:
sftp.jsp:
<%@ page import="java.io.File"%>
<%@ page import="java.io.FileInputStream"%>
<%@ page import="java.io.FileOutputStream"%>
<%@ page import="java.util.Properties"%>
<%@ page import="java.util.Vector"%>
<%@ page import="com.jcraft.jsch.Channel"%>
<%@ page import="com.jcraft.jsch.ChannelSftp"%>
<%@ page import="com.jcraft.jsch.JSch"%>
<%@ page import="com.jcraft.jsch.Session"%>
<%@ page import="com.jcraft.jsch.ChannelSftp.LsEntry"%>
<%
	try {
		String host = "192.168.1.2";
		int port = 22;
		String username = "andowson";
		String password = "changeit";
		String directory = "/home/andowson/download/";
		String uploadFile = "C:\\temp\\upload.txt";
		
		String downloadFile = "C:\\temp\\download.txt";
		String deleteFile = "delete.txt";
	
		//
		// First Create a JSch session
		//
		System.out.println("Creating session.");
		JSch jsch = new JSch();
		ChannelSftp sftp = null;
	
		//
		// Now connect and SFTP to the SFTP Server
		//
		try {
			// Create a session sending through our username and password
			Session sshSession = jsch.getSession(username, host, port);
			System.out.println("Session created.");
			sshSession.setPassword(password);
			// Security.addProvider(new com.sun.crypto.provider.SunJCE());
	
			//
			// Setup Strict HostKeyChecking to no so we don't get the
			// unknown host key exception
			//
			Properties sshConfig = new Properties();
			sshConfig.put("StrictHostKeyChecking", "no");
			sshSession.setConfig(sshConfig);
			sshSession.connect();
			System.out.println("Session connected.");
	
			//
			// Open the SFTP channel
			//
			System.out.println("Opening Channel.");
			Channel channel = sshSession.openChannel("sftp");
			channel.connect();
			sftp = (ChannelSftp) channel;
			System.out.println("Connected to " + host + ".");
		} catch (Exception e) {
			System.err.println("Unable to connect to FTP server." + e.toString());
			throw e;
		}
	
		//
		// Change to the remote directory
		//
		System.out.println("Changing to FTP remote dir: " + directory);
		// CWD
		sftp.cd(directory);
		// PWD
		System.out.println(sftp.pwd());
	
		//
		// Send the file we generated, PUT
		//
		File filePut = new File(uploadFile);
		try {				
			System.out.println("Storing file as remote filename: "	+ filePut.getName());
			sftp.put(new FileInputStream(filePut), filePut.getName());
		} catch (Exception e) {
			System.err.println("Storing remote file failed." + e.toString());
			throw e;
		}
	
		//
		// Get the list of files in the remote server directory
		//
		Vector files = sftp.ls(directory);
	
		//
		// Log if we have nothing to download
		//
		if (files.size() == 0) {
			System.out.println("No files are available for download.");
		}
		//
		// Otherwise download all files except for the . and .. entries
		//
		else {
			long totalSize = 0L;
			for (int i = 0; i < files.size(); i++) {
				LsEntry file = (LsEntry) files.get(i);					
				if (!file.getFilename().equals(".")	&& !file.getFilename().equals("..")) {
					System.out.printf("%s %s [%d bytes]\n",
							(file.getAttrs().isDir() ? "[D]" : "   "), file.getFilename(), file.getAttrs().getSize());
					if (!file.getAttrs().isDir()) {
						totalSize += file.getAttrs().getSize();
					}						
				}
			}
			System.out.println("totalSize = " + totalSize/(1024 * 1024) + "MB");
			//
			// Get the file and write it to our local file system, GET
			//
			System.out.println("Downloading file " + filePut.getName());
			File fileGet = new File(downloadFile);
			sftp.get(filePut.getName(), new FileOutputStream(fileGet));
			//
			// Remove the file from the server, DELE
			//
			System.out.println("Deleting file " + deleteFile);
			sftp.rm(deleteFile);
		}
	
		//
		// Disconnect from the FTP server
		//
		try {
			sftp.quit();
		} catch (Exception e) {
			System.err.println("Unable to disconnect from FTP server. "	+ e.toString());
		}
	
	} catch (Exception e) {
		System.err.println("Error: " + e.toString());
		e.printStackTrace();
	}
	
	System.out.println("Process Complete.");
%>

參考資料:
Sending Files via FTP From Your Java Applications - Part 2 of 2 - Using Jsch for SFTP
 
Forum Index » Profile for andowson » Messages posted by andowson
Go to:   

交換連結乌托邦博客 
在本站刊登廣告
練功房推薦書單
SCJP 6.0認證教戰手冊 (附光碟) 雲端策略:雲端運算與虛擬化技術 SCJP Java 6專業認證手冊 Java認證SCJP 6.0/5.0--猛虎出閘 SCWCD 5 猛虎出閘:Java Web 應用程式專業認證 SCWCD專業認證手冊 Head First Servlets and JSP
[版權說明] 本站授權方式:創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款
Creative Commons License
Powered by JForum 2.2.0 © JForum Team