2008年11月2日日曜日

Oracle Database XE でパスワードを忘れた場合

Oracle Database XEのデータベースのホームページでログインしようと思ったが、パスワードを忘れてログインできなかった。この場合、パスワードを変更してログインできるようにする方法を記しておく。ただし、OS認証が有効になっていることを前提とする。

①コマンドプロンプトを立ち上げsqlplusにログインする。
C:\>sqlplus /nolog

②sysでログインする。
SQL>conn sys as sysdba

③ユーザーのパスワードを変更する(例えば、sysのパスワードをpasswordに変更するには以下のようにする)
SQL>ALTER USER sys IDENTIFIED BY password;

2008年11月1日土曜日

javaでファイルアップロード

まず、以下のJakarta Commonsの以下の2つのライブラリを用いる。
 ①commons-fileupload
 ②commons-io


まず、jspの設定。
以下のフォームを記述する。

<!-- (1)<FORM>タグにmultipart/form-dataを指定 -->
<form method="POST"
enctype="multipart/form-data"
action="アップロードサーブレットのパス">
<!-- (2)ファイルを選択する<input type="file">タグを指定 -->
<input type="file" name="fileName" />
<input type="submit" value="送信" />
</form>

次に、サーブレットの記述。

Collection ItemList = new ArrayList();


InputStream inputStream = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;


DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(factory);

try {
List fileItemList = sfu.parseRequest(request);

if (fileItemList.get(0).getName() == null
|| fileItemList.get(0).getName().equals("")) {
// ファイルが選択されていない場合はアップロード画面へ遷移
request.setAttribute("message", "ファイルを選択してください。");
request.getRequestDispatcher(
"アップロード画面").forward(
request, response);
return;
}

for (FileItem fileItem : fileItemList) {
if (fileItem == null) {
break;
}

inputStream = fileItem.getInputStream();
inputStreamReader = new InputStreamReader(inputStream);
bufferedReader = new BufferedReader(inputStreamReader);

String line = null;
while ((line = bufferedReader.readLine()) != null) {
itemList.add(line);
}

new uploadService().itemUpload(itemList);
}
// アップロード画面へ遷移
aRequest.setAttribute("message", "アップロードに成功しました。");
request.getRequestDispatcher(
"アップロード先").forward(
request, response);
return;
} catch (FileUploadException e) {
//例外処理記述
} catch (SQLException e) {
//例外処理記述
} catch (NamingException e) {
//例外処理記述
}

/*ここまで。*/

javaでファイルダウンロード

Javaでファイルダウンロードを行ってみたが、期待する動作にならない。

/*
ItemServiceクラスのfindItems()メソッドを呼び出して、ItemのリストitemListを得る。
そのリストの値を一つずつ読み込んで、toCSV()メソッドでCSV形式にしてからファイルに保存したい。
firefox2.0.0.17ではファイルに保存できる。
IE7ではブラウザにファイルの内容が書き出されてしまう。なぜ?
*/

public class ItemDownloadServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
process(request, response);
}

@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
process(request, response);
}
request.setCharacterEncoding("Windows-31J");
response.setContentType("application/octet-stream");
String downloadFileName = "itemData.csv";
response.setHeader("Content-Disposition", "attachement:filename="
+ downloadFileName);

OutputStream os = null;
OutputStreamWriter osw = null;
BufferedWriter writer = null;

os = response.getOutputStream();
osw = new OutputStreamWriter(os);
writer = new BufferedWriter(osw);

