仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1795|回复: 18
打印 上一主题 下一主题

[学习教程] JAVA教程之怎样间接在扫瞄器内运转SQL命令

[复制链接]
蒙在股里 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:40:04 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
为什么外国人还要写那些框架进行代码封装,他们不就是为了别人使用时可以更简单么!如果要达到一个企业级项目的不用框架是很难的。小一些的项目还行,大的光是MVC模式的设计的编码量就够大的了。还有性能方面,单轮windows,这个工具是微软写的,。扫瞄器
  本文树模了怎样用一个JavaServlet、一个JSP页面和一个静态Java类机关出一个SQL网关使用。使用这个使用,你能够间接在扫瞄器内实行SQL命令,扫瞄器将把SQL命令提交给远程服务器上的数据库体系,然后前往了局。

  假如你正在利用ISP(InternetServiceProvider)供应的数据库,大概已熟习SQL网关使用的观点了。有的ISP会供应一个操纵数据库的HTML页面,就象本文供应的网关使用一样。假如ISP没有供应如许的界面,你能够把本文的程序上载到服务器,今后要会见ISP服务器上的数据库就很便利了。

  SQL网关使用不但能够用于开辟历程,并且还能够间接供应给对照熟习体系的终极用户利用。固然,同意终极用户间接在数据库上运转SQL命令会带来一些平安隐患,应该稳重思索。

  本文请求读者具有必定的Java、Servlet、JSP和数据库的基本常识,假如要运转本文的程序,还要有一个Servlet/JSP服务器和数据库服务器。鄙人面的申明中,我们要利用的是Tomcat4.0和MySQL,但它应当也能在其他JSP/Servlet容器中运转;假如你要改用MySQL以外的其他数据库,只需供应一个得当的驱动程序,然后修正数据库毗连字符串就能够了。

  1、用户界面

  就是本文SQL网关的用户界面。在这个界面中,SQL网关已实行了一条SQL命令并前往了却果。


<br>

:SQL网关的用户界面

  从能够看出,页面底部的一条信息显现出比来实行的SQL命令影响的行数。假如SQL命令是一个SELECT语句,当SELECT语句实行乐成,页面底部将用HTML表格显现出查询了局,如图二所示。


<br>

:HTML表格显现出查询了局集

  固然,假如SQL命令实行失利,SQL网关将前往非常信息。

  2、计划JSP页面

  在JSP页面中,我们起首放进一个Scriptlet,它的功效是从session对象提取两个属性:

ffffffcellPadding=2width=540align=centerborderColorLight=blackborder=1>
  1. <!doctypehtmlpublic"-//W3C//DTDHTML4.0Transitional//EN"><%StringsqlStatement=(String)session.getAttribute("sqlStatement");if(sqlStatement==null)sqlStatement="";Stringmessage=(String)session.getAttribute("message");if(message==null)message="";%>
复制代码

  第一个属性sqlStatement暗示SQL命令字符串,第二个属性message是包括了局信息的字符串。假如这两个属性的值是null,则暗示它们还没有被设置,我们把sqlStatement和message变量设置成空字符串。

  JSP页面另有一个HTML表单,HTML表单包括一个文本地区(TEXTAREA)和一个“实行”按钮。
  1. <formaction="../servlet/test.SQLGatewayServlet"method="post"><b>SQL命令:</b><br><textareaname="sqlStatement"cols=60rows=8><%=sqlStatement%></textarea><br><br><inputtype="submit"value="实行"></form>
复制代码

  表单中的文本地区用来输出SQL命令。我们将sqlStatement变量的值作为文本地区的默许内容,文本地区的巨细是宽60字符、高8行。当JSP页面第一次运转时,这个文本地区的内容为空。假如用户点击文本地区上面的“实行”按钮,JSP页面把表单内容提交给SQLGatewayServlet(稍后再具体先容)。

  JSP页面底部的表格显现出message字符串的内容。如前所述,message的内容是运转SQL命令的了局。
  1. <b>SQL命令实行了局:</b><br><tablecellpadding="5"border="1"><%=message%></table>
