12月12日

2014年最後の授業!

作成したWebアプリの基本的機能が動作するようにしましょう!

発表に使うPowerPointの資料を準備しましょう。

最終日の発表・デモについて

Gitのpullでエラーが発生する場合の対処方法

  • プロジェクトを右クリックして[チーム]-[リセット]を選択し、リモート・トラッキングのorigin/masterなどを選択してリセットを実行する。
  • ローカルを削除してプロジェクトをcloneしなおす。

POSTメソッドで400エラーが発生する

単純に文字列でユーザーを検索しようとしていたところで発生。
検索結果でユーザー情報を取得したいという理由で、Controllerのメソッド引数に @Valid @ModelAttribute を指定していたが、JSP側でModelAttributeを構成するために必要な情報が不足していたために400エラーとなった。
Validation不要なので、該当引数を削除することで動作。

エンティティの追加でエラー

DAO経由でエンティティを追加しようとしたところで例外が発生。
@Id アノテーションをユーザー名のところにつけていたため。@Idを付けるメンバーを変更して解決。

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

12月11日

デバッグのヒント

画面レイアウトの調整

画面レイアウトにはあまり凝らないこと!
サイトがきちんと動作させることを優先して作業する。

基本的な画面表示がうまくいかない場合、ブラウザの開発者ツールを使うと原因を調査しやすい。
Internet Explorer の場合、画面右上の歯車アイコンをクリックし「F12 開発者ツール」を選択すると、開発者ツールの画面が表示される。
開発者ツールの左端のメニューから「DOM Explorer」を選択すると、DOMの構造と要素に対するスタイルやCSSがどのように割り当てられているかが確認できる。

dev-tool

Chromeの場合は、画面上で右クリックして[要素を検証]を選択すれば、デベロッパーツールの画面が開く。

12月5日

本日19時から福岡の天神にあるオラクル九州支社で、JavaOne 2014 報告会 at 福岡が開催されます!

行ける人は参加しましょう!

各ページへのリンク

12月4日

今後の予定

残りの授業は今週と来週だけなので、遅くても今週で全般的に動作するようにし、来週は細かい調整やデバッグのために時間を確保すること。

1月8日と1月9日の1現目は最終的な動作確認とPowerPointによる発表資料の作成にあてる。
1月9日の2現目は発表とデモを行う。

制限時間:20分
 発表: 10分
 デモ: 5分
 質疑: 5分

詳細は「最終日の発表・デモについて」を参照すること。

ログイン後に決まったページに遷移する方法

Spring Security のデフォルトでは、認証が必要なページAにアクセスしたときに未ログインであればログイン画面を表示し、ログイン後はページAに遷移する。
ログイン画面を表示した後、決まったページに遷移したい場合は、spring-security.xml の form-login タグの設定で always-use-default-target=”true” を指定する。

    <sec:form-login login-page="/login"
        default-target-url="/home"
        login-processing-url="/login"
        always-use-default-target="true"
        authentication-failure-url="/login?error=true" />

このように設定すると、ページAにアクセスしようとしてログイン画面を表示したときも、ログイン後は home に遷移する。

Webアプリケーション内でのファイルアクセス

Webアプリケーションがファイルにアクセスする場合は、Webアプリケーションが動作している物理パスを取得して、その配下のファイルにアクセスしなければならない。

Webアプリケーションが動作している物理パスはServletContextクラスのgetRealPath()メソッドで取得する。
ServletContext は、@Authwired で宣言すればよい。

HogeController.java

@Controller
public class HogeController {
    @Autowired
    private ServletContext context;

    // snip

    /**
     * 例えば画像ファイルを取得する場合
     *
     * @param name 画像ファイル名
     * @return 画像ファイルに対応する File のインスタンス
     */
    private File getImageFile(String name) {
        String dir = context.getRealPath("/images");
        File f = new File(dir, name);
        return f;
    }
}

11月28日

ログの出力

システムの動作状況をログに出力して確認する方法。

一般的に Apache commons の Logger を使うことが多い。

