2012年9月6日 星期四

【jQuery】Ajax to Servlet

這裡介紹一下在jQuery用Ajax發出 Request到後端的 Servlet 時

遇到關於Cross domain 的問題,以下放一些之前做介紹內容


jQuery Ajax

參考(必讀)http://api.jquery.com/jQuery.ajax/ 
常用的setting屬性:
  contentType
 data 
 dataType
 error(jqXHR, textStatus, errorThrown)
 success(data, textStatus, jqXHR)


2012年9月5日 星期三

Struts 教學 - validwhen 介紹

Validwhen 是 Struts Validations 中的一個 validation rules

從Struts 1.2之後開始支援,其內容最主要的目的是

在我們驗證目前Field的值的時候,可能要從其他Field的值綜合起來進行判斷

譬如,我要驗證當購買數量的欄位值不為空的時候 那麼到貨日期也不能為空

首先 要使用 Validwhen 的話記得要放入 antlr.jar 檔

否則當 Struts 在進行驗證的時候會拋出如下的錯誤訊息

java.lang.noclassdeffounderror antlr/ token stream

以下貼出一段範例解說


<field property="emailAddress" depends="validwhen">
      <arg0 key="userinfo.emailAddress.label"/>
        <var>
          <var-name>test</var-name>
          <var-value>((sendNewsletter == null) or (*this* != null))</var-value>
        </var>
 </field>


2012年9月2日 星期日

Struts 教學 - html:checkbox

最近剛好遇到 在 Struts 中使用 html tag 的 checkbox element

在 Struts 中 CheckBox 的寫法如下


<html:checkbox styleId="hasInsuranceCHbox" name="insuranceVO" 
               property="hasInsurance" value="Y"
               onclick="javascript: checkHasInsurance ();"></html:checkbox>


跟其他 Struts 的 html tag 一樣

styleId 會辦替換為 HTML 標籤的 id

而 name 則是可以為一個Struts from bean 或是一個 requestScope 的屬性

其中 如果我們要讓這個Check box 能夠隨著 name 屬性所設定的物件

的hasInsurance這個attribute值被打勾或不打勾的話

可以透過 html:checkbox 的 value 屬性去設定,要注意的是