try {
List itemList = (List) new ItemService().findItems();
for (Item item : itemList) {
writer.write(toCSV(item));
}
writer.flush();
} catch (SQLException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (NamingException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (NotFoundException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} finally {
if (os != null) {
os.close();
}
if (osw != null) {
osw.close();
}
}

2008年10月14日火曜日

MySQLで接続中のスレッドや実行中のSQLを確認する

MySQLで、接続中のスレッドや実行中のSQLを確認するには以下のようにすれば良い。

mysql> show processlist;
+-----+------+-----------------+----------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------------+----------+---------+------+-------+------------------+
| 270 | user | localhost:19549 | dbname | Query | 0 | NULL | show processlist |
+-----+------+-----------------+----------+---------+------+-------+------------------+
1 row in set (0.00 sec)

MySQLでログイン中のユーザーを確認する

ログイン中のユーザーを確認するには以下のようにすると良い。

mysql>select USER();
+---------------+
| USER() |
+---------------+
| user@localhost |
+---------------+
1 row in set (0.03 sec)

2008年10月13日月曜日

MySQLのコメント

MySQLでコメント文を書く方法と注意点を述べる。

コメントスタイルは以下の3つ。


① #(行末まで)、
② --(行末まで)、
③ /*(行中または複数行)*/

をサポートしている。

ここで注意だが、

--(ダッシュ2つ)のコメントスタイルでは、2 つ目のダッシュの後にスペースを 1 つ以上挿入する必要がある。


これを知らずに苦労した経験があるので、注意すること。

MySQLでデータベース一覧と表一覧を確認する

MySQLでデータベース一覧、表一覧、表のフィールドを見る方法をメモしておく。

・データベース一覧はshow databasesを用いる。
・表一覧はshow tablesを用いる。

-- データベース一覧の表示
mysql>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bookshop |
| foods |
| mysql |
| sqldrill |
+--------------------+
5 rows in set (0.00 sec)

-- テーブル一覧の表示
mysql>show tables from foods;
+-----------------+
| Tables_in_foods |
+-----------------+
| foodslist |
+-----------------+
1 row in set (0.06 sec)

-- フィールド一覧の表示
mysql>show fields from foods.foodslist;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| foodname | varchar(30) | YES | | NULL | |
| maker | varchar(30) | YES | | NULL | |
| category | varchar(20) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

2008年10月9日木曜日

DBViewerプラグイン

今日はEclipseのDBViewerプラグインを使用してみた。

DBViewerPluginを右クリックして「登録」を選択。すると、
データベース定義名とJDBCドライバーを登録するウィンドウが表示されるから、
必要事項を記入。

データベース定義の接続情報の設定では以下のように入力(DBにMySQLを使用している場合)。

接続文字列の箇所では以下のを環境に合わせて設定。

jdbc:mysql://:3306/

例えば、ローカルでデータベース名がDataBaseならば
→localhost
→DataBase
と設定する。

これで、EclipseからSQL文を実行し、テーブルを作成したりできるようになる。

2008年10月6日月曜日

数値と文字列を通貨の出力形式で出力する

数値を通貨の出力形式で出力するにはNumberFormatクラスのgetCurrencyInstance(Locale.フィールド)メソッドを用いる。

例えば、2000という数値を¥2,000という出力形式(文字列)で出力させたい場合、以下のメソッドを用いるとよい。

public toYen(long number){
 NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.JAPAN);
  return nf.format(number);
}

さて、long型の整数値はこれでよいが、webアプリではフォームからの入力を文字列で受け取る。そのため、文字列として与えられた数字を上記のような形式で出力したい場合が多いだろう。その場合は、上記のメソッドをオーバーロードした以下のメソッドを用いると良い。

public toYen(String number){
 NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.JAPAN);
  return nf.format(Integer.valueOf(number).intValue());
}

これは、ただ単に、文字列numberをInteger.valueOf(number).intValue()という操作を通して整数値に変換しているだけ。

表の基本形

HTMLで基本的な表を作成する。

<table border="外枠の大きさ">
  <tr>
   <th>見出し</th>
  </tr>
  <tr>
   <td>データ</td>
  </tr>
</table>

ここで、それぞれのタグの説明。
<tr></tr>は横1列を表す。
<th></th>はセルの見出し用。
<td></td>はセルのデータ用。

アクションタグ

JSPでJavaBeansのオブジェクトを生成する。

<jsp:useBean id="オブジェクト変数"
          scope="スコープ"
          class="クラス"
          type="オブジェクト変数の型"
          beanName="クラス" />

例えば、listというjava.util.Collection型のオブジェクト変数が、requestスコープに格納されている場合は以下のようになる。

<jsp:useBean id="list"
          scope="request"
          type="java.util.Collection<Sample>"/>

2008年10月3日金曜日

HTMLエンコード

大抵の本に載っているが一応。

