亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

如何直接在瀏覽器內運行SQL命令

2019-11-18 19:57:52
字體:
來源:轉載
供稿:網友
  本文示范了如何用一個java Servlet、一個jsp頁面和一個靜態Java類構造出一個SQL網關應用。利用這個應用,你可以直接在瀏覽器內執行SQL命令,瀏覽器將把SQL命令提交給遠程服務器上的數據庫系統,然后返回結果。

  如果你正在使用ISP(Internet Service PRovider)提供的數據庫,可能已經熟悉SQL網關應用的概念了。有的ISP會提供一個操作數據庫的HTML頁面,就象本文提供的網關應用一樣。如果ISP沒有提供這樣的界面,你可以把本文的程序上載到服務器,以后要訪問ISP服務器上的數據庫就很方便了。

  SQL網關應用不僅可以用于開發過程,而且還可以直接提供給比較熟悉系統的最終用戶使用。當然,允許最終用戶直接在數據庫上運行SQL命令會帶來一些安全隱患,應當慎重考慮。

  本文要求讀者具備一定的Java、Servlet、JSP和數據庫的基礎知識,如果要運行本文的程序,還要有一個Servlet/JSP服務器和數據庫服務器。在下面的說明中,我們要使用的是Tomcat 4.0和MySQL,但它應該也能在其他JSP/Servlet容器中運行;如果你要改用MySQL之外的其他數據庫,只要提供一個適當的驅動程序,然后修改數據庫連接字符串就可以了。

  一、用戶界面

  圖1就是本文SQL網關的用戶界面。在這個界面中,SQL網關已經執行了一條SQL命令并返回了結果。



圖1:SQL網關的用戶界面


  從圖1可以看出,頁面底部的一條信息顯示出最近執行的SQL命令影響的行數。如果SQL命令是一個SELECT語句,當SELECT語句執行成功,頁面底部將用HTML表格顯示出查詢結果,如圖二所示。



圖2:HTML表格顯示出查詢結果集


  當然,如果SQL命令執行失敗,SQL網關將返回異常信息。

  二、設計JSP頁面

  在JSP頁面中,我們首先放入一個Scriptlet,它的功能是從session對象提取兩個屬性:

<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"><%    String sqlStatement=(String)session.getAttribute("sqlStatement");   if (sqlStatement == null)    sqlStatement = "";   String message =  (String) session.getAttribute("message");   if (message == null)  message = "";%>


  第一個屬性sqlStatement 表示SQL命令字符串,第二個屬性message 是包含結果信息的字符串。如果這兩個屬性的值是null,則表示它們尚未被設置,我們把sqlStatement和message變量設置成空字符串。

  JSP頁面還有一個HTML表單,HTML表單包含一個文本區域(TEXTAREA)和一個“執行”按鈕。

<form action="../servlet/test.SQLGatewayServlet" method="post"><b>SQL命令:</b><br><textarea name="sqlStatement" cols=60 rows=8><%=sqlStatement%></textarea><br><br><input type="submit" value="執行"></form>


  表單中的文本區域用來輸入SQL命令。我們將sqlStatement變量的值作為文本區域的默認內容,文本區域的大小是寬60字符、高8行。當JSP頁面第一次運行時,這個文本區域的內容為空。如果用戶點擊文本區域下面的“執行”按鈕,JSP頁面把表單內容提交給SQLGatewayServlet(稍后再詳細介紹)。

  JSP頁面底部的表格顯示出message字符串的內容。如前所述,message的內容是運行SQL命令的結果。

<b>SQL命令執行結果:</b><br><table cellpadding="5" border="1"><%=message%></table>


  三、編寫Servlet

  SQLGatewayServlet首先導入java.sql包以便使用JDBC類。另外,它還要聲明一個Connection對象,以便Servlet之內的所有方法都可以使用數據庫連接。

