2008年9月7日 星期日

Date date = new Date();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

String a = sdf.format(date.getTime());

date = sdf.parse(a);

Test t = new Test();

t.setStartDate(date);

Date enddate = new Date();

String end = sdf.format(date.getTime()+(60L*60L*24L*30L*1000));
enddate = sdf.parse(end);

t.setEndDate(enddate);

Session session = MulderSessionFactory.getSession();
Transaction tx = session.beginTransaction();
session.saveOrUpdate(t);
tx.commit();
MulderSessionFactory.closeSession();

2008年8月24日 星期日

note

JSTL API
http://java.sun.com/products/jsp/jstl/1.1/docs/api/index.html

JSTL TLD
http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html

workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\專案名稱

http://javaprepare.com/
http://www.javaranch.com/
http://www.digitalthink.com/
http://www.jaworski.com/java/certification
http://www.jchq.net/
http://www.certificationguru.com/

2008年8月16日 星期六

[Java] Dom4j 解析xml格式

Document doc = DocumentHelper.parseText(xmlRequest);
String AAA = doc.selectSingleNode("/action/AAA").getText();
String BBB = doc.selectSingleNode("/action/BBB").getText();

AAA的值為 "abc"
BBB的值為 "def"
其中"/action/AAA" 為xpath 除了需要dom4j.jar外
還需import jaxen.jar套件

[Java] Dom4j 產生xml格式

Document document = DocumentHelper.createDocument();
Element root = document.addElement("action");
root.addElement("AAA").addText("abc");
root.addElement("BBB").addText("def");
xmlRequest = document.asXML();

若要在ccc下面在加一個node
Element ccc = root.addElement("ccc");
ccc.addElement("ddd").addText("xyz");

xmlRequest輸出為以下字串
<action>
<AAA>abc<AAA>
<BBB>def<BBB>
<ccc>
  <ddd>xyz</ddd>
</ccc>
</action>

2008年8月6日 星期三

[Java] 今天和任一日期相差的天數

Calendar cal = Calendar.getInstance();
cal.set(2008, Calendar.JULY, 28); //取得DB中的日期
long daterange = new Date().getTime() - cal.getTimeInMillis();
long time = 1000*3600*24;
System.out.println(daterange/time);

2008年8月3日 星期日

[Java] JDBC連接資料庫 (六)

寫在finally區塊的關閉連線,有例外發生時會關閉連線
finally {

if (rset != null) {
  try {
    rset.close();
  } catch (SQLException e) {
    e.printStackTrace();
  }
}

if (stmt != null) {
  try {
    stmt.close();
  } catch (SQLException e) {
    e.printStackTrace();
  }
}

if (conn != null) {
  try {
    conn.close();
  } catch (SQLException e) {
    e.printStackTrace();
  }
}

}

[Java] JDBC連接資料庫 (五)

執行SQL Query和處理SQL執行結果
ResultSet rset = null;
try {
/**
* Enter SQL Query
*/
  rset = stmt.executeQuery("select deptid, deptname from dept");

/**
* Process SQL Query and print out
*/
while(rset.next()) {
  int deptid = rset.getInt("deptid");
  String deptname = rset.getString(2);
  System.out.println(deptid +", "+deptname);
}

} catch (SQLException e1) {
  e1.printStackTrace();
}

[Java] JDBC連接資料庫 (四)

取得Statement物件
Statement stmt = null;
try {

/**
* Get Statement object
*/
  stmt = conn.createStatement();

} catch (SQLException e1) {
  e1.printStackTrace();
}

[Java] JDBC連接資料庫 (三)

取得Database連線
Connection conn = null;
try {

/**
* Database connection
* jdbc:oracle:thin:@//host:port/DBName
*/
  String url = "jdbc:oracle:thin:@localhost:1521:XE";
  conn = DriverManager.getConnection(url, "java", "java");

} catch (SQLException e1) {
  e1.printStackTrace();
}

[Java] JDBC連接資料庫 (二)

註冊JDBC Driver 以Oracle資料庫為例
/**
* register JDBC Driver
*/
try {

  Class.forName("oracle.jdbc.OracleDriver");

} catch (ClassNotFoundException e) {
  e.printStackTrace();
}

[Java] JDBC連接資料庫 (一)

連接資料庫的六個步驟:
1.註冊JDBC Driver
2.取得Database連線:java.sql.Connection
3.取得Statement物件:java.sql.Statement
4.取得SQL Query
5.處理SQL Query執行結果:java.sql.ResultSet
6.關閉連線

