gwt學習–資料庫記錄顯示實現(二.1)

來源:互聯網
上載者:User
實現的功能
   在gwt開發中實現,與資料庫(oracle)的串連(jdbc),並顯示資料記錄集,說白了就是在ajax的gwt架構下與資料庫互動。
相關工具
gwt,eclipse
首先說明一下要原理
分為兩部分:用戶端部分與服務端部分
如果對gwt的遠程調用不怎麼清楚,請參見:http://code.google.com/webtoolkit/documentation/com.google.gwt.doc.DeveloperGuide.RemoteProcedureCalls.html

用戶端部分
   由於用戶端只支援jdk1.4的包util與lang(沒有jdbc),所以只能自己寫一個類存放記錄集,如下
public class PeaceResultSet {
    private String[] cols;
    /**
     * @gwt.typeArgs <java.lang.String[]>
     */
    private List rows;
    public String[] getCols() {
        return cols;
    }
    public void setCols(String[] cols) {
        this.cols = cols;
    }
    public List getRows() {
        return rows;
    }
    public void setRows(List rows) {
        this.rows = rows;
    }
}
    對此類作一個簡單的說明。cols是存放列名的,rows是存放記錄行的,請注意在它前面的那一個注釋(/**
     * @gwt.typeArgs <java.lang.String[]>
     */),一定不能少的,因為,最終這個java代碼會被轉換成javascript,這裡告訴轉換的類型的
有了記錄集,我們就可以用FlexTable來把我們的記錄集顯示出來了,如下
public class PeaceTable extends Composite{
   
    private FlexTable table = new FlexTable();
    private int selectedRow = -1;
    public FlexTable getTable() {
        return table;
    }
    public PeaceTable() {
        this.setWidget(table);
    }
    public void showResultSet(PeaceResultSet re)
    {
        this.table.clear();
        if(re != null && re.getRows()!= null && re.getRows().size()>0)
        {
            String[] cols = re.getCols();
            List rows = re.getRows();
           
            for(int j = cols.length-1; j >= 0; j--)
            {
                table.setText(0,j,cols[j]);
            }

            for(int i = 0; i < rows.size(); i++)
            {
                cols = (String[])rows.get(i);
                for(int j = cols.length-1; j >= 0; j--)
                {
                    table.setText(i+1,j,cols[j]);
                }
            }
        }
        else
        {
            table.setText(0,0,"no data");
        }
    }
    public void callServer(String sql) {
        PeaceSelectResultSetAsync calService;
        calService = (PeaceSelectResultSetAsync)GWT.create(PeaceSelectResultSet.class);
        ((ServiceDefTarget)calService).setServiceEntryPoint("/peaceselect");
       
        calService.select(sql, new AsyncCallback() {
            public void onFailure(Throwable caught) {
               
            }
            public void onSuccess(Object result) {
                showResultSet((PeaceResultSet) result);
            }
          });
    }
}
服務端部分
這一部分是完全的java,可以用java可以使用的全部庫(當然自己寫的也可以)
我這裡用的是jdbc來串連資料庫(只是最簡單的,因為這裡不是說明資料怎麼操作的),代碼如下
public class PeaceSelectResultSetImpl extends RemoteServiceServlet implements
        PeaceSelectResultSet {

    private static final long serialVersionUID = 1L;

    public PeaceResultSet select(String sql) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet se = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
            String url = "jdbc:oracle:thin:@192.168.1.11:1521:XXXX"; // orcl為資料庫的SID
            String user = "uuser";
            String password = "pwd";
            conn = DriverManager.getConnection(url, user, password);
            stmt = conn.createStatement();
            se = stmt.executeQuery(sql);
            ResultSetMetaData rsmd = se.getMetaData();

            String[] cols = new String[rsmd.getColumnCount()];
            List rows = new ArrayList();
            for (int i = cols.length; i > 0; i--) {
                cols[i - 1] = rsmd.getColumnName(i);
            }
            while (se.next()) {
                String[] row = new String[cols.length];
                rows.add(row);
                for (int i = cols.length - 1; i >= 0; i--) {
                    row[i] = se.getString(cols[i]);
                }
            }
            PeaceResultSet kfse = new PeaceResultSet();
            kfse.setCols(cols);
            kfse.setRows(rows);
            return kfse;
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (se != null)
                try {
                    se.close();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            if (stmt != null)
                try {
                    stmt.close();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            if (conn != null)
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
        }
        return null;
    }
}
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.