約 1,704,961 件
https://w.atwiki.jp/yo-kichi/pages/151.html
JavaスコーラはJava言語を学ぶ授業です。Javaスコーラとは参考 講師は一年間やってきてさまざまに工夫してやってきました。 参考になればいいと思いここにまとめます。 2010年度は自分でプログラムをかけるようになることを目標にたくさんプログラムを書かせてきました。 授業時間は90分で週1回のペースで教えました。授業はスライド、ホワイトボード、実技などで構成しています 前期 Linuxコマンドライン+エディタ HelloWorld 変数について if文, for文 これまでの復習問題 クラスを構成してるもの メソッドの種類、書き方 コンストラクタ、メソッドを使う カプセル化 eclipseを使い始める これまでの復習問題 いくつかお題を提示して簡単なゲームを作ってもらうCUI 復習問題、ゲーム作成の続き ゲーム作成の続き、夏休みの予定検討 夏休み 各自作りたいソフトウェアを作成(Skypeチャットで対応 自分で書かせることでどこを理解していないかがよくわかった 後期 クラスの復習、あるプログラムのクラスを抽出 OOPで書かれた簡単なプログラムを読む 継承 スレッド ソート、データ構造 APIのデータ構造の実装を書いてみる Appletを用いたGUIプログラム GUIでタイマーを作ってみる GUIタイマーの続き 今までの復習、GUIタイマーの改善 自分で考えたプログラムを作る 作ったプログラムの発表 この様な順序で教えました。途中で穴埋め、文章題などの問題を出しました。
https://w.atwiki.jp/mgim/pages/5.html
Java 便利サイトリンク集 素人のアンドロイドアプリ開発日記 楽しいjava入門 とほほ javaの道(Eclipseとかでの開発手順/便利設定) javaまとめリンク集(上のも入ってたw ソースをとりあえず動かしてみたい、とかだったらテトリスとかいいかも)
https://w.atwiki.jp/programing_wands/pages/19.html
Javaについて Javaとは Javaの書き方
https://w.atwiki.jp/bambooflow/pages/81.html
Java Javaについてのメモ。 インストール はじめの一歩 Hello World 変数と定数 演算子 制御文 配列 メソッド クラス 継承 インターフェース パッケージ スレッド 例外処理 ファイル処理 リファレンス Java SE6 API
https://w.atwiki.jp/naobe/pages/25.html
言語に戻る EJB JavaEE5 MBean JMX JNDI サーブレット 言語仕様 項目 説明 transient 修飾子。Seriariseオブジェクトの保管しないフィールドを修飾する。 クラスローダ http //www.techscore.com/tech/Java/JavaEE/Servlet/supplement-1/ 参照 目的 同じ名前でバージョンの異なるクラスを使用するために使う。クラスローダが異なればバージョンが異なっても良い。自分自身のクラスローダを得るにはgetClassLoader()メソッドを用いる。 クラスローダには親子関係があり、子クラスローダがクラスをロードするときには、親クラスローダにロードを依頼してロードできなければ、子クラスローダがロードする。 Class#getClassLoader()は、このクラスをロードしたクラスローダを返す クラスローダによってロードされたClassはパーマネント領域に格納される。ClassLoaderがGCされるとGCから解放される。 VMのクラスローダ ブートストラップクラスローダ JAVA_HOME /lib下のJARファイルに含まれるクラスをロードする。JDK6は、 JAVA_HOME /jre/lib下? 親はいない 拡張クラスローダ JAVA_HOME /lib/ext下のJARファイルに含まれるクラスをロードする。JDK6は、 JAVA_HOME /jre/lib/ext下?親はいない システムクラスローダ CLASSPATHで指定した位置からクラスをロードする。親は拡張クラスローダ。ブートストラップクラスローダは親子関係なしでも委譲されるということでは? 通常のnew Foo()ではこのクラスローダが使われる。 ブートストラップクラスローダ、拡張クラスローダ、システムクラスローダの順番でクラスをロードする。 コンテキストクラスローダ(JDK6 API Threadより) コンテキスト ClassLoader は、クラスおよびリソースをロードするときに、このスレッドで実行中のコードが使用するためにスレッドの作成側によって提供されます。コンテキスト ClassLoader が設定されていない場合、デフォルトでは親 Thread の ClassLoader コンテキストになります。通常、親スレッドのコンテキスト ClassLoader は、アプリケーションのロードに使用されるクラスローダーに設定されます。 なので、設定しなければシステムクラスローダがコンテキストクラスローダになる。 コンテキスト・クラスローダを設定・取得するには、java.lang.Thread#setContextClassLoader,getContextClassLoaderメソッドを使う。 クラスローダ作成 JDK6 APIより たとえば、アプリケーションはネットワーククラスローダーを作成して、サーバーからクラスファイルをダウンロードできます。コードは次のようになります。 ClassLoader loader = new NetworkClassLoader(host, port); Object main = loader.loadClass("Main", true).newInstance(); . . . ネットワーククラスローダーのサブクラスは、ネットワークからクラスをロードするために findClass メソッドと loadClassData メソッドを定義しなければなりません。クラスを作成するバイトを一度ダウンロードしたら、defineClass メソッドを使ってクラスインスタンスを生成する必要があります。実装の例を次に示します。 class NetworkClassLoader extends ClassLoader { String host; int port; public Class findClass(String name) { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData(String name) { // load the class data from the connection . . . } } 特定のディレクトリからクラスをロードするクラスローダを作成してみる。 MyClassLoaderのmainメソッドで、test.MyClassLoaderTargetをロードしClassを作成する MyClassLoaderはClassLoaderを継承したクラスで、loadClassメソッドをオーバライドし、c /mydoc/tmp/を優先的にロードするディレクトリとしている。c /mydoc/tmp/にクラスがない場合は、ClassLoaderのloadClassメソッドを実行する ClassLoaderのloadClassメソッドでは、キャッシュにあれば、そのクラスを返す。なければ親クラスローダに移譲する。なければシステムクラスローダを使ってクラスをロードする Class#newInstance()を実行して、インスタンスを生成する MyClassLoaderTarget#execute()を実行し、MyClassLoaderTarget2をnewしてexecute()を実行する 実行結果を見ると、MyClassLoaderTarget2のクラスローダは、MyClassLoaderであることがわかる。つまりクラスローダを使ってロードしたクラスから別のクラスをnewするときはそのクラスローダを使うことがわかる。クラスローダを作成すると親クラスローダはシステムクラスローダになる。 コンテキストクラスローダは明示的に使用しない限り、使われることはなさそう。 package test; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MyClassLoader extends ClassLoader { private static final int BUFSIZE = 1024; private byte[] result; private int last = 0; @Override public Class ? loadClass(String name) throws ClassNotFoundException { Class ? c = null; try { c = findClass(name); } catch (ClassNotFoundException e) { c = super.loadClass(name); } return c; } private void dbg(String string) { System.out.println(string); } @Override protected Class ? findClass(String name) throws ClassNotFoundException { try { byte[] b = loadClassData(name); return defineClass(name, b, 0, b.length); } catch (Exception e) { throw new ClassNotFoundException(e.getMessage(), e); } } private byte[] loadClassData(String name) throws IOException { result = new byte[0]; last = 0; FileInputStream ins = null; try { byte[] buf = new byte[BUFSIZE]; int readSize = 0; name = name.replace( . , / ); File classFile = new File("c /mydoc/tmp/" + name + ".class"); ins = new FileInputStream(classFile); while((readSize = ins.read(buf)) != -1 ) { moveToResult(readSize, buf); } return result; } finally { if(ins != null) { ins.close(); } } } private void moveToResult(int readSize, byte[] buf) { byte[] tmp = new byte[last + readSize]; // 結果バイト配列をtmp配列の先頭にコピー System.arraycopy(result, 0, tmp, 0, result.length); // bufをtmp配列にコピー System.arraycopy(buf, 0, tmp, last, readSize); result = tmp; last += readSize; } public static void main(String[] args) { try { MyClassLoader loader = new MyClassLoader(); System.out.println("parent " + loader.getParent().getClass().getName()); Class ? clazz = loader.loadClass("test.MyClassLoaderTarget"); System.out.println("target class loader name " + clazz.getClassLoader().getClass().getName()); ((Executor)clazz.newInstance()).execute(); } catch (Exception e) { e.printStackTrace(); } } } package test; public class MyClassLoaderTarget implements Executor { @Override public void execute() { System.out.println("AAA"); MyClassLoaderTarget2 target2 = new MyClassLoaderTarget2(); target2.execute(); System.out.println("target2 class loader name " + target2.getClass().getClassLoader().getClass().getName()); } public static void main(String[] args) { MyClassLoaderTarget target = new MyClassLoaderTarget(); target.execute(); } } package test; public class MyClassLoaderTarget2 implements Executor { @Override public void execute() { System.out.println("BBB"); } public static void main(String[] args) { MyClassLoaderTarget2 target = new MyClassLoaderTarget2(); target.execute(); } } package test; public interface Executor { public void execute(); } 実行結果 parent sun.misc.Launcher$AppClassLoader target class loader name test.MyClassLoader AAA BBB target2 class loader name test.MyClassLoader ThreadLocal スレッドに固有のオブジェクトを保管するために使う(Thread Singleton)。Servletの中で、使用例としてDBに対するConnectionをスレッド毎に保管する場合があげられる。この場合、引数にConnectionを作成すると全てのメソッドにConnectionの引数が必要になり手間がかかる。スレッドにプライベートフィールドを作成して保管できないときに使える。 JDBC 参照 タイプ 説明 備考 type2 ベンダのライブラリと共同して、DBと通信。ベンダのクライアントアプリが必要。 type4 直接DBと通信。JDBCドライバサイズが大きい バッチ insert, updateが連続して行われるときにネットワークトラフィックを削減するために使う。PreparedStatementオブジェクトに対して、addBatch(), executeBatch()メソッドを使うと複数のステートメントをまとめてDBサーバ送信する。 言語コード コード名 説明 Windows-31J ShiftJISの拡張。NEC特殊コードもサポート。 スレッドダンプ 稼働中のスレッドを標準出力にダンプする。 kill -3 プロセス番号 出力例 daemon以外のスレッドを見る。以下の例ではSNMP APIで停止している。 Full thread dump Java HotSpot(TM) Server VM (11.2-b01 mixed mode) "RMI Scheduler(0)" daemon prio=10 tid=0x0955e000 nid=0x15db waiting on condition [0x30cd1000..0x30cd1fa0] java.lang.Thread.State TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for 0x37f243d8 (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java 198) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java 1963) at java.util.concurrent.DelayQueue.take(DelayQueue.java 164) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java 583) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java 576) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java 947) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java 907) at java.lang.Thread.run(Thread.java 619) "Thread-7" prio=10 tid=0x0954bc00 nid=0x15bf in Object.wait() [0x30eb7000..0x30eb7ea0] java.lang.Thread.State TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on 0xa89ec300 (a com.adventnet.snmp.snmp2.SnmpCallback) at com.adventnet.snmp.snmp2.SnmpCallback.sleepUntilNotified(SnmpCallback.java 166) - locked 0xa89ec300 (a com.adventnet.snmp.snmp2.SnmpCallback) at com.adventnet.snmp.snmp2.SnmpCallback.run(SnmpCallback.java 152) アノテーション 注釈。プログラムに影響を与えない。プログラムから読める。コンパイラの動作に影響を与える。 @Override Overrideアノテーションを付加したメソッドがオーバライドメソッドでなければコンパイルエラーになる。 @SuppressWarning Xlintを指定したときに発生する警告メッセージを抑制する。 アプレット jarファイルを指定するには、ARCHIVEタグを使う。CLASSPATHはきかない。 セキュリティポリシー java.policyファイルの構文 grant signedBy "signer_names", codeBase "URL", principal principal_class_name "principal_name", principal principal_class_name "principal_name", ... { permission permission_class_name "target_name", "action",signedBy "signer_names"; permission permission_class_name "target_name", "action",signedBy "signer_names"; ... }; ここで、"signer_names"、"URL"、principal_class_name、"principal_name"、permission_class_name、"target_name"、"action"、"signer_names"は、変数。 signedBy 、codeBase、、principal は省略可能。 意味は、signer_namesで署名されたURLにあるプログラムが、permission_class_nameで規定されるtarget_nameに対して、actionすることを許可する。target_name, actionについては、permission_class_nameのAPIを参照。 http //java.sun.com/j2se/1.5.0/ja/docs/ja/guide/security/PolicyFiles.html 参照。 例 permission java.io.FilePermission "\\\\192.168.1.40\\-", "read,write"; 192.168.1.40のリモートファイルに対する読み書きを許可する。 Linux firefoxへのJava Plugin インストール 例 # ln -s /usr/java/jdk1.6.0_20/jre/lib/i386/libnpjp2.so /opt/firefox/plugins インストールの確認 urlにabout pluginsを設定して開く Linuxでのplugin コントロールパネル 起動 $JAVA_HOME/bin/ControlPanel を実行 最大メモリ容量の修正 "-XX MaxPermSize=256m"をJavaタブのアプレットパラメータに追加 その他 スタックトレースをStringに変換する 仕事の都合で、最後の行で改行を削除してタブをスペースに変換している。 private String getStackTraceAsString(Exception e) { ByteArrayOutputStream ostream = new ByteArrayOutputStream(100); e.printStackTrace(new PrintStream(ostream)); String sep = System.getProperty("line.separator"); return ostream.toString().replaceAll(sep, "").replace("\t", " "); } 固定長レコードのファイルを出力 package test; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; public class SingleFille { private BufferedOutputStream bstream; /** * ファイルに書き込むデータ * 桁数 * 内容 */ private String[][] data = { {"aaa1", "bbb1", "ccc1"}, {"漢字2", "bbb2", "ccc2"}, {"aaa3", "漢字3", "ccc3"}, {"aaa4", "bbb4", "漢字4"}, }; /** 列の桁数 */ private int[] length = {10, 20, 30}; /** ファイルオフセット */ private int offset = 0; private static final String FILE_PATH = "singleFile.dat"; public static void main(String[] args) { SingleFille sfile = new SingleFille(); try { sfile.execute(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void execute() throws IOException { File file = new File(FILE_PATH); try { FileOutputStream stream = new FileOutputStream(file); bstream = new BufferedOutputStream(stream); for(int i = 0; i data.length; i++) { String[] line = data[i]; putFile(line); } } catch (IOException e) { throw e; } finally { if(bstream != null) { try { bstream.close(); } catch (IOException e) { throw e; } } } } /** * @param line * @throws IOException */ private void putFile(String[] line) throws IOException { for(int i = 0; i line.length; i++) { //各列を桁数になるように整形 byte[] term = createTerm(line[i], i); bstream.write(term); offset += term.length; } } /** * @param term * @param index * @return * @throws UnsupportedEncodingException */ private byte[] createTerm(String term, int index) throws UnsupportedEncodingException { //項目を格納するバイト byte[] outterm = new byte[length[index]]; //項目をShift_JISのバイトに変換 byte[] interm = term.getBytes("SJIS"); for(int i = 0; i outterm.length; i++) { if( i interm.length) { outterm[i] = interm[i]; } else { //残りはスペース outterm[i] = 0x20; } } return outterm; } }
https://w.atwiki.jp/charolles/pages/35.html
JavaのGUIについて AWT AWTは、すべてのJavaのバージョンについており、どのようなJavaランタイムでも動くのが利点。GUIの見た目がプラットフォームに依存(ネイティブコードを叩いているため)。拡張性・実行速度ともにSWTに劣るため、どうしてもネイティブウィンドウシステムを利用したいなら、AWTではなくSWTを用いるのが普通。 というか、アプリに対して今時使う必要性が全くない(AWTを使うぐらいならSwing使え) Swing Java2.0?から導入。AWTを継承。 AWTの欠点であった「GUIの見た目がプラットフォームに依存」を解消(つまり100%PureJavaであり、見た目が統一されている)。そして拡張性の無さも解消(SWTよりも拡張性は高い?)。しかしながら、リリース当時はOS比依存性を高めるためにパフォーマンスが犠牲にされていた。最近はJavaVMやSwingの高性能化、プラットフォーム環境の高性能化によりパフォーマンスネックが解消されつつある(現在は、単純なアプリならSWTと速度は変わらない。また今後もさらなる高速化が期待されている)。 Fx スクリプト言語。Swingアプリをより簡単・明快に制作することが出来る(要するにSwingを利用しつつ、Swing本来のコードを書くことなく、より簡単にGUIアプリを作成できる)。 しかし、Swingに比べ、現在は拡張性にまだ難あり。日本語のドキュメントもまだ少ない? SWT SWTはEclipse独自のライブラリが必要。AWTと同じくGUIの見た目がプラットフォームに依存。しかし、AWTより拡張性が高く、高速であったため、通常はこちらの方を利用することが多かった?(しかし、AWTもSwingは、近年はコンピュータの高スペック化、JavaVM高速化に伴い、単純なアプリならほぼ変わらない速度となってるらしい。)
https://w.atwiki.jp/sigumayu/pages/13.html
Java プログラミング言語のひとつ。 オブジェクト指向性を備えている点が大きな特徴。強力なセキュリティ機構や豊富なネットワーク関連の機能が標準で用意されており、ネットワーク環境で利用されることを強く意識した仕様になっている。 プログラムの実行前にコンパイルが必要なタイプの言語。 だが、コンパイル後には実行ファイルではなくクラスファイルが作成され、これがJRE上で実行されるため、様々なOSで実行できるという特徴を持つ。 このように、プログラミング言語ではあると同時に、実行環境等も含む。 Javaで開発されたソフトウェアは特定のOSやマイクロプロセッサに依存することなく、基本的にはどのようなプラットフォームでも動作する。その反面、標準ではどのプラットフォームでも実現できる最大公約数的な機能しか利用できないため、プラットフォーム固有の機能を利用する用途には向かない。 Javaで記述されたソースコードは、コンパイル時にJavaバイトコードと呼ばれる中間コードにいったん変換される。ソフトウェアはバイトコードの状態で配布され、実行時にはJava仮想マシン(JVM)と呼ばれるソフトウェアによって、実行するプラットフォームに対応した形式(ネイティブコード)に変換され、実行される。プラットフォーム間の違いはJava仮想マシンが吸収するため、開発時にはプラットフォームの違いを意識しなくてよい。ただし、ネイティブコードへの変換には時間やメモリ領域が余計に必要となるため、速度やメモリ容量がシビアな用途には向かない。
https://w.atwiki.jp/tamorintech/pages/14.html
別ページにまとめてるもの。 Javaのプリミティブラッパークラスはすべて不変である。 サーブレットのセッション管理(2012/3/18 旧ブログから移行) サーブレット・JSPのライフサイクル(2012/3/18 旧ブログから移行) 集約とコンポジション(2012/3/18 旧ブログから移行) サーブレットコンテナ(2012/3/18 旧ブログから移行) JNDIってどんなものなのか。(2012/3/7)何となくの理解。 Java -- DBでの日付・日時のデータについて。(2012/2/5 Evernoteから移行)DB側の話。 Java側の話。 上記からわかったこと! PATH環境変数とCLASSPATH環境変数は全く関係ないものなんですよ。(2012/2/4 旧wikiから移行) サーブレットの認証方式。(2012/2/4 旧wikiから移行) サーブレットはスレッドセーフに。(2012/2/4 旧wikiから移行) スレッドローカルとは。(ThreadLocal)(2012/2/4 旧wikiから移行) アノテーションとは。(2012/2/4 旧wikiから移行) 別ページにまとめてるもの。 log4j Android Javaのプリミティブラッパークラスはすべて不変である。 よって、ラッパークラスオブジェクトを参照値渡ししてメソッド内で計算しても、メソッド呼び出し側のオブジェクトには結果が反映されない。 private void exec() { Integer value = new Integer(5); System.out.println("メソッド実行前のint値 " + value.toString()); increment(value); System.out.println("メソッド実行後のint値 " + value.toString()); } private void increment(Integer integer) { // 内部的には // integer = new Integer( integer.intValue() + 1 ); // のようなことが行われている。つまりメソッド内のinteger は別の新しいオブジェクトを参照することになる。 integer++; System.out.println("メソッド内での計算結果 " + integer.toString()); } メソッド実行前のint値 5 メソッド内での計算結果 6 メソッド実行後のint値 5 サーブレットのセッション管理(2012/3/18 旧ブログから移行) 今日はホントにメモだけ!(時間ないからね!) サーブレット・JSPのライフサイクル(2012/3/18 旧ブログから移行) とりあえずメモだけアップしておく。まだ目的は達成してないけど・・・。 知りたいことは以下のこと。Tomcat(サーブレットコンテナ)がクラスをロードしたり、サーブレットのinit / service / destroy の呼び出しを行っている部分の詳細な動きが知りたい。 JSPリソースへのリクエストを受け取ったとき、それをJSPから変換したサーブレットへのリクエストへと切替えている部分の詳細な動き。 Tomcatはサーブレットのインスタンスをどのようにしてシングルトンで管理しているのか。 やっぱりTomcatのソースをじっくり読みたい・・・。 集約とコンポジション(2012/3/18 旧ブログから移行) 新人の後輩から質問されて答えられず。そもそも明確な違いは定義しにくく、「曖昧」らしい。 集約とコンポジション、Javaのコードに落とせばどちらも同じ。「全体」のメンバ変数に「部分」のオブジェクトが定義されていることになる。 上記は車クラスが「全体」であるのに対し、車体・エンジン・タイヤクラスが「部分」にあたる。ひし形の色は白なので集約の関連があることを表している。 車クラスをJavaコードにすると以下のようになる。 public class Car { private Body body; private Engine engine; private Tyre tyre; ・・・ } クラス図のひし形の部分が黒で塗りつぶされていて、コンポジションをあらわしていたとしても車クラスは上記と同じコードとなる(のはず)。 他の技術系の記事を参考にすると、コンポジションは両オブジェクト間のライフサイクルが同じ、もしくは強い依存の関係にある場合に使用する。 ということは、集約とコンポジションでJavaコードに違いが出てくるところと言えばオブジェクトの生成の仕方とかだろうか? 車クラスと車体・エンジン・タイヤクラスがコンポジションの関連にある場合、車クラスのコンストラクタで車体・エンジン・タイヤクラスのオブジェクトを必ずnewするとか。もしくはメンバ変数の宣言部でnewしちゃうとか。 public class Car { private Body body = new Body(); private Engine engine = new Engine(); private Tyre tyre = new Tyre(); ・・・ } まぁその辺りも想定するシナリオとかで変わってくる気がする…。 とにかく、集約とコンポジションの違いについて深く悩むことにあまり価値はないと自分に言い聞かせる。(笑) サーブレットコンテナ(2012/3/18 旧ブログから移行) サーブレットコンテナというキーワードで少し勉強した。一番知りたかったのは、「Webサーバ」と「サーブレットコンテナ」の機能の切り分け。 サーブレットコンテナについては前よりイメージがわいてきた。Servlet API / JSP API の参照実装(RI)であること。HttpServletの実装をTomcat等のサーブレットコンテナは持っている。 サーブレットのインスタンス化や破棄など、ライフサイクルの管理を行っていること。 3つの動作形態の種類があること。スタンドアロン型-サーブレットコンテナ自身がWebサーバを内蔵している。Tomcatはこれにあたるので、単体でサーブレットアプリケーションを動かせる。 内部プロセス型 外部プロセス型 Tomcatの設定ファイルを覗いてみるとなんとなく仕組みがわかってくる。なんとなくだが・・・ Connector がWebサーバ機能を担う定義なんじゃなかろうか。 他のWebサーバを使用するため、TomcatのWebサーバの機能をOFFにするにはserver.xmlの Connector 要素を削除するって書いてあったし。 ここでの機能は、クライアントからのリクエストをサーブレットコンテナ(エンジン)に渡すこと。 結局、Webサーバの詳細な機能ははっきりとわからなかった。サーブレットコンテナというキーワードを絡めずに、Webサーバそのものについて今後調べないと! ところで、サーブレットアプリケーションのメインプログラムは何なのか?Javaプログラムはmainメソッドの起動から始まる、と教えてもらったはず。ちょっと調べてみたところ、Tomcatの場合、Bootstrapクラスがそれに当たる模様。 確かにBootstrapクラスにはmainメソッドがあり、Tomcatの起動用スクリプトを見てみてもBootstrapクラスをjavaコマンドにより実行しているようだ。 ただこのBootstrap.classがbootstrap.jarとcatalina.jarという二つのjarファイルに存在する。 これは同じクラス(全く同じモジュール)と考えてよいのか? あ、ちなみにここまで、Tomcat 6についての話。。 5.5のディレクトリ中身を見てみたらまたちょっと違うようだ。あまり気にしなくても大丈夫かな…? JNDIってどんなものなのか。(2012/3/7) JNDIとはJava Naming and Directory Interfaceの頭文字を取ったもので、Javaから •ネーミング・サービス •ディレクトリー・サービス を扱うためのインターフェイスを規定した仕様です。 だそう。こういう定義は他でもいくつか目にするんだが、いまいちイメージがわかない。 何となくの理解。 本質ではなくwebアプリ(サーブレット)に限定した理解だが、DB接続をJNDIで行う場合は以下な感じ。DB接続情報(=DataSource)をサーバーの設定ファイル(Tomcatの場合はcontext.xml)に定義する。その実態はjava.sql.DataSourceクラス(のオブジェクト?)である。 Javaプログラムでは、java.naming.InitialContext#lookupメソッドで、定義したDataSourceを取得する。 DataSource#getConnectionメソッドでjava.sql.Connectionを取得し、DB接続が開始できる。 以下を読むと上記の実装例があり、どんなものかが少しわかった。ありがたい。http //www.javaroad.jp/opensource/js_tomcat8.htm http //blogs.yahoo.co.jp/kensinisnek/11707751.html Java -- DBでの日付・日時のデータについて。(2012/2/5 Evernoteから移行) DB側の話。 標準のSQL(?)では、日付・時刻のデータを持つカラムの型は以下のとおりとなっているようだ。DATA日付のみのデータを持つ。 TIME時刻のみのデータを持つ。精度(桁数?)は指定できる。 TIMESTAMP日付+時刻のデータを持つ。精度は指定できる。 Java側の話。 ここで扱う日付・日時に関するクラスの継承関係は以下のとおり。java.util.Datejava.sql.Date java.sql.Time java.sql.Timestamp java.util.Date日付と日時の両方のデータを持つ。時刻はミリ秒まで。 java.sql.Date日付のデータのみ持つ。基底クラス(java.util.Date)の時・分・秒・ミリ秒には0が設定される。 java.sql.Time時刻のデータのみ持つ。基底クラス(java.util.Date)の年・月・日には1970年1月1日が設定される。 java.sql.Timestamp日付と時刻のデータを持つ。時刻はナノ秒まで。 java.sql.ResultSetインターフェースについて。getDateメソッド:java.sql.Dateを返す。 getTimeメソッド:java.sql.Timeを返す。 getTimestampメソッド:java.sql.Timestampを返す。 上記からわかったこと! テーブルに対応するデータオブジェクト(エンティティクラス)を設計するとき、DBのDATE、TIME、TIMESTAMPのカラムに対応するプロパティは、java.sqlパッケージのクラスを使えってことだね。 PATH環境変数とCLASSPATH環境変数は全く関係ないものなんですよ。(2012/2/4 旧wikiから移行) PATH環境変数は、OSがプロンプトから入力されたコマンドに対するプログラムを検索する際の検索先である。 CLASSPATH環境変数はJavaソースのコンパイル時、プログラム実行時に必要となるクラスファイルを検索する際の検索先である。 よって2つはなんら関係ないものである。 サーブレットの認証方式。(2012/2/4 旧wikiから移行) サーブレットにおける認証方式の種類は以下のものがある。Basic認証:HTTPのBasic認証を使った方式。 Digest認証:HTTPのBasic認証を使うが、パスワードをダイジェストエンコードして暗号化する。 Form認証:HTMLのformを使ってユーザーIDとパスワードを入力する。 Client-Cert認証:クライアント証明書を使って認証を行う方式。 Tomcat標準のレルムレルムとは、ユーザーIDとパスワードをサーバー側でどのように管理するかの設定方法である。XMLベースのテキストファイルやデータベース等がある。 UserDatabaseRealmTomcatでデフォルトで設定されている方式。 ID、パスワード、ロールをtomcat-user.xmlファイルに記載する。 UserDatabaseに対して行った変更が変更情報としてtomcat-user.xmlファイルに書き込まれる? JDBCRealmID、パスワード、ロールをデータベースに格納し、JDBC経由で認証を行う。 JNDIRealmNIS、ActiveDirectory等のディレクトリサービスにID、パスワード、ロールを格納しJNDI経由で認証を行う。 DataSourceRealmJDBC経由で認証を行うが、JDBCへの接続にJNDIルックアップを使用する。 サーブレットはスレッドセーフに。(2012/2/4 旧wikiから移行) サーブレットのインスタンスは(基本的に)1つのみサーブレットコンテナにより作成される。 クライアントからの要求は複数同時に処理される。1リクエスト=1スレッドと考えてよい。 スレッドに関して、サーブレットコンテナは以下の特徴がある。サーブレットコンテナはスレッドプールを持っており、そこに複数のスレッドを蓄えている。 サーブレットコンテナはクライアントからリクエストを受け付けると空きスレッドを割り当て、サーブレットに渡して処理を移譲する。サーブレットのインスタンス数は1つである。 スレッドローカルとは。(ThreadLocal)(2012/2/4 旧wikiから移行) ThreadLocalは、スレッド毎の値を保持する為のクラス。 あるクラス(のインスタンス)がマルチスレッドで呼ばれる際に、スレッド毎に異なる値(インスタンス)を使いたい場合に使用する。 自分でThread(やRunnable)を使ってマルチスレッド化しているならスレッド毎の値が保持できるので、ThreadLocalを使用しても意味がない。 しかし、Webアプリケーション(サーブレット)は1つのインスタンスがマルチスレッドで呼ばれるので、そのスレッド毎に別のインスタンスを保持したいときはとても便利である。 アノテーションとは。(2012/2/4 旧wikiから移行) アノテーションとは、プログラムの動作に影響を与えない注釈、メタデータ。クラスやメソッド、パッケージ等に付与する。 コメントとの主な違いは以下のとおり。プログラムでアノテーションを読み取って処理できる。 アノテーションはコンパイラの動作に影響を与える。 標準アノテーションとして以下のようなものが定義されている。(J2SE 5.0)Override Deprecatedそのメソッドの使用が推奨されないことを示す。(Javadocの@deprecatedと同じ意味を持つ。) そのメソッドを使用するとコンパイル時に警告が出る。 SuppressWarningコンパイル時の警告を抑制する。 抑制する警告の種別はアノテーションの文字列配列の引数を渡すことにより指定が可能。 アノテーションの定義の仕方。「@interface」でアノテーションが定義できる。 以下のように型定義の本体が空のアノテーションをマーカーアノテーションという。 public @inteface Myannotation{ } 同じアノテーションをクラス、メンバ変数、メソッド、それぞれに適用できるようだ。 @Myannotation() public class TestMain { @Myannotation() private String var; @Myannotation() public static void main(String[] args) { } }
https://w.atwiki.jp/redcloud/pages/22.html
目次 目次 前提条件 JDK1.6 インストール 環境設定 Ant インストール 環境設定 前提条件 CentOS5.4上に構築する JDK1.6 インストール (公式サイトから JDKのrpm.bin ファイルをダウンロードしておく) $ sudo chmod +x jdk-6u17-linux-i586-rpm.bin $ sudo ./jdk-6u17-linux-i586-rpm.bin 環境設定 $ vi ~/.bash_profile JAVA_HOME=/usr/java/jdk1.6.0_17 ←行追加 export JAVA_HOME ←行追加 PATH=$JAVA_HOME/bin $PATH $HOME/bin ←$JAVA_HOME/bin追加 $ source ~/.bash_profile Ant インストール $ wget http //ftp.kddilabs.jp/infosystems/apache/ant/ant-current-bin.zip $ unzip ant-current-bin.zip $ sudo mv apache-ant-1.7.1 /usr/local # cd /usr/local # chown -R root.root apache-ant-1.8.0RC1 # ln -s apache-ant-1.8.0RC1 ant 環境設定 $ vi ~/.bash_profile ANT_HOME=/usr/local/ant ←行追加 export ANT_HOME ←行追加 PATH=$ANT_HOME/bin $JAVA_HOME/bin $PATH $HOME/bin ←$ANT_HOME/bin追加 $ source ~/.bash_profile
https://w.atwiki.jp/4kamemo/pages/16.html
Javaの環境設定 ↓のリンクを開く JavaSDK 【Accept License Agreemen】承認を選択して自分の環境に合ったものをダウンロードする 大体の人はこの辺りだと思います 後はダウンロードしたファイルを実行してください こんな感じのものが出来たと思います 次はJavaをPathに通してください。 ↑お決まりの手順だと思ってください。 次に環境変数を設定します。 (失敗したこと無いのですが、失敗すると面倒なことになりそうなので注意してください。) ここで必要な作業は、PATHという環境変数にjavac.exeなどのコマンドが存在する場所を設定することです。 この作業に誤りがあると、コマンドプロンプトでjavacコマンドを実行しても、 「内部コマンドまたは外部コマンド」というエラーメッセージから抜け出すことはできません。 コンピュータを右クリックして【プロパティ】を選択してください システム詳細設定を選択してください。 画面はwindows7です。 環境変数を選択してください 環境変数の設定画面が開きます Pathを選択して、編集ボタンを押してください Pathの編集画面が出てきます 「変数値」のところには何か入力がされていると思います。 これが現在設定されているPathの値です。最初から入力されている部分を消さないように注意して最後のところに 「C \Program Files\Java\jdk1.7.0_45\bin;」を追加して下さい (JDKをインストールしたディレクトリに合わせて設定する値は変更して下さい)。