實現(xiàn)的功能
在gwt開發(fā)中實現(xiàn),與數(shù)據(jù)庫(oracle)的連接(jdbc),并顯示數(shù)據(jù)記錄集,說白了就是在ajax的gwt架構(gòu)下與數(shù)據(jù)庫交互。
相關(guān)工具
gwt1.4,eclipse3.3
首先說明一下要原理分為兩部分:客戶端部分與服務(wù)端部分
如果對gwt的遠(yuǎn)程調(diào)用不怎么清楚,請參見:
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代碼會被轉(zhuǎn)換成javascript,這里告訴轉(zhuǎn)換的類型的
有了記錄集,我們就可以用FlexTable來把我們的記錄集顯示出來了,如下
public class PeaceTable extends Composite{
private FlexTable table = new FlexTable();
public FlexTable getTable() {
return table;
}
public PeaceTable() {
this.initWidget(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.Util.getInstance().select(sql, new AsyncCallback() {
public void onFailure(Throwable caught) {
}
public void onSuccess(Object result) {
showResultSet((PeaceResultSet) result);
}
});
}
服務(wù)端部分這一部分是完全的java,可以用java可以使用的全部庫(當(dāng)然自己寫的也可以)
我這里用的是jdbc來連接數(shù)據(jù)庫(只是最簡單的,因為這里不是說明數(shù)據(jù)怎么操作的),代碼如下
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 (Exception 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;
}
}
在下一部分中,我將說明一些注意事項,以及給出完整的源代碼!!