• 締切済み

JSPのタグリブを使ったDBアクセスの基本的な記述

JSPのスクリプトレットを使ってとりあえず以下のコードを書きました。 とりあえず動いています。しかし今っぽく無くダサいので タグリブを使った記述に書き換えようと思っています。 ---------------------- ResultSet rs = st.executeQuery(sql); ResultSetMetaData mdata = rs.getMetaData(); int numberOfColumns = mdata.getColumnCount(); for (int i = 1; i < numberOfColumns + 1; i++) { out.println("\t<tr><th>" + mdata.getColumnName(i)); } while (rs.next()) { out.println("\t<tr>"); for (int i = 1; i < numberOfColumns + 1; i++) { out.println("\t\t<td>" + rs.getString(i)); } } ---------------------- 最終的にはコネクション取得の部分からタグにしたいのですが 取り合えずばループ部分だけでも変更したいと取り組みました。 いろいろダメなところはあるのですが、 下記のコードすらまともにかけていない状態です。 ---------------------- <c:forEach var="i" begin="1" end="2"> ${mdata.columnName(${i})} </c:forEach> ---------------------- とりあえずは引数が必要なgetterの記述側からないのですが 上記の(ダメダメな)タグのコードを無視し意図を汲み取って その先のコードまで教えていただけると大変助かります。 よろしくお願いします。

みんなの回答

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

今っぽくしたいのであれば データベース接続は 専用にデータアクセス用のクラスを作成し そこに記述。 具体的には 統合Servlet →業務制御クラス →データアクセス →結果オブジェクト →JSP という流れにして JSPでは結果オブジェクトからのデータ取得に留めるべき だね。 これをMVCという。 M:Model つまりデータを格納するもの V:View つまりのところユーザインターフェース C:Control つまり制御部 この3つの分離こそがオブジェクト指向の理想なのです。 仕様変更の際、MVCのうち一つだけを変えれば良いという理想形。 今回の場合 JSP上に直接データアクセスを記述しているとこから推測するに ブラウザから直接JSP呼んでいるんだね。 なので今更大改造は厳しいか。 とりあえず質問部分の回答だけど やるならsqlタグの利用を。 http://lab.moyo.biz/recipes/java/jsp/jstl/sql-transaction.xsp この辺りから参照すると良いかも。

pringlez
質問者

お礼

最初はDoltengを使ってS2+SAStruts+Hibernateとかでやろうと 思っていたのですが逆にいろいろ大変になってしまいやめました。 どうせテーブルは10もなく、画面数も10-20くらいの超極小規模の テスト開発なので、JSPのみで構築することにしました。 sqlタグは最初使っていたのですがよくわかりませんでした。 というかタグが全体的によくわかっていませんでした。 サンプルを見てそれがきっかけでようやくわかったのは <sql:query var="rs" sql="select文" /> で返ってくるrsはResultSetではないということ。 というか、タグリブでは元の良く使うクラスに似た 独自クラスを使う場合があるということ。 それを確認するには、実際に使われているクラスを 確認しながら開発しなければならないこと などがわかりました。 この辺がわかったことにより理解が深まりました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • サーブレット(doGetメソッド内)でMySQLテーブル内を、

    サーブレット(doGetメソッド内)でMySQLテーブル内を、 CSVファイルとしてクライアントへダウンロードする以下プログラムで、 UTF-16LE(BOM無し)でCSVファイルが正常に出力されております。 そこでご質問内容なのですが、このCSVを出力する際に、 BOM無しではなくて、 「BOM有り」でCSVファイル出力する(BOMを追加する)方法を教えてください。   ↓ final ResultSetMetaData meta = rs.getMetaData(); (上記のrsは、MySQLテーブル内をSELECTしたレコードセットです) response.setContentType("application/octet-stream;charset=utf-16le"); response.setHeader("Content-Disposition", "attachment; filename=" + "KYOIKU.csv"); out = response.getWriter(); for (int i = 1; i <= meta.getColumnCount(); i++) { out.print("\"" + meta.getColumnName(i) + "\""); out.print(i < meta.getColumnCount() ? "\t" : ""); } out.print("\r\n"); while (rs.next()) { for (int i = 1; i <= meta.getColumnCount(); i++) { out.print("\"" + rs.getString(i) + "\""); out.print(i < meta.getColumnCount() ? "\t" : ""); } out.print("\r\n"); } } catch (final NumberFormatException e) { (以下省略) お世話になります 以上、宜しくお願い致します。

    • ベストアンサー
    • Java
  • jsp テーブルの使い方

    プログラム歴2くらいの初心者の質問です アスタリスクを並べて表示するプログラムを作りました。 これをテーブルにして表示したいのですが いろいろ試してみたのですが入れる位置が違いますなど? なかなかうまくいきませんどなたかコードは教えてくれなくも いいからヒントだけでも教えてもらえると助かります。 <% int i,m; for ( i= 0; i <= 9; i++) { for(m=0;m<=10;m++){ out.println("*"); } out.println("<p></p>"); } %>

    • ベストアンサー
    • Java
  • HTMLの質問なのかJAVAサーブレットの質問なのか微妙なのですがテー

    HTMLの質問なのかJAVAサーブレットの質問なのか微妙なのですがテーブルを一行に二つ表示したいのですが表示はできるんですが表示位置を中央にすることができなくて困ってます どうすれば中央にすることができますか? while(rs2.next()){ String name = rs2.getString("st.staff_name"); String kana = rs2.getString("st.staff_kana"); String birthday = rs2.getString("st.birthday"); String sex = rs2.getString("sm.sex"); String blood = rs2.getString("bm.blood_type"); String hight = rs2.getString("st.hight"); String weight = rs2.getString("st.weight"); String reration = rs2.getString("st.reration"); String mobile = rs2.getString("st.mobile_tel"); String tel = rs2.getString("st.tel"); out.println("<br></br><TABLE border=0 align=\"center\"><table border=1 align=\"left\"><tr><th width=150>氏名</th>"); out.println("<td width=200>"+name+"</td></tr><tr>"); out.println("<th>ヨミガナ</th>"); out.println("<td>"+kana+"</td></tr><tr>"); out.println("<th>生年月日</th>"); out.println("<td>"+birthday.replace("-", "/")+"</td></tr><tr>"); out.println("<th>性別</th>"); out.println("<td>"+sex+"</td></tr><tr>"); out.println("<tr><th>身長</th>"); out.println("<td>"+hight+"</td></tr>"); out.println("<tr><th>体重</th>"); out.println("<td>"+weight+"</td></tr>"); out.println("<tr><th>血液型</th>"); out.println("<td>"+blood+"</td></tr>"); out.println("<tr><th>携帯電話番号</th>"); String mtel=""; if(mobile!=null&&mobile.length()>0){ for (int i = 0; i < mobile.length(); i++) { char ch = mobile.charAt(i); if(i==3){ mtel+="-"; } if(i==7){ mtel+="-"; } mtel+=ch; if(mobile.length()==0){ mtel="-"; } } }else{ mtel="不所持"; } out.println("<td>"+mtel+"</td></tr>"); out.println("<tr><th>自宅電話番号</th>"); String ttel=""; for (int i = 0; i < tel.length(); i++) { char ch = tel.charAt(i); if(i==4){ ttel+="-"; } if(i==6){ ttel+="-"; } ttel+=ch; } out.println("<td>"+ttel+"</td></tr>"); out.println("<tr><th>続柄</th>"); out.println("<td>"+reration+"</td>"); out.println("</tr></table>");

  • JSPで聞きたいことがあります。

    JSPを学んで一ヶ月になります。以下の内容で質問があります。 <%@ page contentType="text/html;charset=Shift_JIS"import="java.io.*,java.util.*" %> <html> <head> <title>住所録</title> </head> <body> <h1 style="font-size:14pt;background:#cccccc">住所録</h1> <table border="0"> <tr style="background:#00ccff"> <th>No.</th><th>名前</th><th>性別</th><th>電話番号</th><th>住所</th> </tr> <% String tmpStr; StringTokenizer tkn; FileReader fr=new FileReader( application.getRealPath("myData/data.txt")); BufferedReader br=new BufferedReader(fr); while(br.ready()){ tmpStr=br.readLine(); out.println("<tr style='background:#ffffcc'>"); tkn=new StringTokenizer(tmpStr,"\t"); while(tkn.hasMoreTokens()){ out.println("<td>" + tkn.nextToken() + "</td>"); } out.println("</tr>"); } br.close(); %> </table> </body> </html> というコードがあるのですが、上記のコード中にあるwhile文をdo分に変えて、whileと同じように表示するのは可能でしょうか?ちなみに私は、 do{ tmpStr=br.readLine(); out.println("<tr style='background:#ffffcc'>"); }while(br.ready()); tkn=new StringTokenizer(tmpStr,"\t"); do{ out.println("<td>" + tkn.nextToken() + "</td>"); out.println("</tr>"); br.close(); }while(tkn.hasMoreTokens()); と記述したのですが、実行してみると、一部しか表示されず、しかも全ての情報が <th>NO.</th> に入ってしまうのです。そこで質問ですが、whileからdo文に変えて同じように表示するのは可能なのでしょうか?わかる方がいれば、お願いします。

    • ベストアンサー
    • Java
  • データ取得後、JTABLE列幅を変更できませんか

    データベースからデータを取得して(ResultSetMetaData)、Jtableに表示したのですが、列幅を項目ごとに変更したいのですが、できるのでしょうか? 項目ヘッダーはできたのですが。。。 ResultSetMetaData rm = rs.getMetaData(); int cnum = rm.getColumnCount(); colname = new ArrayList<String>(cnum); //列名の取得 String[] hder = {"月日","区分","コード","商品"}; for(int i=1; i<=cnum; i++){ colname.add(hder[i-1]); } //行の取得 data = new ArrayList<ArrayList>(); while(rs.next()){ ArrayList<String> rowdata = new ArrayList<String>(); for(int i=1; i<=cnum; i++){ if (rs.getObject(i)==null){ rowdata.add("");} else{ rowdata.add(rs.getObject(i).toString());} } data.add(rowdata); } 表示はできるのですが、各項目ごとに列幅が、しようとMaxsizeとかsetPreferredWidth などを行ってもうまくでいきません。

  • JSPからMysqlへの接続

    タイトルどおり、以下のようなコードでMysqlデータベースに接続しようとしました。 <%@ page contentType="text/html; charset=Shift_JIS" import="java.sql.*" %> <html> <head> <title>データを表示する</title> </head> <body> <% //データベース設定 String sv = "localhost"; //サーバ名 String db = "test"; //データベース名 String user = "feifei"; //ユーザ名 String pass = "feifei"; //パスワード String encode = "EUC_JP"; //文字コード //データベースに接続する Class.forName("org.gjt.mm.mysql.Driver"); String url = "jdbc:mysql://" + sv + "/" + db + "?user=" + user + "&password=" + pass + "&useUnicode=true&characterEncoding=" + encode; Connection conn = DriverManager.getConnection(url); //データを取得する Statement st = conn.createStatement(); String sql = "SELECT * FROM table1"; //実行するSQL ResultSet rs = st.executeQuery(sql); //データを全件表示する out.println("<table border=0>"); while(rs.next()){ out.println("<tr>"); out.println("<td>" + rs.getInt("id") + "</td>"); out.println("<td>" + rs.getString("name") + "</td>"); out.println("<td>" + rs.getInt("point") + "</td>"); out.println("</tr>"); } out.println("</table>"); //データベース接続を閉じる conn.close(); %> </body> </html> しかし、なぜかわかりませんが、表示した内容のうち日本語はすべて[?]と文字化けしてしまいます。 ちゃんとディレクティブで「charset=Shift_JIS」と指定しているのになぞです。 どうか教えてください。よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaでデータに登録する度にIDを振る

    下記のコードはSQLにテーブルを作成し、データを登録するコードですが コードを少し足すことで、ついでにIDを自動的に割り振る方法はあるのでしょうか? import java.sql.*; public class Sample1 { public static void main(String args[]) { try{ //接続の準備 String url = "jdbc:derby:cardb;create=true"; String usr = ""; String pw = ""; //データベースへの接続 Connection cn = DriverManager.getConnection(url, usr, pw); //問い合わせの準備 DatabaseMetaData dm = cn.getMetaData(); ResultSet tb = dm.getTables(null, null, "車表", null); Statement st = cn.createStatement(); String qry1 = "CREATE TABLE 車表(番号 int, 名前 varchar(50))"; String[] qry2 = {"INSERT INTO 車表 VALUES ('伊藤', '男性')", "INSERT INTO 車表 VALUES ('佐藤', '女性')", "INSERT INTO 車表 VALUES ('山田', '男性')"}; String qry3 = "SELECT * FROM 車表"; if(!tb.next()){ st.executeUpdate(qry1); for(int i=0; i<qry2.length; i++){ st.executeUpdate(qry2[i]); } } //問い合わせ ResultSet rs = st.executeQuery(qry3); //データの取得 ResultSetMetaData rm = rs.getMetaData(); int cnum = rm.getColumnCount(); while(rs.next()){ for(int i=1; i<=cnum; i++){ System.out.print(rm.getColumnName(i) + ":"+ rs.getObject(i) + " "); } System.out.println(""); } //接続のクローズ rs.close(); st.close(); cn.close(); } catch(Exception e){ e.printStackTrace(); } } 000001 伊藤 男性 000002 佐藤 女性 000003 山田 男性

    • ベストアンサー
    • Java
  • JavaでDBを作りたい

    一応自分で出来る限りコードは書いたのですが、上手くいきません。 実行すると一応テーブルは表示されるのですが、更新や削除をしようとすると「java.sql.SQLException: executeQuery メソッドを更新用に使用することはできません」などというエラーが出てしまいます。 また、検索機能をつけるとすればどのようにすればいいでしょうか? (文字数の関係上import文など一部割愛しています) public class test extends BaseFrame implements MouseListener { static int KETU; private JLabel l_code, l_title, l_price; private JTextField tf_code, tf_title, tf_price; private String s_code, s_title, s_price; private JButton b_add, b_cha, b_del; private JTable tb; private JScrollPane sp; private JPanel pn; // パネル分割 private ResultSet rs = null; public static void main(String[] args) { new test("データの挿入"); } public test(String title) { super(title); Container cp = getContentPane(); // テーブル表示エリアの設定(省略)// tb = new JTable(new DefaultTableModel()); // テーブル初期は空の状態 sqlTable("select * from USERS"); // 起動と同時にテーブルを表示 } public void mouseClicked(MouseEvent evt) { Object src = evt.getSource(); s_code = tf_code.getText(); s_title = tf_title.getText(); s_price = tf_price.getText(); if (src == b_add) { sqlTable("insert into USERS values(" + (KETU + 1) + ",'" + s_title+ "'," + s_price + ")"); sqlTable("select * from USERS"); } else if (src == b_cha) { sqlTable("update USERS set title= '" + s_title + "', price= " + s_price + " WHERE code= " + s_code); sqlTable("select * from USERS"); } else if (src == b_del) { sqlTable("delete from USERS where code= " + s_code); sqlTable("select * from USERS"); } tf_code.setText(""); tf_title.setText(""); tf_price.setText(""); } public void mouseEntered(MouseEvent evt) { Object src = evt.getSource(); if (src == b_add) { tf_code.setBackground(Color.black); } else if (src == b_cha) { } else if (src == b_del) { tf_title.setBackground(Color.black); tf_price.setBackground(Color.black); } } public void mouseExited(MouseEvent evt) { Object src = evt.getSource(); if (src == b_add) { tf_code.setBackground(Color.white); } else if (src == b_cha) { } else if (src == b_del) { tf_title.setBackground(Color.white); tf_price.setBackground(Color.white); } } @Override public void mousePressed(MouseEvent evt) { } public void mouseReleased(MouseEvent evt) { } public void sqlTable(String sql) { // SQLテーブル表示用 System.out.println(sql); try { String drv = "org.apache.derby.jdbc.ClientDriver"; String url = "jdbc:derby://localhost:1527/jad2011"; Class.forName(drv); Connection cn = DriverManager.getConnection(url); Statement st = cn.createStatement(); rs = st.executeQuery(sql); //SQLの実行 ResultSet rs = st.executeQuery(sql); tb.setModel(new MyTableModel(rs)); rs.close(); st.close(); cn.close(); } catch (Exception e) { e.printStackTrace(); } } // テーブルモデルクラス class MyTableModel extends AbstractTableModel { private Vector<Object> colname; private Vector<Object> data; public MyTableModel(ResultSet rs) { try { // 列数の取得 ResultSetMetaData rm = rs.getMetaData(); int cnum = rm.getColumnCount(); colname = new Vector<Object>(cnum); // 列名の取得 for (int i = 1; i <= cnum; i++) { colname.addElement(rm.getColumnName(i)); } data = new Vector<Object>(); KETU = 0; while (rs.next()) { Vector<Object> rowdata = new Vector<Object>(); for (int i = 1; i <= cnum; i++) { rowdata.addElement(rs.getObject(i)); if (i == 1) { if (KETU < ((Integer) rs.getObject(i))) { KETU = ((Integer) rs.getObject(i)); } } } data.addElement(rowdata); } } catch (Exception e) { e.printStackTrace(); } } public int getRowCount() { return data.size(); } public int getColumnCount() { return colname.size(); } public Object getValueAt(int row, int column) { Vector rowdata = (Vector) data.elementAt(row); return rowdata.elementAt(column); } public String getColumnName(int column) { return (String) colname.elementAt(column); } }

    • ベストアンサー
    • Java
  • jsp、サーブレットの質問です。

    Tomcatを使用してjspとサーブレットを使い掲示板のような投稿サイトもどきを作成していますが解決できない部分があります。 ↓は表示用のjspです♪ <html> <head> <title>Insert title here</title> </head> <body> <% String lsts = (String)request.getAttribute("lst"); %> <table border="4"> <tr> <td>日時</td> <td>タイトル</td> <td>スレッド主</td> <td></td> </tr> <tr> <td><%for(int i = 0; i<lsts.length(); i++){ out.println(lsts); } %> </td> <td><%out.println(); %></td> <td><%out.println("");%></td> <td> </td> </tr> </table> </form> </body> </html> こちらがサーブレットです otected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*DB接続処理は省略します*/ try{ ps = (PreparedStatement) con.prepareStatement(sql); String sql = "select * from thred"; ResultSet rs = ps.executeQuery(); //テーブル内一覧取得 while(rs.next()){ rs.getString("time"); rs.getString("title"); rs.getString("id"); rs.getString("thredid"); String s = (rs.getString("time")+","+ rs.getString("title")+","+rs.getString("id")); String[] lsts = s.split(","); List<String> thlists = Arrays.asList(lsts); String ss = (thlists.get(0)); request.setAttribute("thlst",ss); RequestDispatcher dispatcher= request.getRequestDispatcher("/list.jsp"); dispatcher.forward(request,response); } }catch(SQLException e){ e.printStackTrace(); } catch(ClassNotFoundException e){ e.printStackTrace(); }finally{ try { con.close(); } } } jspの方にサーブレットでthredDBから抜き取ったtimeとtitleとidを全て表示させたいのですが 現状だと 2014-06-03 06:45:02  aaaa 1 の行だけがたくさん表示されてしまいます 恐らくスコープを取得した時点でこの↑の1行のものしかとれてこれていないのだと思います... どのように処理を行ったらよいのでしょうか? DBの中身は画像添付いたしますっ

  • javaで使われている[?]と[:]の意味

    ResultSetMetaData rsMeta = rs2nd.getMetaData(); int capacity = 0; while(rs2nd.next()){ for(int j = 1; j <= rsMeta.getColumnCount();j++){ if(rs2nd.getString(j) == null){ csvLine += ""; }else{ csvLine += enquote(rs2nd.getString(j)); } csvLine += (j <= rsMeta.getColumnCount() ? "," : ""); } csvLine += System.getProperty("line.separator"); csvLineList.add(csvLine); csvLine = ""; } 上記のようなソースに出会いました。これはCSVファイルに吐き出すリストを作成するものなのですが、[j <= rsMeta.getColumnCount() ? "," : ""]部分の?と:の意味がわからないのです。インターネットで検索しても引っかからないので、どなたかご存知の方がいらっしゃいましたら、ご教授くださいますようよろしくお願いします。

    • ベストアンサー
    • Java