2008年7月28日 星期一

[Java] BufferedReader 和 BufferedWriter 使用方法

import java.io.BufferedReader;
import java.io.BufferedWriter;


Reader rd = new FileReader("abc.txt");
Writer wt = new FileWriter("def.txt");


BufferedReader br = new BufferedReader(rd);
BufferedWriter bw = new BufferedWriter(wt);
String line = null;

while((line = br.readLine()) !=null){
//BufferedWriter user next two line
bw.write(line);
bw.newLine();
System.out.println(line);
}
br.close();

[Java] BufferedReader 和 PrintWriter 使用方法

import java.io.BufferedReader;
import java.io.PrintWriter;

利用FileReader把檔案取出,用PrintWriter寫到另一個檔案中
Reader rd = new FileReader("abc.txt");
Writer wt = new FileWriter("def.txt");

通常都以BufferedReader搭配PrintWriter的方式
BufferedReader是以逐行讀出的方式,一行一行讀出abc.txt 中的內容

BufferedReader br = new BufferedReader(rd);
PrintWriter pw = new PrintWriter(wt);
String line = null;

while((line = br.readLine()) !=null){
  //PrintWriter user next line(usually use this)
  pw.println();
  System.out.println(line);
}
br.close();

[Java] Java I / O 介紹

輸入:
InputStream、Reader
  InputStream:用來讀取位元組資料
  Reader用來讀取字元資料
輸出:
OutputStream、Writer
  InputStream:用來寫出位元組資料
  Reader用來寫出字元資料

常用類別
讀/寫位元:FileInputStream / FileOutputStream
讀/寫字元:FileReader / FileWriter
讀/寫一列文字資料:BufferedReader / BufferedWriter
讀/寫基本型態資料:DataInputStream / DataOutputStream
讀/寫物件:ObjectInputStream / ObjectOutputStream

2008年7月27日 星期日

[Java] FileInputStream 和 FileOutputStream 用法

import java.io.FileInputStream;
import java.io.FileOutputStream;

InputStream is = new FileInputStream("abc.txt");
OutputStream os = new FileOutputStream("def.txt");

int n = 0,total=0;

byte[] ba = new byte[1024];
while ((n = is.read(ba)) != -1){
  os.write(ba, 0, n);
   total+=n;
}
System.out.println("共有" + total + "位元組");

[Java] FileReader 和 FileWrite 用法

import java.io.FileReader;
import java.io.FileWriter;

Reader rd = new FileReader("abc.txt");
Writer wt = new FileWriter("def.txt");

char[] ca = new char[1024];

int n=0,total=0;
while((n = rd.read(ca)) != -1){
  wt.write(ca, 0, n);
  total += n;
}

System.out.println("共有" + total + "字元");

[Java] InputStreamReader 讀取字元

InputStreamReader ir = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(ir);

上面這兩行可縮寫成下面這一行:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.in:代表的是鍵盤,程式會去讀使用者在鍵盤所打的字元
下面程式碼範例為,讀取從鍵盤上,所輸入的字元
String s = "";
while((s = br.readLine())!= null ){
  System.out.print("input : "+ s);
}
br.close();

[Java] 例外處理 try-catch-finally

try {// 這是 try block
  // 可能發生錯誤的 statement
}catch ( NullPointerException ) { // 這是相對應錯誤的處理程式
  e.printStackTrace();
}finally {
 // 無論有發生例外或沒有發生例外 都會執行
}

2008年7月19日 星期六

[Java] 繼承(Inheritance)

子類別可以繼承父類別原來的某些定義,或針對不足的方法,增加方法,用extends的方式可以直接使用父類別的方法

2008年7月14日 星期一

[Java] String 的方法 toUpperCase() 和 toLowerCase()

轉換大小寫的方法
String a = "abcdef";
String b = "abcdef";
System.out.println(a.toUpperCase());
System.out.println(b.toLowerCase());

toUpperCase:小寫英文轉成大寫英文
toLowerCase:大寫英文轉成小寫英文

[Java] String 的方法 startsWith() 和 endsWith()

檢查是否以傳入的字串為開頭或結尾
String a = "abc.txt";
System.out.println(a.startsWith("abc"));
System.out.println(a.endsWith(".txt"));

startsWith():起始是不是以"abc"開頭,回傳blooean型態
endsWith():結束是不是以".txt"結尾,回傳blooean型態

空白字元

