APPLET-SERVLET-DBMS结构的实现

在Internet上实现的WEB应用由于具有统一的用户界面(浏览器)、客户端无须开发任何应用已经成为现在应用程序开发的一个潮流。这种基于Internet的WEB应用一般是以Browser/WEB Server/Database Server三层形式出现,而Java Applet因其强大的功能在网络应用中越来越受流行,成为WEB Browser客户端使用最多的技术之一。一般说来,对数据库的数据存取,从Applet直接存取也是可以的,但是对一个真正的Internet应用,就不可能也不需要为每个WEB Browser客户端保留一个到数据库服务器的连接,因此,必须在数据库和最终的WEB Browser客户端之间的WEB 服务层以实现数据库操作和WEB服务,同时也便于数据库的安全控制。这样,我们就提出了一种Internet数据库应用程序开发的通用结构:APPLET-SERVLET-DBMS结构。 一、APPLET-SERVLET-DBMS结构 APPLET-SERVLET-DBMS结构如下图所示。 其中,应用层为客户机浏览器上运行的Applet应用程序,是用户的操作界面。它和服务层采用URL或SOCKET连接,完成数据交互。 服务层提供支持SERVLET的WEB服务,同时要能访问数据库,因此包含两个部分,即WEB服务和数据库操作。它和应用层采用URL或SOCKET连接,完成数据交互。它和数据库服务层采用JDBC连接,完成数据存取。 数据库服务层提供最终的数据服务。 二、配置: 在实际应用中,我们已经同时在WINDOWS平台和SOLARIS平台下实现了该APPLET-SERVLET-DBMS结构的所有功能。具体的配置如下: 应用客户端: 支持JAVA的浏览器,如IE4/IE5、Netscape或HotJava; 服务器端: Apache HTTP Server Version 1.3 Apache JServ 1.1.2 Oracle JDBC Drivers release 8.0.4.2.0 JDK1.3 数据库端: ORACLE8.0.4 开发工具: JDK1.3 JSDK2.0 所有工具和软件都可以在Internet上找到。 三、源代码示例: 1、取数据库数据 getServlet为SERVLET程序,TestApp为客户测试程序 /********getServlet.java 陈旭东 2000.12.16*******/ import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.net.*; import java.sql.*; public class getServlet extends HttpServlet{ public void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException { String COMMAND=req.getParameter("name"); String id=req.getParameter ("id"); ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(byteOut); //查询数据库 try{ rs=query (ne); }catch (Exception ex) { ex.printStackTrace (); } //发送结果APPLET out.writeUTF(COMMAND); out.writeInt (rs); if (rs>0){ out.writeInt(id); out.writeUTF(name); ... } out.flush(); }else{ out.writeUTF("BAD COMMAND!"); out.flush(); } byte buf[] = byteOut.toByteArray(); DataOutputStream dataout = new DataOutputStream(resp.getOutputStream()); dataout.write(buf); dataout.flush(); dataout.close(); } private int queryNe(NE ne) throws Exception { int columnCount=0; String sqlStr="SELECT ...";//SQL语句 Connection con=null; Statement st=null; ResultSet rs=null; try{ //连接数据库 System.out.println("connecting database..."); DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); con=DriverManager.getConnection ("jdbc:oracle:thin:@server:1521:ORCL", "scott","tiger"); //查询结果 st=con.createStatement (); rs=st.executeQuery(sqlStr); ResultSetMetaData rsmd = rs.getMetaData(); columnCount = rsmd.getColumnCount(); if (rs.next()) { int i=0; id=rs.getInt(i + 1);i++; name=rs.getString(i + 1);i++; ... }; } finally{ try{ if (rs!=null){ rs.close(); } if (st != null){ st.close(); } if (con !=null){ con.close(); } }catch(Exception ex){ ex.printStackTrace (); return 0; } } return columnCount; } } /*****TestApp中接受数据部分***********/ public void getinfo(NE ne) { ...... try{ URL url1 = new URL("http://server/servlet/getServlet?name="+cmd+"&ne="+ id); URLConnection connection1 = url1.openConnection(); DataInputStream inStream = new DataInputStream(connection1.getInputStream()); //读取SERVLET发送过来的数据 String echo = inStream.readUTF(); if (echo.equals(cmd)){ int rs =inStream.readInt(); if (rs>0){ id =inStream.readInt(); name = inStream.readUTF(); .... }; //System.out.println("接到:"+rs); }else{ //System.out.println("接到错误:"+echo); } }catch(Exception e){//System.out.println(e); } } 2、 修改数据库数据 savServlet为SERVLET程序,TestApp为客户测试程序 /***********savServlet 陈旭东 2000.12.18********************/ ... public class savServlet extends HttpServlet{ public void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException { //读取APPLET发送过来的信息 String COMMAND=req.getParameter("name"); String ne_id=req.getParameter ("ne"); DataInputStream in = new DataInputStream(req.getInputStream()); ne.x = in.readInt (); ne.y = in.readInt (); ... in.close(); //修改数据库数据 boolean rs1=false; try{ rs1=SaveNe(ne); }catch (Exception ex) { ex.printStackTrace(); } } } private boolean SaveNe(NE ne) throws Exception { boolean result =false; String sqlStr="update ne set ...";//UPDATE语句 Connection con=null; Statement st=null; try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); con=DriverManager.getConnection ("jdbc:oracle:thin:@server:1521:ORCL","SCOTT","TIGER"); st=con.createStatement (); int rows=st.executeUpdate (sqlStr); if (rows>0) result=true; boolean n1=st.execute("commit"); } finally{ try{ if (st != null){ st.close(); } if (con !=null){ con.close(); } }catch(Exception ex){ } } return result; } } /*********TestApp保存数据部分***************/ private void SaveNEInfo(NE ne){ .... try{ //for apache URL url1 = new URL("http://202.112.145.69/servlet/savServlet?name="+COMMAND2+"&ne="+ne_id); URLConnection con = url1.openConnection(); con.setUseCaches(false); con.setDoOutput(true); con.setDoInput(true); ByteArrayOutputStream byteout = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(byteout); //发送到SERVLET out.writeInt(ne.x); out.writeInt(ne.y); ... out.flush(); byte buf[] = byteout.toByteArray(); con.setRequestProperty("Content-type","application/octet-stream"); con.setRequestProperty("Content-length",""+buf.length); DataOutputStream dataOut=new DataOutputStream(con.getOutputStream()); dataOut.write(buf); dataOut.flush(); dataOut.close(); }catch(Exception e){System.out.println(e);} } 四、结论 本文提出了一种Internet数据库应用程序开发的通用结构:APPLET-SERVLET-DBMS结构。并针对该结构进行了具体的实现,相信会对同类的应用具有借鉴意义。 <淘宝热门商品:

小小豆叮

0 Responses to "APPLET-SERVLET-DBMS结构的实现"

发表评论