概要 †
バージョン †
ディレクトリ構造 †
Map/Reduce †
Javadoc †大変便利で、クラスの概要やメソッドの概要を記述しておくと、その情報からHTML形式のドキュメントファイルを生成してくれます。Java Platform SEのAPIリファレンスは実際に、この機能を使って生成しています。 アノテーション †
Javaには標準アノテーション型として、java.langパッケージに「Override」「Deprecated」「SuppressWarnings?」が定義されています。 スレッドプール †
Context †The request.setAttribute() sets an attribute in the request scope and is thus only available within the same request/response cycle. The servletContext.setAttribute() スコープとは、サーブレットやJSPを跨いでデータを共有したい場合に用いる保存領域のこと。 https://qiita.com/shuyam/items/a9a1be62f52009748844 共有範囲に応じて以下の3種類がある。 リクエストスコープ ブラウザからのリクエスト毎に生成されるスコープのこと。次のリクエストが来た場合やブラウザを閉じたり、アプリケーション・サーバーが再起動した場合は原則保持されない。 セッションスコープ ブラウザを閉じない、あるいはタイムアウトしない限り保持されるスコープ。 アプリケーションスコープ アプリケーション・サーバーが終了しない限り保持されるスコープ。ブラウザを閉じても保持される。 サーブレットのdoGetやdoPostメソッド内でスコープに保存し、 フォワードメソッドで次に引き渡すと、これら全てのスコープのデータを保持した状態で次のサーブレットに渡せる req.getsession().getservletcontext() and getservletcontext()はじつは同じもの https://stackoverflow.com/questions/12448826/difference-between-req-getsession-getservletcontext-and-getservletcontext GAE Standardのセッション管理は この実装では、App Engine のデータストアと memcache を使用してセッション データを保管する。 で、どうやってsessionのattiributeを見るの??なくない?? mvnのPはprofile。pomの中にprofiles/profile/idに指定するところを-Pで指定すると、そのプロファエイルの中に書いてあるdependencyなどが追加でインストールされるなど。複数のプロファイルを読み込むこともできる。 Dはdefineで、system propertyのレベルなので結構広い範囲で有効。C++での-Dに近いものがあるのでわかりやすいね。
Celeniumの自動化をしても結局メンテナンスコストはかかる 画面テストのメンテは実はUnitTest?よりコストがたかいので、メンテできないような亮のテストを作ってはならない。 記録機能はそこまで重要ではなく、それなりのコストが必要になる guavaというGoogleせいのライブラリが会って、これがC++のbits/std++.hみたいな感じでいろんなデータ構造とか簡単に値チェックするための関数軍などを提供していてうれしいらしい。 POM †groupが公開プロジェクトで、artifactがその中でのライブラリ群で、versionはバージョン 例としてこういうのがある https://mvnrepository.com/artifact/com.google.guava/guava mvnrepositoryは便利 MavenはProject Object Model(POM)によるプロジェクト管理ツール javacって何’ jarの仕組みって何(jarは実はJava Archiveで、実際には単なるzipに変な情報を足したもの)JARファイルは.javaファイルではなく.classファイルを使用するので、javacコマンドでコンパイルする必要があります。jar cvf Test.jar test/で作れて、もうtarみたいなかんじ。実際問題jar tvf Test.jarとするとMETA-INFとかが入っているだけなので、実質zip そもそもjavaって何 SCM管理下って何 MavenはAntの強化版。Antではオレオレbuild.xmlを書かないといけなかったり、依存JARが多いと全部サイト巡ってダウンロー土する必要があるみたいな悲しい感じだった。→プロジェクトのディレクトリ構造にルールを作った。また、依存jarは自動ダウンロードするようにした。また、ビルドも、コンパイルしてテストしてZIPで固めて…をするようにした。 JARの識別する仕組みとして、groupId, artifactId, versionを特定するようにした。 ビルドの仕組みもガチガチに決まっている。Default -> Clean -> SIteで、それぞれには9, 3, 4個の手順がある。これをライフサイクルの各フェーズという。ゴールは、ビルドの個々のタスク、コンパイル、JAR作成、ファイルのコピーなどをする。ゴールは全てプラグインが提供する、ゴールは「プラグイン名:ゴール名」compiler:compileみたいな形をしている。要するにゴールは「コンパイルしろ」「テスト走らせろ」みたいな一つの行動に相当していて、これはプレでファインド。 profileという機能があって、これを使うと本番・保守・開発でDBの接続設定を切り替えるとかできる $M2_HOMEというところにMavenのInstall Directoryがある .m2にダウンロードしたJARが格納 java -cpはクラスパスを指定している java -jar Test.jar Test.jarにメイン・マニフェスト属性がありませんと言われるが、これはmain関数がどのクラスのものなのかがわからないため。これの修正のためには、Main-Class: test.Testというマニフェストを追加すると良い。 Javaの特徴は、JVM (Java virtual machine)というマシンの上で仮想化されているので、どんな環境でもJavaが動作する GroupId? 他の全てのプロジェクトと区別するための名前です。 一般に使われるのは ドメイン名を逆にしたものです。 com.example など。 これをそのままパッケージ名のフォーマットに使うのが一般的です。 ArtifactId? バージョンを除いた jar ファイルの名前です。 プロジェクト名といったほうがわかりやすいと思います。 たとえば project_a などにします。 Version Intellij IDEA だと、 デフォルトで 1.0-SNAPSHOT となっていたりしますが、 フォーマットは決まっていません。 1.0.0 のようにもできます。 packageはソースファイル内のクラスが所属するパッケージ名を指定するのに用います。 これをソースコードに書くと、mavenでコンパイルしている場合はtargetディレクトリを勝手にほってくれるので便利という感じっぽ。定義上一つのソースに一つしか存在しない。package文を省略すると、クラスは名前無しのパッケージに所属することになる。 import文はくrスのロードではなく、クラスライブラリ探索のための省略ができるよと言うだけらしい。フルパスで書けば動くは動く。その性質から、当然名前衝突する可能性もあるので、*でimportするのは控えるのが良い。 しかし、Javaにはパッケージ名の衝突を防ぐ仕組みはなく、インターネットドメイン名(DNSドメイン名)をパッケージ名として利用することを推奨している。 JavaのdependencyがLogging version 2とLogging version 3のように衝突する場合は、エラーメッセージがちゃんと出るのでどちらかをexcludeで消さないといけない。 「compile」フェイズでは、maven-compiler-plugin の compile というゴールが実行されます。 プラグイン:ゴール intelliJのビルドは、pomがあるところで実行しているっぽい。
Javaのstatic static メソッドは、そのものがクラスのインスタンスではなく、クラスに属します。それ以上でもそれ以下でもない Javaのfinal final変数はconstみたいなもの。ぶんかとして 普通の変数と区別するために大文字にすることが多い。 final classは継承付加を表す関数。 ServeletのdoGetとかdoPostとかは当然HTTPリクエストに対応している デザインパターン †Builderパターン †Pythonとかだと引数の名前にたいしてf(name="hoge")とかできるけど、Javaではできない。これを解決したいね、というやつ。 基本的には、インスタンスを直接作るのではなく、作ってくれる大工インスタンスを作る時点でビルダーパターンと言える。 Builderを使いたくなる理由 引数が多くなると、順番を正確に覚えておくのが難しくなる。 つまり引数の渡し間違いが発生しやすくなる 任意の値があると、適当な値をわざわざ渡す記述を書く必要がある。 つまり記述量が無駄に多くなる ↑の例でいうと、 ageは任意の値です。任意だけど、コンストラクタに引数として与えなければならない以上記述はしないといけないですね。無駄なことです。 DAO †In computer software, a data access object (DAO) is an object that provides an abstract interface to some type of database or other persistence mechanism. サーブレット †というかJSPでいじる変数ってsessionに書き込まれたAttributeから得る感じなのか…なるほど Datastoreのkindには_ah_SESSIONというのがあって、javaのセッション管理は自動的にここのkindが使われる Javaのdo filterを考えるときには、二つのフィルタがあってそのあいだの順序はweb.xmlで決める(めんどいし順序に依存しないようにfilterを設計するのが大事) chain.doFilteより上が前処理、下が後処理 フィルタ リクエスト・リスポンスの整形をすることができる。生のリクエストは結構汚いので、サーブレットが処理する前後でいろんなデータ正しい状態にするための機能 FilterChain?のdoFilterメソッドによって一連の処理が実行されるので、これより前で処理を行うか後ろで処理を行うかで、クライアントからの要求と応答のどちら側でフィルタリングを行うか決定する事ができます。 JSP Standard Tag Library (JSTL) Tutorial - 手順としては、
JSPファイル Webサーバ上で動くプログラム Javaの中でもウェブサーバでレスポンシブに動くプログラムをサーブレットと言うらしい。 JSPがpythonでやっていたプログラマブルなHTMLに相当している JSPはServlet containerがJavaServlet?に変換して、その役割で働く Servlet ContainerはServletをspin upしたあと、すぐに落とさない(CGIは寝る)。マシン単体でのスケールアップについて責任を追っているので、マルチスレッド対応している。 サーブレットコンテナとして一番有名なのは「Apache Tomcat」 JavaServer Pages が使われています。これは Java テンプレート エンジンの一種ですが、サーブレットとして実行されます。 getSessionという概念がある。これを使って以下のようにすると、reqにもsessionにもかきこまれるようになるみたい。 req.getSession().setAttribute("cursor", endCursor); req.getSession().setAttribute("page", "list"); intelliJ †メソッドのコードや定義の確認のためにはC-bで行ける(Alt-Leftかも) intellliJで、文字列リテラルにs: とかo:とかついているのは、呼び出し元の型がstringかObjectかという違いによるもの というか関数の中の変数としてthisを渡していたりするときも、それがどの方7日がわからなくならないようにbuilder:とかがついている
Jetty †100%Javaで開発されたJava Servletコンテナ/Webサーバである。WebSocketなどのプロトコルもサポートする。Jetty はオープンソースプロジェクトとして開発され、Apache 2.0 License でリリースされている。JBoss、Apache Geronimoといった他のプロジェクトでも利用されている。 単純で効率的な組み込みやすいWebサーバとなるよう意図して開発されている。サイズが小さいので、組み込み型 Java アプリケーションにWebサービスを提供するのに適している。 その一方で、Apache HadoopやGoogle App Engineといった大規模でスケーラビリティが重視されるサービスにおいても採用されている[2]。 2009年1月、WebtideはJettyのコアコンポーネントをcodehausからEclipse Foundationに移管することを発表した。 サーブレットの一種でTomcatと双璧をなしているらしい。GAEで採用されているのはびっくりした。 Tomcatに比べると軽量で、Apache+Tomcatではオーバースペックになっている可能性。TomcatのHTTPサーバ機能は開発者向けで本番環境向けではないが、JettyはHTTPSがついているのでApacheがいらない。あと起動が早い。 Maven Surefire プラグインはユニットテストの実行のためのもの。JUnitと何が違うの? JaCoCo?はコードカバレッジを測るもの。 未整理 †intelliJでJDKを帰るにはProject Structureとかいうのを使えば良い JavaのMakefileみたいなもの Mavel, gradle mavelはlifecycleというものがあるclean, site, deployがデフォルトで、siteはドキュメントを作るためのコマンド。 その他にもvalidate, comile, test, package, verify, installなどいろいろなコマンドがあって、これらの動きを制御するための情報がpom.xmlに書いてある。 IDEは適切に選ぶ。 node.jsとかはIntelliJ Ultimateを使ったり、JavascriptはVSCodeを使うのが良い。 pom.xmlのbuild as maven projectを押した あとSDKはデフォルトで走らなかったからreadlink -f $(which java)をしてGoogleのJDKを使った javaのデフォルトのJDKを調べる方法 readlink -f $(which java) caretはキーボードカーソルのこと? gradle maven-pom .m2 JavaScriptならVScode nodeJSはaltimate intelliJを使う必要 普通のjavaは普通のintelliJを使えば良い。 コマンドを走らせるときはものすごく気をつける!!! そもそもいい加減に走らせない。何をやろうとして走らせているのかを把握して作業する。 mavenはjavaのビルドツール javaのPOMとは?pom.xmlというファイルによってビルドできる A Project Object Model or POM is the fundamental unit of work in Maven. |