Nov 23

rundll32.exe shimgvw.dll,ImageView_Fullscreen 图片文件路径
例如:
rundll32.exe shimgvw.dll,ImageView_Fullscreen C:\WINDOWS\Web\Wallpaper\Bliss.bmp

Nov 18

在java中联接Access中多采用jdbc-odbc的方式,传统做法是在 windows系统下的管理工具里分建一个数据源指向Access数据厍文件。

这样建立的应用程序加大了布属难度。要解决这个问题可以像其它(例如:VB,Delphi等)IDE那样用自建数据源(也称动态数据源)来完成。

联系方法如下:

public class faq
{

    String sDBDriver;
    String sConnStr;
    Connection conn;
    ResultSet rs;

/**

* 初始化联接

*/

    public faq(){
        String dbc = getFilePathRoot()+”/jspshop/database/db.mdb”;
        sDBDriver = “sun.jdbc.odbc.JdbcOdbcDriver”;
        sConnStr = “jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=”+dbc;
        conn = null;
        rs = null;
        try{
            Class.forName(sDBDriver);
        }catch(ClassNotFoundException classnotfoundexception){
            System.err.println(”faq(): ” + classnotfoundexception.getMessage());
        }
    }

/**

* 联接构建好后使用方法就和其它的联接使用方法一样了

*/

public void executeInsert(String s)
    {
        try{
            conn = DriverManager.getConnection(sConnStr);
            Statement statement = conn.createStatement();
            statement.executeUpdate(s);
        }catch(SQLException sqlexception){
            System.err.println(”faq.executeUpdate:” + sqlexception.getMessage());
        }
    }

/**

* 取得应用程序运行的跟目录

*/

 public String getFilePathRoot(){
     String filepath=”";
  filepath = this.getClass().getResource(”").getPath();
  filepath = filepath.substring(0,filepath.indexOf(”/WEB-INF”));
  filepath = filepath.substring(1,filepath.length());
  return filepath;
 }

}

Nov 18

import java.sql.*;
public class Access{
  public static void main(String args[]) throws Exception{
  String strurl=”jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\projects\\demo.mdb”;
  Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver”);
  Connection conn=DriverManager.getConnection(strurl) ;
  Statement stmt=conn.createStatement();
  ResultSet rs=stmt.executeQuery(”select * from mcp_swty_player”);
  while(rs.next())
  System.out.println(rs.getString(”player_mobile”));
  rs.close();
  stmt.close();
  conn.close();
  }
}

Jun 29

远程方法调用(RMI)机制可以把面向对象的思想进一步扩展,因为你可以调用的对象不仅可以在本机上,也可以在别的主机上。本文就简单介绍rmi的编程方法。
  首先介绍一些简单的rmi的概念。
  1, 和客户:在rmi中,如果有一个对象进行远程方法调用,这个对象就叫做客户机对象,而远程对象则被称为对象。
  2, 创建服务器对象的服务器程序:这个程序用来创建服务器对象,注册这个对象,使得客户可以通过注册的名称访问服务器对象。
  3, 接口(interface),接口可以让客户端了解服务器所能做的工作。更具体的说,就是它列出了可以在服务器上执行的所有方法。客户端程序必须能够找到这个类,否则就不能执行对服务器函数的调用。
  4, 客户桩(stub),有的书中翻译成为代码存根,它给客户端程序提供一个桩,这个桩上”绑”着服务器对象。当客户程序需要调用远程对象时,这个桩被到客户端(如果客户端有这个类,则不需要)。然后客户就可以像调用本地方法一样调用远程的方法了。
  这个客户桩的作用是将客户向服务器的请求进行编码、进行传输,服务器执行这次调用后将结果返回到客户桩,客户桩进行解码,将解码后的结果传送到客户程序中。对于编写客户端的程序员来说,他不需要知道其中的具体过程。
  客户桩不需要自己编写,后面会说明它的生成方法。它实现了前述的接口(interface)。
  下面就通过一个例子来说明编写的过程。更多…. Continue reading »

Jun 25

Class.forName(xxx.xx.xx) 返回的是一个类, .newInstance() 后才创建一个对象 Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段

 

Class aClass = Class.forName(xxx.xx.xx);
Object anInstance = aClass.newInstance();

