eclipse下內置的編輯器以及一些其他插件插件的編輯器似乎都沒有提供自動換行的功能。沒有這個有時候真不方便,估計很多人都有這樣的感受吧,所有終于有人開發了一個自動換行的插件,名為WordWrap,試用了一下,感覺還不錯,拿出來和大家分享。插件地址:
http://ahtik.com/eclipse-update/
安裝通過菜單help 下 install New Software來進行,具體細節就不多說了。安裝好后在編輯器中右鍵菜單中有一項Word Wrap,選中就是自動換行,當然你可以綁定一個自己喜歡的快捷鍵,從而快速切換是否自動換行。
eclipse本身自帶了很多快捷鍵,當然也允許用戶修改或自定義。依次打開window –> preferences –> General –> Keys,可以看到設置快捷鍵的列表。一般情況下設置好了快捷鍵就可以立馬使用了,但某些操作好像無法使用快捷鍵,例如配置了svn相關的操作,發現快捷鍵不起作用。究其原因,可能是在 “Command Groups Availability”中沒有啟用。可以在 windows –> Customize Perspective –> Command Groups Availability下找到對應在快捷鍵配置的category,并將其選中。如果沒有選中,那么快捷鍵不啟用。
mac os 下使用maven執行mvn eclipse:eclipse 時,看到命令行上輸出的日志中有一條警告信息,信息如下:
[WARNING] Workspace defines a VM that does not contain a valid jre/lib/rt.jar:
/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
原因是mac os 下沒有rt.jar文件,用classes.jar替代了,其完整路徑是/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar,知道原因,解決這個問題也就很容易,只需要做一個軟鏈接即可,操作如下:
cd /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
sudo mkdir -p jre/lib
sudo ln -s /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar jre/lib/rt.jar
如果是root用戶,可以省略上述命令中的“sudo”
在tomcat 6.0版本后,如果沒有apr natvie library,啟動時候都會出現類似如下的警告信息
The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:...
在以前的一篇文章:Tomcat-6.0.33之APR based Apache Tomcat Native library 中介紹了如果在window和linux下解決這個問題。最近使用mac os,也遇到了同樣的問題,解決的辦法和linux下相似,唯一不同的是在configure時需要指定java home。
自己編譯首要條件介紹已經安裝了gcc,關于如果安裝gcc,可以參考:mac os lion 安裝gcc備忘,依賴的庫似乎默認系統自帶了,如果編譯的時候提示缺少庫,可以使用 port 方式來安裝,順便提一下 port 是一個和centos下的yum、ubuntu下的apt-get類似的包管理軟件。我使用的configure參數設置如下:
./configure --with-apr=/usr/bin/apr-1-config --with-java-home=/System/Library/Frameworks/JavaVM.framework/ --with-os-type=Headers/
然后使用make、make install就編譯完成。如果成功,在目錄/usr/local/apr/lib/下會生成一個名為libtcnative-1.0.dylib的庫文件,使用ln命令做一個軟鏈接到上述警告信息中提到的一個目錄即可,例如:
ln -s /usr/local/apr/lib/libtcnative-1.dylib /Library/Java/Extensions/
freemarker模板文件我一直使用jboss tools下提供的FreeMarker IDE,沒有用過其他插件,也無法對比,個人覺得jboss提供的這個很好用。以前一直都是使用在線安裝的,今天在最新版的eclipse(3.7)使用以前的安裝地址,結果告訴我不可用,原來地址變化了,而且現在分版本了。
插件地址:http://download.jboss.org/jbosstools/updates/development/,在上面根據自己的版本選擇一個正確地址,例如eclipse 3.7就用:http://download.jboss.org/jbosstools/updates/development/indigo/。在線安裝的方法是:Help –> Install New Software 點擊and,再出來的對話框中的Location中輸入:http://download.jboss.org/jbosstools/updates/development/indigo/,name隨便取一個即可。然后會列出來所有可用的插件,如果只需要安裝FreeMarker IDE,可用在? JBoss Application Development 下找到并選中它,然后根據向導即可安裝成功。
freemarker數字格式化可以在兩個地方設置,一個是全局的,即在freemarker.properties文件中設置number_format,還有一個是使用string指令來控制數據的輸出格式。例如:
${num?string('0.00')}
如果小數點后不足兩位,用 0 代替
${num?string('#.##')}
如果小數點后多余兩位,就只保留兩位,否則輸出實際值
輸出為:1239765.46
${num?string(',###.00')}
輸出為:1,239,765.46
整數部分每三位用 , 分割,并且保證小數點后保留兩位,不足用 0 代替
${num?string(',###.##')}
輸出為:1,239,765.46
整數部分每三位用 , 分割,并且小數點后多余兩位就只保留兩位,不足兩位就取實際位數,可以不不包含小數點
${num?string('000.00')}
輸出為:012.70
整數部分如果不足三位(000),前面用0補齊,否則取實際的整數位
${num?string('###.00')}
等價于
${num?string('#.00')}
輸出為:12.70
整數取實際的位數
關于string指令的更多用法,可以訪問官方文檔:http://freemarker.sourceforge.net/docs/ref_builtins_number.html#ref_builtin_string_for_number
當訪問某個鏈接時瀏覽器是直接把內容顯示出來還是出現下載提示框,這個跟當前頁面的content-type有關,例如文本、html、css、圖片等會直接顯示出來,rar、zip等會出現下載提示框。如果需要把文本、圖片不直接顯示在瀏覽器中,可以通過人為設置其content-type。tomcat中配置如下:
<mime-mapping>
<extension>txt</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
<mime-mapping>
<extension>jpg</extension>
<mime-type>application/octet-stream</mime-type>
</mime-mapping>
對于如上配置,當訪問擴展名txt或jpg的資源時就出現下載提示框,如果只需要對某些提到的資源讓其出現下載提示框,上述配置就不行了,解決的方法是在資源的response頭中設置content-type即可,例如:
php 中
header("Content-type:application/octet-stream");
header('Content-Disposition: attachment; filename="downloaded.txt"');
java 中
response.setContentType("application/octet-stream");
resp.setHeader("Content-Disposition", "attachment;filename="downloaded.txt");
如果需要為下載設置一個保存的名字,可以用Content-Disposition屬性來指定。
在centos下,開機后會自動執行/etc/rc.local中的命令,平時啟動tomcat的命令為tomcat_home/bin/startup.sh或tomcat_home/bin/catalina.sh start,當直接把他們任何一個加入到/etc/rc.local中,重啟機器后發現tomcat并沒有啟動。原因是開機時java的環境還沒有設置好,故自己寫一個腳本,先設置java環境,然后在啟動,腳本如下:
export JAVA_HOME=/usr/local/jdk1.6.0_30
export PATH=$JAVA_HOME/bin/:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH
export CATALINA_HOME=/usr/local/tomcat-6.0.35/
/usr/local/tomcat-6.0.35/bin/catalina.sh start
假設保存成一個名為auto-startup.sh的文件存放在/usr/local/tomcat-6.0.35/bin下,然后在/etc/rc.local加入/usr/local/tomcat-6.0.35/bin/auto-startup.sh即可。注意:需要設置auto-startup.sh有執行權限。
在java web 應用中使用dbcp做為連接池,當數據庫重啟或數據庫連接超過設置的最大timemout時間,數據庫會強行斷開已有的鏈接,此時當web程序訪問數據庫時就會出現錯誤,大致的錯誤信息java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost,原因是數據庫這邊已有的連接強行斷開,而連接池中不知道已經斷開,還是從連接池取出數據庫連接交給程序去執行數據庫操作,所以導致出錯。
mysql的默認最大timeout時間是8小時,對空閑超過8小時的數據庫連接會強行斷開。timeout有兩種,一個是非交互式的最大等待時間wait_timeout,另一個是交互式的最大等待時間interactive_time,交互連接如mysql gui tool中的連接。一般情況下interactive_timeout的設置將要對你的web 應用沒有多大的影響。wait_timeout的時間設置太小話會導致連接關閉很快,從而使一些持久連接不起作用,反之設置過大,容易造成連接打開時間過長,在show processlist時,能看到太多的sleep狀態的連接,從而造成too many connections錯誤。修改wait_timeout可以在my.cnf的mysqld段中設置。
可以通過dbcp的配置來解決上述的報錯。可以用兩種方式。
方式一:通過設置validationQuery,例如:
<property name="validationQuery">
<value>select 1</value>
</property>
使用上述配置,連接池在返回數據庫連接給申請者時會多執行一條sql語句來確保該連接的有效性。如果數據庫方已經關閉了,連接池會重新建立連接并返回給申請者。通過測試似乎跟testWhileIdle沒有關系,不管其是true或false都正常工作。
方式二:通過配置timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis,例如:
<property name="minEvictableIdleTimeMillis">
<value>60000</value>
</property>
<property name="timeBetweenEvictionRunsMillis">
<value>10000</value>
</property>
在構造GenericObjectPool [BasicDataSource在其createDataSource () 方法中也會使用GenericObjectPool]時,會生成一個內嵌類Evictor,實現自Runnable接口。如果timeBetweenEvictionRunsMillis大于0,每過 timeBetweenEvictionRunsMillis毫秒Evictor會調用evict()方法,檢查連接池中的連接的閑置時間是否大于 minEvictableIdleTimeMillis毫秒(_minEvictableIdleTimeMillis小于等于0時則忽略,默認為30分鐘),是則銷毀此對象,然后調用ensureMinIdle方法檢查確保池中對象個數不小于_minIdle。如果連接池的連接數小于最小空閑連接數,則創建數據庫連接,同時檢查連接池的連接是否小于maxIdle,是則把剛創建的連接放入連接池中,否則銷毀此對象。
上述方式一能確保不出現本文開頭提到的錯誤,但是不好的方面是每次執行sql時都會額外執行一條提供的validationQuery sql;第二種方式在數據庫重啟后minEvictableIdleTimeMillis毫秒前訪問web應用,連接數據庫使用的還是連接池中老的連接,所以還會出現上述的錯誤,timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis也不宜設置過小,會加重系統開銷。根據具體情況來考慮使用哪種方式。對于數據庫可能會經常重啟,web應用和數據庫機器的網絡連接不穩定,可以采取第一種方式,否則使用第二種。由于mysql的默認最大空閑時間8小時,所以只要把minEvictableIdleTimeMillis設置小于此值即可。例如配置每十分鐘檢查超過空閑一個小時的連接
<property name="minEvictableIdleTimeMillis">
<value>3600000</value>
</property>
<property name="timeBetweenEvictionRunsMillis">
<value>600000</value>
</property>
freemarker的list指令遍歷一個list集合中的每一個元素,例如:
<#list userLists as user>
${user.name}
...
</#list>
其實list指令還隱含了兩個變量,
1、item_index 該變量將返回元素在集合里的索引值,從0開始計數;
2、item_has_next 該變量是boolean型,false表明該元素是Sequences里的最后一個元素。
上述例子中如果需要把序號打印出來,使用${user_index}即可,同時如果想判斷是否是最后一個元素,使用 user_has_next就行了。