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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

2594閲覧

JSPで数値を文字列に変換する方法

cjapan36

総合スコア14

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2019/05/28 02:06

編集2019/05/28 02:08

JSPで表内の数値を文字列に変換したいのですが、やり方がわかりません。
たとえば、現在以下のコードを作成中ですが、ジャンル名のところが本来DBの方に1~3と数値がありまして、DBから取得してきた数値に応じてselectのところにある文学、経済、技術の文字列を表示させたいのです。
どう入力すればいいかわからず、詰まっております。
ご教授いただければ幸いです。
よろしくお願いします。

JSP

1 ジャンル名:<select name="genre"> 2 <option value="1">文学</option> 3 <option value="2">経済</option> 4 <option value="3">技術</option> 5 <input type="submit" value="検索"><br/> 6 </select><br/> 7 <table border="1"> 8 <tr> 9 <th>書籍ID</th> 10 <th>書籍名</th> 11 <th>著者</th> 12 <th>発行日</th> 13 <th>在庫</th> 14 <th>ジャンル名</th> 15 </tr> 16 <c:forEach var="book" items="${bookList}"> 17 <tr> 18 <th>${book.bookId }</th> 19 <th>${book.bookName}</th> 20 <th>${book.author}</th> 21 <th>${book.publicationDate }</th> 22 <th>${book.stock}</th> 23 <th>${book.genreId}</th> 24 </tr> 25 </c:forEach> 26</table>

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

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

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

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

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

m.ts10806

2019/05/28 02:08

それは数値から文字列の変換ではなく、selectボックスの初期値設定の話では?
guest

回答1

0

ベストアンサー

1~3それぞれ対応する名称が決まっているなら
1なら〇〇、2なら〇〇・・・と条件分岐で表示する内容を対応すれば良いと思います。
JSTLならchoose-whenでしょうか。

ただ、「名称は変わることがある」ということから「ジャンルマスタ」をDBに持っておいてjoinして名称を取得するのが本来ベターなやり方と思います。

投稿2019/05/28 02:13

m.ts10806

総合スコア80850

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

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

cjapan36

2019/05/28 02:39

chooseは数値を文字に変換することが出来るのですか? 条件によってその指定した文などを表示させるものとの認識だったのですが(間違っていればすみません)、試しに入力してみましたが、変わりませんでした。コードの書き方を間違えたのでしょうか。 今回の例でいくと表のなかに本来は1~3の数字が出力されるのですが、その数値を文学、経済、技術に変換して表示させたいと考えています。 DBにジャンルマスタを持っておくというものが検索してもでなかったためわからないのですが、こちらのやり方の方がいいのでしょうか?
m.ts10806

2019/05/28 02:57

違います。 これは「変換」ではありません。 あくまで「条件分岐による出力データの切り分け」です。 文章にすると下記です。 ==== ジャンルIDが1の時 →文学と表示する 2のとき →経済と表示する 3のとき →技術と表示する ===== これをコードに起こすだけです。 >DBにジャンルマスタを持っておく 検索してもそのまま出るわけではありません。そのような仕様で作るのであくまで質問者さんが作ろうとしているプログラムによる決めごとです。 発想の問題ですが、teratailの「タグ」これはDBの質問データに文字列で登録されると思いますか? ブログの「日記カテゴリ」も同じです。 ユーザー名も同じですね。 文字列で表記される限りその名称が変更されることはあります。 だから変更されることが不可であるコードやIDだけを登録し、名称は別テーブルに登録しておき、画面表示のためにコードやIDで別テーブル(マスターテーブル)に問い合わせて名称を取得してくる仕組みを導入します。 ※なので本来はジャンル選択のセレクトボックスもDBにコードと名称を登録しておきそのデータに基づいて作るべき
cjapan36

2019/05/28 03:09

ありがとうございます。 <c:choose> <c:when test="${genreId == 1 }"> 文学 </c:when> <c:when test="${genreId == 2 }"> 経済 </c:when> <c:when test="${genreId == 3 }"> 技術 </c:when> </c:choose> このように <th>${book.genreId}</th>の下にコードを入力して実行したのですが、ジャンル名は変わらず数字のままでした。コード自体に記入ミスがあるのか、それともコードの挿入場所が違うのでしょうか? ・ジャンルマスタについて 別テーブルを作成しておくことで名称を取得できるということですね。 詳しくご解説いただきありがとうございます。 こちらの方法でも作成できるように試してみます。
m.ts10806

