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结构的实现"
发表评论