Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

MVCモデル間でのデータ受け渡し

いつも拝見しています。
初めての質問ですので、説明不足等ありましたらご指摘お願いします。

現在Webシステムの勉強の為、掲示板を作成しています。
まず、Struts等のフレームワークを使わず、Servletのみで作成しました。
これは問題なく作成出来たのですが、今度はJSP、Servlet、Beanで、MVCモデルを意識して同じ物を作成しようとした所、疑問があります。

以下、JSP→コントローラ(Servlet)→Bean以降の流れ

1.BeanでDBからデータを取得し、プロパティ(メンバ変数)にset
2.コントローラ(Servlet)でRequestにBeanオブジェクトをsetAttribute
3.JSPをforwardで呼び出す
4.forward先のJSPでjsp:useBeanし、jsp:getPropertyで表示

自分がインターネットで調べた範囲では、ほぼこの流れで書いてありました。
DBから取得するデータが1件の場合には、上記手順で問題なく実装できました。
しかし、複数件取得される場合、Bean内でDBの値を配列にsetし、getPropertyでプロパティを取得すると、配列の文字列が返されてしまいました。
JSPから生成されるjavaを見るとorg.apache.jasper.runtime.JspRuntimeLibrary.toString()というメソッドが呼ばれているようなので、配列やコレクションは受け渡し出来ないのかなと想像しました。(もし出来るのであれば方法を知りたいです)
取りあえず実現する方法として、JSPから直接Beanを使って、スクリプトレット内でgetメソッドを呼び、配列の取得は出来たのですが、これだとコントローラを経由していないのでMVCとは言えないのではないかなと・・・。
(スクリプトレットはあまり使わない方が良い様な話も見かけますし)

Webシステム構築の実務を経験したことが無いので、実際皆さんが現場でこういう場合どうされるのかな?と疑問が沸きました。
普通、こうするよ。という様な方法がありましたら教えて頂きたいです。
※Beanのメンバ変数に配列なんて持たせる事自体おかしいと言うのでも結構です。でもその場合どうしたら良いのか・・・。

知っている方からすると、低レベルな質問だとは思いますがよろしくお願いします。

5

回答

82204

閲覧

5件の回答

評価

0

>配列の文字列が返されてしまいました。
それはServletやJSPがどうという話ではなく、Objectをそのまま使おうとしているだけだと思います。
キャストしてきちんと配列としての扱いをしてあげれば良いのでは。

評価

0

mioさん 返答ありがとうございます。

申し訳ありません、私の文章ですとgetPropertyするのがBean内のように受け取れますね。
>しかし、複数件取得される場合、Bean内でDBの値を配列にsetし、getPropertyでプロパティを取得すると、配列の文字列が返されてしまいました。
正確には、
しかし、複数件取得される場合、Bean内でDBの値を配列にsetし、【forward先のJSPでjsp:getProperty】でプロパティを取得すると、配列の文字列が返されてしまいました。
でした。
もし、認識が同じでキャストするというアドバイスを頂いていたら申し訳ありません。
その場合、JSP内にて<jsp:getProperty>タグで取得した値をキャストするという事でしょうか?
説明下手なので具体的には
【Bean】
public class TestBean {
    private String[] test; ←ここにDBから取得した値をセット
    public String[] getTest() {
        return test;
    }
    public void setTest(String[] test) {
        this.test = test;
    }
【Servlet】
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        TestBean testBean = new TestBean();
        testBean.getTestData(); //DBのデータを取得してtestBean.testにセットする処理
        request.setAttribute("testBean", testBean);
        RequestDispatcher requestDispatcher = request
                .getRequestDispatcher("/result.jsp");
        requestDispatcher.forward(request,response);
    }
【forward先JSP】
<jsp:useBean id="testBean" class="test.TestBean" scope="session" />
<jsp:getProperty name="testBean" property="test"/> ←これが文字列として表示される

となっています。

評価

0

<jsp:getProperty/>は、プロパティを文字列に変換してoutへ出力するためのものなので、配列には使えませんね。
別途<% %>内で取得して地道に書き出すしかないのでは。

評価

0

なるほど。やはりいい方法は無いのですね。
とすると最初に書いた
>取りあえず実現する方法〜
で良かったという事ですね。
あまりMVCだからとこだわらず、こういう場合は<% %>内で取得し、ぐるぐる回す事にします。
mioさん レスありがとうございました。

評価

0

Bean自体はコントローラでセットするんだから、気にしないでいいと思いますが。
ロジックなしに、厳密にビューだけの役割にできるのなら、JSPにはタグだけ書ければいいことになります。

現実には、得てしてJSPにビジネスロジックまで入っているものです。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。