用JAVA编写的 Applet因其具有的丰富的用户界面,强大的交互能力,完善的安全模型而在Internet世界大行其道,随着JDBC API的出现, Applet也具有了一定的数据库访问功能,这为 Applet提供了更大的应用空间,但是JVM(JAVA虚拟机)的沙箱模型(sandbox)大大的 限制Applet的数据库访问能力,因为 Applet只能与其所在的宿主机建立网络连接,因此 Applet也只能对宿主机上的关系数据库提供访问,对于宿主机以外的数据库则无法访问.但是,我们在实际应用中或者由于安全的考虑,或者由于其它原因往往无法保证WEB服务器于数据库服务器位于同一机器,这就为 Applet应用的数据访问操作造成了困难.
1 Applet数据访问操作问题的解决方法
1.1通过数字签名突破JVM的沙箱
在JAVA2中可以通过给 Applet的包文件增加签名可以实现 Applet对非宿主机上的数据库的访问.
1.2 Applet通过Servlet代理实现对数据库的间接访问
Applet中我们可以利用url建立与Servlet的连接,然后通过Servlet访问非宿主机的数据库并将结果返回 Applet, 通过这一过程间接实现了 Applet对非宿主机数据库的访问.
对于第一种方法,可以参照有关的书籍,在此不做解释,下面我们来看看如何具体的实现二者的通信.
2 Applet与Servlet通信的具体实现
通信过程包括下述两个方面:
2.1 Applet对Servlet的访问及参数传递的实现
2.1.1创建URL对象
在JAVA程序中,可以利用如下的形式创建URL对象
URL servletURL = new URL( "http://localhost:8080/servlet/dbServlet.DbServlet" );
2.1.2 与URL地址建立连接
在成功的创建了URL对象之后,可以调用URL类中的openConnection()函数来建立连接.openConnection()函数在建立连接的同时,进行通信连接的初始化工作.
URLConnection servletConnection = servletURL.openConnection();
2.1.3 利用URLConnection对象进行读写操作
2.1.3.1 利用URLConnection对象读取Servlet返回的信息
在获得URLConnection对象之后,如果Servlet向 Applet传送的是JAVA对象,则可以利用URLConnection对象的openStream()方法获得输入流,然后新生成一个ObjectInputStream对象,利用ObjectInputStream对象的readObject()方法即可得到Servlet传回的JAVA对象.
ResultSet rs = null; // Temporary storage for the data.
URL servletURL = null; // The URL to the servlet.
URLConnection servletConnection = null; // The connection to the servlet.
ObjectInputStream dbStream = null; // The stream from the servlet.
try
{
servletURL = new URL( "http://localhost:8080/servlet/dbServlet.DbServlet" );
servletConnection = servletURL.openConnection();
dbStream = new ObjectInputStream( servletURL.openStream() );
// Read an object from the servlet stream and cast it to a DataSetData
// object.
data = (ResultSet) dbStream.readObject();
}
catch( Exception e )
{
...
}
如果Servlet向 Applet传送的是普通的文本,则可以利用URLConnection对象的getInputStream()方法获得输入流,然后新生成一个DataInputStream对象,利用DataInputStream对象的readLine()方法依次取得Servlet传回的文本.
DataInputStream dbStream = new DataInputStream ( servletURL.getInputStream() );
// Read text from the servlet stream line by line.
While((inputLine= dbStream.readLine())!=null)
{
······.
}
2.3.1.2利用URLConnection对象对Servlet的传值操作
Applet向Servlet的有关参数传递,可以通过下面两种方法实现:
可以通过在URL地址后附加参数以GET的方式实现参数的传递:
servletURL = new URL( "http://localhost:8080/servlet/dbServlet.DbServlet sql=select * from hklhzsj where total>100" );
另一种方法是从URLConnection连接获得输出流,这个输出流被连接到公共网关程序的(服务器端)的标准输入流上,然后把要传送的有关数据写入输出流,发送完毕关闭输出流.
servletConnection.setDoOutput(true);
PrintStream outStream=new PrintStream(servletURL.openConnection());
outStream.println("sql=select * from hklhzsj where total>100");
outStream.close();
2.2 Servlet向 Applet的数据传递的实现
可以通过Servlet对象的request参数的getParameter()获得 Applet传递过来的参数:String sql=request.getParameter("sql");
通过Servlet对象的request参数的getOutputStream()所得到的输出流新生成一个对象输出流ObjectOutputStream类型的对象,然后通过该对象的writeObject()方法输出JAVA类型的对象.
Class.forName("sun:jdbc:odbcdriver");
Connection conn =DriverManager.getConnection(connetionString)
Statement st=conn.createStatement()
ResultSet rs=st.execute(sql)
dbStream = new ObjectOutputStream( response.getOutputStream() );
// Write the object...
dbStream.writeObject(rs );
通过request参数的getWriter ()方法得到PrintWriter类型的输出,通过此对象的println()方法可以从Servlet想 Applet输出文本:
PrintWriter out = response.getWriter();
out.println("DataCenter");
3 结束语
通过上面的分析我们通过Servlet 实现了对非宿主机上的数据库的访问,Servlet 与 Applet通信提供了语言级别上的互相传递JAVA对象的便利,我们同样可以利用 Applet通过CGI对各种服务器端的CGI程序或其它脚本应用程序(如ASP,JSP等)提供访问,以文本的方式实现通信.
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