• ベストアンサー

MVCモデルでのサーブレットのやること

Javaを習い始めた者です。 MVCモデルでのサーブレットのやるべきことが、いまいちつかめないので質問させていただきます。 私が思っているサーブレットのすることは、 (1)送られてきたた情報をgetParameter()する。 (2)JavaBeanを生成したり、getAttribute()する。 (3)getParameter()したものをJavaBeanにsetする。 (4)JavaBean内のメソッドを実行する。 (5)JavaBeanをsetAttribute()する。 (6)別のJSPなどにfoward()する。 です。 (基本的に計算や比較などの処理は、サーブレット上では行わず、JavaBean内のメソッドで行う) この考え方は間違っていますか? あと例えば、ログイン認証のプログラムを作るとき、上の考え方だと、getParameter()したIdとPasswordをJavaBeanにsetして、JavaBean内のメソッドで、setしたIdを元にDBからPasswordをgetしてきます。そしてこのPasswordと、setしたPasswordを比較することになると思います。 でも、私的にはJavaBean内のメソッドで、引数にgetParameter()したIdを与えて、DBからgetしたPasswordを戻り値にします。そしてサーブレット上で、このPasswordとgetParameter()したPasswordを比較しようと思いました。 でもこれだと、サーブレット上でPasswordを比較するという処理を行っているのでMVCモデルに反しているのでしょうか? わかりにくい説明で申し訳ないのですが、教えてください。 お願いします。

  • A-boy
  • お礼率94% (131/138)
  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

貴方の考え方であっています。よって、Servlet内でパスワードを比較するのはMVC的にはNGです。 MVCで重要なのは、ModelはControllerを知らなくても動作するってことです。MVCに乗っ取ってパスワード比較を実装すると、Servletのない環境でもそのModelを利用してパスワード比較することができます。逆に言うと、それができないような設計になってる場合はMVCじゃないってことです。

A-boy
質問者

お礼

回答ありがとうございます。 サーブレットでのやることが、よくわかりました。

その他の回答 (1)

  • momozange
  • ベストアンサー率67% (21/31)
回答No.1

提示された状況のみで判断するとMVCモデルのシステムデザインからは反しています。 しかしながらここでMVCモデルの哲学を語ってもなかなか理解し難いでしょうし そもそもアプリケーション設計者の意図によりモデル層の区分けには 若干ならが差異が発生します。 しかしながら、今回の場合「パスワードを比較する」といった アクションはやはりビジネスロジックでありコントローラ層が担う内容ではありません。 その呼び出し自体はコントローラ層にあってもよいかもしれませんが。 強引な気もしますが、今回のような場合だと ・データを扱う→モデル層 ・呼び出すクラスを決定し実行する→コントローラ層 というくらいにざっくり考えてしまったほうがよいかもしれません。 どちらにも属さないようなものがでてきた場合に再度質問してみるか 自分なりに実装してみるとよいです。 デザインポリシーに反していると、大抵の場合融通がきかなかったり実装しにくかったりします。

