FrontPage

Javaの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に近いものがあるのでわかりやすいね。

  • DをrequiredProperty()みたいな感じで取得する方法があるらしい。多分これはPOMのpropertiesにあるbigtable.versionみたいなやつを取得する関数で、POIMの設定として強制的に追加するための関数なんじゃないかなあと思っている

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があるところで実行しているっぽい。

  • pomのreimportをした IntelliJでpomを変えたときには、reimportをしないとdependencyなどが反映されないっぽい。。。

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 - 手順としては、

  • pom.xml のproject/properties/bookshelf.storageTypeとかにstringを格納する
  • this.getServletContext?().getInitParameter?("bookshelf.storageType");とかで何のデータベースを利用しようとしているのかを確認する
  • サーブレットのinitでthis.getServletContext?().setAttribute("dao", dao);をして初期化
  • リクエストが来ると、doGetにプログラムポインタがくる。
  • doGetの中で、this.getServletContext?().getAttribute("dao");をしてDAOを取得
  • ?cursor=%sみたいなやつを、req.getParameter("cursor")で取得する(getAttributeとかはまじで型を限定しないような形になっているっぽい、具体的にはObject型)
  • サーブレットでreq.setAttribute("var", arr)を何回もして配列や変数を登録。配列はList<T>を突っ込む。
  • サーブレットでreq.getRequestDispatcher?(jsp).forward(req, resp)をする
  • jspで${var}が使えるようになっているのでフロントのテンプレートを頑張る。クラスの場合、クラスのメンバ変数には、var.imageURLみたいな感じで親子的にアクセスできる。

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:とかがついている


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS