荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: junire (起来,我要坐), 信区: Java
标  题: [合集]请问!
发信站: 荔园晨风BBS站 (Mon Dec 24 23:24:48 2001), 站内信件

Demon (蓝色梦幻) 于Sat Oct 20 10:47:39 2001提到:

有一个javabean如下:
//opendb.java
//定义包opendb
package opendb;

//引入java.sql.*
import java.sql.*;

//包opendb中的类opendb
public class opendb
{
    //定义数据库连结字符串,jdbc.odbc桥
    String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
    String sConnStr = "jdbc:odbc:Achievement";
    Connection conn = null;
    ResultSet rs = null;
    //定义打开数据库连结的函数
    public opendb()
    {
        try
        {
                Class.forName(sDBDriver);
        }
        //处理异常
        catch(java.lang.ClassNotFoundException e)
        {
                System.err.println("opendb():" + e.getMessage());
        }
    }
    //定义执行SQL语句的函数
    public ResultSet executeQuery(String sql)
    {
        rs = null;
        try
        {
                conn = DriverManager.getConnection(sConnStr,"","");
                Statement stmt = conn.createStatement();
                rs = stmt.executeQuery(sql);
        }
        //处理异常
        catch(SQLException ex)
        {
                System.err.println("aq.executeQuery:" + ex.getMessage());
        }
        return rs;
    }
}
为什么我在jsp里
<jsp:useBean id="db"
             scope="page" class="opendb.opendb"/>调用时,说找不到type opendb
只有type opendb.opendb,造成这个jsp文件实现不了,谁能帮我看一下吗?


Lg (创造人生的传奇) 于Sat Oct 20 13:33:25 2001提到:

把英文的出错信息打出来。
另外你的程序获取conn后,最后rs,conn都没有关闭。我想是不是没有
把这个class打全?应该还有close等方法?
还有你这个只是一个java class,连get set方法也没有,算不上bean。
你可以这样用。
<%
        opendb db = new opendb();
        db.....
%>
另外jdbc-odbc不是线程安全的,你的程序会不时出问题。


Demon (蓝色梦幻) 于Sat Oct 20 15:28:04 2001提到:

我是通过opendb包里含有类opendb来实现的.
我是这用的,在jsp里:
<jsp:useBean id="db"
             scope="page" class="opendb.opendb"/>
....
try
  {
  String sql = "INSERT general ( ID,Grade ) VALUES (\'"+ ID + "\',\'"+
sum2 +"\')";
  ResultSet rs = db.executeQuery(sql);
  }
catch (Exception e2)
  {
  out.println(e2.getMessage());
  }
所以opendb.java里只是负责打开对数据库的连接,和对sql语句的执行,对于我要查询或者
插入,修改数据,或者要对数据记录集如何操作和close等等是在jsp里对它进行操作的.所
以应该不关close的事.
出错信息如下:
org.apache.jasper.JasperException: Unable to compile class for JSPI/O
exception
error:与预期不同,文件C:\tomcat\howjsp\WEB-INF\classes\opendb.java不包含type
opendb.请调整类途径,是文件不在unnamed package中出现.
C:
\tomcat\work\localhost_8080%2Fhowjsp\_0002fGradeStepTwo_0002ejspGradeSte
pTwo_jsp_5.java:137: type declaration中未找到类opendb.
                opendb.opendb db = null;
                      ^
C:
\tomcat\work\localhost_8080%2Fhowjsp\_0002fGradeStepTwo_0002ejspGradeSte
pTwo_jsp_5.java:140: type declaration中未找到类opendb.
                    db= (opendb.opendb)
                               ^
C:
\tomcat\work\localhost_8080%2Fhowjsp\_0002fGradeStepTwo_0002ejspGradeSte
pTwo_jsp_5.java:145: type declaration中未找到类opendb.
                            db = (opendb.opendb) Beans.
instantiate(this.getClass().getClassLoader(), "opendb.opendb");
                                        ^
5错误.

本人对bean不熟,刚开始学,所以想问一下是否bean一定要有get或者set方法呢?



Lg (创造人生的传奇) 于Sun Oct 21 14:43:29 2001提到:

那些中文出错信息怪怪的,不过它是说找不到你的类.你看看把你的opendb放到
WEB-INF/lib或者WEB-INF/classes下面.
另外我觉得这个程序是有问题的.因为你如果利用jsp:useBean,并且scope=session,
那么程序就不行了.page还可以通过,因为它相当于jsp里面new instance.


npudream (工大追梦) 于Sun Oct 21 15:43:07 2001提到:

你应该在/WEB-INF/classes下再建一opendb目录,然后把opendb.class放在里面。应该就
可以了。

omcat\work\localhost_8080%2Fhowjsp\_0002fGradeStepTwo_0002ejspGradeSte


Demon (蓝色梦幻) 于Sun Oct 21 16:13:25 2001提到:

这样不行,我试了一下,出来的错误跟以前一样,应该不关这个途径的事(我用的是tomcat)
究竟是这个程序本身有错误还是<jsp:.....>这个引用有错误呢,这个我老是搞不清楚,程
序本身是可以编译通过的.

ps:本来我写这个是为了方便在整个系统那么多jsp文件里每次调用同一个数据库时不用
老是重复的编写链接数据库的语句(就相当于调用一个子程序吧),没有想到总是通不过.
如果是你们这些高手认为可以有什么方法可以实现这个目的?



npudream (工大追梦) 于Sun Oct 21 16:20:41 2001提到:

我以前一直用Tomcat,package名要对应目录名,你的package是opendb,就必须在clas
ses下建opendb目录,再把class文件放在里面。还不行的话,把这个classes目录设到c
lasspath里试试。不要忘了重起Tomcat。


Lg (创造人生的传奇) 于Sun Oct 21 19:57:13 2001提到:

我是利用DBConnectionManager作pool,一般我的数据库操作都在java的类里面.jsp
只是一些比较简单的操作.比如要从数据库获取一个用户列表,那么我会返回一个
ArrayList,它里面就是User的实例.但是我没有想到怎么解决事务的问题?


Demon (蓝色梦幻) 于Sun Oct 21 23:00:25 2001提到:

我主要希望的就是在java里的实现事务的解决,这样就不用jsp每次进行操作,如果只是要
从数据库里获取用户列表可能容易一点,我还没用过DBConnectionManager连接数据库,是
不是种连接方式比较安全?还是有别的优点?



npudream (工大追梦) 于Mon Oct 22 07:48:02 2001)提到:

其实用数据库连接池比较好,一是把数据库操作都封装在bean里,结构比较清晰,二是当访
问量大时可以大大减少对数据库的连接,提高性能。


Lg (创造人生的传奇) 于Mon Oct 22 09:50:07 2001提到:

DBConnectionManager是一个数据库连接池管理,它可以管理多个数据库连接池,对程序的
性能应该有很大改善,它避免了重复打开数据库连接和关闭连接.
实现事务应该要用到ejb,不过我现在只是要实现transaction,roll back.比如更新一批
用户的信息,如果中间出了问题,那么应该回滚.现在我有User类,它有update()的方法,
可以更新用户的数据库信息,更新单个用户信息很简单,
但是它里面用到的是autoCommit,所以我更新一批的时候,不能用它,否则出错不能会滚.
当然可能会有人建议我说专门写一个类或者方法作
这个,但是我觉得这样并不OO,我对OO的理解很肤浅.
你的程序按照上面说的就可以解决的.


action (一晃又一年) 于Tue Oct 23 10:24:49 2001提到:

问一个题外话,师兄是否现在不研究linux而研究java了?



Lg (创造人生的传奇) 于Tue Oct 23 12:55:15 2001提到:

linux和java不是同一范畴.两者不冲突.掌握多一点知识有好处的.
我现在都是在linux下面开发java.
这一段时间关注java比较多,一个是因为现在做的项目用java,另外一个是觉得
暂时在linux方面不会有长足的进步.
另外我98年就开始用java拉,只是你们不知道.
等c#的正式版出来了,我有空也会学学.刚刚开始接触visual的,又走M$路线的,
c#是个不错的选择.


action (一晃又一年) 于Tue Oct 23 14:16:13 2001提到:

我也做了1年多的java了 ,但是对oo的系统设计,模块的力度划分还是不
很有把握,师兄这么努力的学习,真是让人佩服,希望有时间可以交流
交流。。



npudream (工大追梦) 于Tue Oct 23 14:45:44 2001)提到:

我也是做了一年的Java,但是现在转行了,做网管,不过觉得Java是个好东西,不能丢。


junire (好好学习,天天向上) 于Tue Oct 23 18:15:14 2001提到:

现在外面java主要用来做什么啊?师兄??



Lg (创造人生的传奇) 于Tue Oct 23 23:22:50 2001提到:

