サーブレット(Java Servlet)2
[Webアプリケーション] サーブレット(Java Servlet)2
サーブレットを使った開発の準備が整いましたので、簡単なHTMLの出力を行います。
今回はHTMLで画像の読み込みやCSSファイルの読み込みを試します。
■WebContent配下にフォルダを作成
前回同様に新規の動的Webプロジェクトを作成し、画像とスタイルシートを格納するフォルダを作成します。
▼WebContentを選択し、右クリックで「新規>フォルダ」を作成
▼画像とスタイルシートの格納フォルダ
フォルダを作成できたら、以下のサンプルプログラムを用意して、画像とCSSファイルを格納しましょう。
「src」にサンプルプログラムを作成します。
@WebServlet("/Sample") public class Sample extends HttpServlet { private static final long serialVersionUID = 1L; public Sample() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 文字コードの設定 response.setContentType("text/html; charset=UTF-8"); // 出力ストリームの取得 PrintWriter out = response.getWriter(); // HTML文書の出力 out.println(" <html> "); out.println(" <head> "); out.println(" <title>サンプル</title> "); out.println(" <link rel=\"stylesheet\" href=\"css/main.css\"> "); out.println(" </head> "); out.println(" <body> "); out.println(" <div id=\"main\"> "); out.println(" <h1>画像とCSSを読み込むよ</h1> "); out.println(" <p>画像を表示します。</p> "); out.println(" <p><img src=\"pictures/sample.jpg\"></p> "); out.println(" </div> "); out.println(" </body> "); out.println(" </html> "); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
「css」フォルダにmain.css(スタイルシート)を格納します。
body{ background-color: #F0F8FF; } div#main{ background-color: #FFFFFF; margin: 0 auto; width: 1200px; height: 1200px; padding: 16px; } h1,p{ text-align: center; } h1{ font-size: 24px; } p{ font-size: 16px; }
「pictures」に表示したい好きな画像を格納します。名前はsample.jpgとしてください。
以上の準備ができましたら、実行しましょう。以下のような画面が表示されたら成功です。
表示されたURLを実際のchrome等のブラウザに入力して表示されることを確認してみてください。
さいたま市南区の武蔵浦和駅(中浦和駅)周辺でプログラミングを勉強したい・興味のある方に、
個別指導でJavaのプログラミングを教えています。生徒さまはIT・プログラミング未経験の社会人の方がほとんどです。
▼興味があれば、下記リンクをご確認ください。
サーブレット(Java Servlet)1
[Webアプリケーション] サーブレット(Java Servlet)1
今までの学習ではコンソール画面を利用するコンソールアプリケーションを作成してきましたが、今項目からWebアプリケーションの開発練習を始めます。
まずはWebアプリケーション開発するために、eclipseの設定を行います。
■Java EEのパースペクティブを追加
eclipseの画面右上にあるパースペクティブを開く(+のマークがあるアイコン)をクリックして、Java EE(Enterprise Edition)を選択して開きます。
▼画像左の+のアイコンをクリック
▼Java EEを開く
▼Java EEのアイコンが追加されているので、クリックして選択する。
■動的Webプロジェクトを作成
Java EEを選択したら、いつもの様にまず新規のプロジェクトを作成します。その際に「動的Webプロジェクト」を選択してください。
▼プロジェクトエクスプローラーで右クリックして「動的Webプロジェクト」をクリック
▼作成された動的Webプロジェクトの「src」配下にサーブレットを作成する
▼「src」上で右クリックし新規でサーブレットを作成する
▼作成したサーブレットに下記のサンプルプログラムを記述し、サーバーで実行しましょう。
@WebServlet("/Servlet1") public class Servlet1 extends HttpServlet { private static final long serialVersionUID = 1L; public Servlet1() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 文字コードの設定 response.setContentType("text/html; charset=UTF-8"); // 出力ストリームの取得 PrintWriter out = response.getWriter(); // HTML文書の出力 out.println(" <html> "); out.println(" <head> "); out.println(" <title>タイトル</title> "); out.println(" </head> "); out.println(" <body> "); out.println(" <h1>サンプル見出し</h1> "); out.println(" <p>サンプル文章</p> "); out.println(" </body> "); out.println(" </html> "); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
▼画像の様に実行されれば問題ないです。
さいたま市南区の武蔵浦和駅(中浦和駅)周辺でプログラミングを勉強したい・興味のある方に、
個別指導でJavaのプログラミングを教えています。生徒さまはIT・プログラミング未経験の社会人の方がほとんどです。
▼興味があれば、下記リンクをご確認ください。
データベース接続6
[Webアプリケーション] データベース接続6
SQL データベース操作の学習でトランザクションを勉強しましたが、
今までのプログラムではデータ登録の際にコミットしていないのに、自動で登録されていたのに疑問を感じていたかもしれません。
Javaでも勿論トランザクションを利用できます。トランザクションはConnectionクラスのsetAutoCommitメソッドで実装できます。
自動コミットを無効化するfalseを引数に設定することで、一連のデータベースの更新処理をトランザクションで管理できます。
トランザクションを利用する場合は、明示的にcommitメソッドを記述してデータベースに変更を反映させる必要があります。
また、データベースの変更をキャンセルする場合はrollbackメソッドを記述します。
// トランザクション setAutoCommit(false); // コミット commit(); // ロールバック rollback();
最後に下記のトランザクションを利用したサンプルを参考に、ユーザー情報の更新・退会ができるマイページをイメージしたプログラムを作成してください。
どのようなプログラムにするかは完全に自由です。イメージした機能をプログラミングで実装する練習をしましょう。
サンプルプログラム
public static void main(String[] args) throws SQLException { try { // JDBCドライバーのロード Class.forName("com.mysql.cj.jdbc.Driver"); }catch(ClassNotFoundException e) { e.printStackTrace(); } // URL、ユーザー名、パスワードに値を設定 String url = "jdbc:mysql://localhost/データベース名" + "?characterEncoding=UTF-8&serverTimezone=JST&useSSL=false"; String user = "ユーザー名"; String pw = "パスワード"; // コネクション Connection con = null; // プリペアードステートメント PreparedStatement st = null; try { // データベースへの接続 con = DriverManager.getConnection(url, user, pw); // トランザクションの開始 con.setAutoCommit(false); System.out.println("トランザクションの開始"); //------------------------------------------------- // ➀スケジュールテーブルの削除処理 //------------------------------------------------- String sql = "DELETE FROM sample1 WHERE user_id = ?"; st = con.prepareStatement(sql); // ユーザーIDを設定 st.setString(1, "xxxx"); // SQLを実行 int cnt = st.executeUpdate(); System.out.println("スケジュール:" + cnt + "件 削除"); // クローズ st.close(); //------------------------------------------------- // ➁ユーザーテーブルの削除処理 //------------------------------------------------- sql = "DELETE FROM sample2 WHERE user_id = ?"; st = con.prepareStatement(sql); // ユーザーIDを設定 st.setString(1, "xxxx"); // SQLの実行 cnt = st.executeUpdate(); System.out.println("ユーザー:" +cnt + "件 削除"); // クローズ st.close(); // コミット con.commit(); System.out.println("コミット"); }catch(SQLException e) { // ロールバック con.rollback(); System.out.println("ロールバック"); e.printStackTrace(); }finally{ // リソースの開放 if(con != null) { try { con.close(); }catch(SQLException e){ e.printStackTrace(); } } if(st != null) { try { st.close(); }catch(SQLException e){ e.printStackTrace(); } } }
さいたま市南区の武蔵浦和駅(中浦和駅)周辺でプログラミングを勉強したい・興味のある方に、
個別指導でJavaのプログラミングを教えています。生徒さまはIT・プログラミング未経験の社会人の方がほとんどです。
▼興味があれば、下記リンクをご確認ください。
データベース接続5
[Webアプリケーション] データベース接続5
今まで学習したことを応用して、実際にスケジュールアプリを作成しましょう。
スケジュールアプリのプログラムは、DTO・DAOパターンを採用し、下記4つのクラスで構成します。
イメージは前回学習した通りです。
まずは実行結果を見て、機能を確認しましょう。
実行結果
ログイン画面 メールアドレス:tanaka_taro@gamil.com パスワード:abc ログインしました。ようこそ 田中 太郎 さん。 ---------------------------------------------- ユーザー情報 ID:0001 氏名:田中 太郎 性別:男性 年齢:32 ---------------------------------------------- スケジュールを入力してください。 日付:20201012 予定:プログラミング学習 開始時間:1000 終了時間:1200 備考:データベース スケジュールを登録しました。 引き続き予定を入れる場合は「はい」と入力してください。 予定をいれる:いいえ ---------------------------------------------- 予定一覧 2020年07月23日:BBQ 11:00 ~ 17:00 多摩川 2020年07月23日:歯医者 14:00 ~ 15:00 2020年07月29日:花火大会 17:00 ~ 21:00 飲み物買い出し 2020年09月09日:MTG 11:30 ~ 13:00 会議室2 2020年10月12日:プログラミング学習 10:00 ~ 12:00 データベース 2020年10月12日:映画 17:00 ~ 20:00 渋谷 ----------------------------------------------
実装する機能は下記3つの処理です。
■ログイン
入力したメールアドレスとパスワードでデータベースを確認します。データが存在すればユーザー情報を表示する。存在しなければ、もう一度入力処理に戻る。
■スケジュール登録
入力したスケジュール情報をデータベースに登録します。スケジュールの登録は繰り返し何度でも登録できます。
■スケジュール表示
スケジュール登録を終了した場合、ログインユーザーが登録してある全てのスケジュールを表示します。
こちらの課題は自由にプログラミングしてください。その際のプログラムのポイントは、SQLです。
Javaの処理を簡潔にするために、SQLで処理できることは、SQLで処理しましょう。
さいたま市南区の武蔵浦和駅(中浦和駅)周辺でプログラミングを勉強したい・興味のある方に、
個別指導でJavaのプログラミングを教えています。生徒さまはIT・プログラミング未経験の社会人の方がほとんどです。
▼興味があれば、下記リンクをご確認ください。
データベース接続4
[Webアプリケーション] データベース接続4
Javaでデータベースの接続方法を学習したので、実際にスケジュールアプリのプログラミングを開始する準備をしましょう。
スケジュールアプリのプログラムは、DTO・DAOパターンを採用し、下記4つのクラスで構成します。
・Mainクラス ... ユーザー情報や、スケジュールの入力処理のみを行う。
・ビジネスロジック ... 実際の処理をまとめたクラス。メインクラスから呼び出されるプログラムを作成する。
・DAO(Data Access Object) ... データベースにアクセスする処理をまとめたクラス。
・DTO(Data Transfer Object) ... データベースから取得したデータを格納するためのクラス。格納したデータをビジネスロジックに渡すために使用する。
まずは、下記サンプルを参考に簡単なDTO・DAOパターンのプログラムを作成してみましょう。
・実行するJavaクラス
public static void main(String[] args) { String comma = ","; //DAOをインスタンス化 Common_DAO cd = new Common_DAO(); //DTOでユーザーテーブルのデータを取得 List<User_DTO> list = cd.getUserInfo(); System.out.println("ユーザーテーブルを表示"); if(list != null) { for(int i = 0; i < list.size(); i++) { System.out.print(list.get(i).getUserID()); System.out.print(comma); System.out.print(list.get(i).getUserName()); System.out.print(comma); System.out.print(list.get(i).getGender()); System.out.print(comma); System.out.println(list.get(i).getEmail()); } }else{ System.out.print("データの取得失敗"); } }
・User_DTO クラス(DTO)
データベースの値を格納するメンバ変数(フィールド)とゲッター、セッターを用意しただけのクラス。
public class User_DTO { //フィールド private String userID; private String userName; private String gender; private String email; //ゲッター、セッター public String getUserID() { return userID; } public void setUserID(String userID) { this.userID = userID; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
・Common_DAO クラス(DAO)
データベース接続3で、mainメソッドに書いたデータベースの接続処理をメソッド化して、まとめたクラス。
public class Common_DAO { // フィールド private Connection con; // コンストラクタ public Common_DAO () { getConnection(); } // メソッド //------------------------------------------------------------ // getConnection:データベース接続 // 引数 :なし // 戻り値:なし //------------------------------------------------------------ private void getConnection() { try { //JDBCドライバーのロード Class.forName("com.mysql.cj.jdbc.Driver"); }catch(ClassNotFoundException e) { e.printStackTrace(); } //URL、ユーザー名、パスワードに値を設定 String url = "jdbc:mysql://localhost/データベース" + "?characterEncoding=UTF-8&serverTimezone=JST&useSSL=false"; String user = "ユーザー"; String pw = "パスワード"; try { con = DriverManager.getConnection(url, user, pw); }catch(SQLException e){ e.printStackTrace(); } } //------------------------------------------------------------ // close :データベース接続をクローズ // 引数 :なし // 戻り値:なし //------------------------------------------------------------ private void close() throws SQLException{ if(con != null) { con.close(); } } //------------------------------------------------------------ // getUserInfo:ユーザーテーブルのデータを取得 // 引数 :なし // 戻り値:ユーザー情報 (List) //------------------------------------------------------------ public List<User_DTO > getUserInfo() { //return用のリスト(DTOをリストに格納していく) List list = new ArrayList<User_DTO >(); //プリペアードステートメント PreparedStatement st = null; //リザルトセット ResultSet rs =null; try { //SQL文の生成 StringBuilder buf = new StringBuilder(); buf.append(" SELECT "); buf.append(" COL1 "); buf.append(" ,COL2 "); buf.append(" ,COL3 "); buf.append(" ,COL4 "); buf.append(" FROM "); buf.append(" SAMPLE "); //preparedStatementオブジェクトの生成 st = con.prepareStatement(buf.toString()); rs = st.executeQuery(); while(rs.next()) { User_DTO dto = new User_DTO(); dto.setUserID(rs.getString("COL1")); dto.setUserName(rs.getString("COL2")); dto.setGender(rs.getString("COL3")); dto.setEmail(rs.getString("COL4")); list.add(dto); } }catch(SQLException e) { e.printStackTrace(); }finally { //リソースの開放 try { if(st != null) { st.close(); } if(rs != null) { rs.close(); } close(); }catch(SQLException e) { e.printStackTrace(); } } return list; } }
さいたま市南区の武蔵浦和駅(中浦和駅)周辺でプログラミングを勉強したい・興味のある方に、
個別指導でJavaのプログラミングを教えています。生徒さまはIT・プログラミング未経験の社会人の方がほとんどです。
▼興味があれば、下記リンクをご確認ください。
データベース接続3
[Webアプリケーション] データベース接続3
データベースの接続2で登録したデータを出力するプログラムを作成しましょう。
下記サンプルプログラムを参考に、SQLを作成しデータが取得できるプログラミングをしてください。
※ResultSet は finallyでクローズすることを忘れずに!
public static void main(String[] args) { try { //JDBCドライバのロード Class.forName("com.mysql.cj.jdbc.Driver"); }catch(ClassNotFoundException e) { e.printStackTrace(); } //URL、ユーザー名、パスワードに値を設定 String url = "jdbc:mysql://localhost/テーブル名" + "?characterEncoding=UTF-8&serverTimezone=JST&useSSL=false"; String user = "ユーザー名"; String pw = "パスワード"; //コネクション Connection con = null; //プリペアードステートメント PreparedStatement st = null; //リザルトセット ResultSet rs =null; try { //データベースへの接続 con = DriverManager.getConnection(url, user, pw); System.out.println("接続成功"); //SQL文の生成 StringBuilder buf = new StringBuilder(); buf.append(" SELECT "); buf.append(" COL1 "); buf.append(" ,COL2 "); buf.append(" ,COL3 "); buf.append(" FROM "); buf.append(" SAMPLE "); buf.append(" WHERE "); buf.append(" COL1 = ? "); //プリペアードステートメントの取得 st = con.prepareStatement(buf.toString()); //プレースホルダに値をセット st.setString(1, "a"); //SQLの実行 rs = st.executeQuery(); while(rs.next()) { System.out.print(rs.getString("COL1") + ","); System.out.print(rs.getString("COL2") + ","); System.out.println(rs.getString("COL3")); } }catch(SQLException e) { e.printStackTrace(); }finally{ //リソースの開放 if(con != null) { try { con.close(); }catch(SQLException e){ e.printStackTrace(); } } if(st != null) { try { st.close(); }catch(SQLException e){ e.printStackTrace(); } } if(rs != null) { try { rs.close(); }catch(SQLException e){ e.printStackTrace(); } } } }
さいたま市南区の武蔵浦和駅(中浦和駅)周辺でプログラミングを勉強したい・興味のある方に、
個別指導でJavaのプログラミングを教えています。生徒さまはIT・プログラミング未経験の社会人の方がほとんどです。
▼興味があれば、下記リンクをご確認ください。
インクリメント・デクリメント演算子1
問題1
public static void main(String[] args) int num = 0; int result = (4 / num++) / 2; System.out.println(result); }
実行結果がどうなるかを、実際にプログラムを実行する前に考えてみましょう。
実行結果は、自分の想定通りでしたか?間違えていた場合は、もう一度学習内容を復習しましょう。
さいたま市南区の武蔵浦和駅(中浦和駅)周辺でプログラミングを勉強したい・興味のある方に、
個別指導でJavaのプログラミングを教えています。生徒さまはIT・プログラミング未経験の社会人の方がほとんどです。
▼興味があれば、下記リンクをご確認ください。
java-musashiurawa.hatenablog.com