コンソールにログを出力するには、以下のようにコードを記述する。

HomeController.java

package jp.abc;

import java.security.Principal;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HomeController {
    private static final Log logger = LogFactory.getLog(HomeController.class);

    @RequestMapping(value = "/home", method = RequestMethod.GET)
    public String home(Model model, Principal p) {
        logger.info("home() called. model =" + model + ", Principal="+ p);
                :
    }

エンティティ数を調べる方法


テーブルに登録されているエンティティの数を調べるには DAO で以下のようにコードを記述する。

UserDaoImpl.java

	public long count() {
    	EntityManager manager = factory.createEntityManager();
		CriteriaBuilder builder = manager.getCriteriaBuilder();
		CriteriaQuery<Long> query = builder.createQuery(Long.class);
		query.select(builder.count(query.from(User.class)));
		return manager.createQuery(query).getSingleResult();
	}

ローカルで修正したファイルをGitリポジトリの状態に戻したい場合

ローカルでファイルを編集したけど、サーバー上にある状態に戻したい場合は以下の操作を行う。

戻したいファイルを右クリックし、コンテキストメニューで[置換]-[HEAD改訂]を選択する。

11月20日

Spring Securityでのログイン画面のカスタマイズ

Spring Security では、デフォルトでは Spring Security 標準のログイン画面が表示される。

login

これを、独自のログイン画面にカスタマイズする。

まず、独自のログイン画面を用意する。
src/main/webapp の直下に login.jsp を作成する。
formタグのactionは、Spring Security で標準のログイン処理に使われるURLを指定し、ユーザー名とパスワードも標準のログインで使用されるパラメータ名 j_username と j_password を使用する。

login.jsp

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<title>ログイン</title>
</head>

<body>

<h3>ユーザー名とパスワードを入力してください</h3>
<form name='f' action='/<%=request.getContextPath() %>/j_spring_security_check' method='POST'>
 <table>
    <tr><td>ユーザー名:</td><td><input type='text' name='j_username' value=''></td></tr>
    <tr><td>パスワード:</td><td><input type='password' name='j_password'/></td></tr>
    <tr><td colspan='2'><input name="submit" type="submit" value="Login"/></td></tr>
  </table>
</form>

</body>

</html>

spring-security.xml に24行目の設定を追加して、権限なしでこのファイルにアクセスできるようにする。

spring-security.xml

	<sec:http pattern="/" security="none"/>
	<sec:http pattern="/index.jsp" security="none"/>
	<sec:http pattern="/login.jsp" security="none"/>
	<sec:http pattern="/css/**" security="none"/>

ここで、login.jsp にアクセスできることを確認する。

login-1

次に、権限が必要なページにアクセスしたときは、ログイン画面に遷移するように spring-security.xml に設定を追加する。
追加したのは、28行目の1行のみ。

spring-security.xml

	<sec:http pattern="/" security="none"/>
	<sec:http pattern="/index.jsp" security="none"/>
	<sec:http pattern="/login.jsp" security="none"/>
	<sec:http pattern="/css/**" security="none"/>
	<sec:http auto-config="true">
		<intercept-url pattern="/**" access="ROLE_USER" />
		<sec:form-login login-page="/login.jsp" />
		<sec:logout
			logout-url="/logout"
			logout-success-url="/"
			invalidate-session="true"
			delete-cookies="JSESSIONID" />
	</sec:http>

これで、権限が必要なURLにアクセスしたとき、独自のログイン画面 login.jsp が表示されるようになる。
認証をパスできるユーザー名とパスワードを入力すれば、目的のページに遷移する。

ログインしたユーザー情報の取得

ログインしたユーザーを取得するには、コントローラの引数に Principal を追加する。
ここでは、追加した Princical から getName()メソッドでユーザー名を取得し、addAttribute() で name に値を設定している。

HomeController.java

	@RequestMapping(value = "/home", method = RequestMethod.GET)
	public String home(Model model, Principal p) {
		model.addAttribute("name", p.getName());
		model.addAttribute("title", "成績の検索");
		return "home";
	}

home.jsp では、EL式で名前を表示する。

home.jsp

<h1>${title}</h1>

<p>ようこそ ${name} さん。</p>
<p>受験番号を入力してください</p>

より詳細のユーザー情報が必要な場合は、DAO を使用して名前で検索してオブジェクトを取得する。

pom.xmlの追加(書き忘れ)

Spring Security を利用するために、pom.xml の最後に以下の設定を追加する。

		<!-- Security -->
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-core</artifactId>
			<version>3.2.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-web</artifactId>
			<version>3.2.4.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-config</artifactId>
			<version>3.2.4.RELEASE</version>
		</dependency>

11月7日

チーム開発について

作業の進め方

  1. 作業を進める課題を決める
  2. Backlogで課題を担当して処理中にする
  3. 作業のペアを決める(必要に応じて)
  4. コードを書く
  5. 動作確認する
  6. Gitにcommit/pushする
  7. Backlogの課題を「処理済」にする
  8. Gitからpull/fetchして最新コードを取得(他のメンバー)
  9. 動作確認する(他のメンバー)
  10. 他のメンバーが動作確認できたらBacklogの課題を「完了」にする

バッドノウハウ

  • HSQLDBプラグインの設定を変更したが、HSQLEB Serverを再起動してないためにDBに接続できない。
  • Gitにpushできていない。pushできているかどうかは、BacklogのGitタブのリポジトリを参照して確認する。

クラス名や変数名の命名について

Javaの命名規約
http://java.satoshis.com/index.php/java/tutorial/8-naming-convention.html

11月6日

重要な課題

  • 画面遷移(静的ページで可)
  • ログイン・ログアウト
  • パラメータからデータ受け取り
  • 受け取ったデータの表示
  • データの永続化
  • デザイン

Backlogの課題の粒度を小さくする

「各画面の○○」のような課題は、「A画面の○○」「B画面の○○」のように、画面別の課題にする。
DB連携はエンティティ別に分ける。
基本的な動きが完成したときは課題を完了させ、問題点はバグとして新しく課題を追加する。

Webアプリが期待通りに動作しないときの対処

コンテキストルート( http://localhost:8080/appname/ )にアクセスして404エラーになる場合は、設定に問題があるためにアプリケーションコンテキストが動作していない可能性が高い。
コンソールビューを参照して例外が発生していないか確認する。例外が発生している場合は、例外に表示されているメッセージをヒントにして問題を解決する。

コンテキストルートの設定が間違っていないかを確認する。プロジェクトのプロパティを開き、以下の内容をチェックする。

  • 「プロジェクト・ファセット」を選択して「動的Webモジュール」のバージョンを「2.5」に設定し、行の左端のチェックをONにする。
  • 「Webプロジェクトの設定」を選択して、「コンテキスト・ルート」の設定を確認する。

コンテキストルートにアクセスできて、期待通りに動作しない場合は、変更前のJSPやJavaによって動作している可能性があるので、古いファイルを削除するために以下の操作を試してみる。

  • [プロジェクト]-[クリーン]してプロジェクトをビルドしなおす
  • Tomcatを停止してクリーンする(サーバービューのTomcatを右クリックしてクリーン)
  • Tomcat配下のWebアプリを右クリックして「モジュール・ワーク・ディレクトリーをクリーン」を実行する
  • Tomcat配下のWebアプリを削除して追加しなおす
  • サーバービューでTomcatを削除して再登録する

10月31日

小さな粒度の課題を実施する

今日の2現目はテストなので、作業できるのは70分程度。その短い時間で達成できそうな課題を考えて、その課題を完了させることを目標にすること。

Gitの活用

ソースコードを変更しているときに、変更方法が不適切だと気づいたときは、そのソースコードのファイルを右クリックし、[チーム]-[リセット]を選択するとよい。修正を加える前の状態に戻せる。

Gitの問題?

プッシュして、BacklogのGit上では更新されているのに、プルしても最新のファイルを取得できない問題あり?