2011-06-20 5 views
0

OK、次のスクリプトセクションを実行しているJSPがあります。Java Beanが正常に動作しない

<% irCollection mgrq = new irCollection(); 
mgrq.setMgrid("Chris Novish"); 
mgrq.populateCollection(); 
int pagenum; 
if (request.getParameter("p") != null) { 
String pagedatum=request.getParameter("p"); 
pagenum = Integer.parseInt(pagedatum); 
} else { pagenum = 0; } 
for (int i=0;i<10;i++) { 
int rownum = pagenum * 10 + i; 
InquireRecord currec = mgrq.getCurRecords(rownum); 
     out.println(currec.getID()); %> 

irCollectionは、いくつかのInquireRecordオブジェクトを格納するArrayListの特性を有しています。このデータは、マッチ・タームとしてmgrid as(2行目に設定されている)を使用してデータベースから取得します。

しかし、私はいくつかのテストを行ってきた、と私はpopulateCollection()は物事を行ってきていないので、それはだとかなり確信している11

ラインで表示されますどのようにIndexOutOfBounds例外を取得しています。私は0のサイズを与えるgetSizeメソッドを持っています。

私はすべての私のメソッドが動作していることを確認するためにEclipseでテストクラスを作った: package com.serco.inquire;

public class test { 

    public static void main (String[] args) { 
     String mgr = "Chris Novish"; 
    irCollection bob = new irCollection(); 
    bob.setMgrid(mgr); 
    bob.populateCollection(); 
    InquireRecord fred = bob.getCurRecords(1); 
    System.out.println(fred.getID()); 
} 

} 

このテストクラスは、私が期待しているものを正確に生成します。 いくつかのローカル変数の名前以外にも、私はJSPで何が違うのか分かりません。

だから私に言ってみれば、どんなに重大な間違いをしたのですか?

public void populateCollection() { 
    try { 
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
     String filename = "inquire.mdb"; 
     String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="; 
     database+= filename.trim() + ";DriverID=22;READONLY=true}"; 
     Connection con = DriverManager.getConnection(database ,"",""); 
     Statement s = con.createStatement(); 
     s.execute ("SELECT * FROM inquiries WHERE manager = '" + mgrid + "'"); 
     ResultSet rs = s.getResultSet(); 
     int cur; 
     if (rs != null) { 
     while (rs.next()) { 
      cur = rs.getRow(); 
      cur -- ; 
      int curID = rs.getInt("ID"); 
      this.newIR.setID(curID); 
      String cursub = rs.getString("submitter"); 
      this.newIR.setSubmitter(cursub); 
      this.iRecords.add(cur, this.newIR); 
      } 
     this.size = iRecords.size(); 
     this.pages = this.size/10; 
     int remain = this.size % 10; 
     if (remain > 0) { this.pages++; } 
       } else { System.out.println("no records."); } 
    } 
    catch (Throwable e) { 
     System.out.println(e); 
    } 
} 
+1

私は、スクリプトレットコードをJSPに入れることは非常に悪いアプローチだと考えています。それは間違いです#1。 – duffymo

+0

このテストコードですか?そうでなければ、あなたはデザインを静かに考え直すべきです...スクリプトレット/ロワーケースクラス名の多くのロジックirCollection/JDBCリソースは使用後に解放されません/ハードコーディングされた接続プロパティ... – Thomas

+0

はい、テストコードです。スクリプトレットコードのアドバイスに感謝します。それのどれも実際の質問に答えません。私が実行すると、コードはテストJavaクラスで動作します。 **はjspで動作しません** –

答えて

0

あなたIndexOutOfBounds例外はおそらくrownumの値によって引き起こされているがmgrq.getCurRecords()に渡される:徹底であることのために

は、ここpopulateCollection()メソッドです。

getCurRecords()にあなたのシステムに常に有効な可能性があり、例外を発生させない定数で呼び出しているため、テストコードは何も証明しません。

私の提案は、デバッガを使用してJSPのコードをステップ実行するために、あるいは単にあなたの変数の値をプリントアウトする(特にpagedatumpagenumrownum)あなたのJSPコードです。

0

JSPスニペットは正しいですか?

for (int i=0;i<10;i++) { 

のように中括弧を開始したようですが、そのための中括弧はまったくありません。そうである場合はチェックし、そうであればコードを適切に修正できますか?

関連する問題