筆者是在SSH項目中實作的Ajax,用于異步驗證使用者輸入的登入名是否已經注冊。以下是相關過程
第一步:建構XMLHttpRequest對象
常見的操作是這樣的
<script language="JavaScript" type="text/JavaScript">
<!- - var xmlHttp;
function createXMLHttpRequest(){
if(window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
} //- ->
</script>
由于不同的浏覽器之間的相容性問題,如IE浏覽器的IE5的XMLHttpRequest對象的建立需要使用Microsoft.XMLHTTP對象,而IE6則需要Msxml2.XMLHTTP對象,而其他浏覽器一般直接使用XMLHttpRequest對象。為了最大限度地相容不同浏覽器的不同版本之間的問題,采用如下方式初始化XMLHttpRequest對象
<script language="JavaScript" type="text/JavaScript">
var xmlHttp = null;
try{
xmlHttp = new XMLHttpRequest();
}catch(msfirstkind){
try{
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); //IE6對象
}catch(mssecondkind){
try{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); //IE5對象
}catch(faild){
xmlHttp = null;
}
}
}
</script>
第二步:建構激發異步驗證的js函數
在事件被激發後,然後調用callBack函數來執行伺服器端的通訊
xmlHttp.open("get/post", uri, true/false, userName, userPwd); //通常前三個參數比較重要,第一個是向伺服器發送請求的類型,第二個參數是伺服器處理請求的action位址,第三個參數是是否通過異步的方式來發送請求。最後兩個是可選參數,用來指定使用者名和密碼。
xmlHttp.onreadystatechange = callback; //注意,這裡調用回調函數一定不能加上括号,否則xmlHttp.status的狀态一直都是1.
xmlHttp.send(NULL); //配合open()函數操作,當open()函數指定了發送請求的方式為get時可以發送字元串,當指定為post時,可以發送XML文檔
第三步:編寫回調函數
function callback(){
if(xmlHttp.readyStatus == 4){//如果已從伺服器收到了完整的響應資料
if(xmlHttp.stats == 200){//當伺服器傳回正确響應時
{
……//更新view層的相關邏輯操作
}
}
}
至此,Ajax的實作流程已經完成,然後,在servlet的java bean或Struts的action中返還相應的驗證結果即可。
以action為例
public String checkUserName() throws Exception{
HttpServletResponse response = ServletActionContext.getResponse(); //獲得HttpServletResponse對象
PrintWriter writer = response.getWriter(); //獲得輸出流,用以向ajax發送資料
if(….){
writer.print("true"); //如果業務邏輯驗證為真,則向ajax發送字元串"true",ajax通過xmlHttp.responseText擷取内容
}
else if(….){
writer.print("false"); //如果業務了邏輯驗證為假,則向ajax發送字元串"false"
}
writer.close();
return SUCCESS;
}
struts.xml檔案配置
…..
<package name="default" class="struts-default">
<actioin name="checkUserName" class="className" method="methodName">
<result name="success">/index.jsp</result>
</action>
</package>