在同一個頁面插入數據到數據庫,成功后返回成功插入的結果,相關文件PRPC.htm,SerDojo.java,DataDAO.java。
Dojo開發包:
dojo-0.3.1-ajax.zip.
相關網站:
http://www.tkk7.com/burnet/archive/2006/06/27/55339.htmlhttp://manual.dojotoolkit.org/(官方)
http://manual.dojotoolkit.org/WikiHome/DojoDotBook?(Dojo Book)
http://ajaxcn.org/forum/posts/list/127.page?(Ajax 中文站,Dojo 文檔列表)
代碼如下:
PRPC.htm
<!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">
<html?xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta?http-equiv="Content-Type"?content="text/html;?charset=ISO-8859-1">
<title>PRPC?Test</title>
<script?type="text/javascript"?src="js/dojo/dojo.js"></script>

<script?type="text/javascript">
dojo.require("dojo.io.*");


function?mySubmitProfile()?
{
????dojo.byId('btnAddProfile').disabled?=?'disabled';
????

????dojo.io.bind?(
{
????????url:?'SerDojo?flag=profile',
????????handler:?callBack,
????????formNode:?dojo.byId('main')
????});
}


function?mySubmitCountry()?
{
????dojo.byId('btnAddCountry').disabled?=?'disabled';


????dojo.io.bind?(
{
????????url:?'SerDojo?flag=country',
????????handler:?callBack,
????????formNode:?dojo.byId('main')
????});
}


function?callBack(type,?data,?evt)?
{

????if?(data?==?'profileYES')?
{
????????insertStrProfile();
????????dojo.byId('stateFlag').innerHTML?=?data;
????????dojo.byId('btnAddProfile').disabled?=?'';

????}?else?if?(data?==?'countryYES')?
{
????????insertStrCountry();
????????dojo.byId('stateFlag').innerHTML?=?data;
????????dojo.byId('btnAddCountry').disabled?=?'';
????}
}


function?insertStrProfile()?
{
????var?frm?=?dojo.byId('main');
????var?name?=?frm.name.value;
????var?sex;
????var?radio?=?document.getElementsByName('sex');

????for?(var?i?=?0;?i?<?radio.length;?i?++)?
{

????????if(frm.sex[i].checked)?
{
????????????sex?=?radio[i].value;
????????}
????}
????var?age?=?frm.age.value;
????var?address?=?frm.address.value;
????
????var?txtName?=?document.createTextNode(name);
????var?txtSex?=?document.createTextNode(sex);
????var?txtAge?=?document.createTextNode(age);
????var?txtAddress?=?document.createTextNode(address);
????
????var?tdName?=?document.createElement("td");
????var?tdSex?=?document.createElement("td");
????var?tdAge?=?document.createElement("td");
????var?tdAddress?=?document.createElement("td");
????
????var?tr?=?document.createElement("tr");

????tdName.appendChild(txtName);
????tdSex.appendChild(txtSex);
????tdAge.appendChild(txtAge);
????tdAddress.appendChild(txtAddress);
????
????tr.appendChild(tdName);
????tr.appendChild(tdSex);
????tr.appendChild(tdAge);
????tr.appendChild(tdAddress);

????var?parNode?=?document.getElementById("tbProfile");
????parNode.appendChild(tr);
}


function?insertStrCountry()?
{
????var?frm?=?dojo.byId('main');
????var?country?=?frm.country.value;
????var?company?=?frm.company.value;
????var?website?=?frm.website.value;

????var?txtCountry?=?document.createTextNode(country);
????var?txtCompany?=?document.createTextNode(company);
????var?txtWebsite?=?document.createTextNode(website);

????var?tdCountry?=?document.createElement("td");
????var?tdCompany?=?document.createElement("td");
????var?tdWebsite?=?document.createElement("td");

????var?tr?=?document.createElement("tr");

????tdCompany.appendChild(txtCompany);
????tdCountry.appendChild(txtCountry);
????tdWebsite.appendChild(txtWebsite);

????tr.appendChild(tdCompany);
????tr.appendChild(tdCountry);
????tr.appendChild(tdWebsite);

????var?parNode?=?document.getElementById("tbCountry");
????parNode.appendChild(tr);
}
</script>
</head>

<body>
<form?id="main">
<table?width="600"?border="0"?align="center"?cellpadding="0"?cellspacing="0"?style="border:?1px?dashed?#000000;">
??<tr>
????<td?valign="top">
??????<table?width="100%"?border="0"?cellspacing="0"?cellpadding="3">
????????<tr>
??????????<td><table?width="80%"?border="1"?align="center"?cellpadding="1"?cellspacing="1">
???????????<tbody?id="tbProfile">
????????????<tr>
??????????????<td>Name</td>
??????????????<td>Age</td>
??????????????<td>Sex</td>
??????????????<td>Address</td>
????????????</tr>
???????????</tbody>
??????????</table></td>
????????</tr>
????????<tr>
??????????<td><table?width="50%"?border="0"?align="center"?cellpadding="2"?cellspacing="1"?bgcolor="#CCCCCC">
????????????<tr>
??????????????<td?width="29%"?bgcolor="#EBEBEB">Name:</td>
??????????????<td?width="71%"?bgcolor="#EBEBEB"><input?type="text"?name="name"?/></td>
????????????</tr>
????????????<tr>
??????????????<td?bgcolor="#EBEBEB">Age:</td>
??????????????<td?bgcolor="#EBEBEB"><input?type="text"?name="age"?/></td>
????????????</tr>
????????????<tr>
??????????????<td?bgcolor="#EBEBEB">Sex:</td>
??????????????<td?bgcolor="#EBEBEB"><input?type="radio"?name="sex"?checked="checked"?value="Male"?/>
????????????????Male
??????????????????<input?type="radio"?name="sex"?value="Female"?/>
??????????????????Female</td>
????????????</tr>
????????????<tr>
??????????????<td?bgcolor="#EBEBEB">Address:</td>
??????????????<td?bgcolor="#EBEBEB"><input?type="text"?name="address"?/></td>
????????????</tr>
????????????<tr>
??????????????<td?colspan="2"?bgcolor="#EBEBEB"><div?align="right">
????????????????<input?type="button"?name="btnAddProfile"?value="AddNew"?onclick="mySubmitProfile()"?/>
??????????????</div></td>
??????????????</tr>
??????????</table></td>
????????</tr>
??????</table>
????<table?width="100%"?border="0"?cellspacing="0"?cellpadding="0">
??<tr>
????<td?height="20"><font?color="#FF0000"><div?id="stateFlag">State</div></font></td>
??</tr>
</table>

????<hr?width="90%"?size="1"?noshade="noshade"?/>
????</td>
??</tr>
??<tr>
????<td?valign="top">
??????<table?width="100%"?border="0"?cellspacing="0"?cellpadding="3">
????????<tr>
??????????<td><table?width="80%"?border="1"?align="center"?cellpadding="1"?cellspacing="1">
??????????????<tbody?id="tbCountry">
????????????<tr>
??????????????<td>Company</td>
??????????????<td>Country</td>
??????????????<td>WebSite</td>
????????????</tr>
????????????</tbody>
??????????</table></td>
????????</tr>
????????<tr>
??????????<td><table?width="50%"?border="0"?align="center"?cellpadding="2"?cellspacing="1"?bgcolor="#CCCCCC">
????????????<tr>
??????????????<td?width="29%"?bgcolor="#EBEBEB">Company:</td>
??????????????<td?width="71%"?bgcolor="#EBEBEB"><input?type="text"?name="company"?/></td>
????????????</tr>
????????????<tr>
??????????????<td?bgcolor="#EBEBEB">Country:</td>
??????????????<td?bgcolor="#EBEBEB"><input?type="text"?name="country"?/></td>
????????????</tr>
????????????<tr>
??????????????<td?bgcolor="#EBEBEB">WebSite:</td>
??????????????<td?bgcolor="#EBEBEB"><input?type="text"?name="website"?/></td>
????????????</tr>

????????????<tr>
??????????????<td?colspan="2"?bgcolor="#EBEBEB"><div?align="right">
??????????????????<input?type="button"?name="btnAddCountry"?value="AddNew"?onclick="mySubmitCountry()"?/>
??????????????</div></td>
????????????</tr>
??????????</table></td>
??????????<tr>
??????????????<td?align="right">
??????????????????<input?type="button"?value="NEXT"?onclick="javascript:window.open('dojoBind.htm','_self')"?/>
??????????????</td>
??????????</tr>
????????</tr>
??????</table>
????</td>
??</tr>
</table>
</form>
</body>
</html>

SerDojo.java
package?servlet;

import?DAO.DataDAO;

import?java.io.IOException;
import?java.io.PrintWriter;

import?javax.servlet.ServletException;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;



/**?*//**
?*?Servlet?implementation?class?for?Servlet:?SerDojo
?*
?*/
public?class?SerDojo?extends?javax.servlet.http.HttpServlet

????implements?javax.servlet.Servlet?
{

????/**//*?(non-Java-doc)
?????????*?@see?javax.servlet.http.HttpServlet#HttpServlet()
?????????*/

????public?SerDojo()?
{
????????super();
????}


????/**//*?(non-Java-doc)
?????*?@see?javax.servlet.http.HttpServlet#doGet(HttpServletRequest?request,?HttpServletResponse?response)
?????*/
????protected?void?doGet(HttpServletRequest?request,

????????HttpServletResponse?response)?throws?ServletException,?IOException?
{
????????//?TODO?Auto-generated?method?stub
????????PrintWriter?out?=?response.getWriter();
????????String?strFlag?=?request.getParameter("flag");

????????String?strName?=?request.getParameter("name");
????????String?strAge?=?request.getParameter("age");
????????String?strSex?=?request.getParameter("sex");
????????String?strAddress?=?request.getParameter("address");

????????String?strCompany?=?request.getParameter("company");
????????String?strCountry?=?request.getParameter("country");
????????String?strWebSite?=?request.getParameter("website");

????????DataDAO?dao?=?new?DataDAO();
????????boolean?isSuccess?=?false;


????????if?(strFlag.equals("profile"))?
{

????????????try?
{
????????????????isSuccess?=?dao.insertProfile(strName,?strAge,?strSex,
????????????????????????strAddress);

????????????}?catch?(Exception?e)?
{
????????????????e.printStackTrace();
????????????}


????????????if?(isSuccess)?
{
????????????????out.print("profileYES");

????????????}?else?
{
????????????????out.print("profileNO");
????????????}

????????}?else?if?(strFlag.equals("country"))?
{

????????????try?
{
????????????????isSuccess?=?dao.insertCompany(strCompany,?strCountry,?strWebSite);

????????????}?catch?(Exception?e)?
{
????????????????e.printStackTrace();
????????????}


????????????if?(isSuccess)?
{
????????????????out.print("countryYES");

????????????}?else?
{
????????????????out.print("countryNO");
????????????}
????????}
????}


????/**//*?(non-Java-doc)
?????*?@see?javax.servlet.http.HttpServlet#doPost(HttpServletRequest?request,?HttpServletResponse?response)
?????*/
????protected?void?doPost(HttpServletRequest?request,

????????HttpServletResponse?response)?throws?ServletException,?IOException?
{
????????//?TODO?Auto-generated?method?stub
????????doGet(request,?response);
????}
}

DataDAO.java
package?DAO;

import?java.sql.Connection;
import?java.sql.Statement;



public?class?DataDAO?
{
????public?boolean?insertCompany(String?djCompany,?String?djCountry,

????????String?djWebSite)?throws?Exception?
{
????????boolean?success?=?false;
????????String?sql?=?"insert?into?Dojo_Table_Company??";
????????sql?+=?("values('"?+?djCompany?+?"','"?+?djCountry?+?"','"?+?djWebSite?+
????????"')");
????????
????????//ResultSet?rs=null;
????????Connection?con?=?null;
????????Statement?stat?=?null;


????????try?
{
????????????con?=?Login.getConnection();
????????????stat?=?con.createStatement();
????????????stat.executeUpdate(sql);
????????????success?=?true;

????????}?catch?(Exception?e)?
{
????????????//e.printStackTrace();
????????????throw?e;
????????}

????????finally?
{
????????????Login.closeStatement(stat);
????????????Login.closeConnection(con);
????????}

????????return?success;
????}

????public?boolean?insertProfile(String?djName,?String?djSex,?String?djAge,

????????String?djAddress)?throws?Exception?
{
????????boolean?success?=?false;
????????String?sql?=?"insert?into?Dojo_Table_Profile??";
????????sql?+=?("values('"?+?djName?+?"','"?+?djSex?+?"','"?+?djAge?+?"','"?+
????????djAddress?+?"')");

????????//ResultSet?rs=null;
????????Connection?con?=?null;
????????Statement?stat?=?null;


????????try?
{
????????????con?=?Login.getConnection();
????????????stat?=?con.createStatement();
????????????stat.executeUpdate(sql);
????????????success?=?true;

????????}?catch?(Exception?e)?
{
????????????//e.printStackTrace();
????????????throw?e;
????????}

????????finally?
{
????????????Login.closeStatement(stat);
????????????Login.closeConnection(con);
????????}

????????return?success;
????}
}

關于dojo.io.bind的學習筆記
模塊:dojo.io.IO
dojo.io.bind
處理請求取回需要的數據并處理
?
這個函數是AJAX中最為重要和有用的函數,dojo.io.bind這個類是用來處理客戶端與服務器間通訊的,需要通訊的參數由對象dojo.io.Request所定義,具體通訊的方法則由另外一個對象Transport所提供。
?
因此,我們如果需要與服務器通訊,則應該定義一個Request對象,其中包括服務器地址及回調函數,例子中Requset都是以匿名對象方式定義的
雖然我們可以定義一個自己的Transport,但是顯然不如直接利用現成的Transport方便。
Dojo里提供了一個同時兼容IE和Firefox的dojo.io.XMLHTTPTransport,但是這個對象位于dojo.io.BrowserIO,因此,一般require dojo.io.IO時,還應該require dojo.io.BrowserIO
?
Usage Example:
? dojo.io.bind({
??? url: "http://localhost/test.html", //要請求的頁面地址
??? mimetype: "text/html", //請求的頁面的類型,應該設置為與你請求頁面類型對應的mimetype,默認為 "text/plain"
??? method:"GET", //默認為"GET"
??? sync: false, //默認為異步執行
??? useCache: false, //默認為不使用頁面緩存,注意這里的緩存并不是瀏覽器的緩存,而是Dojo自身所維護的頁面緩存
??? preventCache: false, //默認為啟用瀏覽器緩存,否則將通過自動增加不同的參數來確保瀏覽器緩存失效
??? timeoutSeconds: 3000,? //3秒后超時,如果為0則永不超時
??? load: function(type, data, evt) { alert(data); }, //type should be "load", data is that we wanted
??? error: function(type, error) { alert(error.message); }, //error is dojo.io.Error
??? timeout: function(type) { alert("請求超時!"); }
? });
? 你也可以用一個handle來處理所有的事件
?
? dojo.io.bind({
??? url: "http://localhost/test.html", //要請求的頁面地址
??? mimetype: "text/html", //請求的頁面的類型,應該設置為與你請求頁面類型對應的mimetype
??? timeoutSeconds: 3000,? //3秒后超時,如果為0則永不超時
??? handle: function(type, data, evt){
????? if(type == "load") { alert(data); } //data is that we wanted
????? else if (type == "error") { alert(data.message); } //data is the error object
????? else { ; } //other events maybe need handled
??? }
? });
?
? 如果沒有在Request中指定所用的transport,則Dojo會自動的在已注冊的transports中尋找能夠處理這個Request的transport,如果不能找到,則返回指定的Request。下面是一個指定了transport的例子:
? dojo.io.bind({
??? url: "http://localhost/test.html", //要請求的頁面地址
??? mimetype: "text/html", //請求的頁面的類型,應該設置為與你請求頁面類型對應的mimetype
??? timeoutSeconds: 3000,? //3秒后超時,如果為0則永不超時
??? transport: "XMLHTTPTransport",
??? load: function(type, data, evt) { alert(data); }, //type should be "load", data is that we wanted
??? error: function(type, error) { alert(error.message); }, //error is dojo.io.Error
??? timeout: function(type) { alert("請求超時!"); }
? });
? 你還可以利用bind來得到一個JavaScript所定義的對象(注意mimetype必須要定義為"text/javascript")
?
? testObj = dojo.io.bind({
??? url: "http://localhost/test.js", //test.js里定義了一個對象
??? mimetype: "text/javascript", //請求的頁面的類型,應該設置為與你請求頁面類型對應的mimetype
??? timeoutSeconds: 3000,? //3秒后超時,如果為0則永不超時
??? handle: function(type, data, evt){
????? if(type == "load") { alert(data); } //data is a object or value
????? else if (type == "error") { alert(data.message); } //data is the error object
????? else { ; } //other events maybe need handled
??? }
? });
?
? 下面是一個Post的例子:
?
? dojo.io.bind({
??? url: "http://localhost/test.aspx", //要提交的頁面地址
??? mimetype: "text/html", //請求的頁面的類型,應該設置為與你請求頁面類型對應的mimetype
??? timeoutSeconds: 3000,? //3秒后超時,如果為0則永不超時
??? method: "POST",
??? formNode: dojo.byId("myForm"), //指定提交的Form名稱
??? load: function(type, data, evt) { alert(data); }, //type should be "load", data is that we wanted
??? error: function(type, error) { alert(error.message); }, //error is dojo.io.Error
??? timeout: function(type) { alert("請求超時!"); }
? });
?
? 另一個Post的例子(without Form to post):
? dojo.io.bind({
??? url: "http://localhost/test.aspx", //要提交的頁面地址
??? mimetype: "text/html", //請求的頁面的類型,應該設置為與你請求頁面類型對應的mimetype
??? timeoutSeconds: 3000,? //3秒后超時,如果為0則永不超時
??? method: "POST",
??? content: {a: 1, b: 2}, //要提交的數據
??? load: function(type, data, evt) { alert(data); }, //type should be "load", data is that we wanted
??? error: function(type, error) { alert(error.message); }, //error is dojo.io.Error
??? timeout: function(type) { alert("請求超時!"); }
? });
?
dojo.io.queueBind
? 有時,我們需要一次發出多個網頁請求,則應該使用dojo.io.queueBind,因為瀏覽器可能只允許同時發出有限個數的請求,如果是使用dojo.io.bind的話,則有可能會申請不到新的XMLHttp對象而導致出錯。
? 用法與dojo.io.bind是一樣的。
?
dojo.io.argsFromMap
? 用來把對象轉換為URL的參數形式
?
Usage Example:
? dojo.io.argsFromMap({a:1,b:2,c:3}); //will return "c=3&b=2&a=1"
? dojo.io.argsFromMap({name:"名稱",value:"值"},"utf"); //will return "value=%E5%80%BC&name=%E5%90%8D%E7%A7%B0", 有中文的話應該指定utf格式,否則dojo.string.encodeAscii返回的編碼是很怪異的
? dojo.io.argsFromMap({a:1,b:2,c:3}, "utf", "c"); //will return "b=2&a=1&c=3",最后一個參數可以控制指定名稱的值出現在最后
?
?
dojo.io.setIFrameSrc
? 設置IFrame的Src
?
Usage Example:
?
? dojo.io.setIFrameSrc(dojo.byId("myFrame"), "http://localhost/test.htm"); //myFrame打開指定的網頁
? dojo.io.setIFrameSrc(dojo.byId("myFrame"), "http://localhost/test.htm", true); //myFrame打開指定的網頁,并覆蓋瀏覽器的歷史記錄
?
TODO: 補充一個kwArgs的例子,我之前在網上看見過,可是現在無論如何也找不到相關的頁面了,只好以后在舉例了
?
模塊:dojo.io.BrowserIO
?
基本上就提供了dojo.io.XMLHTTPTransport這個對象
XMLHTTPTransport一般能夠滿足我們的需求,但是其有幾個限制:它不能傳輸文件,不能夠成功執行跨域名的遠程請求,并且不支持 file:// 這樣的協議
因此,根據應用要求,我們可能會需要選用其它的transport: dojo.io.IframeTransport, dojo.io.repubsubTranport, dojo.io.ScriptSrcTransport, ShortBusTransport
?
dojo.io.IframeTransport,用法與xmlhttp是一樣的,其優點就是可以跨域,不存在任何的安全問題
如果Request指定的mimetype是text或javascript,返回的內容應該是放在第一個textarea里的內容,如果指定的mimetype是html,則IFrame里的html則是需要的內容。因為瀏覽器兼容的原因,IframeTransport不能正確處理返回類型為XML的請求。
摘自:http://www.cnblogs.com/Icebird/archive/2006/08/07/dojo_study_6.html