public class HTMLEncoderUtil {
public static String encode(String aTag) {
if (aTag == null || aTag.equals("")) {
return aTag;
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < aTag.length(); ++i) {
if (aTag.charAt(i) == '<') {
sb.append("<");
} else if (aTag.charAt(i) == '>') {
sb.append(">");
} else if (aTag.charAt(i) == '&') {
sb.append("&");
} else if (aTag.charAt(i) == '\'') {
sb.append("'");
} else if (aTag.charAt(i) == '"') {
sb.append(""");
} else {
sb.append(aTag.charAt(i));
}
}
return sb.toString();
}
}

2008年10月2日木曜日

空白文字チェック

/**
* 空白文字チェック(全角スペース・半角スペースの両方をチェック)
*
* @param aValue
* @return
*/
public static boolean checkBlankOrNull(String aValue) {
if (aValue==null || validateMask(aValue.trim(), "^\\s"))
return true;

return isBlankOrNull(aValue);
}

/**
* aValueに空白文字が含まれているかどうかのチェック
*
* @param aValue
* @return 空白文字が含まれていれば真を返す
*/
public static boolean containsBlank(String aValue) {
return validateMask(aValue.trim(), "\\s");
}

2008年9月30日火曜日

DBからDATE型の日付を取得して文字列に格納する

dayがDBのDATE型のカラム名とする。
すると、rs.getDate("day")の内容は、2008-09-30のような形式となっている。
これを2008/09/30のような形式で表示させるには以下のようにする。

rs.getDate("day").toString().replaceAll("-", "/")

ここで、rsはResultSetである。

2008年9月28日日曜日

javaのResultSetからデータを取得する際の注意点

ResultSetからデータを取得する際の注意点を1つ挙げる。それは、

★ResultSetオブジェクトの指すカーソルは、一番最初は、sql文を実行して取得したデータセットの一行目の一つ前に置かれることになっているので、 nextメソッドの最初の呼び出しで、カーソルは一行目に置かれ、一行目がカレント行になる。

つまり、取得データの一行目を扱いたかったら、必ず初めにnext()メソッドを実行して次の行があるかどうかを判定し、それから一行目のデータを扱う必要がある。

コードで書けば以下のような感じ。

ResultSet rs = stmt.executeQuery("SELECT id FROM usertable");
if(rs.next){
  String id = rs.getString("id");
}

2008年9月27日土曜日

Javaで、日付・妥当性の厳密チェック

Javaで入力フォームから、yyyy/MM/ddのような日付入力(例:2008/08/23)を受けたとき、それが入力形式(yyyy/MM/dd)に合致しているかを厳密に調べるメソッドisDateFormat()の作成。

public static boolean validateMask(String aValue, String aMask) {
   return GenericValidator.matchRegexp(aValue, aMask);
}

public static boolean isDateFormat(String aValue) {
//YYYY/MM/ddのチェック
if(!validateMask(aValue, "\\d{4}/\\d{2}/\\d{2}")){
   return false;
}

DateFormat format = DateFormat.getDateInstance();
// 日付/時刻解析を厳密に行うかどうかを設定する。
format.setLenient(false);
try {
   format.parse(aValue);
   return true;
} catch (Exception e) {
   return false;
}
}

2008年9月25日木曜日

Javaで正規表現を用いるためのライブラリ

Javaで正規表現を使おうと思うと外部のライブラリを使う。
JakartaプロジェクトのOROというライブラリを使う。
OROはPerl互換の正規表現を提供するライブラリ。
このライブラリをビルドパスに追加しなければ、NoClassDefFoundErrorが発生する。

2008年9月22日月曜日

コネクションプーリングを用いたDBアクセス

環境














言語java1.6
アプリケーションサーバTomcat5.5
DBmysql5.1.6
OSWindows XP


①JDBCドライバを
   Tomcatインストールディレクトリ\Tomcat 5.5\common\lib
に配置する。
今回は
  mysql-connector-java-5.1.6-bin.jar
を用いる。


***
当初、eclipseのWEB-INF/libに、このドライバをコピーするだけでドライバをロードできると思っていたが、それでは以下のような例外が発生して、ロードできない。

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver'


②以下の3つのファイルに設定を加える。
(i)WEB-INF/web.xml
<resource-ref>
<res-ref-name>jdbc/projectDB<res-ref-name>
<res-type>javax.sql.DataSource<res-type>
<res-auth>Container<res-auth>
<res-sharing-scope>Shareable<res-sharing-scope>
</resource-ref>

(ii)META-INF/context.xml
<Context docBase="projectPass" path="/projectPass">
<ResourceLink global="jdbc/projectDB" name="jdbc/projectDB"
type="javax.sql.DataSource" />
<Context>


***ここで、nameの値はWEB-INF/web.xmlのres-ref-nameと一致させる。また、globalもjdbc/projectDBにする。もしも、globalをprojectDBだけにしたら、以下の例外が発生する。

javax.naming.NameNotFoundException: 名前 projectDB はこのコンテキストにバインドされていません


(iii)tomcatのconfig/server.xml
<Resource auth="Container"
driverClassName="com.mysql.jdbc.Driver" name="jdbc/projectDB"
password="DBパスワード" type="javax.sql.DataSource"
url="jdbc:mysql://localhost/projectPass" username="DBユーザー名" />


***今回の場合、urlにはポート番号を加えたりしない。つまり以下のようにしたりしない。
url="jdbc:mysql://localhost:3306/projectPass"



---------------------------------------------------------------------
最後に。何か間違っていることをしていたら、コンソールにエラーメッセージが出力されるから基本的にそれを見て対処すること。また、最終的に戻るべきところはmysqlやtomcat、java APIなどのドキュメント。

2008年9月13日土曜日

mysqlを使って、ユーザー作成からテーブル作成までを行う

①インストールが完了したら、以下のコマンドを入力してrootでログインする。

C:\> mysql -u root -p

②ユーザーを登録する。
 ユーザーIDがuser、パスワードがpasswordというユーザーに全てのテーブルに対して、全ての権限を与えて登録する場合は以下のようにする。

mysql> GRANT ALL ON *.* TO user@localhost IDENTIFIED BY 'password';

③次にデータベースを作成する。
user_dbという名前のデータベースを作成する場合は以下のようにする。

mysql> CREATE DATABASE user_db;

データベースが作成されたかどうかは、

mysql> SHOW DATABASES;

として確認できる。

**
因みに、データベースの削除は
mysql> DROP DATABASE user_db;

とすればよい。

④テーブルの作成
データベースの中にテーブルを作成するには以下のようにする。

まず、テーブルを作成したいデータベース(ここではuser_dbとする)に接続する。

mysql> USE user_db;

続いて、データベースを作成するためにCREATE TABLEを実行する。

mysql> CREATE TABLE user_table(id INTEGER NOT NULL, password VARCHAR(30), PRIMARY KEY(id));

のようにすればよい。

⑤テーブルが正しく作成されたかどうかの確認

mysql > show fields from user_db;

2008年6月14日土曜日

Javaのファイル操作

package packagename;

import java.io.File;
import java.io.IOException;

public class IO {

/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO 自動生成されたメソッド・スタブ
File dir = new File("C:\\Documents and Settings\\users\\Cookies");
File file1 = new File(
"C:\\Documents and Settings\\users\\My Documents\\work\\test.txt");

// ファイル名を得る
String[] fileNames = dir.list();
for (int i = 0; i < fileNames.length; ++i) {
System.out.println(fileNames[i]);
}

// ファイル名を絶対パスで表示させる
File[] dirName = dir.listFiles();
for (int i = 0; i < dirName.length; ++i) {
System.out.println(dirName[i]);
}

// ルートディレクトリを得る
for (int i = 0; i < dir.listRoots().length; ++i) {
System.out.println(dir.listRoots()[i]);
}

// カレントディレクトリを得る
String currentDir = System.getProperty("user.dir");
System.out.println("カレントディレクトリは" + currentDir);

// 現在のプログラムがファイル読み取りを許可されているか
// 許可されていれば最終更新日を1970年1月1日から経過した時間(ミリ秒)を表示
if (file1.canRead()) {
//System.out.println((file1.list())[0] + "の長さは" + file1.length());
System.out.println(file1.lastModified());
}
//現在のプログラムが書き込みを許可されているか
//許可されていれば削除
if(file1.canWrite()){
file1.delete();
}
//同じ名前のファイルが存在しない場合は、この名前で新しい空のファイルを作成
file1.createNewFile();
}

}