質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1443閲覧

javaサーブレット doget メソッドについて

kokok

総合スコア145

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2019/05/09 05:34

編集2019/05/09 06:00

java

1 2 3 4 5 6package sample1; 7 8import java.io.IOException; 9import java.io.PrintWriter; 10import java.sql.Connection; 11import java.sql.DriverManager; 12import java.sql.ResultSet; 13import java.sql.SQLException; 14import java.sql.Statement; 15 16import javax.servlet.ServletException; 17import javax.servlet.annotation.WebServlet; 18import javax.servlet.http.HttpServlet; 19import javax.servlet.http.HttpServletRequest; 20import javax.servlet.http.HttpServletResponse; 21 22/** 23 * 24 * @author mori 25 * 26 */ 27@WebServlet("/Hello") 28public class Hello extends HttpServlet { 29 private static final long serialVersionUID = 1L; 30 31 32 /** 33 * doGetメソッド 34 * SELECT文を発行・画面に表示する 35 * @param request 36 * @param response 37 * @throw ServletException 処理中に問題が起こったときに、Servlet がスローする可能性のある一般的な例外を定義しています。 38 * @throw IOException 入出力処理の失敗、または割り込みの発生によって生成される例外 39 * 40 */ 41 protected void doGet(HttpServletRequest request, HttpServletResponse response) 42 throws ServletException, IOException { 43 response.setContentType("text/html; charset=utf-8"); 44 PrintWriter out = response.getWriter(); 45 46 out.println("<html>"); 47 48 out.println("<body>"); 49 50 Connection conn = null; 51 String url = "jdbc:mysql://localhost/training"; 52 String user = "root"; 53 String password = "ryota"; 54 55 try { 56 Class.forName("com.mysql.jdbc.Driver"); 57 conn = DriverManager.getConnection(url, user, password); 58 59 Statement stmt = conn.createStatement(); 60 String sql = "SELECT * FROM user"; 61 ResultSet rs = stmt.executeQuery(sql); 62 63 out.println("<table = border=1>"); 64 out.println("<tr>"); 65 out.println("<th>"); 66 out.println("</th>"); 67 out.println("<th>"); 68 out.println("name"); 69 out.println("</th>"); 70 out.println("<th>"); 71 out.println("age"); 72 out.println("</th>"); 73 74 while (rs.next()) { 75 int id = rs.getInt("id"); 76 String name = rs.getString("name"); 77 int age = rs.getInt("age"); 78 79 out.println("<tr>" + "<td>" + id + "</td>" + "<td>" + name + "</td>" + "<td>" + age + "</td>" + "<tr>"); 80 out.println("<br>"); 81 82 } 83 out.println("</table>"); 84 rs.close(); 85 stmt.close(); 86 } catch (ClassNotFoundException e) { 87 out.println("lassNotFoundException:" + e.getMessage()); 88 } catch (SQLException e) { 89 out.println("SQLException:" + e.getMessage()); 90 } catch (Exception e) { 91 out.println("Exception:" + e.getMessage()); 92 } finally { 93 94 try { 95 if (conn != null) { 96 conn.close(); 97 } 98 } catch (SQLException e) { 99 out.println("SQLException:" + e.getMessage()); 100 } 101 102 } 103 104 out.println("</body>"); 105 out.println("</html>"); 106 } 107 108 /** 109 * doPostメソッド 110 * 111 */ 112 113 protected void doPost(HttpServletRequest request, HttpServletResponse response) 114 throws ServletException, IOException { 115 doGet(request, response); 116 } 117 118 119コード

doGet メソッドのrequestとresponse の引数は何を受けっと手いるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/05/09 05:41 編集

コードがマークダウンのコードブロックに含まれていないので、正しく反映されているかは質問編集画面右側のプレビューを確認して調整してから投稿してください。 なお、調べればわかることもあるのですが、何か調べたり試したりしたのでしょうか?
m.ts10806

2019/05/09 05:42 編集

これだけだと、HttpServletRequestオブジェクトとHttpServletResponse オブジェクトです という答えにしかなりません。それでよければ回答しますが。
m.ts10806

2019/05/09 05:51 編集

冒頭の'と末尾の'コード は不要です。コピペしたときにエラーが出ては手間が発生します。 また、コード以外の質問文が全て消えていますが、投稿前に確認しないのでしょうか?
kokok

2019/05/09 06:00

申し訳ないです
m.ts10806

2019/05/09 06:03

いえ、きちんと質問を書いてもらえればそれで良いですが、結局何も調べてなくて何も試していないということで良いですか?(丸投げです)
kokok

2019/05/09 06:07

ずっと調べていて何らかのオブジェクトが渡されることは分かりましたがその先がどうしても具体的にどのような物が渡されているのかが分かりませんでした。
m.ts10806

2019/05/09 06:10

その「調べた内容」を書かないとどの段階でのアドバイスをすべきなのか他人には伝わりません。 またデバッグをすればわかることなので、デバッグを覚えてください。
kokok

2019/05/09 06:15

どうしても分からなかったのでとりあえず次に進んでみます ありがとうございました。
m.ts10806

2019/05/09 06:18

そこ、概念でも理解しないとJavaに限らずこけますよ。
kokok

2019/05/09 06:29

そうですよね。 オブジェクトを受け取るのは分かったのですが HttpServletResponse response  responseとは送信に関してだと理解していたのですが、それを受け取るっていうのがよく理解ができないです。
m.ts10806

2019/05/09 06:31

自身のコードを見てresponseがまだ「受け取る処理」をしていると思うのでしたら本当に基本の基本からやり直したほうがいいです。(PHPでも「レスポンスヘッダ」とか出てくるのに) 回答はしているので熟読しておいてください。
kokok

2019/05/09 06:33

すいません、requestのほうでした。
m.ts10806

2019/05/09 06:42

キャッチボールでボールを投げるのがリクエスト、投げられたらキャッチするのでそれが「リクエストを受けとる」、受け取ったらボールを返せば「レスポンス」 まあ、この例えはよくないですけど (2回目)回答はしているので熟読しておいてください。
guest

回答2

0

ベストアンサー

オブジェクトを受け取るのは分かったのですが

HttpServletResponse response 

responseとは送信に関してだと理解していたのですが、それを受け取るっていうのがよく理解ができないです。

ここでいう”受け取る”っていうのは、doGetメソッドの引数にresponse受け取るという意味ではないですか?
requestももちろん受け取ってますが・・・

思考停止して、訂正するのも良くないと思いますし、きちんと説明されるクセを付けたほうが良いかと思います。
もし、私の勘違いでしたら、読み飛ばしていただいて結構です。


サーブレットを書いて私が一番最初に戸惑ったというか違和感があったのは、
いわゆる戻り値を作成してreturnするのでなく
引数としてresponseが来ることでした。

まぁ、詳しくはmts10806さんの回答先のリンクを読まれるのが良いと思いますが。

ざっくり要点だけいうと

レストランで例えるなら、注文票(request)と皿(response)を用意するので、厨房(プログラマ)に対して
皿に料理を載せてくれ。

という感じになっています。
皿に載せられた料理はサーブレットコンテナがお客へ届けるイメージです。


なんで、上記のような作りになっているかというと。

ゼロからHTTPリクエストを解析してレスポンスを生成してというのを書くのは非常に面倒なので
フレームワーク化されています。
※ここでいうフレームワークは、広義の意味で特定の何かのプロダクトをさすものではありません。

サーブレットはサーブレットコンテナ上で動くもので、ある程度の処理を共通化しています。
そのため実装箇所が部分的になり、実装の手間の削減や、実装箇所が減る=バグの混入がへるので
品質の担保を期待できますが、

その恩恵を受けるために、フレームワークのルールにのっとる必要があります。

HttpServletResponse を returnするには、その実態を返却するためのインスタンス化が必要ですが、
フレームワークはブラックボックス化されているので、どのようにオブジェクトを構築すれば
いいかプログラマには、わかりません。
内部構造を知らずにオブジェクトを生成すればヌルポの嵐になるかもしれませんし、
そもそも、そんな面倒な生成手順など覚えたくないわけです。

ここで用いられてる解決方法が制御の反転と呼ばれるものです。

responseオブジェクトをnewさせるのでなく、フレームワーク側でnewさせたオブジェクトに対して操作をさせるという考え方です。

という感じで、入力用と出力用の両方のオブジェクトを引数として渡すようになっています。

投稿2019/05/09 10:49

編集2019/05/10 01:04
momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokok

2019/05/10 06:11

回答ありがとうございます。 おかげでだいぶイメージが付きました。
guest

0

概念は下記のような記事を読んでおくこと。(検索すればすぐ出てきます)

ドキュメントで雰囲気はつかんでおくこと。

あとは解説記事とか入門記事も読むこと。


「リクエストとレスポンス」 これはサーバーサイドの言語を扱うには必須の概念です。「何がきているか」という具体的な中身を追うよりも「どういうものか」という概念を理解したほうが今後つまずくことは少ないのではないでしょうか。
質問履歴見ましたがPHPでの質問されてますよね。解決したっぽくないのに一気に解決済みにされたみたいですけど、PHPにももれなく「リクエストとレスポンス」の概念は存在します。

コーディングしていく上ではそこまでリクエスト・レスポンスの実体を意識することはあまりないです。
「フォームやURLなどのパラメータを送信されたものをその言語ではどう受け取るか」だけ考えますし、「どのような処理をしてリクエストが送られてきた先に何を返すか」だけを考えます。

「実際に何が入っているか」はそれこそデバッグの範疇で、Eclipseなどであればブレイクポイントでも貼って中身を確認すれば良い話です。

投稿2019/05/09 06:16

編集2019/05/09 06:18
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問