大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> JSP专区 -> 如何直接在浏览器内运行SQL命令

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

时间: 2021-07-31 作者:daque

  正文演示了怎样用一个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网关的用户界面

如何直接在浏览器内运行sql命令图1

  从图1不妨看出,页面底部的一条消息表露出迩来实行的sql吩咐感化的行数。即使sql吩咐是一个select语句,当select语句实行胜利,页面底部将用html表格表露出查问截止,如图二所示。

图2:html表格表露出查问截止集

如何直接在浏览器内运行sql命令图2

  固然,即使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。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.