Springフレームワーク

Springとは?

Java用汎用アプリケーションフレームワーク
・DI機能
・Webアプリケーションだけではなく、デスクトップアプリケーション等の開発でも使える
・多くのオープンソースライブラリとの連携が可能
等の特徴がある。

プロジェクト作成方法

MVC

spring1

spring2
テンプレート:「Spring MVC Project」を選択

spring3
デフォルトでビューとコントローラが作成される。

アノテーション

@Controller

Controllerの役割となるクラスに付与
コントローラである事を定義

@RequestMapping

リクエストとメソッドを紐付ける
@RequestMapping(value = "/test")
public String index() {
 URL=testへのリクエストを処理
 return "test";
}
@RequestMapping(value = {"/test", method = RequestMethod.POST)
public String index() {
 URL=testへのPOSTリクエストを処理
 return "test";
}
@RequestMapping(value = {"/login/{" + Constants.UUID_KEY + "}"}, method = RequestMethod.POST)
public String index() {
 URL=testへのPOSTリクエストを処理
 return "test";
}
@Controller
@RequestMapping(value = "/login")
public class LoginController {
 @RequestMapping(value = "/test1")
 public String index() {
  URL=login/test1へのリクエストを処理
  return "test1";
 }
 @RequestMapping(value = "/test2")
 public String index() {
  URL=login/test2へのリクエストを処理
  return "test2";
 }
}

タグ

if

<%
session.setAttribute("count","15");
%>
<c:if test="${count >= 10}" >
 ~
</c:if>

choose when

<%
session.setAttribute("count","15");
%>

<c:choose>
 <c:when test = "${count >= 10}">
  ~
 </c:when>
 <c:otherwise>
  ~
 </c:otherwise>
</c:choose>

Eclipse使用方法

デバッグ

実行 キー
ステップイン F5
ステップオーバー F6
ステップアウト F7
定義 F3
参照元の検索 CTRL + ALT + H
基底/派生クラス CTRL + T
戻る/進む ALT + ← / →
タブ移動(左)/(右) CTRL + PGUP / PGDN
タブ上下分割/戻す CTRL + _ / _
インクリメント検索 CTRL + J
最終編集箇所へ戻る CTRL + Q
指定行へ移動 CTRL + L
実行 SHIFT + ALT + X , J
デバッグ実行 SHIFT + ALT + D , J

条件付きブレイク
ブレークポイント右クリック→[ブレークポイントプロパティ]→[条件付き]
デバッグ共通」参照

入力

入力候補表示

入力後
CTRL + SPACE
入力内容が正しい場合 → 続きの入力候補
入力内容が誤りの場合 → 正しい入力候補

メソッド変更

SHIFT + ALT + C
メソッドの参照元も変更される

修正

CTRL + 1

選択範囲のロジック単位での拡大/縮小

SHIFT + ALT + ↑
SHIFT + ALT + ↓
インスタンス
↑↓
インスタンス.メソッド名
↑↓
インスタンス.メソッド名(引数、引数)
↑↓
ブロック{ インスタンス.メソッド名(引数、引数) }
↑↓
Ifブロック{ インスタンス.メソッド名(引数、引数) }
↑↓
try { Ifブロック{ ~ } } catch(){ ~ }
↑↓
メソッド全体
と選択範囲が変更される
削除や移動の際に使用

コメント

種類 命令 キー 結果
選択行全体 コメントアウト Ctrl + Shift + / /* AAA */
コメント解除 Ctrl + Shift + \ AAA
行毎 コメントアウト Ctrl + / //AAA
コメント解除 Ctrl + \ AAA

展開

「*」

検索

文字列検索

単語を選択 → CTRL + H

次(前)を検索


CTRL + K

CTRL + SHIFT + K

参照元の検索

右クリック → 呼び出し階層を開く
参照元の検索」参照

リソース検索

リソースを開く(.java有り)
CTRL + SHIFT + R
リソースを開く(.java無し)
CTRL + SHIFT + T

タブ検索

タブリスト表示/選択
CTRL + e

アウトライン

アウトライン(クラス内メソッドの一覧)をエディタ上に表示
CTRL + o

構成

既存プロジェクトを開く

メニュー:[ファイル]→[インポート]→[一般]→[既存プロジェクトをワークスペースへ]

親子プロジェクトの構成


└子1
└子2
└子3
親をインポート
子をインポート(既存プロジェクトをワークスペースに)
不必要な子プロジェクトを閉じる
必要なプロジェクトは開く
コンパイル単位は親
親ディレクトリ毎コンパイルされる

他プロジェクトを参照

プロジェクト右クリック→[プロパティ]→[プロジェクト参照]→他プロジェクトにチェック

ライブラリを参照

ライブラリ(jarファイル)をlibに保存
→ビルドバスに追加
eclipse_ref1
参照パスに追加される
eclipse_ref2
プロジェクト右クリック→[ビルドパス]→[ビルドパスの構成]
※ビルドパス=classpath
eclipse_ref3
※ライブラリが追加されている

ソースコードリンク

Eclipseワークスペース外のソースファイルをコピーではなく参照する

Eclipse上のプロジェクト右クリック
→ プロパティ
→ Java、PHP等
→ ビルドパス
→ ソースのリンク
リンクされるフォルダーのロケーション:外部のソースフォルダパス(絶対パス)
フォルダー名:Eclipse上のプロジェクト内のフォルダ(プロジェクト名からの相対パス)

パッケージエクスプローラ

エディタとリンク
エディタで開いているファイルをパッケージエクスプローラで自動的に展開する
パッケージエクスプローラの右上の
[←→]ボタン
を押下

型の種類を表示
インターフェイス、列挙体等を表示
[ウィンドウ]→[設定]→[一般]→[外観]→[ラベル装飾]→[Javaタイプ・インジケーター]

設定

Tomcat

ウィンドウ → 設定 → Tomcat

eclipse_tomcat
Tomcatホーム = Tomcatのインストールディレクトリ

ワークスペースの切り替え

切替時
[ファイル]→[ワークスペースの切り替え]→[既存ワークススペース]
追加時
[ファイル]→[ワークスペースの切り替え]→[その他]
ワークスペース内の「.metadata」→「.plugins」を移動する事で、プラグインやエディタの設定を引き継ぐ事も可能

ワークスペースの表示・指定

・起動パラメータ設定
ショートカットアイコン → プロパティ → リンク先
"C:\~\eclipse.exe –showLocation"
"C:\~\eclipse.exe –data C:\~\workspace"
・コマンドプロンプトで開く
プロジェクト → コマンドプロンプトで開く

プラグイン

Glance

Ctrl + J
Enter:次へ
Shift + Enter:前へ

Exploler

ソースコードの解析ツール
パッケージエクスプローラで選択したファイルをExplolerで表示する

Checkstyle

ソースコードの解析ツール
言語仕様として問題は無いが慣例として一般的でない記述を表示
チーム開発を行う場合に記述を統一する為に使用される
プロジェクト右クリックメニュー→[Checkstyle]→[このプロジェクトでCheckstyleを有効にする]
例:
static public void main()~:×
public static void main()~:○
対象:コンパイル前のソースファイル(.Java)

FindBubs

Checkstyle同様、チーム開発を行う場合に記述を統一する為に使用される
プロジェクト右クリックメニュー→[FindBugs]→[FindBugsを自動的に実行する]
例:
(オブジェクト) == (オブジェクト):×
(オブジェクト).equals((オブジェクト)):○
対象:コンパイル語のクラスファイル(.class)

プロになるためのWeb技術入門

JavaでのWEBアプリを作成するに当たって読みました。
JSP,サーブレットといった技術はまさに理解したかった項目だったので良かったです。
過去、ネットワーク越しに文書を共有したいというニーズがあってHTTPが生まれた。

クライアントの操作によって対象を動作させたいというニーズがあってCGIが生まれた

CGIを高速に大量に動作させる為にServletが生まれた

Servletのモジュールをクライアント側とサーバ側で分離させる為にJSPが生まれた
という様に時系列に沿って各技術を説明してくれています。
結果、アプリケーションサーバ(Tomcat)、JSP、サーブレット
に多くのページを割いていますが、非Javaエンジニアに取っては分かり難くないでしょうか?
大丈夫でしょうか? PHPやRubyエンジニアに取ってもこれらは有用でしょうか?
.Net限定エンジニアに取っては難しいと思います。
ただここを理解すればIISの設定等も格段にやりやすくなるとは思いますが。
WEBの技術がPerl→Javaを経て現在に至る事の証左とも言えるでしょう。

他、以下について説明しています。
サーバ, クライアントモデル
HTTPプロトコル
IPアドレス
URL, URI
GET, POST
CGI
Cookie
Session
Web システム構成
WEB サーバ
DB サーバ
アプリケーションサーバ
Webアプリーション
フレームワーク
Web アーキテクチャ
MVC Pattern
layer Pattern

本サイトの参照記事
[JAVA]

JAVA EE サーバー ~ クライアント間のデータ連携

リクエストスコープ

※サーバー側(サーブレット)
public class MyServlet extends HttpServlet
{
 protected void doPost(
  HttpServletRequest req,
  HttpServletResponst res) throws ~{
  
  GET、POSTパラメータを取得
  String prm = req.getParameter("パラメータ名");
  転送先へ値を渡す
  req.setAttribute("変数名","値");
  フォワード
  this.getServletContext().getRequestDispatcher("転送先パス").forward(req, res);<br/>
 }
}

※クライアント側(転送先パス.jsp)
リクエストパラメータを取得
${param['変数名']}
サーバから渡された値を取得(フォワード時のみ)
${requestScope['変数名']}

JavaBeans

JavaBeans」参照

クッキー

クッキーとは?

・ プログラム(命令)によって生成されるテキストデータ
生成されると
・ クライアント側で保持される
・ ブラウザを閉じても残る
・ 自動的に(勝手に)サーバへ送信される
・ 暗号化されないので直接読まれる

クッキー(コード)

本例での流れ
cookie_flow

※cookie1.jsp
<%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
クッキー情報がある場合にその値を取得する
<%
 String email = "";
 
 全クッキー取得
 Cookie[] cookies = request.getCookies();
 
 if (cookies != null)
 {
  クッキー全件Loop
  for (Cookie cook : cookies)
  {
   クッキー名:emailの値を取得
   if (cook.getName().equals("email"))
   {
    email = cook.getValue();
    break;
   }
  }
 }
%>
<!DOCTYPE html>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>

 <form method="POST" action="cookie2.jsp">
  <input type="text" name="email" value="<%=email %>" />
  <input type="submit" value="送信" />
 </form>
</body>
</html>

※cookie2.jsp
<%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>

 <%
  クッキーオブジェクト生成
  cookie1.jspからのパラメータをクッキーオブジェクトに格納
  Cookie cook = new Cookie("email", request.getParameter("email"));
  cook.setMaxAge(60 * 60 * 24 * 10); 有効期限:10日
  
  クッキーを削除する場合
  cook.setMaxAge(0);

  
  クッキー発行
  response.addCookie(cook);
  クライアント側でクッキーを保存する様に命令
 %>
</body>
</html>

クッキー(HTTPヘッダー)

※cookie1.jsp
(1)テキストボックスのデータをPOSTする前
cookie1
クッキーはまだ無い
セッションIDについては別項参照

※cookie2.jsp
(2)パラメータをクッキーに格納
cooki2
・クッキーはまだ無い
・(1)のPOSTデータを受け取っている
・クライアントへクッキーをセットする様に命令

※cookie1.jsp
(3)再度cookie1.jspにアクセス
cookie3
クッキーをサーバーへ通知
クッキーが作成されている

セッション

セッションとは?

サーバー側で管理される接続情報
接続毎にセッションIDが発行され、クライアントに通知される。
ブラウザを閉じた後のアクセスは別ユーザと見なされる。

セッション(コード)

※session1.jsp
<%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
<%
 セッション情報を取得
 String email = (String) session.getAttribute("email");
%>
<!DOCTYPE html>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>

 <form method="POST" action="session2.jsp">
  セッション情報がある場合にテキストボックスに表示
  <input type="text" name="email" value="<%=(email == null) ? "" : email %>" />
  <input type="submit" value="送信" />
 </form>
</body>
</html>

※session2.jsp
<%@ page pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>

 <%
  パラメータをセッション情報に格納
  session.setAttribute("email", request.getParameter("email"));
  
  セッション情報保持期限
  session.setMaxInactiveInterval(60);
  単位:秒
  デフォルト:1800(30分)

  アプリケーション全体で設定する場合はデプロイメントディスクリプタ参照
  
  セッション情報を削除する場合
  session.removeAttribute("email");
  
  セッション情報を全て削除する場合
  session.invalidate();

 %>
</body>
</html>

セッション(HTTPヘッダー)

※session1.jsp
(1)初回表示時
session1
セッション情報がサーバー側で作成され、IDをクライアントに通知している
セッションIDがクッキーに保存される。

※session1.jsp
(2)テキストボックスのデータをsession2.jspへポスト
session2

※session2.jsp
(3)パラメータをセッション情報に格納
session3
・(1)で受け取ったセッションIDをサーバーへ通知している
・(2)のPOSTデータを受け取っている

※session1.jsp
(4)再度session1.jspを表示
session4
セッション情報があるのでテキストボックスにセッション情報が表示される。

スコープ

変数が保持される期間・範囲

page

現在のページ(ファイル)内でのみ有効。
ほかのページと共有の必要がない単発的な処理を行う場合に使用。
全スコープ中で最も有効範囲の狭い設定(デフォルト)

request

一連のリクエスト処理の範囲で有効。
現在のページ、およびフォワード(またはインクルード)された先のページでのみ、値を共有することができる

session

ユーザーセッションの範囲で有効。
複数の独立したファイル(クラス)間で情報を共有したい場合に使用する
(例:ECサイトにおける買い物カゴなど)。
異なるユーザーとの間では情報は共有されない

application

現在のアプリケーション内のすべてのファイル(クラス)間、アプリケーションにアクセスしている全ユーザー間で有効。
全スコープ中で最も有効範囲の広い設定

JAVA EE HTTPクライアント

HttpURLConnectionクラス

GET

import java.net.URL;
import java.net.HttpURLConnection;
public class myjava
{
 public static void main (String[] args)
 {

 URL url = new URL("http://office-yone.com/" + args[0]);
 HttpURLConnection cn = (HttpURLConnection) url.openConnection();
 cn.setRequestMethod("GET");
  
 if (cn.getResponseCode() == HttpURLConnection.HTTP_OK)
 {
  try (InputStreamReader input = new InputStreamReader(cn.getInputStream(), StandardCharsets.UTF_8);
  BufferedReader reader = new BufferedReader(input)) {
   String line;
   while ((line = reader.readLine()) != null) {
    System.out.println(line);
   }
  }

 }
 cn.disconnect();
 }
}

POST

import java.net.URL;
import java.net.HttpURLConnection;
public class myjava
{
 public static void main (String[] args)
 {

 
  URL url = new URL("http://office-yone.com/");
  HttpURLConnection cn = (HttpURLConnection) url.openConnection();
  cn.setDoOutput(true);
  cn.setRequestMethod("POST");
  
  BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(cn.getOutputStream(),StandardCharsets.UTF_8))
  writer.write(args[0]);
  writer.flush();
  
  if (cn.getResponseCode() == HttpURLConnection.HTTP_OK) {
   try (InputStreamReader input = new InputStreamReader(cn.getInputStream(),StandardCharsets.UTF_8);
   BufferedReader reader = new BufferedReader(input)) {
    String line;
    while ((line = reader.readLine()) != null) {
     System.out.println(line);
    }
   }

  }
  cn.disconnect();
 }
}

CloseableHttpClientクラス

GET

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
public class myjava
{
 public static void main (String[] args)
 {

  try (CloseableHttpClient client = HttpClients.createDefault()) {
  try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
  
   HttpGet method = new HttpGet("http://office-yone.com/" + args[0]);
   
   try (CloseableHttpResponse res = client.execute(method)) {
    if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
     HttpEntity entity = res.getEntity();
     System.out.println(EntityUtils.toString(entity,StandardCharsets.UTF_8));

    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}

POST

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
public class myjava
{
 public static void main (String[] args)
 {

  try (CloseableHttpClient client = HttpClients.createDefault()) {
  try (CloseableHttpClient client = HttpClientBuilder.create().build()) {
  
   HttpPost method = new HttpPost("http://office-yone.com/");
   StringBuilder builder = new StringBuilder();
   builder.append(args[0]);
   
   method.setEntity(new StringEntity(builder.toString(),StandardCharsets.UTF_8));
   
   try (CloseableHttpResponse res = client.execute(postMethod)) {
    if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
     HttpEntity entity = res.getEntity();
     System.out.println(EntityUtils.toString(entity,StandardCharsets.UTF_8));

    }
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
}