如果不設定的話 default 的值為 "on"  ((( 表示當 hasInsurance 為 on 才會被打勾

所以這裡依據你的需求去定義 value 值吧!!

另外 如果要對 html:checkbox 實作 javascript 的onclick的話

那麼 html:checkbox 也有提供 onclick 的屬性喔!



2012年9月1日 星期六

【Javascript】alert 亂碼

最近遇到一個情況 雖然頁面(JSP)的編碼

已經是 UTF-8 了,都已經有下列的宣告標籤


<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
....
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

可是 alert 一直都是亂碼,雖然alert 的文字是從Servlet來的

但是Servlet 在 log 的時候是正常中文的,

而且 response (HttpServletResponse)也有編碼過,但是在實際run的時候一就是亂碼

最後才發現  這也有可能跟 Eclipse 有關 (不知道是不是我的版本太舊?)

提供以下更換Eclipse javascrip 編碼的方式

Eclipse > Window > Preferences > 左邊選擇 General 中的 Content type

並在右邊的隊應畫面中 Text(展開) > Javascript source file 下方的 default encoding 輸入 utf-8



2012年4月13日 星期五

【Hadoop】安裝配置

本文介紹在一個 Linux 的環境下建立一個 Hadoop

首先我的環境是 Ubuntu 10.10  (非虛擬機下)

在接下來的動作之前  請記得先讓你的環境可以上網

這裡提供簡單的 Ubuntu 的有線上網設定 (自動取得IP)

eth0 是我的有線網卡

sudo gedit /etc/network/interfaces


iface etho inet dhcp


sudo /etc/init.d/networking restart


sudo ifup eth0

接下來進入正題,再安裝 Hadoop 之前必須要先安裝 Java

主要是因為 Hadoop 是基於 Java 開發的

2012年4月2日 星期一

【MongoDB】安裝配置

本篇介紹如何在Windows的系統下安裝與配置你的MongoDB

並額外推薦一個簡易的MongoDB管理工具介RockMongo


首先到 http://www.mongodb.org/downloads 下載MongoDB的最新版

我目前是抓 2.0.4 的版本,下載下來並解壓縮之後

可以將整個目錄放到 D:\ 也可以只將目錄下的bin資料夾移到 D:\ (位置自行決定)

我這邊是先在 D:\ 底下建立一個資料夾 mongodb,並把解壓縮後的內容都放入

完成之後在 mongodb 中建立一個 data 的資料夾

之後開啟你的 command line (cmd) 並移動到 D:\mongodb\bin

並輸入如下的指令  >  mongod --dbpath D:\mongodb\data

應該會看如如下的結果:

2012年3月28日 星期三

Hibernate 教學 - 繼承 : Table per concrete class with implicit polymorphism

本篇介紹的是Hibernate繼承機制方案中的另一解法

跟上一篇大同小異 Hibernate 教學 - 繼承 : Table per concrete class with unions (<如需看以下內容請先看這篇)

基本上Discount 和 Free 這兩個實體類別都會對應一個Table

差別式在於Table per concrete class with unions 這個作法下

他只需透過一個映射檔就能夠交代繼承關係(union-subclass)

那麼在 Table per concrete class with implicit polymorphism 這個情況下

你必須針對每個實體類都撰寫一份映射文件

這樣子的狀況下 就會出現共同屬性(父類別的屬性) 會出現在每份映射文件內

也就是說 會寫到一些重複的代碼,如之前的範例就會造成

在 Preferential 這個父類別下的 id 和 name 屬性必須重複在

Discount.hbm.xml 和 Free.hbm.xml 中去定義

當然Table per concrete class with implicit polymorphism 這個方法是繼承架構下

最易懂也易學的一個基本概念。

2012年3月17日 星期六

Hibernate 教學 - 繼承 : Table per concrete class with unions

本篇介紹 Hibernate 中的繼承機制裡的其中一個  Table per concrete class with unions

從字面上翻譯,可以看得出一個table會對應到一個具體類

但是它不像 Table per concrete class with implicit polymorphism 需要一個具體類別就要一個映射檔

Table per concrete class with unions  只需要一個映射檔並透過 union-subclass 

來指名具體類是對映到哪個資料表即可

以下以一個"優惠(Preferential)"為一個抽象的父類別,並有兩個子類別

"折扣(Discount)" 以及 "免費(Free)"

首先先來看這三個簡單的Java程式

Preferential.java

2012年3月16日 星期五

【DisplayTag】Excel亂碼問題

在使用DisplayTag的時候多,如果你會出Excel檔案的時候,多半會發生中文亂碼問題

因為DisplayTag並沒有針對中文作良好的編碼,因此如果你遇到類似問題

不仿採用下面介紹的方法解決亂碼的情況吧

先去下載 displaytag-export-poi-1.1.jar





這是目前官方推薦的作法,它已經將POI導出Excel的一些過程整合到

DisplayTag下以解決中文亂碼的問題,所以你只需要額外下載displaytag-export-poi-1.1這個JAR即可。

  並將它放到/WEB-INF/lib/  最後在classpath下的displaytag.properties中新增這一段

        export.excel.class=org.displaytag.export.excel.ExcelHssfView

        就可以解決問題了。

注意我使用的是 display1.1.1版本,所以你如果抓錯POI的JAR檔,就無法有效解決你的問題



2012年3月15日 星期四

【DisplayTag】匯出檔案

如果有要匯出 Excel,Xml,Pdf,RTF,CSV檔案的話,不仿可以考慮使用 DisplayTag

首先你必須先下載 displayTag相關的JAR檔案

在以下的範例環境我採用displaytag1.1.1版的

接著如果我們想針對網頁上的某份報表進行匯出的動作

可以將原本呈現報表的tabel標籤轉成如下所示:


<display:table export="true" name="show_query" pagesize="10"  >
    <display:column property="userName" title="姓名"  />
    <display:column property="email" title="連絡電話" />         
</display:table>


export="true" 告訴display:table 開啟匯出功能

pagesize="10" 則是每個table會有10筆資料

name="show_query" 資料的來源,這裡的show_query是request裡的一個屬性資料
                                                            等同於 request.getAttribute("show_query")

2012年3月12日 星期一

【Cordova】環境配置與範例

Cordova 的前身是PhoneGap,但是在前陣子已經將PhoneGap捐給Apache基金會了

並命名為Cordova。以下我以Cordova在Android環境上建立一個簡單的HTML範例

首先先到 http://phonegap.com/download/ 這是PhoneGap的官網下載 library

目前最新版是1.5.0,但是下載下來並解壓縮之後的JAR檔案名稱已經更改為 cordova.jar 了

首先先依照下面步驟建立範例程式

前提是你必須已經具備Android得開發環境,包括Eclipse。Android環境配置

建立Android專案

File > New > Android Project > 輸入專案名稱 > 選擇SDK (這裡我是用Android 3.2)

> 設定package name > Finish

完成之後,就可以來配置Cordova的環境

1. 在專案目錄下建立libs的目錄
2. 在assets目錄下建立www目錄

2012年3月9日 星期五

【DWR】調用HttpServletRequest

最近在用 DWR 處理 Ajax 問題時,遇到一個狀況

就是我想要在前端網頁送出請求到後端時,透過HttpSession 檢查請求的有效性

但是我們一般在建立一個 DWR的後端處理元件時,如下:


<create creator="new" javascript="PhoneVisitDataService">
      <param name="class" value="erp.mgt.PhoneVisitDataService" />
</create>


PhoneVisitDataService.java 是一個後端的DWR原件,或許你會問

我該如何讓這之程式取得Session,在Servlet中取得Session是透過:

HttpServletRequest的getSession()取得,那這支程式又該怎樣擁有HttpServletRequest物件

在DWR的應用中,所有的AJAX請求都會先到某一支Servlet

再由該Servlet呼叫 PhoneVisitDataService 的某方法(例如: getPhoneVisitData() )

因此如果要在 getPhoneVisitData方法中取得HttpServletRequest物件

你只要這樣寫就可以了

public PhoneVisitData getPhoneVisitData(HttpServletRequest request) 

這樣DWR就會自動幫你把 HttpServletRequest 物件導入給你的方法中了

2012年2月11日 星期六

【DWR】集合物件與JavaBean


最後的範例綜合前面的所介紹的,底下程式提供一個遠端服務,

能夠取得所有書籍(BookBean),並放到Java的List集合內以回傳給前端網頁的Javascript

先來看一下BookBean.java的內容

package org.bean;

/**
 * @author allen
 *
 */
public class BookBean 
{
 private String title;
 private int price;
 
 public BookBean(){}

 public String getTitle() {
  return title;
 }

 public void setTitle(String title) {
  this.title = title;
 }

 public int getPrice() {
  return price;
 }

 public void setPrice(int price) {
  this.price = price;
 }
}

2012年2月9日 星期四

【DWR】陣列運用

如果我們需要透過DWR呼叫遠端還取得多筆的資料

可以用以下範例在網頁中有一個select-option的下拉式選單

當網頁在載入的過程中透過DWR呼叫遠端服務,並回傳一個字串陣列

取得四個季節的選項並加入到下拉式選單中。

首先,先提供一個遠端的服務SeasonService.java 

package org.service;
/**
 * @author allen
 *
 */
public class SeasonService
{
 public String[] getSeason(){
  return new String[]{"春","夏","秋","冬"};
 }
}

2012年2月5日 星期日

【Android】android java.net.ConnectException: localhost/127.0.0.1 - Connection refused

延續前一篇,在環境中我弄了一個簡單的 Java Web project

以實現檔案上傳的動作,但是在 Android 的應用程式中卻發生這樣的錯誤

原因是因為 Tomcat 上已經有我寫好的web 程式

URL路徑類似 http://localhost:8080/Android_Demo/UploadServlet.do

但是 Android 一旦判別到 localhost 或是 127.0.0.1時,他會把這段路徑當作是自己(也就是模擬器)

所以如果要在模擬器上訪問你的電腦的路徑,記得用10.0.2.2吧。


2012年2月4日 星期六

【Android】android.os.NetworkOnMainThreadException

今天在寫Android 程式模擬檔案上傳到遠端的時候遇到的問題

以下是程式片段:

HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection();
//...
OutputStream os = conn.getOutputStream();  //拋出例外

在Android的應用程式中,如果要訪問遠端的資源,必須在/AndroidManifest.xml

加入以下這行標籤:

<uses-permission android:name="android.permission.INTERNET" />

如果已經加上去之後還是有例外,可以嘗試在 Activity 中的 onCreate(Bundle) 中

加入以下的片段程式:


StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()    
             .detectDiskReads()    
             .detectDiskWrites()    
             .detectNetwork() 
             .penaltyLog()    
             .build());    
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()    
             .detectLeakedSqlLiteObjects()    
             .detectLeakedClosableObjects()    
             .penaltyLog()    
             .penaltyDeath()    
             .build());


或許可以幫助你解決問題

2012年2月3日 星期五

【Android】java.io.filenotfoundexception permission denied

當程式需要存取SD卡的時候,遇到類似如下問題:

java.io.FileNotFoundException: /mnt/sdcard/test.txt (Permission denied) 
at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method) 
at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152) 

或是:

(No such file or directory) 之類的

那麼先檢查一下 /AndroidManifest.xml 有沒有加入以下兩行


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />


如果加了還是有問題,那注意一下你的虛擬機一開始配置的時候有沒有給SD卡足夠的空間

在 Eclipse 中的上方功能列 > Window > AVD manager > 選擇你的虛擬機 > 按下Edit >

配置你的SD卡一些空間 > Edit AVD > 完成

在這分享一下。

2012年2月2日 星期四

【Android】Widget 介紹


Button
<Button
android:id="@+id/Button01"
android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@string/app_add"
     />

介紹一些可能常用的屬性:
android:enabled=”[true|false]” 表示按鈕是否有效(能不能按)
android:onClick="[Your method name]" 表示按鈕按下後的觸發事件

在之前的程式裡,我們要處理Button的時候都是在Activity建立一個OnClickListener 並實作 onClick(View) 方法來解決按鈕按下後要做的事情
例如:

button.setOnClickListener(new OnClickListener(){
              public void onClick(View view) {
                  // TODO Auto-generated method stub
                  // Your code           }
        });


這樣有時候當程式碼多的時候是蠻不好看也不好維護的,

所以可以直接在layout下設定Buttonandroid:onClick屬性,

2012年2月1日 星期三

【Android】Activity 間的資料傳遞


接下來要來說明一下在Activity之間切換時,該如何傳遞資料?

主要是需要透過Bundle物件來達成,先來看以上範例中如何在FirstActivity傳到SecondActivity

以下來看一下傳過去的程式實做:

傳送:
Bundle bundle = new Bundle();
bundle.putInt("id", id);
bundle.putString("name", account);
intent.putExtras(bundle);
startActivity(intent);


接收:
Bundle bundle = getIntent().getExtras();
bundle.getInt("id");
bundle.getString("name");



其實Intent也內建了Bundle物件,因此你也可以如下這樣寫

傳送:

2012年1月29日 星期日

【Android】Activity間的切換


Intent 類別的介紹,Intent可以幫助我們在不同的Activity中切換以及資料的傳遞。

Intent你可以把它當作是一個信件,它告訴了目前這個Activity它的下一個Activity是誰

以及它所包含要傳遞的資料。以下就來做一個簡單的Activity之間的切換:

以下範例以一個FirstActivity.java 以及SecondActivity.java 為例

他們所對應的 layout main.xml以及second.xml

main.xml中有一個按鈕,按下去會前往SecondActivity,而在second.xml也有一個按鈕,

按下去會返回FirstActivity,以這樣的動作來解釋Activity間的切換。
首先是 FirstActivity.java


package org.sample.android;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

/**
 * @author allen
 *
 */
public class FirstActivity extends Activity 
{
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  Button button = (Button)findViewById(R.id.button_id_first);
  button.setOnClickListener(new OnClickListener(){

   public void onClick(View v) {
    // TODO Auto-generated method stub
    
    Intent intent = new Intent();
    intent.setClass(FirstActivity.this, SecondActivity.class);
    /* 以上兩行可以寫成 Intent intent = new Intent(FirstActivity.this, SecondActivity.class)
     * 第一個參數是目前的Activity, 第二個參數是要前進的下一個Activity 
     * */
    startActivity(intent);
    finish(); //這行等於FirstActivity.this.finish();
   }
   
  });
  
 }
 
}