空白字元為 : nbps "&"後面加";"
小於符號"<" lt "&"後面加";" 大於符號">" gt "&"後面加";"

[Java] HashSet的用法

Set繼承collection介面,Set容器中的物件都是唯一
HashSet<Integer> hs = new HashSet<Integer>();

for(int i=0;i<6;i++){
   int num = (int)(Math.random()*42)+1;
   hs.add(num);
   System.out.print(num+", ");
}

System.out.println("\n");
for(int i : hs){
   System.out.print(i+", ");
}

輸出結果:
11, 38, 12, 28, 38, 5,
38, 5, 11, 12, 28,

因為有重複產生之數值,HashSet只會選擇無重複之值存在容器中

[Java] for 迴圈新的表示法(JDK 5.0)

通常的for寫法:
for(int i=0;i<5;i++){}
新的表示法
for(Type varName : listName){}
varName:代表list中的型態,String、int
listName:填入obj,型態例如:List、Array

2008年7月13日 星期日

[Java] Collection 類別介紹

Collection 稱為容器,表示裡面可以放物件,Collection包括了List和Set,List是可以接受排序、跟可重複的物件,Set剛好相反 ,不接受重複的物件,也具有排序的功能

List
ArrayList、LinkedList
Set
HashSet、TreeSet、EnumSet

  • 由一個物件來容納多個物件者稱為Collection,期內的物件稱為element
  • Collection介面
  • Set介面:element沒有順序 ,不允許重複的元素
  • List介面:element有順序 ,允許重複的元素

2008年7月12日 星期六

[Java] String 的方法 lastIndexOf()

String a = "abcdef"
int b = a.lastIndexOf("c");

回傳最後一次出現字串"c"的位置,回傳值為Int型態

[Java] String 的方法 indexOf()

String a = "abcdef"
int b = a.indexOf("c");
int b2 = a.indexOf(2);

b的結果為,搜尋字串a中是否有"c",有此字元,回傳數值為-1
b2的結果為,取出第二個位置的字元,值為2

[Java] String 的方法 substring()

String a = "abcdef";  //[0,1,2,3,4,5]
String b1 = a.substring(1);
String b2 = a.substring(1, 3);

a.substring(beginIndex) b的值為 "bcdef"
a.substring(beginIndex, endIndex)b2的值為 "bc" 1 為起始值 3 為起始結束值(不包含)

[Java] String 的方法 charAt()

String a = "abcdef";
char b = a.charAt(2);

回傳一個char型態,b的值等於 "c"

2008年7月9日 星期三

[Java] 三元運算子

if(x>0)
  ans=x;
else
  ans=-x

可以用以下方式寫
ans = (x > 0)?x:-x

2008年7月7日 星期一

[Eclipse] 產生Javadoc

如果是用UTF-8來編寫程式的話,額外的參數,不會有中文亂碼的產生
-encoding UTF-8 -charset UTF-8

2008年7月4日 星期五

[Java] 不可逆加密MD5

public static String MD5(String text){
String md5Text = "";
try {
  MessageDigest digest = MessageDigest.getInstance("MD5");
  md5Text = new BigInteger(1,digest.digest((text).getBytes()))
.toString(16);
} catch (Exception e) {
  System.out.println("Error in call to MD5");
}

if (md5Text.length() == 31) {
  md5Text = "0" + md5Text;
}
  return md5Text;
}

出處來自 Yahoo BBAuth 的開放碼

2008年7月3日 星期四

[Java] 讀取網頁中的文字 HttpURLConnection 和 URL

import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.net.HttpURLConnection;
import java.net.URL;

以下是在接XML中方便接傳值的方法,首先設定要抓取的網頁位置
URL url = new URL("http://localhost/test.jsp");
用HttpURLConnection 開起
HttpURLConnection huc = (HttpURLConnection)url.openConnection();

InputStreamReader之後在寫使用方式
BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream(), "UTF-8"));

一樣用BufferedReader去讀回來

String str = "";
StringBuffer sb = new StringBuffer();
while(null != ((str=br.readLine()))) {
sb.append(str);
}
br.close();
String xmlResponse = sb.toString();

最後要記的關閉連結
br.close();
huc.disconnect();

[Java] 寫入文字到檔案中 FileWriter

取得要寫入文字的檔案
FileWriter fw = new FileWriter("G:/Counter.txt");
寫入字串"Num"
fw.write("Num");
fw.close()

[Java] 讀取檔案中的文字 FileReader

