第三个周的任务是用户可以自己在文本框中输入sql语句,点击确定后在当前页面上显示相应的表记录。

 

技术:ajax

实现背景:选择一种类型的数据库后,选择该库中的某个表,再选择该表的某些字段,然后能在当前页上显示了该表的内容,用表格形式显示。

要求:用户输入sql语句后,要对输入的sql语句进行一下语法检查,由于该目的是用户对当前库查询表,所以要有”from“字符串(此检查还不完善需改进)如果用户正确输入语法,但输入的表在当前库中没有,则不能正确执行,亦提示错误。正确输入sql后,即可在当前页面上显示所要的记录。当然对显示的表也要加上相应的表名,这个表名由于是在用户输入的字符串中,所以要通过一个函数来获取才行。下面我都会说下这些具体的判断怎么实现。

实现:要想将正确的sql语句查询出来,已经知道表了,还需二个参数,即当前表所在的库类型,当前库名,这两个参数在前面的任务中已经通过隐藏按钮的name和value值得到了,这样就可以在js中将这三个参数传给相应的jsp页面,运用写出的类对sql语句进行查询了。

调用的jsp页面:

<%@ page import="java.io.*" %>
<%@ page import="java.sql.*" %>
<%@ page import="diyibao.*" %>

<%   
      StrGet ss=new StrGet();
      String databaseStyle= request.getParameter("databasestyle"); 
      String databaseName= request.getParameter("databasename");
      String datasql= request.getParameter("sql");
   String path="";
   String table=ss.Str(datasql);//判断能不能正确返回一个表名,因为我要在显示的表上加一个标题栏来显示当前表的表名。若datasql不包括一个表名,则返回一个"Error!",如有则返回表名。
   
   if( "Error!" == table)
    {
      // out.print("SQL SYNTAX ERROR!");
   out.print("SQL语法错误!");
    }
    else
    {
   
      SQLset example = new SQLset(); 
   String result=example.sqlout(databaseStyle,databaseName,datasql);

//接着看下sql语句能不能正确执行,若能正确执行,则输出一个result,是显示表的字符串。若不能则输出"SQL执行错误!"
   if ( result.equals("Error"))
   {
        //out.print("SQL EXCUTE ERROR!");
      out.print("SQL执行错误!");
   }
   else
   {
     path += "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" ><tr>";  
     path +="<td align=\"left\" style=\"background-color:#FFFFCC\" >";
     path +="<div id=\"titlename\" >";
     path +="<span id=\"edit\"><img id=\"edit\" src=\"images/edit.gif\" onClick=\"javascript:database_show();\"/></span>";
     path +="<span id=\"editname\">";
     path += table;
     path +="</span>";
     path +="</div>";
     //path += "</td><th>";
     path +="<td align=\"right\" style=\"background-color:#FFFFCC\">"; 
     
     //path += "<span id=\"min\"><img id=\"min\" src=\"images/min.gif\"  onclick=\"javascript:contentfade();\"/> </span>";  
     //path += "<span id=\"max\"><img id=\"max\" src=\"images/max.gif\" onclick=\"javascript:contentshow();\"/></span>";
     path += "<span id=\"close\"><img id=\"close\" src=\"images/close.jpg\" onclick=\"javascript:databaseclose();\"/></span>";
     path +="</td>";   
     path += "</tr>";
     path += "<tr>"; 
     path += "<td align=\"center\" colspan=2>"; 
  
     path += result;
     path += "</td>";    
     path += "</tr>";  
     path += "</table>";  
    
     response.setContentType("text/xml");
     out.clear();
    
     out.print(path);
    }
   
  }
   //out.print(example.sqlout(databaseStyle,databaseName,datasql));z
%>

下面是服务器返回jsp页面时js如何接收的问题,看下xmlHttp_sql.responseText的内容是什么,如果有上述的两个错误之一,则弹出alert(xmlHttp_sql.responseText),这样就可以重新写sql语句。如果没什么错误码就正确在特定的位置显示jsp页面的结果。

function handleStateChange_sql(){
 if(xmlHttp_sql.readyState==4){//请求完成
 //alert("ok");
     if(xmlHttp_sql.status==200){//成功得到请求内容
      
    if("SQL语法错误!" == xmlHttp_sql.responseText.trim() || "SQL执行错误!" == xmlHttp_sql.responseText.trim())
    {
         alert(xmlHttp_sql.responseText.trim());
    }
   else  
   {
   document.getElementById("grp3").innerHTML=xmlHttp_sql.responseText;  
   }

注意这里有一个问题就是从服务器上返回的字符串前后都有特殊的不显示的字符,("SQL语法错误!" == xmlHttp_sql.responseText.trim() || "SQL执行错误!" == xmlHttp_sql.responseText.trim())这句在调试的时候老是不能正确回应,即xmlHttp_sql.responseText的内容确定是"SQL执行错误!",但两者比较的时候也不相同。原来就是返回的字符串含有不显示字符的问题。使用函数把服务器返回的字符串前后的字符去掉主可以正确接收了。

用到的函数:String.prototype.trim = function() //这句的意思时在字符串原型中添加一个自定义的trim函数
{
    return this.replace(/(^[\s]*)|([\s]*$)/g, "");
 //含义是去掉字符串前面的空白字符和后面的空白字符
 
}