package test;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.sql.*;public class SQLGatewayServlet extends HttpServlet{    private Connection connection;


  當Servlet引擎開始運行這個Servlet,Servlet的init方法就打開一個數據庫連接:

public void init() throws ServletException{    try{        Class.forName("org.gjt.mm.mysql.Driver");        String dbURL = "jdbc:mysql://localhost/murach";        String username = "root";        String passWord = "";        connection = DriverManager.getConnection	(dbURL, username, password);    }    catch(ClassNotFoundException e){        System.out.println("找不到數據庫驅動程序.");    }    catch(SQLException e){        System.out.println("不能打開數據庫連接: "                           + e.getMessage());    }}


  在這個例子中,Servlet利用一個MysQL數據庫的驅動程序打開murach數據庫的連接,數據庫和Servlet運行在同一個服務器上。此外,Servlet使用MySQL的默認用戶名字root,密碼為空。不過,你可以修改這里的代碼,只要有適當的驅動程序,就可以讓Servlet連接到任何服務器上的任何數據庫(有關MySQL數據庫的更多信息,請參見www.mysql.com)。

  Servlet引擎關閉Servlet之前,調用destroy方法關閉數據庫連接,釋放連接資源:

public void destroy() {    try{        connection.close();    }    catch(SQLException e){        System.out.println("不能關閉數據庫連接: " + e.getMessage());    }}


  前面介紹的JSP頁面要調用Servlet的doPost方法,doPost方法調用doGet方法:

public void doPost(HttpServletRequest request,                   HttpServletResponse response)                   throws IOException, ServletException{     doGet(request, response); }


  在doGet方法之中,第一個語句首先獲取用戶在JSP頁面中輸入的SQL命令,第二個語句聲明message變量:

public void doGet(HttpServletRequest request,                   HttpServletResponse response)                   throws IOException, ServletException{     String sqlStatement = request.getParameter("sqlStatement");     String message = "";


  然后,在try塊之內,第一個語句利用Connection對象創建Statement對象,接下來的兩個語句利用String對象的trim方法和substring方法返回用戶輸入的SQL命令的前六個字符。

try{     Statement statement = connection.createStatement();     sqlStatement = sqlStatement.trim();     String sqlType = sqlStatement.substring(0, 6);


  如果SQL命令的前六個字符是“select”,則利用Statement的executeQuery方法執行SQL語句,獲得一個ResultSet對象,把這個對象傳遞給SQLUtil類(稍后詳細說明)的getHtmlRows方法,getHtmlRows方法將把記錄集中的記錄格式化成HTML表格并返回。

if  (sqlType.equalsIgnoreCase("select")){     ResultSet resultSet = statement.executeQuery(sqlStatement);     // 構造一個String,其中包含HTML表格形式的結果集數據     message = SQLUtil.getHtmlRows(resultSet); }


  如果SQL語句的前六個字符不是“select”,則我們調用Statement對象的executeUpdate方法,executeUpdate方法返回當前操作影響的行數——如果這個數字是0,則該SQL命令是一個DDL命令,例如DROP TABLE或CREATE TABLE等;否則,則表明SQL命令可能是DML命令,如INSERT、UPDATE或DELETE命令。無論是哪一種SQL命令,我們都把message變量設置成相應的消息。

else     {         int i = statement.executeUpdate(sqlStatement);         if (i == 0) // 這是一個DDL命令           message =             "<tr><td>" +               "命令執行成功." +             "</td></tr>";         else // 這是一個INSERT、UPDATE或DELETE命令             message =               "<tr><td>" +                 "SQL命令執行成功。<br>" +                 "已更改" + i + " 行。" +                "</td></tr>";     }     statement.close(); }


  如果try塊里面的任何一個語句拋出一個SQLException,catch塊就設置message變量,使其包含有關該SQLException的信息。例如,如果在表單中輸入的SQL命令語法錯誤,下面設置的message變量值將幫助你排解錯誤。

catch(SQLException e){    message = "<tr><td>執行SQL命令時遇到錯誤:<br>"            + e.getMessage() + "</tr></td>";}


  在catch塊之后,接下來的三個語句獲得session對象,把sqlStatement和message變量設置為session的屬性:

HttpSession session = request.getSession(); session.setAttribute("message", message); session.setAttribute("sqlStatement", sqlStatement);


  接下來,最后兩個語句創建一個RequestDispatcher,并轉發request和response對象給前文介紹的JSP頁面:

RequestDispatcher dispatcher =     getServletContext().getRequestDispatcher(         "/sql/sql_gateway.jsp"); dispatcher.forward(request, response);


  四、編寫工具類

  下面來看看工具類SQLUtil的代碼:

package test;import java.sql.*;public class SQLUtil{


  SQLUtil類包含一個getHtmlRows靜態方法,前面的Servlet正是通過調用該方法將結果集格式化成HTML表格。getHtmlRows的輸入參數是一個ResultSet對象,其返回值是一個String對象,這個String對象的內容是記錄集的所有列表題和行的HTML代碼。為了構造出這樣一個String對象,getHtmlRows聲明了一個名為htmlRows的StringBuffer對象,然后在方法執行過程中向這個StringBuffer對象追加數據。在getHtmlRows方法的末尾,我們用toString方法將StringBuffer的內容轉換成String,最后將這個String返回給Servlet:

public static synchronized String getHtmlRows(ResultSet results)throws SQLException{    StringBuffer htmlRows = new StringBuffer();    ResultSetMetaData metaData = results.getMetaData();    int columnCount = metaData.getColumnCount();    // 將記錄集中列的名稱作為HTML表格列的標題    htmlRows.append("<tr>");    for (int i = 1; i <= columnCount; i++)        htmlRows.append("<td><b>" + metaData.getColumnName(i) + "</td>");    htmlRows.append("</tr>");    // 對于結果集中的每一行...    while (results.next()){        htmlRows.append("<tr>");        // 將該行中的每一個列轉換成一個表格單元        for (int i = 1; i <= columnCount; i++)            htmlRows.append("<td>" + results.getString(i) + "</td>");    }    htmlRows.append("</tr>");    return htmlRows.toString();}


  為了獲得記錄集對象的列標題,getHtmlRows方法利用ResultSet的getMetaData方法來創建一個ResultSetMetaData對象,ResultSetMetaData對象包含了有關記錄集的描述信息,例如列的數量、列的名稱可以分別調用ResultSetMetaData的getColumnCount和getColumnName方法獲得。

  為了提取記錄集的數據,getHtmlRows方法利用一個嵌套的循環,即while循環里面嵌套的for循環,來提取每一個行里面每一個列的值。在循環之內,我們用記錄集的getString方法來獲取各個字段的值,不管字段值原來的類型是什么,getString方法都會將它轉換成String。

  請注意這個方法的聲明中帶有synchronized關鍵詞,這是為了避免兩個或兩個以上的Servlet線程同時執行該方法。

  下載本文的代碼:SqlGateway_code.zip

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av综合中文字幕| 日韩欧美在线国产| 亚洲国产欧美精品| 在线播放日韩av| 欧美在线观看日本一区| 国产精品白丝jk喷水视频一区| 国产一区二区视频在线观看| 久久视频在线看| 亚洲国产精品电影在线观看| 国产精品极品在线| 中文日韩电影网站| 亚洲精品网站在线播放gif| 亚洲天堂免费视频| 欧美午夜精品久久久久久人妖| 日韩一级裸体免费视频| 久久理论片午夜琪琪电影网| 国产999精品久久久| 欧美精品激情在线| 成人啪啪免费看| 欧美电影免费播放| 欧美高清电影在线看| 91精品视频在线免费观看| 欧美日韩午夜剧场| 亚洲视频自拍偷拍| 成人激情在线观看| 国产美女精品免费电影| 成人免费在线视频网站| 国模视频一区二区| 欧美精品日韩三级| 亚洲xxxxx性| 亚洲精品一区av在线播放| 国产精品99免视看9| 国产成人精品久久亚洲高清不卡| 亚洲专区在线视频| 色999日韩欧美国产| 国产亚洲精品一区二555| 精品久久中文字幕久久av| 久久福利视频网| 国产主播欧美精品| 97精品一区二区视频在线观看| 亚洲激情电影中文字幕| 国产高清在线不卡| 欧美华人在线视频| 欧美性videos高清精品| 九九热这里只有精品6| 国产精品一区二区久久久久| 亚洲а∨天堂久久精品9966| 久久久国产一区二区三区| 久久久www成人免费精品| 成人免费大片黄在线播放| 欧日韩在线观看| 国产精品久久9| 亚洲 日韩 国产第一| 亚洲国产婷婷香蕉久久久久久| 久久91亚洲精品中文字幕| 日韩欧美在线观看视频| 国模gogo一区二区大胆私拍| 国产成人一区二| 欧美性生活大片免费观看网址| 国产精品伦子伦免费视频| 国产日韩换脸av一区在线观看| 欧美激情a∨在线视频播放| 97在线观看免费| 91国产精品视频在线| 91精品国产色综合久久不卡98口| 最好看的2019年中文视频| 91麻豆桃色免费看| 亚洲精品av在线| 精品一区二区电影| 日本精品视频在线| 91久久在线观看| 亚洲精品日韩丝袜精品| 亚洲国产成人精品久久久国产成人一区| 国产视频在线一区二区| 国产精品欧美日韩| 精品国产一区二区三区久久狼5月| 色中色综合影院手机版在线观看| 日韩在线视频观看正片免费网站| 91视频免费在线| 日韩高清欧美高清| 久久国产精品久久久| 日韩视频免费观看| 国产精品高清网站| 国产精品美女无圣光视频| 久久国产精品影视| 亚洲国产成人精品女人久久久| 日韩在线免费观看视频| 欧美日韩在线影院| 亚洲色图五月天| 日韩中文字幕国产| 精品久久中文字幕| 日韩中文字幕国产| 第一福利永久视频精品| 18一19gay欧美视频网站| 国产精品久久久久久中文字| 日韩av中文在线| 亚洲aaa激情| 欧美限制级电影在线观看| 亚洲人成欧美中文字幕| 久久亚洲影音av资源网| 福利精品视频在线| 久久久国产视频91| 狠狠久久五月精品中文字幕| 88国产精品欧美一区二区三区| 日韩一区二区三区xxxx| 国产精品久久色| 日韩欧美亚洲一二三区| 日韩有码在线观看| 亚洲激情视频网站| 亚洲а∨天堂久久精品9966| 亚洲深夜福利视频| 亚洲va欧美va国产综合剧情| 爽爽爽爽爽爽爽成人免费观看| 69视频在线免费观看| 岛国精品视频在线播放| 亚洲国产三级网| 久久精品91久久香蕉加勒比| 欧美中文字幕视频| 日韩高清a**址| 亚洲精品国精品久久99热一| 国产精品91久久| 欧美视频13p| 91色视频在线观看| 欧美性猛交xxxx黑人猛交| 欧美激情精品久久久久久免费印度| 欧美日韩国产一中文字不卡| 亚洲天堂男人的天堂| 一本久久综合亚洲鲁鲁| 久久激情视频久久| 亚洲无av在线中文字幕| 亚洲精品久久久久久久久久久久| 午夜欧美不卡精品aaaaa| 热久久美女精品天天吊色| 国产精品丝袜视频| 日韩欧美视频一区二区三区| 欧美丰满老妇厨房牲生活| 日韩亚洲欧美中文在线| 亚洲自拍中文字幕| 欧美高跟鞋交xxxxxhd| 日韩欧美aⅴ综合网站发布| 日韩精品久久久久久久玫瑰园| 亚洲美女在线视频| 91成人精品网站| 97婷婷涩涩精品一区| 欧美成人激情图片网| 欧美日韩亚洲国产一区| 亚洲第一综合天堂另类专| 日本国产欧美一区二区三区| 久久免费在线观看| 97免费中文视频在线观看| 欧美性生交xxxxx久久久| 日韩风俗一区 二区| 色噜噜亚洲精品中文字幕| 色哟哟网站入口亚洲精品| 精品国产网站地址| 国产精品稀缺呦系列在线| 国产精品极品美女粉嫩高清在线| 日韩精品极品视频免费观看| 亚洲人成在线播放| 日韩精品免费综合视频在线播放| 国产精品久久久久高潮| 欧美激情亚洲国产| 日韩精品在线观看一区| 91在线观看免费高清完整版在线观看|