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

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

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

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

4回答

3213閲覧

Listの使い方がいまいちわかっていません。

usako

総合スコア31

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2019/07/01 06:54

編集2019/07/02 01:38

前提・実現したいこと

閲覧いただき、ありがとうございます。
Eclipse,Spring,jdbcを使ってJAVAの勉強をしている初心者です。
マスタのコード、名称をjsp側に渡したいのですが、うまくいきません。
どなたかご教示いただけないでしょうか。
jsp側ではセレクトボックス形式でマスタの名称を表示しようとしています。

発生している問題・エラーメッセージ

①list.next()でコンパイルエラーが発生しているのですが、どう修正すべきかわかりません。
エラーメッセージ:メソッドnext()はList<Map<String, Object>>で未定義です。
イメージ説明

②List(list)からList(DeparmentList)に項目を転送していますが、もっとスマートなやり方があるのではないか。(どちらのリストもcd,nameのみなので)

該当のソースコード

java

1(Controller.java)★修正前 2 List<Map<String, Object>> list = departmentInfoGet.getDepartmentList(); 3 List<Departrment> departmentList = new ArrayList<>(); 4 5 while (list.next()){ 6 Departrment department = new Departrment(); 7 department.setCd(((Departrment) list).getCd()); 8 department.setName(((Departrment)list).getName()); 9 departmentList.add(department); 10 } 11 12 13 model.addAttribute("departmentList", departmentList); 14

java

1(Controller.java)★修正後 2 List<Map<String, Object>> departmentList = departmentInfoGet.getDepartmentList();

java

