我們要開發一個java類:其內容只有一句,輸出"hello ant"字符串。并使用ant完成編譯和運行工作,這個例子只是為了跑通ant,不附加多余的東西。
下圖為文件組織,請建立相應的目錄,并編寫HelloAnt.java
按照人家老外的文件組織規則咱也照搬。
hello.ant.HelloAnt.java |
在項目根目錄(hello-ant\)寫1個文件:ant執行配置文件build.xml
build.xml |
ok,一切大功告成,哦,不,還沒有運行它。
dos下進入hello-ant的目錄,即build.xml所在的目錄,我們要用ant工具執行它 ,
執行: %ant_home%/bin/ant -file build.xml 用ant工具執行當前目錄下的配置文件build.xml
或 :ant -file build.xml 你如果設置%ant_home%/bin到path中
這次ok了,這是答案:
命令提示符窗口 |
D:\temp\hello-ant>ant -file build.xml Buildfile: build.xml main: [javac] Compiling 1 source file to D:\temp\hello-ant\build\classes [java] hello ant,ant 的第一次接觸,好棒! BUILD SUCCESSFUL Total time: 2 seconds D:\temp\hello-ant> |
檢查一下build/classes目錄,哦,看到編譯過的文件就在這里:
build/classes/hello/ant/HelloAnt.class.
hello ant 進級
(此段比較廢話,可以略過)
你也許會說:這末簡單的工作寫個批處理不就得了,又xml又ant的,把我的時間都浪費完了,我用jbuild或
webShpere不就得了,怎末說你才明白呢?反正網上開源項目大多數都用ant,你總不能給人家個*.jpx吧,
而且這樣的工具太貴,受不了(當然用D的兄弟不怕^_^ ),而且ant可以讓你明確的管理和自動化所有的東西:
編譯-實施-測試...,哎,稍微麻煩一點點,但節約你以前花在零碎的copy,paste上的時間.而且我發現管理
代碼的質量有所提高.
我們要改進build.xml,讓它做更多的事情:
凡事都講究平衡,你要ant給你做更多事,當然要累一點點,不過只用累一次,以后的代碼修改后的構建都是"一鍵式"完成,我們制作一個hello的簡單例子,你可以自己做j2ee的練習。
我們要擴充目錄結構,使它更像回事:
ant處理編譯之前的目錄:
ant處理之后的目錄:
圖中:\src,\docs,\lib是自己組織的文件結構,\build,\dist是ant動態生成的成品。
\src 源文件:java源,script源,jsp源,xml配置.....
\src\main java源
\src\script window,unix,liunx的執行script,我們的簡單只有一個:
run.bat: java hello.ant.HelloAnt
\docs 手寫說明文檔
\lib 程序所需類庫的jar,比如j2ee.jar,mail,jar...
\build 用ant動態生成的構建目錄
\build\classes 編譯的類文件
\build\docs copy "\docs"的手寫說明文檔,和ant生成的api文檔
\build\lib 放置我們自己的HelloAnt.class打包成品hello-ant.jar
\dist\bin copy "\src\script" 得執行文件
\dist\docs copy "\build\docs" 的文檔
\dist\lib 除了copy "\build\lib"下的hello-ant.jar外,
還應copy "\lib"的程序所需jar,這里我們沒有。
以上是我學老外的文件組織,大家可以按照自己的愛好組織
我們編寫必要的文件:
hello.ant. HelloAnt.java |
已有 |
\src\script.bat |
\docs\index.html 隨便寫一個手寫的文檔 |
hello ant 軟件項目手冊docs |
\build.xml 配置文件 |
build.xml多了些,但其實很簡單:(注釋比較詳細可以參照,這里再簡單說一下)
一個build.xml包含一個工程的自動化處理的完整xml說明,并且基本由3種東東組成:
<project >
1.全局變量的定義
<property/>
2.任務組
<target>
3.許多單項任務... 像copy,delete,javac,jar...
<task1/>
<task2/>
<task3/>
</target>
</project>
參考及下載:
本文程序:第1個hello-ant
本文程序:第2個進階的hello-ant
ant最新下載:
http://jakarta.apache.org/ant/index.html
ant具體的編寫方法參考ant手冊以下2部分就形,
http://jakarta.apache.org/ant/manual/using 使用說明
http://jakarta.apache.org/ant/manual/coretasklist.html 核心tasks
其他一大堆東西你要看也行。不過我覺得比較浪費時間。
http://jakarta.apache.org/ant/manual/index.html 手冊index
huihoo.com翻譯改編的ant/manual/using
http://www.huihoo.com/java/ant.html
用ANT構造Application作者:余斌斌
http://developer.ccidnet.com/pub/disp/Article?columnID=295&articleID=27619&pageNO=1
ibm 利用 Ant 和 JUnit 進行增量開發——使用單元測試來逐步改進代碼
http://www-900.ibm.com/developerWorks/cn/java/j-ant/index.shtml
SET ANT_HOME=D:\jakarta-ant-1.5.1 //注意是Ant的安裝目錄,不是bin子目錄 SET PATH=%PATH%;%ANT_HOME%\bin; |
Buildfile: build.xml does not exist! Build failed |
//HelloWorld.java package com.sharetop.antdemo; public class HelloWorld { public static void main( String args[] ) { System.out.println("Hello world. "); } } |
<?xml version="1.0" encoding="UTF-8" ?> <project name="HelloWorld" default="run" basedir="." > <property name="src" value="src"/> <property name="dest" value="classes"/> <property name="hello_jar" value="hello.jar" /> <target name="init"> <mkdir dir="${dest}"/> </target> <target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}"/> </target> <target name="build" depends="compile"> <jar jarfile="${hello_jar}" basedir="${dest}"/> </target> <target name="run" depends="build"> <java classname="com.sharetop.antdemo.HelloWorld" classpath="${hello_jar}"/> </target> </project> |
圖1 ant_demo應用的目錄結構
G:\myDoc\ant_demo>ant -buildfile build_front.xml |
G:\myDoc\ant_demo>ant compile |
目錄 | 文件 |
bin | 公共的二進制文件,以及運行腳本 |
build | 臨時創建的文件,如類文件等 |
dist | 目標輸出文件,如生成Jar文件等。 |
doc/javadocs | 文檔。 |
lib | 需要導出的Java包 |
src | 源文件 |
<target name="core" depends="init"> <ant dir="components" target="core"/> <ant dir="waf/src" target="core"/> <ant dir="apps" target="core"/> </target> |
圖2 build.xml文件的結構
<!DOCTYPE project [ <!ENTITY share-variable SYSTEM "file:../share-variable.xml"> <!ENTITY build-share SYSTEM "file:../build-share.xml"> ]> <project name="main" default="complie" basedir="."> &share-variable; &build-share; ... ... |
<target name="deploy_HelloEJB" depends="compile"> <delete dir="${temp}/ejb_make"/> <!-- 首先刪除臨時目錄 --> <delete file="${temp}/helloEJB.jar"/> <!-- 刪除WebLogic域中老版本的EJB --> <delete file="${weblogic.deploy.dest}/helloEJB.jar"/> <!-- 創建META-INF目錄,放置ejb-jar.xml和weblogic-ejb-jar.xml --> <mkdir dir="${temp}/ejb_make/META-INF"/> <!-- 拷貝ejb-jar.xml和weblogic-ejb-jar.xml 到臨時目錄--> <copy todir="${temp}/ejb_make/META-INF"> <fileset dir="etc/baseinfo"> <include name="*.xml"/> </fileset> </copy> <!-- 拷貝所有的helloEJB類到臨時目錄 --> <copy todir="${temp}/ejb_make/"> <fileset dir="${dest.classes}/"> <!-- dest.classes是輸出的類文件目錄 --> <include name="${dest.classes}/helloEJB/**"/> </fileset> </copy> <!-- 將所有這些文件打包成helloEJB.jar --> <jar jarfile="${temp}/helloEJB.jar" basedir="${temp}/ejb_make"/> <!-- 進行weblogic.ejbc編譯 --> <java classpath="${wl_cp}" classname="weblogic.ejbc" fork="yes" > <classpath> <fileset dir="lib"> <include name="*.jar" /> </fileset> </classpath> <arg value="${temp}/helloEJB.jar" /> <arg value="${temp}/helloEJB_deploy.jar" /> </java> <!-- 拷貝/發布到WebLogic的{DOMAIN}\applications目錄 --> <copy file="${temp}/helloEJB_deploy.jar" todir="${weblogic.deploy.dest}"/> </target> |
<target name="run" depends="client"> <junit printsummary="yes" fork="yes" haltonfailure="yes"> <classpath> <pathelement location="client.jar" /> </classpath> <formatter type="plain" /> <test name="com.sharetop.antdemo.HelloWorldTest" /> </junit> </target> |
//HelloInfoTask.java package com.sharetop.antdemo; import org.apache.tools.ant.*; public class HelloInfoTask { private String msg; public void execute() throws BuildException { System.out.println(msg); } public void setMessage(String msg) { this.msg = msg; } } |
//HelloTask.java package com.sharetop.antdemo; import org.apache.tools.ant.*; public class HelloTask extends Task implements org.apache.tools.ant.TaskContainer { private Task info; private int count; public void execute() throws BuildException { for(int i=0;i<count;i++) info.execute(); } public void setCount(int c){ this.count=c; } public void addTask(Task t){ this.info=t; } } |
<target name="hello" depends="client"> <taskdef name="hello" classname="com.sharetop.antdemo.HelloTask" classpath="client.jar"/> <taskdef name="helloinfo" classname="com.sharetop.antdemo.HelloInfoTask" classpath="client.jar"/> <hello count="3" > <helloinfo message="hello world" /> </hello> </target> |
package com.sharetop.antdemo; import org.apache.tools.ant.*; import org.apache.tools.ant.taskdefs.*; import java.io.File; public class RunAntTask { public RunAntTask() { } public static void main(String args[]){ AntJAR j = new AntJAR(); j.setBasedir(new File("./classes")); j.setJarfile(new File("aaa.jar")); j.execute(); } } final class AntJAR extends Jar { public AntJAR() { project = new Project(); project.init(); taskType = "jar"; taskName = "jar"; } } |
public void buildTarget(String targetName,String buildFileName) { try { Project p = new Project(); p.init(); File f = new File(buildFileName); p.setUserProperty("ant.file",f.getAbsolutePath()); ProjectHelper.configureProject(p,f); p.addBuildListener(this); if( targetName==null ) p.executeTarget(p.getDefaultTarget()); else p.executeTarget(targetName); } catch (Exception ex) { jTextArea1.append(ex.getMessage()); } } |
public void buildStarted(BuildEvent event){ /* nothing*/ } public void buildFinished(BuildEvent event) { /* nothing*/ } public void targetStarted(BuildEvent event) { this.jTextArea1.append(event.getTarget().getName()+": \n\r"); } public void targetFinished(BuildEvent event) {/* nothing*/ } public void taskStarted(BuildEvent event) {/* nothing*/ } public void taskFinished(BuildEvent event) { /* nothing*/ } public void messageLogged(BuildEvent event) { int prior = event.getPriority(); switch(prior){ case Project.MSG_ERR : this.jTextArea1.append("["+event.getTask().getTaskName()+"]Err:" +event.getMessage()); break; case Project.MSG_INFO: this.jTextArea1.append("["+event.getTask().getTaskName()+"]"+event.getMessage ()); break; case Project.MSG_WARN: this.jTextArea1.append("["+event.getTask().getTaskName()+"]" +event.getMessage()); break; case Project.MSG_VERBOSE: this.jTextArea1.append(event.getMessage()); break; } } |
//服務器代碼
/********************************Main******************************/
import java.io.*;
import java.net.*;
import java.util.*;
public class ServerMain{
public static Vector socketVector=new Vector();
public static void main(String[] args) throws IOException{
System.out.println("服務器啟動........");
ServerSocket s = new ServerSocket(5000);
while(true){
Socket soc = s.accept();
SocketThread st=new SocketThread(soc);
socketVector.addElement(st);
st.start();
}
}
public static void sendEveryone(String msg){
Object object=null;
int len=socketVector.size();
for(int i=0;i<len;i++){
try {
object=socketVector.elementAt(i);
SocketThread st = (SocketThread)object;
st.sender.send(msg);
}
catch (Exception ex) {
socketVector.removeElement(object);
}
}
}
public static void removeObject(Object object){
socketVector.removeElement(object);
}
public static void removeObject(Sender sender) throws Exception{
int len=socketVector.size();
for(int i=0;i<len;i++){
Object object=socketVector.elementAt(i);
SocketThread st = (SocketThread)object;
if(st.sender==sender)
socketVector.removeElement(object);
}
}
}
/*********************************SocketThread **********************/
import java.io.*;
import java.net.*;
import java.util.*;
public class SocketThread implements Runnable{
public Socket socke;
public DataInputStream dis;
public DataOutputStream dos;
public Sender sender;
private boolean stop;
Calendar date;// = Calendar.getInstance(TimeZone.getTimeZone("Asia/ShangHai"));
public SocketThread(Socket sok){
socke=sok;
}
public void start(){
Thread t=new Thread(this);
t.start();
}
public void run() {
try {
socke.setKeepAlive(true);
dis = new DataInputStream(socke.getInputStream());
dos = new DataOutputStream(socke.getOutputStream());
sender = new Sender(dos);
while (true) {
StringBuffer sb = new StringBuffer();
char c;
while (((c = dis.readChar()) != '\n') && (c != -1)) {
sb.append(c);
}
if (c == -1) {
break;
}
date = Calendar.getInstance(TimeZone.getTimeZone("Asia/ShangHai"));
String ljnTime="("+date.get(date.YEAR)+"/"+(date.get(date.MONTH)+1)+"/"+date.get(date.DATE)+" "+date.get(date.HOUR_OF_DAY)+":"+date.get(date.MINUTE)+":"+date.get(date.SECOND)+")";
String acceptMsg=sb.toString();
System.out.println(ljnTime+acceptMsg);
ServerMain.sendEveryone(acceptMsg);
}
stop();
ServerMain.removeObject(this);
} catch (IOException ioe) {
} catch (Exception e) {
e.printStackTrace();
}
}
public void stop() {
try {
stop = true;
if(sender!=null){
sender.stop1();
}
if (dis != null) {
dis.close();
}
if (dos != null) {
dos.close();
}
if (socke != null) {
socke.close();
}
} catch (IOException ioe) {
}
}
}
/*********************************************Sender**************************/
import java.io.*;
public class Sender extends Thread {
private DataOutputStream dos;
private String message;
public Sender(DataOutputStream os) {
this.dos = os;
start();
}
public synchronized void send(String msg) {
message = msg;
notify();
}
public synchronized void run() {
while (true) {
if (message == null) {
try {
wait();
} catch (InterruptedException e) {
}
}
if (message == null) {
break;
}
try {
dos.writeChars(message);
dos.writeChars("\r\n");
} catch (IOException ioe) {
try {
ServerMain.removeObject(this);
}
catch (Exception ex) {
}
}
message = null;
}
}
public synchronized void stop1() {
message = null;
notify();
}
}
//下面為手機客戶端代碼
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class ChatClientMIDlet extends MIDlet {
private static ChatClientMIDlet instance;
public static ChatForm displayable = new ChatForm();
/** Constructor */
public ChatClientMIDlet() {
instance = this;
}
/** Main method */
public void startApp() {
Display.getDisplay(this).setCurrent(displayable);
}
/** Handle pausing the MIDlet */
public void pauseApp() {
}
/** Handle destroying the MIDlet */
public void destroyApp(boolean unconditional) {
}
public static void setCurrent(Displayable s){
Display.getDisplay(instance).setCurrent(s);
}
/** Quit the MIDlet */
public static void quitApp() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}
}
/********************************************************ChatForm ************************/
import com.nec.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
public class ChatForm extends Form implements CommandListener,Runnable {
public Form mainForm=new Form("聊天室");
public Command enter=new Command("進入",Command.OK,0);
public Command send=new Command("發送",Command.OK,1);
public Command exit=new Command("退出",Command.EXIT,0);
public DataInputStream dis;
public DataOutputStream dos;
public SocketConnection sc;
public Sender sender;
public boolean stop;
public TextField textField=new TextField("請輸入昵稱:", null, 10, TextField.ANY);
public TextField info=new TextField("請輸入消息:", null,255, TextField.ANY);
public ChoiceGroup choiceGroup=new ChoiceGroup(null,ChoiceGroup.EXCLUSIVE);
public String MyName="游客";
public boolean isCurrent=false;;
public ChatForm() {
super("我的聊天室");
append(textField);
addCommand(enter);
mainForm.append(info);
mainForm.append(choiceGroup);
choiceGroup.append(");
setCommandListener(this);
mainForm.addCommand(send);
mainForm.addCommand(exit);
mainForm.setCommandListener(this);
}
public void commandAction(Command c, Displayable dis) {
if(c==enter){
if(textField.getString().length()==0){
Alert alert=new Alert("警告","昵稱不能為空!", null, AlertType.WARNING) ;
alert.setTimeout(3000);
ChatClientMIDlet.setCurrent(alert);
return;
}else
{
MyName = textField.getString();
append("正在進入......");
}
Thread t=new Thread(this);
t.start();
}else if(c==send){
if(info.getString().length()==0){
Alert alert=new Alert("警告","消息內容不能為空!", null, AlertType.WARNING) ;
alert.setTimeout(3000);
ChatClientMIDlet.setCurrent(alert);
return;
}
sender.send(MyName+"說:"+info.getString());
info.setString("");
}
else{
stop();
ChatClientMIDlet.quitApp();
}
}
public void run() {
try {
sc = (SocketConnection) Connector.open("socket://127.0.0.1:5000");
sc.setSocketOption(SocketConnection.LINGER, 5);
dis = new DataInputStream(sc.openInputStream());
dos = new DataOutputStream(sc.openOutputStream());
sender = new Sender(dos);
sender.send("歡迎"+MyName+"進入房間");
while (true) {
if(stop) break;
StringBuffer sb = new StringBuffer();
char c;
while (((c = dis.readChar()) != '\n') && (c != -1)) {
sb.append(c);
}
if (c == -1) break;
if(!isCurrent){
ChatClientMIDlet.setCurrent(mainForm);
isCurrent=true;
}
String msg=sb.toString();
msg=msg.substring(0,msg.length()-2);
choiceGroup.insert(0,msg,null);
choiceGroup.setSelectedIndex(0,true);
}
stop();
} catch (ConnectionNotFoundException cnfe) {
} catch (IOException ioe) {
if (!stop) {
ioe.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void stop() {
try {
stop = true;
if (sender != null) {
sender.stop1();
}
if (dis != null) {
dis.close();
}
if (dos != null) {
dos.close();
}
if (sc != null) {
sc.close();
}
} catch (IOException ioe) {
}
}
}
/**************************Sender*********************************/
同上
在Weblogic 8.1 sp1 上調試《精通EJB 2》源代碼
----連接池及數據源ejbPool的配置.
--------------------------------------------------------------------------------
一. 首先在mysql數據庫中新建一個me2庫,再建一個sa用戶(密碼:222222).授予權限.再提交源代碼中的EJB.sql文件 ( 在EJB.sql文件頭加上use me2; )。
具體如下:
d:\mysql –u root –p
mysql> create database me2;
mysql> GRANT ALL PRIVILEGES ON me2.* TO sa@'localhost' IDENTIFIED BY '222222' WITH GRANT OPTION;
mysql> quit
d:\ mysql –u sa –p < EJB.sql
password: (輸入222222)
完成.
二. 下面開始創建DS:
a. 把mysql的驅動程序mm.mysql-2.0.14-bin.jar復制到 D:\bea\weblogic81\server\lib 目錄下.
b. 修改D:\bea\user_projects\domains\mydomain 目錄下的startweblogic.cmd文件中的 CLASSPATH設置,加上%WL_HOME%\server\lib\mm.mysql-2.0.14-bin.jar;
c. 起動weblogic,登陸 http://localhost:7001/console
--------------------------------------------------------------------------------
1.先建個pool (下圖)
--------------------------------------------------------------------------------
2. (下圖)
--------------------------------------------------------------------------------
3. (下圖)
--------------------------------------------------------------------------------
4. (下圖)
--------------------------------------------------------------------------------
5. (下圖)
--------------------------------------------------------------------------------
6. (下圖)
--------------------------------------------------------------------------------
7. 再建JDBC DS (下圖)
--------------------------------------------------------------------------------
8. (下圖)
--------------------------------------------------------------------------------
9. (下圖)
--------------------------------------------------------------------------------
10(下圖)
--------------------------------------------------------------------------------
11. (下圖)
--------------------------------------------------------------------------------
12. 部署你的EJB,可以進行測試了(下圖)
--------------------------------------------------------------------------------
13. 運行cmp 2.0的例子. Client輸出:
14. Console 上輸出
1. 在http://localhost:7001/console 找到 Configure a new JMS Topic..
2.如下圖輸入:
3.Create成功后.
4.部署你的消息驅動Bean
5.運行客戶端,run_client.bat
6.weblogic控制臺上的輸出.
/*$T BYBARP~1.H GC 1.137 09/13/05 08:37:52 */
#ifndef ByBarPrinterH
#define ByBarPrinterH
#include "vcl.h"
#define BPLA_OK 1000 //一切正常
///
#define BPLA_COMERROR 1001 //通訊錯或者未聯接打印機
#define BPLA_PARAERROR 1002 //參數錯誤
#define BPLA_FILEOPENERROR 1003 //文件打開錯誤
#define BPLA_FILEREADERROR 1004 //文件讀錯誤
#define BPLA_FILEWRITEERROR 1005 //文件寫錯誤
#define BPLA_FILEERROR 1006 //文件不合要求
#define BPLA_NUMBEROVER 1007 //指定的接收信息數量過大
#define BPLA_IMAGETYPEERROR 1008 //圖象文件格式不正確
#define BPLA_PAPERSHORT 1009 //缺紙
#define BPLA_RIBBIONSHORT 1010 //缺色帶
#define BPLA_BUSY 1011 //解釋器忙
#define BPLA_PAUSE 1012 //暫停
///中
#define BPLA_HEADHEAT 1013 //打印頭過熱
#define BPLA_HEADOVER 1014 //打印頭抬起
#define BPLA_CUT 1015 //切刀錯
#define BPLA_READERROR 1016 //read error
//打開端口
typedef int (__stdcall *mBY_Open_Port) (int devtype, int porttype, char *opencode, int codelength, int baudrate);
//打印
typedef int (__stdcall *mBY_Print_Label)
(
int LabelType,
const char *JiDaJu,
const char *FenFaJu,
const char *TiaoMaXinXi,
const char *HaoMa,
const char *JianShu,
const char *ZhongLiang,
const char *ZhuanKouJuDaiHao,
const char *XingHao,
const char *BeiZhu,
const char *BiaoPaiBianHao,
const char *ZhongLeiJianCheng,
const char *BenZhuan,
int Pieces
);
//查詢狀態
typedef int (__stdcall *mBY_Query_Status) ();
//關閉端口
typedef int (__stdcall *mBY_Close_Port) (char *closecode, long codelength);
class PACKAGE CByBarPrinter
{
public:
long OpenPort(long nPcIndex, long nPortIndex, long baudrate);
void ClosePort(void);
long PrintLabel
(
long LabelType,
String JiDaJu,
String FenFaJu,
String TiaoMaXinXi,
String HaoMa,
String JianShu,
String ZhongLiang,
String ZhuanKouJuDaiHao,
String XingHao,
String BeiZhu,
String BiaoPaiBianHao,
String ZhongLeiJianCheng,
String BenZhuan,
long Pieces
);
CByBarPrinter(void);
long GetStatus(void);
private:
HINSTANCE m_hDll;
bool LoadLib(void);
};
#endif
/*$T BYBARP~1.CPP GC 1.137 09/13/05 08:37:52 */
#pragma hdrstop
#include "ByBarPrinter.h"
/* ---------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- */
CByBarPrinter::CByBarPrinter(void)
{
m_hDll = NULL;
}
/* ---------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- */
bool CByBarPrinter::LoadLib(void)
{
if(m_hDll == NULL) m_hDll = ::LoadLibrary("byprndll.dll");
if(m_hDll == NULL)
return false;
else
return true;
}
/* ---------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- */
long CByBarPrinter::OpenPort(long nPcIndex, long nPortIndex, long baudrate)
{
long retCode;
if(!LoadLib())
{
retCode = -2;
return retCode;
}
mBY_Open_Port BY_Open_Port;
BY_Open_Port = (mBY_Open_Port) GetProcAddress(m_hDll, "BY_Open_Port");
if(BY_Open_Port == NULL)
{
retCode = -1;
}
else
{
String szCom;
szCom = "COM";
szCom += IntToStr(nPortIndex);
int nLen = szCom.Length();
retCode = BY_Open_Port(nPcIndex, nPortIndex, szCom.c_str(), nLen, 19200);
}
return retCode;
}
/* ---------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- */
void CByBarPrinter::ClosePort(void)
{
if(!LoadLib()) return;
mBY_Close_Port BY_Close_Port;
BY_Close_Port = (mBY_Close_Port) GetProcAddress(m_hDll, "BY_Close_Port");
char CloseCode[50];
int CodeLength = 0;
memset(CloseCode, 0, 50);
BY_Close_Port(CloseCode, CodeLength);
//FreeLibrary(m_hDll);
delete[] CloseCode;
return;
}
/* ---------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- */
long CByBarPrinter::PrintLabel
(
long LabelType,
String JiDaJu,
String FenFaJu,
String TiaoMaXinXi,
String HaoMa,
String JianShu,
String ZhongLiang,
String ZhuanKouJuDaiHao,
String XingHao,
String BeiZhu,
String BiaoPaiBianHao,
String ZhongLeiJianCheng,
String BenZhuan,
long Pieces
)
{
long retCode;
if(!LoadLib())
{
retCode = -2;
return retCode;
}
//USES_CONVERSION;
mBY_Print_Label BY_Print_Label;
BY_Print_Label = (mBY_Print_Label) GetProcAddress(m_hDll, "BY_Print_Label");
if(BY_Print_Label == NULL)
{
retCode = -1;
return S_OK;
}
retCode = BY_Print_Label
(
LabelType,
JiDaJu.c_str(),
FenFaJu.c_str(),
TiaoMaXinXi.c_str(),
HaoMa.c_str(),
JianShu.c_str(),
ZhongLiang.c_str(),
ZhuanKouJuDaiHao.c_str(),
XingHao.c_str(),
BeiZhu.c_str(),
BiaoPaiBianHao.c_str(),
ZhongLeiJianCheng.c_str(),
BenZhuan.c_str(),
Pieces
);
return retCode;
}
/* ---------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------- */
long CByBarPrinter::GetStatus(void)
{
long state;
if(!LoadLib())
{
state = -1;
return state;
}
mBY_Query_Status BY_Query_Status;
BY_Query_Status = (mBY_Query_Status) GetProcAddress(m_hDll, "BY_Query_Status");
if(BY_Query_Status == NULL)
state = -1;
else
state = BY_Query_Status();
return state;
}
#pragma package(smart_init)
//查詢某個時間段的值
select * from tdespatch t
where t.out_time between to_date('2005-10-18 15:47:42','yyyy-mm-dd hh24:mi:ss')
?and to_date('2005-10-20 10:47:42','yyyy-mm-dd hh24:mi:ss')
3。
//復制表(只復制結構,源表名:a?新表名:b)
SQL:?select?*?into?b?from?a?where?1<>1
4。
//拷貝表(拷貝數據,源表名:a?目標表名:b)
SQL:?insert?into?b(a,?b,?c)?select?d,e,f?from?b;
5。
說明:顯示文章、提交人和最后回復時間
SQL:?select?a.title,a.username,b.adddate?from?table?a,(select?max(adddate)?adddate?from?table?where?table.title=a.title)?b
說明:外連接查詢(表名1:a?表名2:b)
SQL:?select?a.a,?a.b,?a.c,?b.c,?b.d,?b.f?from?a?LEFT?OUT?JOIN?b?ON?a.a?=?b.c
說明:日程安排提前五分鐘提醒
SQL:??select?*?from?日程安排?where?datediff('minute',f開始時間,getdate())>5
說明:兩張關聯表,刪除主表中已經在副表中沒有的信息
SQL:??
delete?from?info?where?not?exists?(?select?*?from?infobz?where?info.infid=infobz.infid?)?
說明:--
SQL:??
SELECT?A.NUM,?A.NAME,?B.UPD_DATE,?B.PREV_UPD_DATE
??FROM?TABLE1,?
????(SELECT?X.NUM,?X.UPD_DATE,?Y.UPD_DATE?PREV_UPD_DATE
????????FROM?(SELECT?NUM,?UPD_DATE,?INBOUND_QTY,?STOCK_ONHAND
????????????????FROM?TABLE2
??????????????WHERE?TO_CHAR(UPD_DATE,'YYYY/MM')?=?TO_CHAR(SYSDATE,?'YYYY/MM'))?X,?
????????????(SELECT?NUM,?UPD_DATE,?STOCK_ONHAND
????????????????FROM?TABLE2
??????????????WHERE?TO_CHAR(UPD_DATE,'YYYY/MM')?=?
????????????????????TO_CHAR(TO_DATE(TO_CHAR(SYSDATE,?'YYYY/MM')?¦¦?'/01','YYYY/MM/DD')?-?1,?'YYYY/MM')?)?Y,?
????????WHERE?X.NUM?=?Y.NUM?(+)
??????????AND?X.INBOUND_QTY?+?NVL(Y.STOCK_ONHAND,0)?<>?X.STOCK_ONHAND?)?B
WHERE?A.NUM?=?B.NUM
說明:--
SQL:??
select?*?from?studentinfo?where?not?exists(select?*?from?student?where?studentinfo.id=student.id)?and?系名稱='"&strdepartmentname&"'?and?專業名稱='"&strprofessionname&"'?order?by?性別,生源地,高考總成績
說明:
從數據庫中去一年的各單位電話費統計(電話費定額賀電化肥清單兩個表來源)
SQL:?
SELECT?a.userper,?a.tel,?a.standfee,?TO_CHAR(a.telfeedate,?'yyyy')?AS?telyear,
??????SUM(decode(TO_CHAR(a.telfeedate,?'mm'),?'01',?a.factration))?AS?JAN,
??????SUM(decode(TO_CHAR(a.telfeedate,?'mm'),?'02',?a.factration))?AS?FRI,
??????SUM(decode(TO_CHAR(a.telfeedate,?'mm'),?'03',?a.factration))?AS?MAR,
??????SUM(decode(TO_CHAR(a.telfeedate,?'mm'),?'04',?a.factration))?AS?APR,
??????SUM(decode(TO_CHAR(a.telfeedate,?'mm'),?'05',?a.factration))?AS?MAY,
??????SUM(decode(TO_CHAR(a.telfeedate,?'mm'),?'06',?a.factration))?AS?JUE,
??????SUM(decode(TO_CHAR(a.telfeedate,?'mm'),?'07',?a.factration))?AS?JUL,
??????SUM(decode(TO_CHAR(a.telfeedate,?'mm'),?'08',?a.factration))?AS?AGU,
??????SUM(decode(TO_CHAR(a.telfeedate,?'mm'),?'09',?a.factration))?AS?SEP,
??????SUM(decode(TO_CHAR(a.telfeedate,?'mm'),?'10',?a.factration))?AS?OCT,
??????SUM(decode(TO_CHAR(a.telfeedate,?'mm'),?'11',?a.factration))?AS?NOV,
??????SUM(decode(TO_CHAR(a.telfeedate,?'mm'),?'12',?a.factration))?AS?DEC
FROM?(SELECT?a.userper,?a.tel,?a.standfee,?b.telfeedate,?b.factration
????????FROM?TELFEESTAND?a,?TELFEE?b
????????WHERE?a.tel?=?b.telfax)?a
GROUP?BY?a.userper,?a.tel,?a.standfee,?TO_CHAR(a.telfeedate,?'yyyy')
說明:四表聯查問題:
SQL:?select?*?from?a?left?inner?join?b?on?a.a=b.b?right?inner?join?c?on?a.a=c.c??inner?join?d?on?a.a=d.d?where?.....
說明:得到表中最小的未使用的ID號
SQL:
SELECT?(CASE?WHEN?EXISTS(SELECT?*?FROM?Handle?b?WHERE?b.HandleID?=?1)?THEN?MIN(HandleID)?+?1?ELSE?1?END)?as?HandleID
?FROM??Handle
?WHERE?NOT?HandleID?IN?(SELECT?a.HandleID?-?1?FROM?Handle?a)
6?? 根據父表 只取子表最新的一條記錄{
SQL> select * from testa ;
??????? F1
----------
???????? 1
???????? 2
???????? 3
SQL> select * from testb ;
??????? F
---------- -------------------
???????? 1 2006-04-10 14:56:41
???????? 1 2006-04-10 14:56:53
???????? 1 2006-04-10 14:57:00
???????? 2 2006-04-10 14:57:08
???????? 3 2006-04-10 14:57:19
???????? 3 2006-04-10 14:57:25
6 rows selected.
SQL> select testa.f1,v1.f1,v1.f2 from testa ,(select f1,f2,row_number() over (partition by f1 order
by f2 desc) rn from testb) v1 where testa.f1 = v1.f1 and v1.rn = 1 ;
??????? F
---------- ---------- -------------------
???????? 1??????? ??1 2006-04-10 14:57:00
???????? 2????????? 2 2006-04-10 14:57:08
???????? 3????????? 3 2006-04-10 14:57:25
------------------------------------------
7 查詢語句的優化
select t.* from acc$ t
where
not exists (在此不使用not in 是為了性能上的考慮)
(select 'a' from crm$ a
where
a.客戶名=t.用戶名稱
--a.客戶號=t.用戶編號
用連接池提高Servlet訪問數據庫的效率 |
作者:[本站編輯] 來源:[CSDN] 瀏覽:[ ] | |
一、實現連接池的意義 動態Web站點往往用數據庫存儲的信息生成Web頁面,每一個頁面請求導致一次數據庫訪問。連接數據庫不僅要開銷一定的通訊和內存資源,還必須完成用戶驗證、安全上下文配置這類任務,因而往往成為最為耗時的操作。當然,實際的連接時間開銷千變萬化,但1到2秒延遲并非不常見。如果某個基于數據庫的Web應用只需建立一次初始連 1) 從連接池獲取(或創建)可用連接。 此外, DBConnectionPool類還能夠處理無效連接(原來登記為可用的連接,由于某種原因不再可用,如超時,通訊問題) 1) 裝載和注冊JDBC驅動程序。 本文余下部分將詳細說明這兩個類,最后給出一個示例演示Servlet使用連接池的一般過程。 二、具體實現 DBConnectionManager.java程序清單如下: 001 import java.io.*; 該類在209至345行實現,它表示指向某個數據庫的連接池。數據庫由JDBC URL標識。一個JDBC URL由三部分組成:協議標識(總是jdbc),驅動程序標識(如 odbc、idb、oracle等),數據庫標識(其格式依賴于驅動程序)。例如,jdbc:odbc:de 四、類DBConnectionManager 說明 該類只能創建一個實例,其它對象能夠調用其靜態方法(也稱為類方法)獲得該唯一實例的引用。如031至036行所示,DBConnectionManager類的建構函數是私有的,這是為了避免其它對象創建該類的實例。 drivers 以空格分隔的JDBC驅動程序類列表 其它的屬性和特定連接池相關,其屬性名字前應加上連接池名字: <poolname>.url 數據庫的 JDBC URL 其中url屬性是必需的,而其它屬性則是可選的。數據庫帳號和密碼必須合法。用于Windows平臺的db.properties文件示例 drivers=sun.jdbc.odbc.JdbcOdbcDriver jdbc.idbDriver idb.url=jdbc:idb:c:\\local\\javawebserver1.1\\db\\db.prp access.url=jdbc:odbc:demo 注意在Windows路徑中的反斜杠必須輸入2個,這是由于屬性文件中的反斜杠同時也是一個轉義字符。 五、Servlet使用連接池示例 Servlet API所定義的Servlet生命周期類如: 1) 創建并初始化Servlet(init()方法)。 本例演示連接池應用,上述關鍵步驟中的相關操作為: 1) 在init(),用實例變量connMgr 保存調用DBConnectionManager.getInstance()所返回的引用。 示例程序清單如下: import java.io.*; public void init(ServletConfig conf) throws ServletException { public void service(HttpServletRequest req, HttpServletResponse res) res.setContentType("text/html"); public void destroy() { |
exp airport/airport@ems file=airport2.dmp owner=airport log=exp2.log