~あの有名サイトも基本は同じ仕組みで動いている~

研修成果

  • Webアプリケーション初学者を対象にMVCモデルを理解することが目的の研修です。静的Webと動的Webの違いといった基本的なところからJDBCを使ったWebアプリケーションの入り口までを学びます。実務で使うことの多い各種フレームワークがどのような基礎を元に作られているかが理解できるので今後の応用力の醸成が期待できます。

達成目標

  • Webアプリケーションとは何かを他者に説明できる
  • JSP、サーブレット、JavaBean、MySQLを使い簡単なMVCモデルの実装ができる
  • Webアプリケーションのセキュリティ上の脅威と対策を知っている

対象

IT企業の新入社員または第二新卒。自宅でもPCがあり、プログラミングの自習環境が構築できること。

前提知識

以下の6講座に参加していること。または、同等の知識があること。

カリキュラム例

オリエンテーション

・Webアプリケーションの勉強の仕方
・環境構築の方法

STEP
1

Webアプリケーションとは

(1) Webサーバとは
(2) HTTPプロトコル
(3) 動的Webコンテンツ
(4)MVCモデル

STEP
2

JSP

(1) JSPとは
(2) JSPの基本的なタグ
(3) ディレクティブ

STEP
3

サーブレット

(1) サーブレットの基本
(2) 文字化け対策
(3) ユーザー入力の受け取り

STEP
4

プログラム間のデータの受け渡し

(1) セッション
(2) フォワードとリダイレクト
(3) 各種スコープ

STEP
5

JavaBeans

(1) JavaBeansとは
(2) アクションタグ
(3) MVCモデルの確認

STEP
6

Webアプリケーションのセキュリティ

(1) クロスサイトスクリプティング対策
(2) ディレクトリトラバーサル対策
(3) SQLインジェクション対策

STEP
7

まとめ

◎理解度チェックテスト

STEP
8

注1)受講者の習熟度に合わせて内容や時間配分を一部変更する場合があります。
注2)上記カリキュラム中に表記がなくともディスカッションや演習、小テストを随時行い、可能な限り個々人にあわせた柔軟な進め方をします。

価格(ノンカスタマイズの場合)

講師料:1日あたり15万円(税別)

テキスト代:3,000円(税別) ✕ 研修参加人数

新入社員の皆さんのFAQ

※NetBeans IDE 8.2で検証しております。

Servletのファイルをコピーしたらサーブレットはもちろん、HTMLまで実行できなくなりました。出力ウインドウには「GlassFish Server 4.1.1, deploy, null, false (中略) モジュールはデプロイされませんでした。詳細は、サーバーのログ・ファイルを参照してください。」と表示されます。

ひょっとしたらサーブレットのファイルをコピーしませんでしたか?

恐らく、サーブレットファイルの「urlPatterns」が重複しています。

アプリケーションサーバからみて、同じ名前の2つのファイルがある状態になっていますので、urlPatternsの重複を解消してください。

Servletをフォームから呼ばずに単独で実行するとブラウザに「HTTP Status 405 - HTTPのGETメソッドは、このURLではサポートされていません。」と表示されました。

ServletにdoGetメソッドがないのが原因です。

Servletを単独で実行すると呼ばれるメソッドはdoGetメソッドです。

おそらくそのServletにはdoPostメソッドしかないのではないでしょうか?

グラスフィッシュのコンソールの情報量が多いのと文字が小さいので見にくいです。

グラスフィッシュのコンソールを右クリックして「クリア」するとまっさらな画面になります。

「大きいフォント」を選べば文字が大きくなります。

warファイルで提出するように言われましたがどうしたらよいか分かりません。

warファイルはJavaのwebアプリケーションで使用されるすべてのファイルをまとめたものです。中には、HTML、設定ファイル、Jar形式のファイル、画像音声ファイルなどが入ります。この形式であればコンテナに載せれば実行することができます。

warファイルの作り方は以下の通りです。

目的のプロジェクトを右クリック>消去してビルドを選択

コンソールにwarファイルの保存場所が以下のように表示されます。

Created dir: C:\Users[ユーザー名]\Documents\NetBeansProjects\WebApplication1\dist

該当のフォルダに移動してwarファイルを入手してください。

JSPを実行しようとすると「(ファイル名)には、ISO-8859-1文字セットへの変換中に正しく変換されない可能性がある文字が含まれています。この文字セットでファイルを保存しますか?」と表示され、「はい」を押して実行するとブラウザで文字が?に文字化けしています。

pageEncodingを以下のようにUTF-8に指定します。

<%@ page pageEncoding="UTF-8" %>
または、以下のようにcontentTypeのcharsetをUTF-8に指定します。

<%@ page contentType="text/html; charset=UTF-8" %>
あるいは、web.xmlファイルに以下を追記します。

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