手動建立一個Counter.txt在第一行寫上"100",設定讀取檔案位置
FileReader fr = new FileReader("G:/Counter.txt");
用BufferedReader 讀取
BufferedReader br = new BufferedReader(fr);
String strNum = br.readLine(); //讀第一行

輸出
System.out.println(strNum);

要讀出全部可用while加StringBuffer來達成,改成讀出所有內容的程式碼
StringBuffer sb = new StringBuffer();
while ((strNum=br.readLine())!=null){
  sb.append(strNum);
}

輸出
System.out.println(sb.toString());

2008年6月30日 星期一

[Java] URLEncoder 使用方式

若要在網址列傳中文字串,需要編碼
URLEncoder.encode("要編碼的字串","UTF-8")
相對的,有加密也有解密,通常Bowser會自己解
URLDecoder.decode("要解碼的字串","UTF-8")

[Java] JavaMail 使用方式

今天因為要把補發密碼的方式,改為用Email的方式,所以去JavaWorld挖出了下面的程式碼,之後有時間在補詳細的說明好了
public void dosend() {
try {
//設定所要用的Mail 伺服器和所使用的傳送協定
Properties props = new Properties();
props.put("mail.host", mailserver);
props.put("mail.transport.protocol", "smtp");
Session session = Session.getInstance(props,null);
session.setDebug(true);
MimeMessage msg = new MimeMessage(session);
//設定傳送郵件的發信人
msg.setFrom(new InternetAddress(From));
//設定傳送郵件至收信人的信箱
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(To));
//設定信中的主題
msg.setSubject(Subject);
//設定送信的時間
msg.setSentDate(new Date());
//設定傳送信的MIME Type
msg.setText(messageText);
//送信
Transport.send(msg);

} catch (Exception e) {
e.printStackTrace();
}
}

[Java] Hashtable 使用方法

宣告使用Hashtable的程式碼如下:
import java.util.Hashtable;

Hashtable<String, String>ht = new Hashtable<String, String>();

把值放入Hatable的程式碼ht.put(名稱, 變數)

ht.put("ID","abcde");

取出ht.get(名稱)

String text = ht.get("ID");

text輸出的文字為abcde

[Java] Vector 的用法

Vector類似陣列,我稱為可變動性陣列,下面為宣告方式
import java.util.Vector;

Vector vc = new Vector();

增加值的方法
vc.add(20); //0
vc.add(40); //1
vc.add(30); //2

取出值的方法vc.get(int index)
vc.get(0);

也可以排序,但須另使用Collections這個類別,程式碼如下
import java.util.Collections;

Collections.sort(vc);

輸出結果,以上面的例子為例:20,40,30 => 20,30,40

2008年6月29日 星期日

[Java] 產生亂數的方法

簡單來說,就是回傳一個正的double數值,他是介於0.0~1.0之間,但不包含1.0的值。

而如果我們要產生一個1~42的亂數,該怎樣做呢?答案其實很簡單,因為Math.random()是回傳0.0~1.0之間的值,所以我們可以把Math.random()乘以42後,即會變成0.0~42.0的值,但不包含42,再強制轉換成int型態後,再加上1即可。

而程式碼來說明,即是下段程式碼:
import java.lang.Math;

int rnum = (int)(Math.random()*42+1);

[Hibernate] hibernate one-to-many mapping

資料表
Parent{
column:id,name
PK:id
}
Child{
column:id,name,ref_parent_id
PK:id
FK:ref_parent_id
}


DAO資料模型
package eg;
public class Parent{
private Integer Id;
private String Name;
private Set Children;
/*
getter and setter 省略
*/
}


package eg;
public class Child{
private Integer Id;
private String Name;
private Parent RefParent;
/*
getter and setter 省略
*/
}

hibernte mapping檔案
Parent.hbm.xml{
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="eg">
<class name="Parent" table="Parent">
<id column="id" name="Id" type="integer">
<generator class="native">
</id>
<property column="name" length="50"
name="Name" type="string"/>
<set cascade="all" inverse="true" name="Children">
<key column="ref_parent_id"><!--重要:Children的FK而不是PK-->
<one-to-many class="Child">
</set>
</class>
</hibernate-mapping>
}


Child.hbm.xml{
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="eg">
<class name="Child" table="Child">
<id column="id" name="Id" type="integer">
<generator class="native">
</id>
<property column="name" generated="never" length="50"
name="Name" type="string"/>
<many-to-one class="Parent" column="ref_parent_id" name="RefParent" null="true">
</class>
</hibernate-mapping>
}

