星期日, 9月 03, 2006

JDOM (2) - 讀取XML檔

package jdom;
import org.jdom.*;
import org.jdom.input.*;
import java.io.*;
import java.util.List;

public class ReadFibonacci {
public ReadFibonacci() {

//是否用DTD驗正XML的合法性(true/false)
SAXBuilder bSAB = new SAXBuilder(false);

Document docJdom;
try {
//讀取Fibonacci.xml
docJdom = bSAB.build("C:/Documents and Settings/gecko/jbproject/TIJ/Fibonacci.xml");

//取得xml檔內的root節點-Fibonacci_Numbers
Element root = docJdom.getRootElement();

//新增子節點,內容為"驗證XML",index為6
Element fib = new Element("fibonacci");
fib.setText("驗証XML");
fib.setAttribute("index", "6");
root.addContent(fib);

//取得fibonacci.xml所有子節點內容
List children = root.getChildren("fibonacci");

for(int i=0;i\<children.size();i++){
Element child = (Element)children.get(i);
System.out.println("child: "+i);
System.out.println("Text: "+child.getText());
System.out.println("Attrubute: "+child.getAttribute("index"));
}

}
catch (IOException ex) { ex.printStackTrace(); }
catch (JDOMException ex) { ex.printStackTrace(); }

}
public static void main(String[] args) {
ReadFibonacci read = new ReadFibonacci();
}
}

JDOM (1) - 建立XML檔

//建立Fibonacci數列並將結果寫入Fibonacci.xml

package jdom;
import org.jdom.*;
import org.jdom.output.XMLOutputter;
import org.jdom.output.Format;
import java.math.BigInteger;
import java.io.FileWriter;
import java.io.IOException;

public class FibonacciJDOM {
public FibonacciJDOM(){
//建立根節點root, Tag名稱為Fibonacci_Numbers
Element root = new Element("Fibonacci_Numbers");

BigInteger low = BigInteger.ONE;
BigInteger high = BigInteger.ONE;
for(int i=1;i<=5;i++){
//建立存放費氐樹列的Tag名稱-fibonacci
Element fib = new Element("fibonacci");
fib.setText( low.toString() );
fib.setAttribute("index", String.valueOf(i));
//利用addContent()建根節點與子節點的從屬關係
root.addContent(fib);
BigInteger tmp = high;
high = high.add(low);
low = tmp;
}
//設定root為此XML的根節點
Document doc = new Document();
doc.setRootElement(root);
//用Format.getPrettyFormat()使XML文字內容排列整齊
XMLOutputter serializer = new XMLOutputter(Format.getPrettyFormat());
try {
//輸出內容至console
serializer.output(doc, System.out);
} catch (IOException ex) {System.err.println("ex: "+ex);}

//寫入Fibonacci.xml
FileWriter writer = null;
try {
writer = new FileWriter("Fibonacci.xml");
serializer.output(doc, writer);
writer.close();
} catch (IOException ex1) { ex1.printStackTrace(); }

}
public static void main(String[] args) {
FibonacciJDOM Fib = new FibonacciJDOM();
}
}

星期三, 8月 30, 2006

java.io (5) - 小結 - 讀取與寫入檔案內容

package ch12io;
import java.io.*;

public class BufReader {
public static void main(String[] args) throws IOException {
//互動式寫入檔案
FileWriter fw = null;
BufferedWriter bw = null;
BufferedReader br = null;
try {
//利用FileWriter讀入檔案
fw = new FileWriter("test.txt", true);
//將BufferedWriter與FileWriter介接起來
bw = new BufferedWriter(fw);
//從Console作連續輸入,每次輸入記錄為一行
br = new BufferedReader(new InputStreamReader(System.in));
while(true){
System.out.print("please enter a string: ");
String str = br.readLine();
System.out.println("The string u entered is: " + str);
if(str.equals("q")) //鍵入"q"以離開輸入模式
break;
bw.write(str);//寫入test.txt內
bw.newLine();//換行
}
} catch (IOException ex) { System.out.println("ex: "+ex); }
finally{
bw.close();
}

//3種讀取方式
//第1種:FileInputStream
FileInputStream fir = null;
try {
fir = new FileInputStream("test.txt");
int totalbytes = fir.available();
byte[] buffer = new byte[totalbytes];
if(fir.read(buffer)==totalbytes){
String str1 = new String(buffer);
System.out.println("\"檔案內容為: \"");
System.out.print(str1);
}
} catch (FileNotFoundException ex1) {System.out.println("ex1. "+ex1); }

//第2種:FileReader
FileReader fr = null;
fr = new FileReader("test.txt");
char[] buffer1 = new char[1];
while(fr.read(buffer1)!=-1){ //-1意謂到檔案尾端
String str1 = new String(buffer1);
System.out.print(str1);
}

//第3種:BufferedReader結合FileReader
FileReader fer = null;
BufferedReader bdr = null;
fer = new FileReader("test.txt");
bdr = new BufferedReader(fer);
String line = null;
while( (line=bdr.readLine())!=null ){//讀取一行,判斷是否為檔案結尾
System.out.println(line);
}
}
}

星期二, 8月 29, 2006

java.io (4) - FileReader & FileWriter - 資料型態:character - 讀取與寫入檔案內容

package ch12io;
import java.io.*;

public class EX_FileWriter {
public static void main(String[] args) {
//寫入檔案
FileWriter fw = null;
String s = "gecko";
try {
fw = new FileWriter("test.txt", true);//true為可append新文字至test.txt尾端
fw.write(s);//完成寫入動作
} catch (IOException ex) {System.out.println("ex: "+ex);}
finally{
try {
fw.close();
} catch (IOException ex1) {System.out.println("ex1: "+ex1);}
}

//讀取檔案
FileReader fr = null;
char[] buffer1 = new char[1]; //一次讀取一個character,中文字與英文字符皆視為一個char
try {
fr = new FileReader("test.txt");//讀取檔案
while (fr.read(buffer1) != -1) { //-1表示資料尾端
String s1 = new String(buffer1); //將char轉換成String
System.out.print(s1);
}
} catch (IOException ex2) {System.out.println("ex2: "+ex2); }
}
}

java.io (3) - FileOutputStream & FileInputStream - 資料型態:byte - 寫入與讀取檔案內容

package ch12io;
import java.io.*;

public class FileOuput {
public static void main(String[] args) throws FileNotFoundException {//無檔案則丟出Exception
//寫入檔案(FileOutputStream)
FileOutputStream fos = null;
String s = "gecko";
byte[] data = null;
try {
fos = new FileOutputStream("test.txt", true);//true代表append資料至檔尾
data = s.getBytes(s);//由於資料型態為byte,所以須做轉換
fos.write(data);
} catch (IOException ex) {System.out.println("ex: "+ex); }
finally{
try {
fos.close();
} catch (IOException ex1) {System.out.println("ex1: "+ex1);}
}

//讀取檔案(FileInputStream)
FileInputStream fis = null;
fis = new FileInputStream("test.txt");
int totalbytes = 0;
try {
totalbytes = fis.available();
byte[] content = new byte[totalbytes];
if (fis.read(content) == totalbytes) {
String s1 = new String(content);
System.out.print(s1);
}
} catch (IOException ex2) {System.out.println("ex2: "+ex2);}
}
}

java.io (2) - File class [列出指定目錄下的子目錄與檔案]

package ch12io;
import java.io.File;
import java.io.*;
public class Ex_File2 {
public Ex_File2() {}
public static void main(String[] args) {
String path = "C:/Documents and Settings/gecko/jbproject/TIJ/";
File file = new File(path); //建立路徑之instance
String[] filelist = file.list(); //將檔案清單存成Array
for (int i = 0; i < filelist.length; i++) {
File file2 = new File(path + filelist[i]);//將目錄檔案清單個別建立instance
if(file2.isDirectory())//判斷該instance是否為目錄
System.out.println(filelist[i]+" 是目錄");
else
System.out.println(filelist[i]+" 是檔案");
}
}
}