「エラー: パッケージjavax.servlet.httpは存在しません」と表示され実行できません。

新規プロジェクトを作成するときに「JavaWeb」で作成しましたか?

例えば、「Java」で作成してしまうとサーブレット関連のクラスが無いため上記のようなエラーメッセージが表示されます。

JSPで「pageEncoding=”UTF-8″, contentType charset=”UTF-8″」のように2つも文字コードを指定するのはなぜですか?

pageEncodingは、アプリケーションサーバ側でJSPをServletに変換するときにどの文字コードを使うか(Encoding)という指定。

contentTypeは、クライアント側で画面表示する際に(HTML)コンテンツにどの文字コードを使うかという指定という違いがあります。

言葉の意味から理解すると分かりやすいですね。

なお、2つの文字コードは統一するようにしましょう。

MySQLに接続できません。グラスフィッシュのログには「重大: java.sql.SQLNonTransientConnectionException: Cannot open file…」というメッセージが出ています。

MySQL8.xを使っているからかと思います。

バージョンが上がるとセキュリティ強度が上がって接続文字列に加える文字列が増えます。

接続文字列の?の後に「characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B9&rewriteBatchedStatements=true」と加えてみてください。

接続できない:”jdbc:mysql://localhost:3306/sample?serverTimezone=JST”

接続できる:”jdbc:mysql://localhost:3306/sample?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B9&rewriteBatchedStatements=true”

サーブレットとJSPのファイルの指定方法が混乱します。

当社の研修では、

サーブレットを指定するにはurlPatternsを使います。

一般的にJSP(HTML)を指定するには相対パスで指定します。

サーブレットのurlPatternsはそのサーブレットがどのような名前で呼ばれるかを決めるものです。

urlPatterns = {“/NewServlet”}のように頭に”/”が入ります。

そして、urlPatternsは物理的なファイルの場所とは関係がありません。

どこからでも「NewServlet」という名前で呼び出すことができます。(拡張子ナシ)

これはセキュリティのためです。

ユーザーが実行されているサーブレットのアドレスを見ても、どこにそのファイルがあるのかが隠されています。

JSPからサーブレットを呼ぶ場合には、/は抜いて指定します。

一方、JSP(HTML)は物理的なファイルの場所をパスで指定します。

ファイル同士の相対的な位置関係で指定するか、/がWebページのルートフォルダなので、そこからのパスを指定すれば良いでしょう。

サーブレットを実行しようとしたところ次のエラーが出て実行できません。「モジュールはデプロイされませんでした。詳細は、サーバーのログ・ファイルを参照してください。ビルド失敗」

一つの可能性として、システムのプロキシの設定が邪魔をしている可能性があります。

メニューの「ツール」‐「オプション」‐「プロキシ設定」から以下の「オプション」のダイアログボックスで「接続のテスト」を試してください。

java サーバーサイドプログラミング

接続できないようでしたら念のためシステム管理者に確認のうえ、「プロキシなし」のラジオボタンにチェックを入れてみてください。

自宅環境でクッキーを使ったサンプルプログラムを実行しましたが、クッキーを取得できませんでした。

ブラウザの設定でクッキーを無効にしていませんか?

お使いのブラウザでクッキーを有効化する方法を調べて下さい。例えば、グーグルクロームの場合は以下のURLにあります。

Cookie を有効または無効にする

次のようなdoGetメソッドを実行したところ「java.lang.IllegalStateException: Cannot forward after response has been committed」という例外が発生しました。8行目のリダイレクトを実行する場合のみ発生します。

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
       int number = Integer.parseInt(request.getParameter("number"));
       
       if(number<0){
           response.sendRedirect("error.jsp");
       }
       
       double ans = Math.sqrt(number);
        HttpSession session = request.getSession();
        session.setAttribute("number", number);
        session.setAttribute("ans", ans);
        request.getRequestDispatcher("/WEB-INF/view/newjsp.jsp").forward(request, response);
    }

原因は、if文のなかでレスポンスをフォワードやリダイレクトしているにも関わらず、doGetメソッド(やdoPostメソッド)から抜けていないためです。

以下のように8行目の後に「打ち切りのreturn文」を加えて下さい。

      if(number<0){
           response.sendRedirect("error.jsp");
           return;
       }

NetBeansからMySQLを使うことはできますか?

できます。

以下のリンクを参照ください。

MySQLをNetBeansから使う

HTTP Status 405 - HTTPのPOSTメソッドは、このURLではサポートされていません。 というエラーがブラウザに表示されました。

サーブレットにdoPostメソッドが用意されていないからです。

JSPまたはHTMLのフォームで指定したメソッド属性がpost(method="post")であるにも関わらず、ServletにはdoPostメソッドが用意されていないのではないでしょうか?