A-boy
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • MVCモデルのJSPの使い方

    こんにちは。二回目の質問をさせていただきます。 今MVCモデルとJDBCで、社員データをDBにいれる簡単なプログラムを作ろうとしているのですが、初期の段階で躓きました。 サーブレットにてBeanをSessionに関連付けているのですが、いざJSPにてBeanを使おうとするとエラーが出るのです。 JSPのコードは冒頭部分にきちんと下記のものを記述し、 (Beanクラス名はFileBeanです。サーブレットできちんとSessionで関連付けています) <jsp:useBean id="bean" class="FileBean" scope="session" /> JSPの中で、Beanのメソッドを使うようにしているのですが下記のようなエラーが出てしまいます。 org.apache.jasper.JasperException: JSPのクラスをコンパイルできません注: sun.tools.javac.Main は推奨されません。 JSPファイル: /Nyuryoku.jsp の中の行: 3でエラーが発生しました 生成されたサーブレットのエラーです: C:\Apache Tomcat 4.0\work\localhost\SyainData\Nyuryoku$jsp.java:65: クラス org.apache.jsp.FileBean が見つかりません。 FileBean bean = null; ^ 因みに参考書のもので試してみたところ、JSPにおいてBeanを使おうとすると空のHTMLが吐き出され、ブラウザには真っ白な画面が表示されます。JSPのBeanの部分を削除すると、ブラウザには普通にHTMLの部分が表示されるのです。 以上二つのことから、JSPでのBeanの使い方がおかしい、というのはわかったのですが、自分でどう解決して良いのかわかりません。特に参考書のコードはちゃんと市販されているものなので、問題ないと思うのですが… 最後になりましたが、私の環境は Tomcat4.0 で OSはMEになります。 皆様お忙しいとは思いますが、ご教示の程宜しくお願い致します<(_ _)>

    • ベストアンサー
    • Java
  • AjaxとMVCについて

    こんばんは。Ajaxなんですが、テキストフィールドに入力して、送信ボタンを押したら、jspに飛ばして、データベースを呼び出して、 <div id="result"></div>のところに、飛ばしたjspの中の出力を反映させているのですが、飛ばしたjspで、データベースの接続、結果セットの取得、responseTextで返すテキストの出力など、全て行っているのですが、最近サーブレットやJavaBeansの勉強に入り、なるべくMVCを意識して、データベースの接続や結果セットを取得するあたりまでは、サーブレットやJavaBeansを使って行いたいのですが、そういった連携の仕方がどうも思いつきませんでした。以下が大まかなコードですが、 JavaScriptのコードです。 //表示 var httpObject; function selectRequest(){ if(window.XMLHttpRequest){ httpObject=new XMLHttpRequest(); } //途中省略します。 httpObject.onreadystatechange=display; //省略します。 httpObject.open("GET","kakunin.jsp?nen="+encnen,true); httpObject.send(null); } function display(){ if(httpObject.readyState==4 && httpObject.status==200){ document.getElementById("result").innerHTML=httpObject.responseText; //残り省略します } おおまかですが、kakunin.jspの内容は以下のようになっています。 String nen = request.getParameter("nen"); PreparedStatement ps = db.prepareStatement("select * from kintai where nen=?"); ps.setInt(1, Integer.parseInt(nen)); ResultSet rs = ps.executeQuery(); if (rs.next()){ ここでout.println("<table><tr>……</table>");みたいな感じでresponseTextを作っています。 } ジャバスクリプトのコードで、httpObject.open("GET","kakunin.jsp?nen="+encnen,true); の部分なんですが、ここのkakunin.jspをサーブレットにしたら、responseTextをサーブレットで作らなくてはならないような事になりそうな気がしてやめました。httpObject.openのところでkakunin.jspに要求しているので、responseTextもkakunin.jspの出力でないといけないとは思うのですが、その間どこかでサーブレットやJavaBeansを呼び出して、複雑な処理をそっちにまかせたいのですが、jspからサーブレットを呼び出す方法は、<form method="post" action="サーブレット名">ぐらいしか知らず、これは今回関係ないと思いました。 DWRとかいうのもあるみたいですが、最初はなるべく原始的なやり方で作りたいので、そっちはまだよく調べていません。 発想自体がおかしいかもしれませんが、Ajaxを使っている時、jspやサーブレットなどをうまく連携させて、きれいにまとめたコードを記述する方法などございましたらアドバイスの方よろしくお願いします。

    • ベストアンサー
    • Java
  • 配列をセッションに割り当てた後で

    javaBeanでDBにアクセスして、取得した値を配列に格納します。その配列をサーブレット側でgetメソッド使って取得し、セッションに割り当てます。その後、JSP側でセッションを通して配列の各要素を取り出し表示させたいのですが<%= session.getAttribute("Date") %>←(Dateが配列)では配列の各要素ではなく配列そのものが取り出されるのか、 [Ljava.lang.String;@737371 のような文字が表示されてしまいます。 セッションで割り当てられた配列の各要素の値の取得のやり方がわかる方どうかご教授お願いします。

    • ベストアンサー
    • Java
  • WEBアプリのMVCについて質問です。

    一般的なフレームワークを用いたMVCについて質問です。 例えばM、これはモデルですね。 普通DBヘの接続はモデルでおこないクエリの発行もモデルで行いますね。 その後、クエリ実行後の結果をコントローラー側に返すと思います。 このとき、普段わたしはモデル上ではDB空の目的のデータをいっさい処理せずそのまま コントローラに返します。 返り値として、何かしらの一覧データを取得するものとします。例えば [ {name : "タロウ" , age : "20","town_id" : 10,"city_id" : 49, "prefecture_id" : 23}, {name : "花子" , age : "20","town_id" : 10,"city_id" : 49, "prefecture_id" : 23}, {name : "邦夫" , age : "20","town_id" : 10,"city_id" : 49, "prefecture_id" : 23} ] といった感じで特定の組み合わせのハッシュを多次元配列(リスト)的にラップしたものがかえりますよね。 そして、上記データをコントーラー側が受け取り、さぁいざビューへと受け渡す際に、どの程度コントローラでデータの 加工を行うものかが気になっています。 たとえば上記データでは「県市町」のデータがユニークなIDとして保持しています。このままでは「タロウ」が どの住所なのかがわかりません。どこかで「県市町」のデータリストを受け取りループで一致する住所を取得する 必要があります。 それをコントローラあるいはビュー・・・・どちらで行うのがMVCとして正しいのでしょうか?多少のループなら ビュー側で行うのもありかとおもいますが、はやりビューがループであふれかえるのは作業しにくいですよね。 MVCの基本だとは思いますが、rubyやPHPなど、フレームワークごとの細かい思想はあるでしょうが 一般的なMVCとしてみるとどうでしょうか? ちなみに、モデル内でjoin などつかって県市町のテーブルをくっつけるのはここでは考えないものとしてください。 個人的にはビュー内では大きなループ一度ですませたいものですが ・・・。

  • 静的ページからのサーブレット起動について

    今、JSPとサーブレットの勉強を行っております。 サーブレット側でデータを取得して JSP側で表示を行いたいと思っているのですが フォームアクション等を行わずに、JSP⇒サーブレット⇒JSPと 実施する事は可能でしょうか? URLアクセス ⇒ JSPからサーブレットの処理を呼び出し ⇒ サーブレットから クラスを利用してデータを取得 ⇒ JSPへデータを渡して表示   というように、URLアクセスのみで一連の処理を行いたいです。 サーブレットからJSPにセッション経由でデータを渡して表示する事や JSPからクラスを利用する方法では成功していますが できるだけMVCモデルに準拠した方法で行いたく思っており かつ、コントローラとしてサーブレットを使ってみたくて このような事に挑戦しております。 可能かどうかだけでもわかると非常に有難いですので ご存知の方、どうかよろしくお願い致します。

    • ベストアンサー
    • Java
  • BeanにてのDB接続方法

    こんばんは、こちらの皆様には大変お世話になっております。 早速ですがまた質問です^_^; 今MVCモデルを使って社員データをDBにいれる簡単なプログラムを作っているのですが、DB接続がうまくいきません。というよりも私の考え方で合っているのかが定かではないのですが…。 BeanのほうでDB接続のメソッドを作って、それをサーブレットで使おうと思っているのですが、Beanクラスのコンパイルができないんです。(画面表示担当のJSPから直接DBへ接続するぶんにはなんの問題もありません) Beanにはいろんなメソッドを作るつもりで、DBへの指示のSQL文も一つ一つメソッド(データを追加したり、削除したり)を作るつもりでいます。 問題はメソッドの中でDB接続の処理をしてしまうと、別のメソッドでStatementオブジェクトが使えなくなってしまうことです。 DB接続のメソッドは戻り値も引数もなく、DBへ指示を出すメソッドはその時々に合ったものにしようと考えています。この引数をうまく使うのかなぁ、と思いつつも良い案が浮かびません。それとも根本的に考え方が間違っているのでしょうか? 皆様お忙しいとは思いますがご教示のほど、宜しくお願いいたします<(_ _)>

    • ベストアンサー
    • Java
  • JSPとサーブレットの連携

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub request.setCharacterEncoding("windows-31j"); response.setContentType("text/html;charset=windows-31j"); PrintWriter out=response.getWriter(); request.setCharacterEncoding("windows-31j"); String st = request.getParameter("ti"); String s2 = request.getParameter("ho"); String s3 = request.getParameter("ke"); Connection con = null; ResultSet rs = null; Statement stmt = null; try { String url = "jdbc:mysql:///o?user=&password=2&useUnicode=true&characterEncoding=windows-31J"; con = (Connection) DriverManager.getConnection(url); stmt = (Statement) con.createStatement(); String sql = "INSERT INTO o_tb(tiiki,houmon,keiyaku) VALUES('" + request.getParameter("ti")+ "','" + request.getParameter("ho")+ "','" + request.getParameter("ke")+ "') "; int rss=0; rss = stmt.executeUpdate(sql); }catch (SQLException e){ out.println("SQLException:" + e.getMessage()); } JSPから上記のサーブレットに値を渡し、DB格納までは上手くいきました。 ですが当然上記だと真っ白なサーブレットページが表示されるだけです。 JSPのボタンを押し→サーブレットでDB格納したら、またJSPページを表示させたいんですが、どうしたらいいですか??

    • ベストアンサー
    • Java
  • Java Struts MVCモデル 正しい書き方

    Java Struts1.3.10 皆でとあるシステムを作ることになったのですが、 JSP・ActionForm・Actionそれぞれの関係の在り方について悩んでいます。 ログイン機能を例とします。 1機能、1Form、1Actionとした場合は: 1.Login.jspでIDとPASSを入力。 2.LoginResultForm.javaにIDとPASSを格納。 3.LoginResultAction.javaでDBチェック(IDとPASSの存在・権限) 4.Result.jspへ遷移。ID・PASS・権限を表示する 使用するファイルは4つとなります。 1JSP、1Form1、Actionとした場合は: 1.Login.jspでIDとPASSを入力。 2.LoginForm.javaにIDとPASSを格納。 3.LoginAction.javaでDBチェック(IDとPASSの存在) 4.ResultForm.javaにIDとPASSを渡す(Sessionなど) 5.ResultAction.javaでDBから権限を取得、ResultFormに格納 6.Result.jspへ遷移。ID・PASS・権限を表示する 使用するファイルは6つとなります。 現在意見が三つありまして、 1.違うForm同士にデータのやり取りが発生するようであれば(1機能とし)、同じフォームにするべきではないのか? 2.Fromのメンバの数が少ないうちは良いが、今後数が増えると可読性が悪くなるから分けるべきではないのか? 3.フォームは同じでないとまずいが、ActionはJSPごとに分けるべき というものです。 1.ではログイン者情報をセッションに保持することは許可しています。(一部例外を認めている) これらはいずれもStrutsフレームワークの範疇から逸脱している、あるいはMVCモデルに反している、そもそも非効率的ということはないのでしょうか? つまりあくまで実装の仕方の問題でしかない、という結論でよろしいでしょうか?

    • ベストアンサー
    • Java
  • 動的に作成したラジオボタンの選択肢をサーブレットに渡す

    こんにちは。再度失礼します。 JSPで一覧表示された表からラジオボタンでひとつ選択し、サーブレット・Beanにその値を渡し、更新ページで更新処理、または削除処理を行わせたいと考えています。 更新用・削除用のサーブレットは別々です。 一覧表にはラジオボタンをDBに登録された名前が、DBにあるだけ(select * from テーブル)表示されることになっています。 下のソースはわかりやすいように3個だけもってくることにしてます。 【JSP】----------------------------------------------- <% for (int i = 0; i < 3; i++){ %> <tr><td> <input type"radio" name="choice" value="i"> </td><td> <%= [DBから取得した名前](i) %></td> <%= i %> <% } %> 【servlet】 String str = request.getParameter("choice") -------------------------------------------------------- ここで実行するとサーブレットに渡されたchoiceの値はvalueの変数 i になってしまいます。valueの値がサーブレットに渡されるのはわかっているのですが、i ではなく、[DBから取得した名前]をサーブレットに渡したいのですがどうしたらよいのでしょうか。 良い方法をご存知の方、ご教授よろしくお願いいたします。

    • ベストアンサー
    • Java
  • サーブレット GETからPOST送信

    はじめまして。 JAVA初心者です。 現在、サーブレットにおいてGETメソッドで受け取ったリクエストを、POST送信で他のサーブレットにパラメータを渡してフォワードする、アプリケーションを考えています。 このような処理を行なった経験のある方、お手数ですが、方法又は参考サイトなど、ご教授いただけませんでしょうか。 ちなみに、パラメータをhiddenで持たすJSPを間に入れる方法では、上手くいくようですが、JSPなしで直接送ることはできないでしょうか。

専門家に質問してみよう