2008年6月30日 星期一

xfce新增圖示主題

先到http://www.xfce-look.org/下載想要的圖示
例如XXX.tar.gz
移到~/icons/並解壓縮開來 (如果沒有icons資料夾就自行mkdir)
~/icons/XXX/
即可在 Xfce設定管理程式 -> 使用者介面 -> 圖示主題 下
看到剛新增的圖示主題

2008年6月20日 星期五

JCR研究:jackrabbit

一。使用 svn checkout出jackrabbit的src code
svn co http://svn.apache.org/repos/asf/jackrabbit/trunk jackrabbit
二。進到checkout出來的根目錄,使用 maven 進行build
mvn install
三。完成建置後 maven 會在家目錄產生jackrabbit的jars:
${home}\.maven\repository\org.apache.jackrabbit\jars\jackrabbit-*-SNAPSHOT.jar

四。在classpath引入必要的jars
jcr的有:
jcr-1.0.jar
jackrabbit的有:
jackrabbit-api-1.5-SNAPSHOT.jar
jackrabbit-core-1.5-SNAPSHOT.jar
jackrabbit-jcr-commons-1.5-SNAPSHOT.jar
jackrabbit-spi-1.5-SNAPSHOT.jar
jackrabbit-spi-commons-1.5-SNAPSHOT.jar
jackrabbit-text-extractors-1.5-SNAPSHOT.jar
slf4j的有:
slf4j-api-1.3.0.jar
slf4j-simple-1.5.2.jar
其他:
commons-collections-3.1.jar
concurrent-1.3.4.jar
derby-10.2.1.6.jar
commons-io-1.4.jar
lucene-core-2.2.0.jar
PDFBox-0.7.3.jar
poi-3.0.2-FINAL-20080204.jar
tm-extractors-0.4.jar
poi-scratchpad-3.0.2-FINAL-20080204.jar
poi-contrib-3.0.2-FINAL-20080204.jar

五。第一個登入程式FirstHop
public static void main(String[] args) throws Exception {
// local repository
// System.setProperty("org.apache.jackrabbit.repository.home", "D:/jackrabbit-repos");
// Repository repository = new TransientRepository();
// http rmi repository
Repository repository = new URLRemoteRepository("http://192.168.1.57:-1/jackrabbit-webapp-1.5-SNAPSHOT/rmi");
// rmi repository
// Repository repository = new RMIRemoteRepository("//localhost/jackrabbit.repository");
Session session = repository.login(new SimpleCredentials("transtep", "".toCharArray()));
try {
String user = session.getUserID();
String name = repository.getDescriptor(Repository.REP_NAME_DESC);
System.out.println("Logged in as " + user + " to a " + name + " repository.");
Workspace workspace = session.getWorkspace();
Node rootNode = session.getRootNode();
// // 儲存資料
workspace.getNamespaceRegistry().registerNamespace("xsignage", "http://www.transtep.com/xsignage/1.0");
Node imageNode = rootNode.addNode("xsignage:image");
imageNode.setProperty("xsignage:type", "圖片");
imageNode.setProperty("xsignage:read", true);
imageNode.setProperty("xsignage:write", true);
Node jpegImage = imageNode.addNode("xsignage:jpeg");
jpegImage.setProperty("xsignage:yuffie", new FileInputStream(new File("./尤菲.jpg")));
session.save();
// 取出資料
Node imageNode2 = rootNode.getNode("xsignage:image");
System.out.println("type: " + imageNode2.getProperty("xsignage:type").getString());
System.out.println("read: " + imageNode2.getProperty("xsignage:read").getString());
System.out.println("write: " + imageNode2.getProperty("xsignage:write").getString());
Node jpegImage2 = imageNode2.getNode("xsignage:jpeg");
InputStream ins = jpegImage2.getProperty("xsignage:yuffie").getStream();
FileOutputStream pos = new FileOutputStream("./yuffie.jpg");
int read = -1;
while ((read = ins.read()) != -1) {
pos.write(read);
}
} finally {
session.logout();
}
}

2008年6月19日 星期四

從servlet上下載檔案的寫法

public void execute(HttpServletRequest req, HttpServletResponse res) {
PrintWriter out = null;
// 取得輸入參數
String did = req.getParameter("did");
String filename = req.getParameter("filename");
if (did == null) {// 無did
out.print("公文文號(did)為空值");
return;
} else if (filename == null) {// 無filename
out.print("檔案名稱(filename)為空值");
return;
}
// Dao
DocAttDao docAttDao = DocAttDao.getInstance();
TblDocattId id = new TblDocattId(Integer.parseInt(did), filename);
TblDocatt tblDocAtt = new TblDocatt(id);
tblDocAtt = (TblDocatt) docAttDao.get(tblDocAtt);
try {
res.setHeader("Pragma", ""); // HTTP 1.0
res.setHeader("Cache-Control", ""); // HTTP 1.1
if (tblDocAtt != null) {
String fileurl = tblDocAtt.getUrl();
String agent = req.getHeader("User-Agent");
if (agent.indexOf("MSIE") > -1) {
// encoding filename for IE
filename = URLEncoder.encode(filename, "utf-8");
} else {
filename = new BCodec().encode(filename);
}
// 下載檔案
res.setContentType("application/octet-stream;charset=utf-8");
res.setHeader("Content-Disposition", "attachment; filename = " + filename);
// 打開指定文件的stream
File file = new File(fileurl);
FileInputStream bis = new FileInputStream(file);
OutputStream bos = res.getOutputStream();
byte[] buff = new byte[1024];
int readCount = 0;
readCount = bis.read(buff);
while (readCount != -1) {
bos.write(buff, 0, readCount);
readCount = bis.read(buff);
}
if (bis != null)
bis.close();
if (bos != null)
bos.close();
} else {
res.getWriter().print("無此檔案");
}
} catch (Exception e) {
e.printStackTrace();
}

}

