如何直接在浏览器内运行SQL命令

浏览器

  本文示范了如何用一个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对象提取两个属性:

ffffff cellPadding=2 width=540 align=center borderColorLight=black border=1>

<!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。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索sql
, 数据库
, servlet
, 命令
, 方法
, jsp+表单+sql
, 一个
SQL命令
运行ie浏览器命令、sql 运行存储过程命令、运行sql命令行、命令行运行sql文件、oracle运行sql命令行,以便于您获取更多的相关知识。

时间: 2024-08-05 11:49:17

如何直接在浏览器内运行SQL命令的相关文章

python脚本内运行linux命令的方法

  本文实例讲述了python脚本内运行linux命令的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 #/usr/bin/env python import subprocess class RunCmd(object): def cmd_run(self, cmd): self.cmd = cmd subprocess.call(self.cmd, shell=True) #Sample usage a = RunCmd() a.cmd_run('ls

使用SQL Server代理运行CmdExec命令

需求:调用网服务器(SMS SQL Server)上的短信发送接口(是一个存储过程)来发送(Stage SQL Server)上的数据内容到本Team 成员的手机上.这两台服务器,本地在拨VPN后可以访问.要求以本地的SQL Server做跳转,同时调用这两台服务器的数据接口. 实现方法与步骤(在本地的SQL Server环境): 1.创建一个SQL Server Job 2.创建一个调用 操作系统(CmdExec)命令的Job步骤,调用命令以完成自动拨VPN的功能. 代码如: rasdial

dedecms SQL命令运行器批量替换指定字符串例子

查询指定 archives 表 select * from 你的表前缀_archives limit 1 这个表是主表了,我们查询一条出来看看,结果如下 运行SQL:select * from 你的表前缀_archives where id =1466,共有1条记录,最大返回100条! 记录:1 id:1466 typeid:110 typeid2:0 sortrank:1238913636 flag:c,p ismake:1 channel:1 arcrank:0 click:33119 mo

《PHP和MySQL Web开发从新手到高手(第5版)》一一2.2 使用phpMyAdmin运行SQL查询

2.2 使用phpMyAdmin运行SQL查询 PHP和MySQL Web开发从新手到高手(第5版) 如同Web服务器设计响应来自客户端(一个Web浏览器)的请求一样,MySQL数据库服务器会响应来自客户端程序(client programs)的请求.在本书稍后的内容中,我们将以PHP脚本的形式编写自己的MySQL客户端程序.但是现在,我们可以使用XAMPP和MAMP二者都有的一个客户端程序,这就是phpMyAdmin. phpMyAdmin本身是用PHP编写的.一个高级的Web应用程序.除了包

《PHP和MySQL Web开发从新手到高手(第5版)》一2.2 使用phpMyAdmin运行SQL查询

2.2 使用phpMyAdmin运行SQL查询 PHP和MySQL Web开发从新手到高手(第5版) 如同Web服务器设计响应来自客户端(一个Web浏览器)的请求一样,MySQL数据库服务器会响应来自客户端程序(client programs)的请求.在本书稍后的内容中,我们将以PHP脚本的形式编写自己的MySQL客户端程序.但是现在,我们可以使用XAMPP和MAMP二者都有的一个客户端程序,这就是phpMyAdmin. phpMyAdmin本身是用PHP编写的.一个高级的Web应用程序.除了包

如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码

server|服务器 SQL Server 7.0 数据转换服务 (DTS) 对象传输功能可在两台服务器之间传输登录和用户,但它不传输 SQL Server 验证登录的密码.要从一台运行 SQL Server 7.0 的服务器向另一台运行 SQL Server 7.0 的服务器传输登录和密码,请按照本文"在 Master 数据库中创建和运行存储过程"一节中的说明操作.您将在源服务器上创建 sp_help_revlogin 存储过程.此过程将生成一个脚本,您可以在目标服务器上运行该脚本,

看实例学VFP:用sql命令修改表结构

在看实例学VFP:用sql语句修改数据表记录一文中介绍过用sql语句修改表记录的值,实际vfp中也可以用sql语言中的Alter语句动态的修改表结构.虽然可以实现这样的操作,但是我觉得尽可能还是不要在程序中动态修改表结构,因为这样有可能会造成程序的不稳定以及其它的意外情况. vfp中对表结构的操作主要是增加字段.修改字段.重命名字段和删除字段这四项,sql中修改表结构的语句是Alter语句,那么和这四项操作相对应的Alter语句格式可以总结如下: 增加字段:alter talbe 表名 add

看实例学VFP:用sql命令创建表

本文是一个在vfp中使用sql命令创建表的实例.用sql命令创建表结构的格式如下: create table 表名 (字段名1 类型(宽度[,小数位]),字段名2 类型(宽度[,小数位]),-) 在看实例学VFP:示例数据库一文中已经给出了"网站信息表"的表结构如下表: 字段名 类型 宽度 编号 字符型 5 网站名称 字符型 12 网站网址 字符型 24 那么我要创建相同的表结构并且表名为"网站信息表2"的sql命令如下: create table 网站信息表2 (

Windows XP系统常用的内置AT命令

  AT命令是Windows XP中内置的命令,它也可以媲美Windows中的"计划任务",而且在计划的安排.任务的管理.工作事务的处理方面,AT命令具有更强大更神通的功能.AT命令可在指定时间和日期.在指定计算机上运行命令和程序. 我们可以在"开始→运行"中输入AT命令,下面就来看看AT命令的一些实例分析. 1.定时关机 命令:at 21:00 ShutDown –S –T30 该命令运行后,到了21:00点,电脑会出现"系统关机"对话框,并默