Class.forName(”").newInstance()返回的是object
but there is some limit for this method to create instance
that is your class constructor should no contain parameters, and you should cast the instance manually.

Class Driver{
protected static Driver current;
public static Driver getDriver(){
return current;
}
}

Class MyDriver extends Driver{
static{
Driver.current=new MyDriver();
}
MyDriver(){}
}

用时:
Class.forName(”MyDriver”);
Driver d=Driver.getDriver();

有的jdbc连接数据库的写法里是Class.forName(xxx.xx.xx);而有一些:Class.forName(xxx.xx.xx).newInstance(),为什么会有这两种写法呢? Continue reading »

Jun 23

2007 年 7 月 05 日

Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。在这期的 Java 理论与实践 中,Brian Goetz 将介绍几种正确使用 volatile 变量的模式,并针对其适用性限制提出一些建议。

Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。

锁提供了两种主要特性:互斥(mutual exclusion)可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。

Volatile 变量

Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式(Invariants)的类(例如 “start <=end”)。 Continue reading »

Apr 28

JDK5中的一个亮点就是将Doug Lea的并发库引入到Java标准库中。Doug Lea确实是一个牛人,能教书,能出书,能编码,不过这在国外还是比较普遍的,而国内的教授们就相差太远了。

一般的服务器都需要线程池,比如Web、FTP等服务器,不过它们一般都自己实现了线程池,比如以前介绍过的Tomcat、Resin和Jetty等,现在有了JDK5,我们就没有必要重复造车轮了,直接使用就可以,何况使用也很方便,性能也非常高。 Continue reading »

Apr 24

notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。两者的最大区别在于:

notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的,一旦该对象被解锁,他们就会去竞争。
notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。

下面是一个很好的例子:

import java.util.*;

class Widget{}
class WidgetMaker extends Thread{
    List
<Widget> finishedWidgets=new ArrayList<Widget>();
    
public void run(){
        
try{
            
while(true){
                Thread.sleep(
5000);//act busy
                Widget w=new Widget();
                
//也就是说需要5秒钟才能新产生一个Widget,
这决定了一定要用notify而不是notifyAll
                
//因为上面两行代码不是同步的,如果用notifyAll则所有线程都企图冲出wait状态
                
//第一个线程得到了锁,并取走了Widget(这个过程的时间小于5秒,新的Widget还没有生成)
                
//并且解开了锁,然后第二个线程获得锁(因为用了notifyAll其他线程不再等待notify语句
                
//,而是等待finishedWidgets上的锁,一旦锁放开了,他们就会竞争运行),运行
                
//finishedWidgets.remove(0),但是由于finishedWidgets现在还是空的,
                
//于是产生异常
                
//***********这就是为什么下面的那一句不能用notifyAll而是要用notify
                                
                
synchronized(finishedWidgets){
                    finishedWidgets.add(w);
                    finishedWidgets.notify(); 
//这里只能是notify而不能是notifyAll
                }

            }

        }

        
catch(InterruptedException e){}
    }

    
    
public Widget waitForWidget(){
        
synchronized(finishedWidgets){
            
if(finishedWidgets.size()==0){
                
try{
                    finishedWidgets.wait();
                }

                
catch(InterruptedException e)
                
{}
            }

            
return finishedWidgets.remove(0);
        }

    }

}

public class WidgetUser extends Thread{
    
private WidgetMaker maker;
    
public WidgetUser(String name,WidgetMaker maker){
        
super(name);
        
this.maker=maker;
    }

    
public void run(){
        Widget w
=maker.waitForWidget();
        System.out.println(getName()
+got a widget);
    }

    

    
public static void main(String[] args) {
        WidgetMaker maker
=new WidgetMaker();
        maker.start();
        
new WidgetUser(Lenny,maker).start();
        
new WidgetUser(Moe,maker).start();
        
new WidgetUser(Curly,maker).start();

    }


}
Apr 23

使用如下方法可以获得PrintJob的实例用于控制打印操作: 

Toolkit.getPrintJob(Frame f, String jobtitle, Properties prop) 

那么对于打印属性的设置可以通过对prop的属性设置来实现,打印属性包括: 

awt.print.destination: 可以是”printer”或”file” 

awt.print.printer: 打印机名 

awt.print.fileName: 打印文件名 

awt.print.numCopies: 打印份数 

awt.print.options: 打印命令的打印选项 

awt.print.orientation: 打印方向,可以是”portrait”或”landscape” 

awt.print.paperSize: 纸张大小,可以是”letter”,”legal”,”executive”或”a4″

Apr 23
 

级别: 初级

2002 年 10 月 22 日

SUN公司一直致力于Java打印功能的完善,而Java2平台则终于有了一个健壮的打印模式的开端,该打印模式与Java2D图形包充分结合成一体。更令人鼓舞的是,新发布的jdk1.4则提供了一套完整的“Java 打印服务 API” (Java Print Service API),它对已有的打印功能是积极的补充。利用它,我们可以实现大部分实际应用需求,包括打印文字、图形、文件及打印预览等等。本文将通过一个具体的程序实例来说明如何设计Java打印程序以实现这些功能,并对不同版本的实现方法进行分析比较。希望大家能从中获取一些有益的提示。

前言

 

在我们的实际工作中,经常需要实现打印功能。但由于历史原因,Java提供的打印功能一直都比较弱。实际上最初的jdk根本不支持打印,直到jdk1.1才引入了很轻量的打印支持。所以,在以前用Java/Applet/JSP/Servlet设计的程序中,较复杂的打印都是通过调用ActiveX/OCX控件或者VB/VC程序来实现的,非常麻烦。实际上,SUN公司也一直致力于Java打印功能的完善,而Java2平台则终于有了一个健壮的打印模式的开端,该打印模式与Java2D图形包充分结合成一体。更令人鼓舞的是,新发布的jdk1.4则提供了一套完整的”Java 打印服务 API” (Java Print Service API),它对已有的打印功能是积极的补充。利用它,我们可以实现大部分实际应用需求,包括打印文字、图形、文件及打印预览等等。本文将通过一个具体的程序实例来说明如何设计Java打印程序以实现这些功能,并对不同版本的实现方法进行分析比较。希望大家能从中获取一些有益的提示。 Continue reading »