實際操作
取得Parnet List,連帶取得Child的Set

//open session lazy=true
Query query = null;
Session hsession = null;
List<Parent> list=null;
int i=0;
query=hsession.createQuery("FROM Parent");//
query.setFirstResult(0);
query.setMaxResults(5);//取5筆
list=query.list();
for(i=0;i<list.size();i++){
out.println("Parent 有 "+list.get(i).getChildren().size()+"個Child");
}
//close session

//取得指定Parent,關閉session,再取得Parent的Children
//open session lazy=true 延遲讀取
Query query = null;
Session hsession = null;
List<Parent> list=null;
int i=0,n=1;
query=hsession.createQuery("FROM Parent p WHERE p.Id=:id");
query.setInteger("id",n);
Parent p =(Parent)query.uniqueResult();
Hibernate.initialize(p.getChildren());
//close session
out.println("Parent 有 "+p.getChildren().size()+"個Child");

[Java] String 的方法 trim() 去除空白字元

在下面的例子中 display 前後有空白字元,可以用字串中的trim()去除空白字元

String display = " abc ";

System.out.println(display.trim());

印出的結果:abc

[Hibernate] hibernate one-to-one mapping

資料表
ObjA{
column:id,name
PK:id
}


ObjB{
column:ref_obja_id,name
PK:ref_obja_id
FK:ref_obja_id
}


DAO資料模型
package eg;
public class ObjA{
private Integer Id;
private String Name;
private ObjB ObjB;
/*
getter and setter 省略
*/
}


package eg;
public class ObjB{
private Integer RefObjAId;
private String Name;
private ObjA RefObjA;
/*
getter and setter 省略
*/
}



hibernte mapping檔案
ObjA.hbm.xml{
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="eg">
<class name="ObjA" table="ObjA">
<id column="id" name="Id" type="integer">
<generator class="native">
</id>
<property column="name" length="50"
name="Name" type="string"/>
<one-to-one name="ObjB"
class="ObjB"
cascade="all"
/>
</class>
</hibernate-mapping>
}


ObjB.hbm.xml{
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="eg">
<class name="ObjB" table="ObjB">
<id column="ref_obja_id" name="RefObjAId" type="integer">
<generator class="foreign">
<param name="property">RefObjA</param>
</generator>
</id>
<property column="name" generated="never" length="50"
name="Name" type="string"/>
<one-to-one name="RefObjA"
class="ObjA"
constrained="true"
/>
</class>
</hibernate-mapping>
}

[Java] StringBuffer使用方式

import java.lang.StringBuffer

StringBuffer xml = new StringBuffer();
xml.append("要輸出的字串");
xml.toString();

[Java] String 的方法 split (切割字串)

String display = "a&b&c";

String[] arrayS = display.split("&");

回傳一個字串的陣列 可用for把值給取出

在Blogger中貼上程式碼

CODE{
display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 8pt;
overflow:auto;
background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;
max-height:200px;
height:200px; // for IE6
line-height: 1.2em;
}



從以下來源找到的
http://klcintw4.blogspot.com/2006/11/blog-post_03.html

[Java] SimpleDateFormate使用方式

import java.text.SimpleDateFormat;

SimpleDateFormat df =
new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

String display = df.format(System.currentTimeMillis());
System.out.println(display);

df.parse(String source)可回傳Date()型態
Date d = df.parse("2010-01-01");





yyyy:代表西元年
MM:月份
dd:日
HH:時
mm:分
ss:秒

[Java] 將字串轉成整數

String a = "12345";
int b = Integer.parseInt(a);

2008年6月28日 星期六

[Hibernate] hibernate DAO 資料表對應物件

public class Account {

private String apid;
private String id;
private String pw;

get和set,用eclipse可以自動產生 如下

public String getApid() {
  return apid;
}
public void setApid(String apid) {
  this.apid = apid;
}

}

2008年6月24日 星期二

JavaScript login驗證

chkform=function(){
var PhoneNumber=document.getElementById('PhoneNum');

 if(PhoneNum.value==''){
  alert('請輸入帳號');
  PhoneNum.focus();
  return false;
 }

}

在表單送出時 可以用JavaScript 去驗證是否有欄位沒有填
表單範例
<form id="form1" name="form1" method="post" action="xxx.jsp" onsubmit="javascript:return(chkform());>
<input name="PhoneNum" id="PhoneNum" type="text">
<input type="submit" name="Submit" value="確認" />