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;
    }
}