2012年1月28日 星期六

【Android】CREATE TABLE android_metadata failed

關於 CREATE TABLE android_metadata failed 這一連串的例外

首先  一開始每支程式都好好的,莫名的出現這個例外

但是並不是錯誤 每個 Project 的 Activity 都可以正常啟動

但是一進去 AVD 畫面並載入成功後  會一直跳出例外訊息

去 DDMS 裡面看  大約的訊息類似如下


01-28 15:51:20.502: E/SqliteDatabaseCpp(139): CREATE TABLE android_metadata failed
01-28 15:51:20.622: D/PowerManagerService(78): bootCompleted
01-28 15:51:20.672: E/SQLiteDatabase(139): Failed to open the database. closing it.
01-28 15:51:20.672: E/SQLiteDatabase(139): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
.......

一長串的問題  好像都是關於一個 android_metadata 這個 Table 所造成的

不過我都還沒用到 SqlLite 就出現這種問題  也不太合理

不解決還不行  因為每次在AVD中關掉錯誤警告的視窗後,沒幾秒就會一直跳出來。。。

最後我的解決辦法是

在 Eclipse 中上方工具列 > Window > AVD manager > 點選你目前使用的虛擬機
                                          > 按下右下方的 Start > 勾選 Wipe user data 這個選項
                                          > 最後 AVD跑出來的結果  果真沒那個煩死人的錯誤訊息了

