跳到主要內容

發表文章

目前顯示的是有「java」標籤的文章

Can't create output stream on Tomcat 7

When I visit my web application on newly installed Tomcat 7, a message shows up: SEVERE : org . zkoss . zk . ui . UiException : javax . imageio . IIOException : Can 't create output str eam! at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct orAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC onstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) ... at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpo int.java:2442) at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoin t.java:2431) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec utor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor .java:908) at org.apache.tomcat.util.t...

使用Google Custom Search REST API

介紹: 我使用v1 https://developers.google.com/custom-search/v1/overview 準備工作: 只要有Google 帳號就能申請,但一天只能免費查詢100次 申請設定custom search engine 並取得engine ID 申請Google API使用權限 並取得 API key 作法概念: 發出Http GET request 到下面的URL並設定好參數 https://www.googleapis.com/customsearch/v1?key=[INSERT-YOUR-API-KEY]&cx=[CUSTOM-SEARCH-ENGINE-ID] 範例程式: public String search(String keyword){ StringBuffer result = new StringBuffer(); try { HttpURLConnection connection = (HttpURLConnection)new URL(CSE_URL+"&q="+keyword).openConnection(); connection.setRequestMethod("GET"); connection.setDoOutput(true); connection.connect(); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; while ((line = reader.readLine())!=null){ result.append(line); } }catch (Exception e) { e.printStackTrace(); } return result.toString(); } 使用 Custom Search API - Java library : Javad...

Java 執行檔(exe)路徑問題

要讀取應用程式下相對目錄的檔案,要瞭解java File解析相對路徑的方式。 JavaDoc java.io.File中提到 A pathname, whether abstract or in string form, may be either absolute or relative . ...resolve relative pathnames against the current user directory. This directory is named by the system property user.dir , and is typically the directory in which the Java virtual machine was invoked. 路徑可以是「相對」或「絕對」,相對路徑依照目前使用者的所在目錄,也就是JM被啟動的目錄。 在eclipse中,啟動的目錄是project根目錄,例如: myProject下執行"run as Java Application" current user directory就是 [workspace目錄]\myProject 如果用JSmooth之類的custom launcher工具封裝成exe後,current user directory就是exe所存在的目錄。 建立成捷徑後,則current user directory會以捷徑內容中「開始位置」為準,所以如果「開始位置」與exe存放位置相同的時候,則與直接雙擊exe執行的current user directory相同。 但若以bat執行,則current use directory會以bat所在目錄為準。 例如一個bat檔如下 d:\filePath.exe pause 若filePath會建一個新檔在current user directory,若bat放在桌面,則該新檔會建立在桌面,而不是exe檔所在位置。 但透過JSmooth設定可以改變此情形。 勾選"Set the executable folder as current directory of application"之後,無論bat檔在什麼位置,都以exe檔的所在位...

StringBuffer & "The Type AbstractStringBuilder is not visible"

在jdk1.5下使用StringBuffer,如果在同一行連續使用append StringBuffer sb = new StringBuffer(); sb.append("test").append("test2"); 有些IDE會出現以下compilation error訊息: The Type AbstractStringBuilder is not visible. 但如果分開寫就沒有這個error: <big><br />sb.append("test");<br />sb.append("test2");<br /></big> 原因有兩個 其一是,Java2SE5.0 開始有covariant return types這個新feature,意思大約是「可變回傳型態」,主要是讓子類別在覆寫(override)父類別的某個method時,回傳型態可以是父類別回傳型態的子類別。例如 <br />Parent class{<br /> Parent getObj(...){...}<br />}<br /><br />Child class extends Parent{<br /> Child getObj(...){<br /> ...<br /> return Child;<br /> }<br /> 其 二是1.5之後新增了AbstractStringBuilder為StringBuffer, StringBuilder的父類別,但他卻是private類別,甚至從javadoc上也看不到此類別,你只會看到StringBuffer, StringBuilder都繼承自Object。 所以,第一種寫法,StringBuffer append()可能被IDE compiler判定回傳AbstractStringBuilder然後又呼叫其append(),導致發生找不到 AbstractStringBuilder情形,這應該是IDE可以解決的問題,我聽說ecli...

BeanDefinitionStoreException with ClassFormatError

使用Spring過程中突然發生application server啟動即出現bean definition file parsing的以下錯誤: BeanDefinitionStoreException: Unexpected exception parsing XML doc ument from class path resource.. nested exception java.lang.ClassFormatError: Unknown constant tag 0 in class file com/sun/org/apache/xerces/internal.. 詳細檢查了數次都找不到xml哪裡有錯。 ClassFormatError這個錯誤很少見,似乎是JVM內Hotspot相關的錯誤,而且同時其他所有舊的project使用Spring原本可以正常執行的,現在都會產生這個錯誤。 研判可能是JVM出了什麼問題,重裝JDK1.5這個問題就消失了。

Java Program Thinking

*複合多次呼叫的缺點:當該行發生exception時,不容易推測問題的原因。 ex: aLine.append(format(colMeasure[col].get(row).toString())); 發生null pointer exception 難以判斷是 colMeasure[col], get(row), toString() 那一個發生null pointer.

取得資料表的欄位名稱

It's userful method. public void getColumnNames ( ResultSet rs ) throws SQLException { ResultSetMetaData rsMetaData = rs.getMetaData () ; int nCol = rsMetaData.getColumnCount () ; // get the column names for ( int i = 0 ; i < nCol ; i++ ) { String colName = rsMetaData.getColumnName ( i ) ; // Get table String tableName = rsMetaData.getTableName ( i ) ; } }

JNI(Java Native Interface) Learning Notes

JNI Learning Notes 要從Java中呼叫第三方C的DLL, cstat.dll,該程式沒有source code無法重新編譯。 因JNI的方式來呼叫的話,C的函數名稱有固定的規則,因為無cstat.dll的原始檔可以修改,因此要用C/C++寫一個中間程式來呼叫cstat.dll。 架構為 Java Class -> intermedia c program -> cstat.dll ( ->代表函數呼叫 ) 產生C header file javah -jni Hello produce Hello.h C compiler Download free cygwin 安裝時要選擇gcc的套件一併安裝,才有gcc可用。 編譯出object file, 要求編譯系統不要使 用 cygwin的DLL gcc -c -I C:/j2sdk1.4.2_13/include -I C:/j2sdk1.4.2_13/include/win32 -mno-cygwin Sample1.c -c 執行編譯 -I 指定jni.h的目錄位置與作業系統相關的header file位置 Build DLL from .o file gcc -shared -o Sample1 .dll Sample1 .o 製作 DLL 時要求編譯系統不要使 用 cygwin 的 DLL gcc -mno-cygwin -shared -o HelloImp.dll HelloImp.o Build DLL directly from .c file gcc -shared -mno-cygwin -I C:/j2sdk1.4.2_13/include -I C:/j2sdk1.4.2_13/include/win32 Arguments.c -o Arguments.dll Final correct command with options gcc -shared -mno-cygwin -Wl,--kill-at -I C:/j2sdk1.4.2_13/include -I C:/j2sdk1.4.2_13/include/win32 Arguments.c -o Arguments.dll -Wl,option 把option傳遞給連接器,如果op...

JDK CLASSPATH 設定

JDK CLASSPATH 設定 (configure) Class Path,JRE會依照此路徑的設定去尋找對應的class檔與相關資源(程式要讀取的檔案等)。使用JDK的程式(java.exe or javac.exe),可以不設定classpath,原始會有一個預設值(default class path),就是執行java時的該目錄。 舉例來說,若是要在C:\myproject\下執行Hello.class java Hello 若Hello有用到C:\myproject\下的其他.class檔都可以被搜尋到,不用另外指定。但是若class包在jar檔則無法被引入。 若找不到執行所需要的class會產生如下錯誤: Exception in thread "main" java.lang.NoClassDefFoundError:packagename/classname 若用到的class檔較多、不在同一目錄下或包在jar中,則需要設定CLASSPATH。 有三種方式,不管用哪種方式,一旦設定classpath,JRE就不會再參考預設的classpath設定,會完全按照你設定來找尋class,如果設定不對就會出現前面所述的java.lang.NoClassDefFoundError 一是直接設定在windows系統的環境變數中,一開機就設定好比較方便,如果有修改則需要重開機新的設定才會生效。不管哪個版本大致上是從控制臺>系統>進階>環境變數。 可在命令列模式下輸入: echo %classpath% 系統會顯示目前的classpath設定值 增加一個環境變數為classpath,值可能是: .;C:\Program Files\Shared\dc.jar;C:\Program Files\Java\jdk1.5.0_15\lib;%JAVA_HOME%\lib\tools.jar 分號分隔的各是一個路徑值,請注意第一個值是一個點".",這個代表執行該class當前的目錄,也就是前述的預設值,但因我們現在已經用系統的環境變數去覆蓋預設值,因此必須要設定當前目錄,這是最常見的錯誤,否則會連一個class都執行不起來。 另外兩種就是JDK手冊上提到的方法: 用set指...

MySQL, JDBC, Eclipse

MySQL, JDBC, Eclipse 下載 MySQL JDBC產品 Connector/J 自行解壓到一個自訂目錄 設定Eclipse,匯入此JDBC JAR Project/Properties Libraries/Add External JAR 選擇Connector/J所在的目錄,找到名為 mysql-connector-java- [version] -bin.jar 的JAR檔 測試程式碼 import java.sql.*; public class MysqlConnect { public static void main ( String [] args ) { System.out.println ( "MySQL Connect Example." ) ; Connection conn = null ; String url = "jdbc:mysql://localhost:3306/" ; String dbName = "jdbctutorial" ; String driver = "com.mysql.jdbc.Driver" ; String userName = "root" ; String password = "root" ; try { Class.forName ( driver ) .newInstance () ; conn = DriverManager.getConnection ( url+dbName,userName,password ) ; System.out.println ( "Connected to t...