复制代码

  3、编写Servlet

  SQLGatewayServlet起首导进java.sql包以便利用JDBC类。别的,它还要声明一个Connection对象,以便Servlet以内的一切办法都可使用数据库毗连。
  1. packagetest;importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;importjava.sql.*;publicclassSQLGatewayServletextendsHttpServlet{privateConnectionconnection;
复制代码

  当Servlet引擎入手下手运转这个Servlet,Servlet的init办法就翻开一个数据库毗连:
  1. publicvoidinit()throwsServletException{try{Class.forName("org.gjt.mm.mysql.Driver");StringdbURL="jdbc:mysql://localhost/murach";Stringusername="root";Stringpassword="";connection=DriverManager.getConnection(dbURL,username,password);}catch(ClassNotFoundExceptione){System.out.println("找不到数据库驱动程序.");}catch(SQLExceptione){System.out.println("不克不及翻开数据库毗连:"+e.getMessage());}}
复制代码

  在这个例子中,Servlet使用一个MysQL数据库的驱动程序翻开murach数据库的毗连,数据库和Servlet运转在统一个服务器上。别的,Servlet利用MySQL的默许用户名字root,暗码为空。不外,你能够修正这里的代码,只需有得当的驱动程序,就能够让Servlet毗连就任何服务器上的任何数据库(有关MySQL数据库的更多信息,请拜见www.mysql.com)。

  Servlet引擎封闭Servlet之前,挪用destroy办法封闭数据库毗连,开释毗连资本:
  1. publicvoiddestroy(){try{connection.close();}catch(SQLExceptione){System.out.println("不克不及封闭数据库毗连:"+e.getMessage());}}
复制代码

  后面先容的JSP页面要挪用Servlet的doPost办法,doPost办法挪用doGet办法:
  1. publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{doGet(request,response);}
复制代码

  在doGet办法当中,第一个语句起首猎取用户在JSP页面中输出的SQL命令,第二个语句声明message变量:
  1. publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{StringsqlStatement=request.getParameter("sqlStatement");Stringmessage="";
复制代码

  然后,在try块以内,第一个语句使用Connection对象创立Statement对象,接上去的两个语句使用String对象的trim办法和substring办法前往用户输出的SQL命令的前六个字符。
  1. try{Statementstatement=connection.createStatement();sqlStatement=sqlStatement.trim();StringsqlType=sqlStatement.substring(0,6);
复制代码

  假如SQL命令的前六个字符是“select”,则使用Statement的executeQuery办法实行SQL语句,取得一个ResultSet对象,把这个对象传送给SQLUtil类(稍后具体申明)的getHtmlRows办法,getHtmlRows办法将把纪录会合的纪录格局化成HTML表格并前往。
  1. if(sqlType.equalsIgnoreCase("select")){ResultSetresultSet=statement.executeQuery(sqlStatement);//机关一个String,个中包括HTML表格情势的了局集数据message=SQLUtil.getHtmlRows(resultSet);}
复制代码

  假如SQL语句的前六个字符不是“select”,则我们挪用Statement对象的executeUpdate办法,executeUpdate办法前往以后操纵影响的行数――假如这个数字是0,则该SQL命令是一个DDL命令,比方DROPTABLE或CREATETABLE等;不然,则标明SQL命令多是DML命令,如INSERT、UPDATE或DELETE命令。不管是哪种SQL命令,我们都把message变量设置成响应的动静。
  1. else{inti=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变量值将匡助你排遣毛病。
  1. catch(SQLExceptione){message="<tr><td>实行SQL命令时碰到毛病:<br>"+e.getMessage()+"</tr></td>";}
复制代码

  在catch块以后,接上去的三个语句取得session对象,把sqlStatement和message变量设置为session的属性:
  1. HttpSessionsession=request.getSession();session.setAttribute("message",message);session.setAttribute("sqlStatement",sqlStatement);
复制代码

  接上去,最初两个语句创立一个RequestDispatcher,并转发request和response对象给前文先容的JSP页面:
  1. RequestDispatcherdispatcher=getServletContext().getRequestDispatcher("/sql/sql_gateway.jsp");dispatcher.forward(request,response);
复制代码

  4、编写工具类

  上面来看看工具类SQLUtil的代码:
  1. packagetest;importjava.sql.*;publicclassSQLUtil{
复制代码

  SQLUtil类包括一个getHtmlRows静态办法,后面的Servlet恰是经由过程挪用该办法将了局集格局化成HTML表格。getHtmlRows的输出参数是一个ResultSet对象,其前往值是一个String对象,这个String对象的内容是纪录集的一切列表题和行的HTML代码。为了机关出如许一个String对象,getHtmlRows声了然一个名为htmlRows的StringBuffer对象,然后在办法实行过程当中向这个StringBuffer对象追加数据。在getHtmlRows办法的开端,我们用toString办法将StringBuffer的内容转换成String,最初将这个String前往给Servlet:
  1. publicstaticsynchronizedStringgetHtmlRows(ResultSetresults)throwsSQLException{StringBufferhtmlRows=newStringBuffer();ResultSetMetaDatametaData=results.getMetaData();intcolumnCount=metaData.getColumnCount();//将纪录会合列的称号作为HTML表格列的题目htmlRows.append("<tr>");for(inti=1;i<=columnCount;i++)htmlRows.append("<td><b>"+metaData.getColumnName(i)+"</td>");htmlRows.append("</tr>");//关于了局会合的每行...while(results.next()){htmlRows.append("<tr>");//将该行中的每个列转换成一个表格单位for(inti=1;i<=columnCount;i++)htmlRows.append("<td>"+results.getString(i)+"</td>");}htmlRows.append("</tr>");returnhtmlRows.toString();}
复制代码

  为了取得纪录集对象的列题目,getHtmlRows办法使用ResultSet的getMetaData办法来创立一个ResultSetMetaData对象,ResultSetMetaData对象包括了有关纪录集的形貌信息,比方列的数目、列的称号能够分离挪用ResultSetMetaData的getColumnCount和getColumnName办法取得。

  为了提取纪录集的数据,getHtmlRows办法使用一个嵌套的轮回,即while轮回内里嵌套的for轮回,来提取每个行内里每个列的值。在轮回以内,我们用纪录集的getString办法来猎取各个字段的值,不论字段值本来的范例是甚么,getString办法城市将它转换成String。

  请注重这个办法的声明中带有synchronized关头词,这是为了不两个或两个以上的Servlet线程同时实行该办法。

  下载本文的代码:SqlGateway_code.zip。




C#是盗用了Java的源代码,仿照开发的,原因是Java是开源的啊,盗了也白盗,还有一点,开发C#语言的团队是就是开发Java语言的团队,是微软重金挖过去的啊
蒙在股里 该用户已被删除
沙发
 楼主| 发表于 2015-2-6 16:10:19 | 显示全部楼层
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-6 21:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表