java.io (1) - File class [建立檔案]

package ch12io;
import java.io.File;
import java.io.*;
public class Ex_File1 {
public Ex_File1() {}
public static void main(String[] args) {
File file = new File("test.txt"); //在記憶體Heap區塊建立檔案物件類別的instance,以利用exists() method檢查檔案是否存在
System.out.println("檔案是否存在? "+file.exists());
if(!file.exists()){
System.out.println("利用creatNewFile()建立新檔/是否建立成功? ");
try {
System.out.println(file.createNewFile());
} catch (IOException ex) {
System.out.println(ex);
}
System.out.println("檢查新建檔案是否存在? " + file.exists());
}
}
}
=================================================
執行Ex_File1之結果:

檔案是否存在? false
利用creatNewFile()建立新檔/是否建立成功? true
檢查新建檔案是否存在? true

建立的檔案在Jbuilder存放project的目錄下 QQ

星期日, 8月 06, 2006

JSP與JDBC交戰重點(一)

MySQL Driver(http://www.mysql.com/products/connector-j/index.html)
並置於( ..\webapps\Stores\WEB-INF\lib )目錄下
或 將存放路徑 加入環境變數CLASSPATH

*使用JDBS連接MySQL 三步驟 -

Class.forName("com.mysql.jdbc.Driver"); or Class.forName("com.mysql.jdbc.Driver").newInstance();
---------------------------------------------------------

Connection con = DriverManager.getConnection
      ("jdbc:mysql://localhost:3306/db?name=test&password=pwd");

String url = "jdbc:mysql://localhost:3306?db";
String user = "test";
String password = "pwd";
Connection con = DriverManager(url, user, password);
---------------------------------------------------------

Statement stmt = con.createStatement();

++++++++++++++++++++++++++++++++++++++++

<完整寫法>

Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection
      ("jdbc:mysql://localhost:3306/db?name=test&password=pwd");
Statement stmt = con.createStatement();

++++++++++++++++++++++++++++++++++++++++

% ResultSet 之參考文章 %
% 參考文章之重點整理 %

createStatement()不給定參數時,預設是
ResultSet.TYPE_FORWARD_ONLY、 ResultSet.CONCUR_READ_ONLY

resultSetType可指定參數有
  1. ResultSet.TYPE_FORWARD_ONLY
  2. ResultSet.TYPE_SCROLL_INSENSITIVE
  3. ResultSet.TYPE_SCROLL_SENSITIVE
第1個只能使用next()來逐筆取得資料
第2個或第3個,則可用afterLast()、previous()、absolute()、relative()等方法。

**第2個及第3個的差別在於能否取得ResultSet改變值後的資料,另外您還必須指定
resultSetConcurrency
  1. ResultSet.CONCUR_READ_ONLY
  2. ResultSet.CONCUR_UPDATABLE

第1個表示只能讀取 ResultSet的資料
第2個表示可以直接使用ResultSet來操作資料庫

JSP - 解決中文字顯示問題 (Tomcat 5.5 + MySql 4.0)

將下列紅字處編碼改成MS950
                            藍色處
編碼改為UTF-8


<%@ page import="java.sql.*"%>

<%@ page lanaguage="java" contentType="text/html;charset=MS950" pageEncoding=MS950%>

.. 略 ..


<% request.setCharacterEncoding("MS950")

Connection con = DriverManager.getConnection
("jdbc:mysql://localhost:3306/dbName?user=geckoshow&password=pwd
&useUnicode=true&characterEncoding=UTF-8");
%>

.. 略 ..

因為編碼的關係,網頁無法正常顯示某些中文字
( 例如:碁 恒 )
但只要照上述紅字處(MS950)作修改,即可改善!!

另外,某些中文字編碼內含跳脫字符
導致輸入中文後,無法正常顯示 ( 例如:功 )
只要將連結DB的characterEncoding編碼改成(
UTF-8)即可