1(DepartmentInfoGet.java)★変更なし 2package jp.practice.address; 3 4import java.util.List; 5import java.util.Map; 6 7import org.springframework.jdbc.core.JdbcTemplate; 8import org.springframework.stereotype.Component; 9@Component 10public class DepartmentInfoGet { 11 private JdbcTemplate jdbcTemplate; 12 public DepartmentInfoGet(JdbcTemplate jdbcTemplate) { 13 this.jdbcTemplate = jdbcTemplate; 14 } 15 16 public List<Map<String, Object>> getDepartmentList() { 17 List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from unit02.department order by cd"); 18 return list; 19 }

jsp

1(update.jsp)★修正前 2 <div> 3 <span class="itemName">所属:</span> 4 <form:select path="department"> 5 <form:options items="${departmentList}" itemLabel="name" itemValue="cd"/> 6 </form:select> 7 </div> 8

jsp

1(update.jsp)★修正後 2 <div> 3 <span class="itemName">所属:</span> 4 <form:select path="department"> 5 <c:forEach var="department" items="${departmentList}"> 6 <form:option value="${department.cd}" label="${department.name}" /> 7 </c:forEach> 8 </form:select> 9 </div>

試したこと

model.addAttribute("departmentList", departmentList);を
model.addAttribute("departmentList", list);としてjspに渡したところ、
jsp側の表示がうまく表示されなかった(※)ので、Servlet側を修正しようとしています。
※うまくいかなかった時の事象
リンク内容

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

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

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

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

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

m.ts10806

2019/07/01 07:17 編集

あと「Spring」をタグに追加しておいてください。 前のコメントで追記忘れてましたが、SpringではjspよりもTymeleafですね。
usako

2019/07/01 07:33

mts10806様、ご指摘ありがとうございます。 あと、「SpringではjspよりもTymeleaf」とのこと。ご丁寧にありがとうございます。 聞いたこともなかったので、調べてみたいと思います。
guest

回答4

0

Listから順次要素を取り出したいという場合、やり方はいくつかあります。

  • カウンタを使ってforループ

java

1for(int i = 0; i < list.size(); i++) { 2 Map<String, Object> map = list.get(i); 3}
  • 拡張for文

java

1for(Map<String, Object> map : list) { 2 3}
  • Iteratorを使う

java

1Iterator<Map<String, Object>> iterator = list.iterator(); 2while(iterator.hasNext()){ 3 Map<String, Object> map = iterator.next(); 4}

簡素さから言えば拡張for文を使う場合が多いと思われます。

投稿2019/07/01 08:09

swordone

総合スコア20651

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

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

usako

2019/07/01 09:59

swordone様、ご回答ありがとうございます。 拡張for文をためしてみようと思います!
guest

0

ベストアンサー

model.addAttribute("departmentList", list);としてjspに渡したところ、

jsp側の表示がうまくいかなかったので、Servlet側を修正しようとしています。

むしろ、詰め替えるとループを何度もすることになり無駄だったりするので、departmentInfoGet.getDepartmentList()の結果をそのままjspに渡すので良いと思います。
もし必要な情報が限定されているのでしたらSQLでselect * from ~~~としている*のところを必要なカラムだけにするというのもありと思います。
例:select cd,name from ~~~
※その場合は「getDepartmentList()」というメソッド名を変更したほうが良さそうです。

あとListはwhileではなく通常はfor、またはforEachかと思います。

whileによる.next()はあくまでStatementからResultSetを得たときの手法です。
※そもそもエラーの通りnext()メソッドはListにはありません

投稿2019/07/01 07:16

編集2019/07/01 07:37
m.ts10806

総合スコア80850

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

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

usako

2019/07/01 07:48

mts10806様、コメントありがとうございます! >あとListはwhileではなく通常はfor、またはforEachかと思います。 勉強になりました。教えていただいたサイトとともに忘れないようにしたいと思います。 >departmentInfoGet.getDepartmentList()の結果をそのままjspに渡すので良いと思います。 はい・・・それを試したところ、jsp側の表示がうまくいかなくて。 1つ前のQ&Aになるのですが、「試したこと」の「リンク内容」にあるように、 jsp側のセレクトボックスに{cd="1",name="ああああ"}と表示されてしまいます。 色々試してServlet側を修正すればよいのかと思っていたのですが、何かよいアドバイスをいただけないでしょうか。
m.ts10806

2019/07/01 07:50

「リンク内容」は当ページをさしていますよ。 jsp側でfor利用すれば良いかと思いますが、jsp側ではどのように書いたのでしょうか。 jspもコードもご提示ください。
usako

2019/07/01 08:03

mts10806様、「リンク内容」が間違っていました。申訳ありません。 jspのソースも関連している個所を追加しました。(update.jsp) jsp側ではセレクトボックスにマスタの名称のみ表示し、コードは別マスタ(従業員マスタ)更新に使用したいと考えています。
m.ts10806

2019/07/01 08:09

「やりたいことができるようになりました!」とあったのでできたものと思ったのですが・・。 ひとまずforで回してoptionを作っては如何でしょうか。
usako

2019/07/01 08:19

mts10806様、たびたび返信ありがとうございます。 jsp側がうまくいったので、あとはServlet側の問題だと思い、クローズしてしまいました・・・ >ひとまずforで回してoptionを作っては如何でしょうか。 はい!いつもコメントくださりありがとうございます。
m.ts10806

2019/07/01 08:22

なるほど。一連の流れとして対応したほうがいいかもしれませんね。 スポットスポットでは中々前に進みませんので。 ひとまず、jsp側で渡したデータをforで回してみて結果を教えてください。
usako

2019/07/01 08:33

mts10806様、勘違いしているかもしれないので確認させてください。 for文で回すというのはServlet側を、という風に考えていたのですが、jsp側をfor文で回すということでしょうか?
m.ts10806

2019/07/01 08:37

回答にも書きましたが、今回は既にListで取れている情報を別のListに入れなおすというループの二度手間が発生しているので、getDepartmentList() の結果をそのままviewに渡したほうが良いです。
usako

2019/07/01 08:53

mts10806様、返信ありがとうございます。 >まずは「実現可能な手っ取り早い方法」ですね。 はい!ご教授いただいたサイトを参考にjsp側に手をいれてみます!
usako

2019/07/02 01:32

mts10806様、時間がかかってしまいましたが、うまく行きました!(今度こそ) 後で、修正したソースコードをアップしますが、取り急ぎお礼まで! 最後まで付き合っていただき、ただただ感謝です。
m.ts10806

2019/07/02 01:34

解決につながったようで何よりです。 Tymeleafの件も、特に指定がない限りはjspよりもTymeleafが採用されるケースが多いはずなので、 Tymeleafも勉強しておいたほうが良いと思います。
usako

2019/07/02 01:42

返信ありがとうございます。 まだちょっとネットで調べただけなのですが、Spring bootはTymeleaf推奨とあったのですが、普通のSpring(たぶんFrameworkのこと?)でもTymeleafがよいのでしょうか?
m.ts10806

2019/07/02 01:49

現場ではWebはBootを採用するケースが多そうです(Webに特化してるから) ただ、jspはjsp固有の技術を多く覚える必要があったり、生HTMLからの変換が結構面倒という印象があり、 Tymeleafが採用されるケースも多いのではないかと思います。 (稀に共存させているケースもあるようですが)
usako

2019/07/02 02:05

なるほど。ではSpring bootも覚える必要があるということですね(まだまだ遠い道のりですが)。 色々教えていただき、本当にありがとうございます。
guest

0

Springのバージョンに依存しますが、commons-beanutilsが大抵は含まれていますので

java

1import org.apache.commons.beanutils.BeanUtils; 2import java.lang.reflect.InvocationTargetException; 3 4.... 5 6List<Map<String, Object>> sourcelist = getDepartmentList(); 7List<SampleModel> target = new ArrayList<SampleModel>(); 8 9try { 10 for (Map<String, Object> source : sourcelist) { 11 SampleModel model = new SampleModel(); 12 BeanUtils.copyProperties(model, source.get(i)); 13 target.add(model); 14 } 15} catch (IllegalAccessException|InvocationTargetException e) { 16 // 例外ハンドリング 17}

ないしは、

java

1List<Map<String, Object>> source = getDepartmentList(); 2List<SampleModel> target = new ArrayList<SampleModel>(); 3 4source.stream().forEach(s -> { 5 SampleModel model = new SampleModel(); 6 try { 7 BeanUtils.copyProperties(model, s); 8 } catch (IllegalAccessException | InvocationTargetException e) { 9 // 例外ハンドリング 10 } 11 target.add(model); 12});

で簡単にマッピングできます。

http://commons.apache.org/proper/commons-beanutils/

投稿2019/07/01 09:06

A-pZ

総合スコア12011

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

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

usako

2019/07/02 01:29

A-pZ様、ご回答ありがとうございます。 両方とも試してみたのですが、エラーが出てしまいそれを解決することができませんでした・・・(私のf力不足で) 今回は重複した処理を行っている(同じようなListから別のListへの転記)というご指摘を他の方からいただき、結局jsp側に手をいれることにしました。(質問の仕方も悪かったと思います) でも、具体的なロジックまでご提示いただき、感謝です。もう少し力がついたらこのロジックを参考にしてプログラムで再度チャレンジしようと思います。
guest

0

Listにnextメソッドってあったっけ?
hasNextじゃないの??

投稿2019/07/01 07:23

編集2019/07/01 07:28
NEO_PLANETT-777

総合スコア333

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

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

swordone

2019/07/01 08:10

ListはnextもhasNextもありません。 Listから生成されるIteratorにはありますが。
usako

2019/07/01 09:55

swordone様、ご指摘ありがとうございます。 やはり考え方がそもそも間違っているということでしょうか・・・
swordone

2019/07/01 10:31

考え方は間違っていません。 コンピュータへの指示の出し方が間違っているのです。
usako

2019/07/01 10:39

なるほど。 もっとがんばります!
NEO_PLANETT-777

2019/07/02 00:24

swordone様 hasNextってIteratorにあるんですね。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問