maven安裝

1.下載maven
2.解壓縮
3.新增M2_HOME環境變數到解壓縮目錄
4.新增M2_HOME\bin 路徑到Path環境變數
5.在console下運行svn --version檢查是否安裝成功

2008年6月18日 星期三

DTO DAO 物件

[轉載]http://www.javaworld.com.tw/jute/post/view?bid=44&id=85388&tpg=1&ppg=1&sty=3&age=0
DTO:Data Transfer Object
DAO:Data Access Object

由名稱來猜,DTO 就是類似用來作資料傳輸的 Java 類別,個人看過的寫法是寫成有 getter/setter 的 JavaBean
透過 DTO 可以很方便地將資料跨 tier 傳遞,且完整封裝

比如:

Servlet 產生 DTO 物件,將 Client 端輸入的資料透過 setter 寫進 DTO,呼叫企業邏輯處理元件時將 DTO 物件當成參數向後端傳遞

而後端的企業邏輯處理元件就可以透過 DTO 的 getter 取出所需要的資料,並進行運算
若後端運算完畢之後必須要將處理結果傳回 Client 端,也是透過 DTO 的 setter 設定新的值,並回傳給 Servlet

這整個過程當中都只需要 DTO 物件一個參數,像坐捷運一樣從前端一路傳到後端
不需要串一堆參數傳來傳去的,若後端須新增參數時也只需要更改 DTO 及用到相關 getter/setter 的程式碼即可,大部分程式都不需要變動


至於 DAO,是跟資料庫存取有關的類別
我看過的做法是將所有操作資料庫的動作都萃取集中起來寫成特定的公用類別
程式中若需要存取資料庫時一律透過 DAO 處理

這樣的好處是,當資料庫更換時,僅需抽換 DAO 即可,其他程式可以繼續使用,可以將應用程式與資料庫的耦合度降低

linux 下使用藍芽傳輸

1.安裝kdebluetooth套件
2.確定相關服務已啟動
sudo /etc/init.d/dbus start
sudo /etc/init.d/bluetooth start
3.啟動kbluetoothd
4.使用kbtobexclient程式傳送資料到手機上

ps.手機 -> pc 尚未試成功

2008年6月13日 星期五

java 的 enum

透過java列舉型別可以很容易的表達一些常數性質的資料
public enum ROLE {
CHANNEL, PLAYLIST, TERMINAL, CONTENT;
};
而使用列舉型別的values()方法可以取出所有的列舉常數陣列
public static void main(String[] args) {
for(ROLE role : ROLE.values()){
System.out.println(role);
}
}
同時列舉型別也可以自定所屬的成員和方法,更可以override toString()方法來自定常數的表示
public enum ROLE {
CHANNEL, PLAYLIST, TERMINAL, CONTENT;
private Integer id;
private String name;

public void setId(Integer id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return name + "(" + id + ")";
}
};

使用列舉型自定的方法:
public static void main(String[] args) {
for(ROLE role : ROLE.values()){
role.setId(4);
role.setName("頻道四號");
System.out.println(role);
}
}

2008年6月2日 星期一

使用URL post XML給server端的servlet

URL urlobj = new URL(servletUrl);
HttpURLConnection urlconn = (HttpURLConnection) urlobj.openConnection();
urlconn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8"); //<--注意編碼設定
urlconn.setDoOutput(true);
urlconn.setDoInput(true);
urlconn.setRequestMethod("POST");
PrintWriter urlpw = new PrintWriter(new OutputStreamWriter(new DataOutputStream(urlconn.getOutputStream()),"UTF-8")); //<--注意編碼設定
JAXBAgent jaxbAgent = new JAXBAgent();
urlpw.print(jaxbAgent.marshal(reqObj));
urlpw.flush();
urlpw.close();
BufferedReader urlbr = new BufferedReader(new InputStreamReader(new DataInputStream(urlconn.getInputStream()),"UTF-8")); //<--注意編碼設定
StringBuffer strbuf = new StringBuffer();
String line = null;
while (null != (line = urlbr.readLine())) {
strbuf.append(line);
}
Object resObj = jaxbAgent.unmarshal(pkgName, strbuf.toString());


//server端的Servlet也要使用
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//來設定編碼,才不會有中文字亂碼的問題。