|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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>- <!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)和一个“实行”按钮。
- <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命令的了局。
- <b>SQL命令实行了局:</b><br><tablecellpadding="5"border="1"><%=message%></table>
复制代码
3、编写Servlet
SQLGatewayServlet起首导进java.sql包以便利用JDBC类。别的,它还要声明一个Connection对象,以便Servlet以内的一切办法都可使用数据库毗连。
- packagetest;importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;importjava.sql.*;publicclassSQLGatewayServletextendsHttpServlet{privateConnectionconnection;
复制代码
当Servlet引擎入手下手运转这个Servlet,Servlet的init办法就翻开一个数据库毗连:
- 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办法封闭数据库毗连,开释毗连资本:
- publicvoiddestroy(){try{connection.close();}catch(SQLExceptione){System.out.println("不克不及封闭数据库毗连:"+e.getMessage());}}
复制代码
后面先容的JSP页面要挪用Servlet的doPost办法,doPost办法挪用doGet办法:
- publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{doGet(request,response);}
复制代码
在doGet办法当中,第一个语句起首猎取用户在JSP页面中输出的SQL命令,第二个语句声明message变量:
- publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{StringsqlStatement=request.getParameter("sqlStatement");Stringmessage="";
复制代码
然后,在try块以内,第一个语句使用Connection对象创立Statement对象,接上去的两个语句使用String对象的trim办法和substring办法前往用户输出的SQL命令的前六个字符。
- try{Statementstatement=connection.createStatement();sqlStatement=sqlStatement.trim();StringsqlType=sqlStatement.substring(0,6);
复制代码
假如SQL命令的前六个字符是“select”,则使用Statement的executeQuery办法实行SQL语句,取得一个ResultSet对象,把这个对象传送给SQLUtil类(稍后具体申明)的getHtmlRows办法,getHtmlRows办法将把纪录会合的纪录格局化成HTML表格并前往。
- 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变量设置成响应的动静。
- 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变量值将匡助你排遣毛病。
- catch(SQLExceptione){message="<tr><td>实行SQL命令时碰到毛病:<br>"+e.getMessage()+"</tr></td>";}
复制代码
在catch块以后,接上去的三个语句取得session对象,把sqlStatement和message变量设置为session的属性:
- HttpSessionsession=request.getSession();session.setAttribute("message",message);session.setAttribute("sqlStatement",sqlStatement);
复制代码
接上去,最初两个语句创立一个RequestDispatcher,并转发request和response对象给前文先容的JSP页面:
- RequestDispatcherdispatcher=getServletContext().getRequestDispatcher("/sql/sql_gateway.jsp");dispatcher.forward(request,response);
复制代码
4、编写工具类
上面来看看工具类SQLUtil的代码:
- packagetest;importjava.sql.*;publicclassSQLUtil{
复制代码
SQLUtil类包括一个getHtmlRows静态办法,后面的Servlet恰是经由过程挪用该办法将了局集格局化成HTML表格。getHtmlRows的输出参数是一个ResultSet对象,其前往值是一个String对象,这个String对象的内容是纪录集的一切列表题和行的HTML代码。为了机关出如许一个String对象,getHtmlRows声了然一个名为htmlRows的StringBuffer对象,然后在办法实行过程当中向这个StringBuffer对象追加数据。在getHtmlRows办法的开端,我们用toString办法将StringBuffer的内容转换成String,最初将这个String前往给Servlet:
- 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语言的团队,是微软重金挖过去的啊 |
|