最後 在作一次上述動作  這次取消勾選 Wipe user data 這個選項

就大功告成了




2012年1月26日 星期四

【Android】Activity的生命週期

可以用上面這張圖簡單解釋 Activity 的四個主要狀態

這對開發者而言,我們可以決定在什麼狀態作什麼事情,注意我們所撰寫的每一個Activity有繼承(extends)一個Activity類別,也因此我們可覆寫很多狀態的方法,例如以下:

publc void onCreate(Bundle savedInstanceState);  //initial > onStart()
publc void onStart();   //stop > active
publc void onResume();   //pause > active
publc void onPause();   //active > pause
publc void onStop();   //active > stop
publc void onDestroy();  //active > killed

2012年1月25日 星期三

【Android】Activity介紹


Activity Android的基本處理單元,絕大多數的Activity都會有一個對應的頁面

在這裡所謂的頁面就是User在行動裝置上所看到的畫面(View)

回顧上一章的 Hello World程式:【Android】Hello World 範例  



我們在 /src org.sample.android.activity目錄下有一個Activity HelloWorldActivity.java 

它所對應的View即是 /res/layout/main.xml

AndroidManifest.xml 中可以看到如下這一段的XML標籤
<activity
        android:name=".HelloWorldActivity"
        android:label="@string/app_name" > <!— app_name 會註冊在 /res/values/strings.xml -->
        <intent-filter
            <action android:name="android.intent.action.MAIN" />
           <!— 以下這行指定此Activity為預設執行的主要Activity
  所以當你啟動虛擬機的時候一定會看到這支Activity所對應的View-->
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>


接著來稍微改寫 HelloWorldActivity以及它所對應的 main.xml,如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <!- 如果要在此ViewActivity中找到該元件,需要給它一個id
         android:id=”@+id/<name>” 如此會在R.java中產生一個對應的程式
         R.id.<name> 透過這行程式就可以找到你要的元件-->
    <TextView android:id="@+id/TextView01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
    
    <Button android:id="@+id/Button01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_text" />
</LinearLayout>

fill_parent:意指將該元件填滿它的父元件
wrap_content:意指該元件會完全包住它的所有內容(元件)

接著來看看 HelloWorldActivity.java 

2012年1月24日 星期二

【Android】Hello World 範例


*   開啟Eclipse > 上方功能列 > File > Project > 選擇Android Project > Next

Project Name 欄為內輸入Hello_World > Next > 勾選SDK > Next


2012年1月23日 星期一

【Android】環境配置


        1.    開發環境檢查
*   Microsoft Windows XP(32 bits) /Microsoft Window 7 (32/64 bits) OS
*   Mac OS X 10.5.8 或更新版本(x86)
*   Linux Ubuntu
*   JDK 6.0 以上
*   Eclipse IDE 3.7 (Indigo)

2.    安裝Android 3.2Eclipse IDEAndroid Plugin
*   下載並安裝 Android SDK and AVD manager (http://developer.android.com/sdk/index.html)

*   上一步驟,我是選擇installer_r16-windows.exe (Recommended) 由執行檔來安裝在執行安裝過程中,他會先檢查你的電腦內是否有安裝JDK,如果電腦裡沒JDK則務必先安裝JDK。之後你只要選擇你要安裝的路徑即可。

*   安裝完成後可以開啟SDK Manager,並找到Android 3.2(API13) 這個項目並勾選 SDK PlatformSamples for SDKGoogle APIs by Google Inc.。並按右下方的 Install packages…



  *   安裝成功之後應該如下圖所示: