如果记录集很多的话可以用游标, Oracle可以用"select "+fname+" from (select rownum num,"+fieldname+" from (select "+fieldname+" from "+this.getTableName()+this.getFilter()+") temptable1) temptable2 where num between 1 and 10
用zlyperson(rookie)方法,在本地,用applet可以访问servlet,但是把放在另 外一台机器,出错如下: http://192.168.1.3:8080/ConnToApplet?StrSQL=select%20*%20from%20USER_INFO&AppletDsn=test java.security.AccessControlException: access denied (java.net.SocketPermission 1 92.168.1.3:8080 connect,resolve) at java.security.AccessControlContext.checkPermission(AccessControlConte xt.java:272) at java.security.AccessController.checkPermission(AccessController.java: 399) at java.lang.SecurityManager.checkPermission(SecurityManager.java:545) at java.lang.SecurityManager.checkConnect(SecurityManager.java:1044) at sun.net.www.http.HttpClient.openServer(HttpClient.java:465) at sun.net.www.http.HttpClient.<init>(HttpClient.java:267) at sun.net.www.http.HttpClient.<init>(HttpClient.java:277) at sun.net.www.http.HttpClient.New(HttpClient.java:289) at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection .java:408) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLCon nection.java:501) at Appletdbconn.executeQuery(Appletdbconn.java:45) at MyApplet.paint(MyApplet.java:37) at sun.awt.RepaintArea.paint(RepaintArea.java:298) at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:196) at java.awt.Component.dispatchEventImpl(Component.java:2663) at java.awt.Container.dispatchEventImpl(Container.java:1213) at java.awt.Component.dispatchEvent(Component.java:2497) at java.awt.EventQueue.dispatchEvent(EventQueue.java:339) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh read.java:131) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre ad.java:98) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:85) 出错:java.lang.NullPointerException Exception occurred during event dispatching: java.lang.NullPointerException: string is null at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2242) at MyApplet.paint(MyApplet.java:55) at sun.awt.RepaintArea.paint(RepaintArea.java:298) at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:196) at java.awt.Component.dispatchEventImpl(Component.java:2663) at java.awt.Container.dispatchEventImpl(Container.java:1213) at java.awt.Component.dispatchEvent(Component.java:2497) at java.awt.EventQueue.dispatchEvent(EventQueue.java:339) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh read.java:131) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre ad.java:98) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) at java.awt.EventDispatchThread.run(EventDispatchThread.java:85) 什么意思?该如何处理?谢先了!
--- ZJQ
Oracle可以用"select "+fname+" from (select rownum num,"+fieldname+" from (select "+fieldname+" from "+this.getTableName()+this.getFilter()+") temptable1) temptable2 where num between 1 and 10
要不就用thin的JDBC直接访问数据库吧
java.io.NotSerializableException: sun.jdbc.odbc.JdbcOdbcResultSet
try{
String tablename=String.valueOf(qry.elementAt(1)).trim() ;
Statement stmt=dbcon.createStatement() ; String sql="Select * from "+tablename.trim() ; ResultSet rs=stmt.executeQuery(sql);
ResultSetMetaData dmd=rs.getMetaData();
int col=dmd.getColumnCount();
if(col<1) System.out.println("table erroer");
Vector names=new Vector();
for(int i=1;i<=col;i++)
names.add(rs.getMetaData().getColumnName(i));
Vector datas=new Vector(10,5);
while (rs.next())
{
Vector vrow=new Vector(col);
for(int i=1;i<=col;i++)
vrow.addElement(rs.getObject(i));
datas.addElement(vrow);
}
rs.close() ;
stmt.close() ;
Casedata.addElement(names);
Casedata.addElement(datas);
ObjectOutputStream oos=new ObjectOutputStream(response.getOutputStream() );
oos.writeObject(Casedata);//要传递的数据
oos.flush() ;
oos.close() ;
qry.clear() ;
}catch(SQLException e1)
{
System.out.println(e1.toString() );
}catch( IOException eee )
{
System.err.println( "IOException caught!" );
System.err.println( eee.getMessage() );
eee.printStackTrace( System.err );
}
ObjectOutputStream oos = new ObjectOutputStream(rsp.getOutputStream());
oos.writeObject(rs1);
oos.flush();
oos.close();
运行servlet,出错提示:
java.io.NotSerializableException: sun.jdbc.odbc.JdbcOdbcResultSet
什么意思?
类在Stream中传送必须串行化。rs1是一个ResultSet记录集
ObjectOutputStream oos = new ObjectOutputStream(rsp.getOutputStream());
oos.writeObject(rs1);
oos.flush();
oos.close();
运行servlet,出错提示:
java.io.NotSerializableException: sun.jdbc.odbc.JdbcOdbcResultSet
什么意思?没有实现串行化。MyResultSet extends ResultSet implements Serializable () {...}
MyResultSet rs1;
Applet, Servlet中都用MyResultSet代替ResultSet
类在Stream中传送必须串行化。rs1是一个ResultSet记录集
ObjectOutputStream oos = new ObjectOutputStream(rsp.getOutputStream());
oos.writeObject(rs1);
oos.flush();
oos.close();
运行servlet,出错提示:
java.io.NotSerializableException: sun.jdbc.odbc.JdbcOdbcResultSet
什么意思?没有实现串行化。MyResultSet extends ResultSet implements Serializable () {...}
MyResultSet rs1;
Applet, Servlet中都用MyResultSet代替ResultSet
import java.sql.*;
import java.util.*;public class MyResultSet extends ResultSet implements Serializable
{
public MyResultSet()
{}
}
编译出错,提示:
MyResultSet.java:5: no interface expected here
public class MyResultSet extends ResultSet implements Serializable
^
1 error
2。不要传递太多的数据,很容易溢出;
3。浏览器里的jre版本低,而且很袖珍,很多类都没有,要用就得打成applet jar,很大也很繁(之间有依赖关系,打进去的文件可能很多,用jbuilder这样的工具好些)。比较好的办法就是用container类了,象是vector(这个1.1就有),把处理好的东西放进去。如果客户端机器稍微差一点,复杂的操作就作不来了,很可能死掉。继承resultset是要干嘛?再说了,java.sql.ResultSet是interface,你怎么继承成class?
...
ResultSet rs1 = dbconn.executeQuery()
Vector strVector = new Vector();
strVector.addElement(rs1);
...
ObjectOutputStream oos = new ObjectOutputStream(rsp.getOutputStream());
oos.writeObject(rs);//回传到applet
oos.flush();
oos.close();
在applet取Vector部分代码:
...
ObjectInputStream ois=new ObjectInputStream(urlcon.getInputStream());
p = (Vector)ois.readObject();
ois.close();Enumeration enum = p.elements();
ResultSet rs;
while(enum.hasMoreElements())
{
rs = (ResultSet)enum.nextElement();
}
String name = null;
while(rs.next())
{
name = rs.getString("User_name");//在servlet里存在
}但是在applet里取不到,如果在strVector里存放的是字符串,就可以该如何改?
...
ResultSet rs1 = dbconn.executeQuery()
Vector strVector = new Vector();
strVector.addElement(rs1);
...
ObjectOutputStream oos = new ObjectOutputStream(rsp.getOutputStream());
oos.writeObject(strVector);//回传到applet 上面写错了,不好意思
oos.flush();
oos.close();
在applet取Vector部分代码:
...
ObjectInputStream ois=new ObjectInputStream(urlcon.getInputStream());
p = (Vector)ois.readObject();
ois.close();Enumeration enum = p.elements();
ResultSet rs;
while(enum.hasMoreElements())
{
rs = (ResultSet)enum.nextElement();
}
String name = null;
while(rs.next())
{
name = rs.getString("User_name");//在servlet里存在
}但是在applet里取不到,如果在strVector里存放的是字符串,就可以该如何改?
1、自己写个类,实现序列化接口,数据库表的字段作为它的FIELD,把ResultSet中的数据一个个取出放在该类对象中,将这些对象加到Vector中
2、自己写个类,实现ResultSet接口和序列化接口,将取出的ResultSet(实际上是你用的驱动程序的实现类)强制转化为该类注:2没试过
--- ZJQ
while(enum.hasMoreElements())
{
rs = (ResultSet)enum.nextElement();
}
String name = null;
while(rs.next())
{
name = rs.getString("User_name");//在servlet里存在
}
---------------------------------------------
你这个循环好像套到外边了吧?
字段名和数据,applet传到servlet是一个sql语句,要返回一个ResultSet对象
,该如何实现呢?如果是返回确定的字段和数据,是可以的。但是要返回一个
ResultSet对象,还真的不懂!各位帮忙想一下帮帮忙!
ResultSet rs = (ResultSet)session.getAttribute("result");
然后,你想怎么样就怎么样!
情况,也可以?
这篇文章是继<<Servlet传送对象给Applet使用>>后,征对网友的特殊问题写的又一个实例.
现发表出来与大家分享,文中瑕癖之处甚多,望各位指教.
这个问题在csdn上已经有讨论了http://www.csdn.net/expert/topic/971/971710.xml.
具体的需求就不讲了,这里把我的实现步骤详细写下,与<<Servlet传送对象给Applet使用>>中提到的方法
一样.用到的CachedRowSet可以到
http://java.sun.com//Download4?userid=zlyperson&platform=zip&button=continue&config-file=rowset-1_0-ea4.config
去下.还有一个netscape的包,在C:\WINNT\java\Packages\0S0W0NFX.ZIP中.
我也把所需要的包及我的实现代码打成了包,其中包扩了CachedRowSet&netscape&本文.
http://63.210.240.215/rookieport/rowset.jar
下面给出全部代码和配置,其中Applet部分涵盖
了Javascript与Applet的互相调用,对于该部分不感兴趣的朋友可以复略.<pre>
第一步,实现Servlet
package exapplet;
import java.io.*;
import java.sql.*;
import javax.sql.*;
import sun.jdbc.rowset.*;
import javax.servlet.*;
import javax.servlet.http.*;public class MyServlet extends HttpServlet
{
static {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (Exception e) {
e.printStackTrace();
}
} public void doGet(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException
{
try {
Connection dbconn = DriverManager.getConnection("jdbc:odbc:BlueSite");
Statement stmt = dbconn.createStatement();
String dbsql = req.getParameter("DBSQL");
ResultSet dbrest = stmt.executeQuery(dbsql);
CachedRowSet crs = new CachedRowSet();
crs.populate(dbrest);
dbrest.close();
stmt.close();
dbconn.close();
//传回对象给Applet
res.setContentType("application/octet-stream");
ObjectOutputStream oos = new ObjectOutputStream(res.getOutputStream());
oos.writeObject(crs);
oos.close();
} catch (Exception exp) {
exp.printStackTrace();
}
}
public String getServletInfo()
{
return "A simple Servlet!";
}
}第二步,实现提取对象的Applet
package exapplet;
import java.awt.*;
import java.applet.*;
import java.io.*;
import java.net.*;
import javax.sql.*;
import sun.jdbc.rowset.*;
import netscape.javascript.*;public class MyAppletB extends java.applet.Applet
{
public void init()
{
}
public void paint(Graphics g)
{} //This method will be call in html
public void invoke() {
try {
URL url = new URL("http://Liaoyuan:8080/WorkingRoom/exapplet/PostToApplet?DBSQL=Select%20TopicName,TopicName,TopicName%20from%20Topic");
//注意url中的空个用%20替代.
URLConnection urlcon = url.openConnection();
urlcon.connect();
ObjectInputStream ois=new ObjectInputStream(urlcon.getInputStream());
CachedRowSet crs = (CachedRowSet)ois.readObject();
ois.close();
while ( crs.next() ) {
JSObject.getWindow(this).call("alert",new String[]{crs.getString(1)});
}
crs.close();
} catch (Exception e) {
}
}
}第三步,配制WebServer(我用的是Tomcat4.0)
拷贝编译后的MyServlet.class到相应目录下,或者下载我打的包到WEB-INF\lib下
编辑对应的web.xml文件,确保下面的内容正确
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>PostToApplet</servlet-name>
<servlet-class>exapplet.MyServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>
PostToApplet
</servlet-name>
<url-pattern>
/exapplet/PostToApplet
</url-pattern>
</servlet-mapping>
</web-app>第四步,编写html文件
提取对象的html
<HTML>
<HEAD>
<TITLE> New Document For Using Applet </TITLE>
</HEAD><BODY>
Hello This is a Test!<br>
<APPLET id="obj_applet" align=center code="exapplet.MyAppletB" codeBase="." width=400 height=300 name="obj_applet" archive="BV7RFD3P.ZIP"></APPLET>
<Input type=button value="CallAppletMethod" onclick="callApplet()">
<Script language=javascript>
function callApplet()
{
obj_applet.invoke();
}
</Script>
</BODY>
</HTML>
</pre>
中间有错误的地方请指教,[email protected]
狭隘!惭愧!!
--- ZJQ
import sun.jdbc.rowset.*;
import netscape.javascript.*;
大多数浏览器的JRE版本不怎么高(1.1左右),这几个包根本不存在。如果在server端当然没问题,你的classpath可能是jdk1.3(如果要用rowset,就得1.4了)。你说是打了包给applet,那么,这个包里应该有所有的相关类,不知道要多大?拨号用户受不受得了?直觉上,应该小不了。如果只能在LAN里用,就没什么搞头了。thanx alot!
两个办法:
1、不使用默认ClassLoader装载类,改从服务器端加载。
2、只有自己实现这个RowSet了 :)个人意见,请指正!
--- ZJQ
外一台机器,出错如下:
http://192.168.1.3:8080/ConnToApplet?StrSQL=select%20*%20from%20USER_INFO&AppletDsn=test
java.security.AccessControlException: access denied (java.net.SocketPermission 1
92.168.1.3:8080 connect,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlConte
xt.java:272)
at java.security.AccessController.checkPermission(AccessController.java:
399)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:545)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1044)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:465)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:267)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:277)
at sun.net.www.http.HttpClient.New(HttpClient.java:289)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection
.java:408)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLCon
nection.java:501)
at Appletdbconn.executeQuery(Appletdbconn.java:45)
at MyApplet.paint(MyApplet.java:37)
at sun.awt.RepaintArea.paint(RepaintArea.java:298)
at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:196)
at java.awt.Component.dispatchEventImpl(Component.java:2663)
at java.awt.Container.dispatchEventImpl(Container.java:1213)
at java.awt.Component.dispatchEvent(Component.java:2497)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:339)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:131)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:98)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:85)
出错:java.lang.NullPointerException
Exception occurred during event dispatching:
java.lang.NullPointerException: string is null
at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2242)
at MyApplet.paint(MyApplet.java:55)
at sun.awt.RepaintArea.paint(RepaintArea.java:298)
at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:196)
at java.awt.Component.dispatchEventImpl(Component.java:2663)
at java.awt.Container.dispatchEventImpl(Container.java:1213)
at java.awt.Component.dispatchEvent(Component.java:2497)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:339)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:131)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:98)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:85)
什么意思?该如何处理?谢先了!