因为我觉得做的越高,你需要掌握的知识就要越多,这样才能高屋建瓴的
看问题。以前总想学个“最有用”的语言,现在觉得需要掌握几种语言,
这样处理问题才能游刃有余。另外数据库,网络,操作系统等等都是作
集成不可缺少的。
我一直都是作c语言的开发,所以对oo没有什么了解,现在都是希望从java
里面学取。


Demon (蓝色梦幻) 于Wed Oct 24 12:29:10 2001提到:

我看师兄们几次提到oo,究竟oo是怎样的概念,能不能介绍一下?不懂的问!


Fadeaway (孤独的人总说无所谓) 于Wed Oct 24 12:38:48 2001提到:

  object oriented

我看师兄们几次提到oo,究竟oo是怎样的概念,能不能介绍一下?不懂的问!


action (一晃又一年) 于Wed Oct 24 13:58:33 2001提到:

那在c语言中,推送技术是用什么方式去实现的呢?
*



Lg (创造人生的传奇) 于Thu Oct 25 13:05:34 2001提到:

web里面的?是不是在作聊天室?
一般都是利用GET的方式,但是HTTP对应的cgi进程不断开,有信息就发送给客户端IE


action (一晃又一年) 于Thu Oct 25 15:27:57 2001提到:

是这样的:java用rmi实现推送:
下面是个例子程序:
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.LocateRegistry;
import java.util.*;
import java.io.*;

public class Server
     extends UnicastRemoteObject
     implements watch {
    public String ServerSay = "jimmy";
    public Notify notify =null;

    public Server() throws RemoteException{
    }
    public synchronized String Watch(String say,Notify obj) throws
RemoteException{
        System.out.println("Server.watch():"+say);
        this.notify = obj;
        return this.ServerSay;
    }

    public static void main(String args[])
    {
        // Create and install the security manager
        System.setSecurityManager(new RMISecurityManager());

        try {
            System.out.println("StockServer.main: creating registry");
            LocateRegistry.createRegistry(2005);
            //System.out.println("StockServer.main: creating server");
            Server server = new Server();
            //System.out.println("StockServer.main: binding server ");
            Naming.rebind("//localhost/HelloServer", server);
            //System.out.println("StockServer.main: done");
            server.ServerSay = "jiji";

            try {
            BufferedReader in = new BufferedReader(
            new InputStreamReader(System.in));
            String str = "";
            while (str != null) {
            System.out.print("> prompt ");
            str = in.readLine();
            server.notify.update(str);
            }
            } catch (IOException e) {
            }

        } catch (Exception e) {
            System.out.println("StockServer.main: an exception occurred: " +
                               e.getMessage());
            e.printStackTrace();
        }
    }

}
以上的是服务器
下面的是客户端

import java.net.URL;
import java.rmi.*;
import java.rmi.server.*;
import java.util.*;

public class Client implements Notify, java.io.Serializable{
    public watch Watch = null;

    public synchronized void update(String updateString) {
        System.out.println("Client get:"+updateString);
    }

    public void init(){
     try{
        synchronized(this){
            Watch = null;
        }

        try {
                UnicastRemoteObject.exportObject(this);
        } catch (java.rmi.server.ExportException e) {
                e.printStackTrace();
        }

        Watch = (watch)Naming.lookup("//localhost/HelloServer");
        Watch.Watch("client:",this);
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }

    public static void main(String[] args){
        try{
        Client cl = new Client();
        cl.init();
    // wait for invocations from server
        java.lang.Object sync = new java.lang.Object();
            synchronized (sync) {
                sync.wait();
         }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }

}

我想问的是:好像这样的应用:服务器端的程序将结果送到客户端
可以是application的客户端,c或是c++走的是什么协议,怎么样让
服务器和客户端同步?



Lg (创造人生的传奇) 于Thu Oct 25 19:53:39 2001提到:

rmi是java专有的,c/c++一般是用corba.你的程序是股票软件测试吧?
要实现这种一对多的推送,java的jms可以做到,但是底层跑的应该也是rmi吧,
ejb用到很多rmi.
如果自己用c, c++实现,最容易想到的就是自己定协议,比如用multicast?
如果一个一个socket写,可能不够实时.


action (一晃又一年) 于Thu Oct 25 23:20:40 2001提到:

是呀,这是一个股票程序改出来了,
不过只是一个对一个的情况,,不过也是用来试验的:)
谢谢你的题点。


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店