${userdata.id}
の挙動が、よくわからんのですよね・・・
userdataは、List<dto> なので、そもそもgetIdが無いはずで、
List.get(int)が、List.get("id")と、評価されるのかなぁ。
とりあえず、${userdata.id} は、Listに書くようなものでないのですし
DBのデータうんぬんはエラーメッセージからは関係いとは思います。
DBが問題か判断したいなら、
java
1List<dto>userdata=dao.findAll();
2request.setAttribute("userdata", userdata);
上記の部分を
List<dto> userdata = new ArrayList<>();
userdata.add(new dto("name", 1, 2));
request.setAttribute("userdata", userdata);
のようにDB経由でないデータを表示できるか確認してみると良いです。
もしエラーが出るならDBのデータは直接関係なさそうと判断できます。
※少なくともDBに接続しなくてもエラーが出るということがわかる。
まぁ。JSTLのforEach
使えば大丈夫じゃないかなぁとは思います。