2019/05/28 03:29

>別テーブルを作成しておくことで名称を取得できるということですね。 「そのように作る」です。勝手にはなりません。 これをきちんと覚えるにはDBの正規化とかリレーションといったところをおさえる必要があります。 > <th>${book.genreId}</th>の下にコード 下に入れたらテーブルからはみ出るだけですよ(HTMLの文法的におかしい)。それにthの中がそのままなので変わるわけがないです。 それにそもそもgenreId 単体は存在してませんよね。あくまでbookオブジェクトに格納されているのでbook.genreIdです。 やるならたぶんこう。(未検証) <th> <c:choose> <c:when test="${book.genreId == 1 }"> 文学 </c:when> <c:when test="${book.genreId == 2 }"> 経済 </c:when> <c:when test="${book.genreId == 3 }"> 技術 </c:when> </c:choose> </th>
cjapan36

2019/05/28 04:01

なるほど、DBに関して改めて勉強しておきます。 たしかに、genreIdではありませんでした、すみません。 そのコードを入力したところ、表の中の数値を文字に置き換えることができました! 非常に助かりました。ありがとうございます。 先日に続き、迅速な回答いただきまして、ありがとうございます。 今後もこのようなことがあるかと思いますが、その際はよろしくお願いします。
m.ts10806

2019/05/28 04:06

解決されたようで何よりですが、ここは考え方を少し広げる必要があると思います。 通常「数値を文字列に変換」と書いてあると「型変換かな」という印象を誰もが受けます。( 1 → "1") でも実際は「数値に対応する文字列を出力」が実態なので、このあたりはしっかりおさえておく必要があると思います。 特に実現したいことはもう少し具体的な表現をされたほうが解決も早いかと思います。
cjapan36

2019/05/28 04:36

失礼しました。Javaの理解度そのものがあまり高くないというのと、 自分自身の文章力にも問題がありました。 今後はそういったところも気をつけられればと思います。
m.ts10806

2019/05/28 04:39

はい。「プログラムは書いた通りにしか動かない」ので、正しく文章化することは非常に大切です。 「設計」にあたる部分ですね。
cjapan36

2019/05/28 08:44

ちなみになのですが、DBの方にgenre_idとgenre_nameのテーブルを作成してそちらの方から取得するというやり方も試したのですが、うまくいきませんでしたので、ご助言いただけますでしょうか。 SQL文("SELECT * FROM book b INNER JOIN genre g ON b.genre_id = g.genre_id")をDAOに入力し、DAOのwhileの中に以下の三行を書き足しました。 Genre genre = new Genre(); genre.setGenreId(rs.getInt("genre_id")); genre.setGenreName(rs.getString("genre_name")); また、ジャンル名の呼び出しを<th>${genre.genreName}</th>と変更しましたが、表自体は出力されるのですが、ジャンル名の部分だけ空白になってしまいました。
m.ts10806

2019/05/28 08:46

SQL自体は悪くなさそうですけど、、 構文チェック:https://jp.piliapp.com/mysql-syntax-check/ bookがメインでjoinしているのでしたらデータ取得時にはbookに持たせるべきだと思います。
cjapan36

2019/05/28 09:16

素早い返事ありがとうございます。 ${book.genreName}としましたが、空白のままです。。 beansにもprivate Genre genreと追加したのですが、正しく出力してもらえません。
cjapan36

2019/05/28 10:09

失礼します。 自己解決いたしました。 book.setGenre(genre);を抜かしておりました。 ありがとうございます。
m.ts10806

2019/05/28 10:13

デバッグ実行して変数内部の情報を確かめる癖をつけると良いのではないでしょうか。
cjapan36

2019/05/29 01:34

デバッグの使い方自体があまり理解できていないので、デバッグについても学んでおこうと思います。 ありがとうございました。
m.ts10806

2019/05/29 01:35

初心者にはなるべくHello Worldの次にデバッグを覚えてもらいたいと常々思っています(あまりその段階で教える書籍などがないのは疑問です)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問