简体   繁体   中英

Java Bean not working as expected

OK, I have a JSP running the following script section.

<% 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 has an ArrayList property that stores a several InquireRecord objects. It gets this data from a database using the mgrid as (set in line 2 there) as the matching term.

But I'm getting an IndexOutOfBounds exception on what appears here as line 11.

I've done some tests, and I'm pretty sure that it's because populateCollection() isn't getting things done. I have a getSize method that gives me a size of 0.

I made a test class in Eclipse to make sure all my methods were working: 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());
}

}

That test class produces exactly what I'd expect. Other than the names of some of the local variables, I can't see what I'm doign different in the JSP.

So... tell me, what noobish mistake did I make?

for the sake of being thorough, here's the populateCollection() method:

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);
    }
}

Your IndexOutOfBounds exception is probably being caused by the value of rownum being passed to mgrq.getCurRecords() .

Your test code proves nothing because there you're calling getCurRecords() with a constant which is probably always valid for your system and will never cause the exception.

My suggestion is to step through the code in your JSP with a debugger, or even simply to print out the value of your variables (especially pagedatum , pagenum and rownum ) in your JSP code.

Is your JSP Snippet correct? It looks like you started the braces for the

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

but I dont see a end braces for that at all. Can you check if that is the case and if so, fix the code appropriately?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM