??xml version="1.0" encoding="utf-8" standalone="yes"?>
?敏捷软g开发宣aQ我们正在通过亲n实践和帮助其他h实践Q揭C更好的软g开发方法,通过q项工作Q我们认为:(x)
人和交流胜过q程和工?
可工作的软g胜过面面俱到的文?
客户协作胜过合同谈判
响应变化胜过遵@计划
虽然右项也有价|但是我们认ؓ(f)左项更重要??
—?Kent Beck Q?Mike Beedle Q?Arie van Bennekum Q?Alistair Cockburn Q?Ward Cunningham Q?Martin Fowler Q?James Grenning Q?Jim Highsmith Q?Andrew Hunt Q?Ron Jeffries Q?Jon Kern Q?Brian Marick Q?Robert C. Martin Q?Steve Mellor Q?Ken Schwaber Q?Jeff Sutherland Q?Dave Thomas
敏捷软g开发这个词?2006 q的中国软g界听h仍然昑־有些陌生。自 2001 q敏捯盟被发v以来Q敏h法的实践l验和理论研I在不断的更新。而我国的大多数程序员q是只能在书本上d敏捷的好处,很难在项目中q行实践。这其中的原因,主要是缺乏拥有实际敏捷项目经验的人来带领实施敏捷。虽然敏捷开发是U实践行为,很难从书本上直接学习(fn)Q不q多数程序员了解敏捷Q却都是先从书本开始的。无论结果怎样Q从认识到实늚q程是免不了的?
敏捷软g开发之Ҏ(gu)论篇
大家都知道敏捯Y件开发方法包括了多种Ҏ(gu)论,主要有:(x) SCRUM Q?Crystal, 特征驱动软g开发( FDD Q,自适应软g开发( ASD Q,以及(qing)最著名的极限编E?(XP) 。这些方法论分别在不同的著作上专门论q过Q?
SCRUM Q?Agile Software Development with Scrum ?by Ken Schwaber, Mike Beedle Q?Agile Project Management With Scrum ?by Ken Schwaber
FDD: ?Java Modeling in Color with UML ?by Peter Coad, ?A Practical Guide to Feature-Driven Development ?( 特征驱动开?) by Stephen R Palmer, John M. Felsing,
Crystal: ?Crystal Clear ?by Alistair Cockburn
ASD: ?Adaptive Software Development 》(自适应软g开发) by James A. Highsmith
其中以 XP pd的书c居多。h民邮?sh)出版社的一pd极限~程pd丛书Q在国内引进较早。在q没有统一敏捷词汇的情况下Q引发了一Ҏ(gu)捷先锋h士的热情Q是我国E序员的敏捷启蒙教材。这些书包括?Extreme Programming Explained 》(解析极限~程Q,?Extreme Programming Examined 》(极限~程研究Q,?Extreme Programming Installed ?( 极限~程实施 ) Q?Extreme Programming Explored 》(探烦极限~程Q,?Extreme Programming Applied 》(应用极限~程Q?Extreme Programming in Practice 》(极限~程实践Q,?Planning Extreme Programming 》(规划极限~程Q等Q这些书有的是作者的 XP 实践论文Q有些是?XP 目的介l,其中Q值得推荐的是下面两部著作?
?Extreme Programming Explained: Embrace Change ?by Kent Beck
W一版中译版Q《解析极限编E:(x)拥抱变化》, 唐东铭, 人民邮电(sh)出版C?
W二版中译版Q?雷剑文,?sh)子工业出版C?
作ؓ(f) XP 的开׃作,目前已经出版了第二版。在W一版中Q?Kent Beck ?XP 作了详细的描q。从当前软g开发的现状和问题谈P从需求的变化到如何拥抱变化,l出?XP 的四h(hun)D和十二项实践。对于想了解敏捷的来龙去脉的人,此书属于必读之类。在W二版, Kent Ҏ(gu)几年来的实践Qؓ(f) XP 增加了一h(hun)DQ尊重,q增加了原则的概念,同时增加和删改了一些实c?
该书W一版是E序员的宣言Q这?Kent 的背景很有关pR随?XP l历了五六年的发展和实践Q?Kent 自己也逐渐意识刎ͼq样的观点太狭隘了。因此就有了W二版,与其说这是技术书c,到更像是Ua(b)意义的Y工书c。期间也可以看出 XP 的体pL加完备。这其中ؓ(f)H出的是把h攑ֈ了更为重要的C?
?Extreme Programming in Practice ?by James Newkirk, Robert C. Martin
中译版:(x)《极限编E实c, 王钧Q?人民邮电(sh)出版C?
读过了一些列?XP 书籍Q程序员们都?x)觉?XP 非常好,但到底如何才能开始实?XP 呢?q不是太清楚。本pd中的q本书用一个完整的项目作例子Q从头到教lh如何敏捷开发,是一本不可多得的实践教材。如果想直接实施 XP 开发,q本书可以给你很大启C?
敏捷软g开发之实践?
一、极限编E最?jng)_?
׃极限~程是如此的行Q多数敏捷团队都?x)或多或的借鉴一?XP 中的敏捷实践Q?XP 的每一个敏捷实践也实值得大书特书Q而其中最著名的是试驱动开发和重构实践Q?
?Test-Driven Development ?by Kent Beck
中译版:(x)《测试驱动开发》, 崔凯Q中国电(sh)力出版社
试驱动开发是 Kent Beck 另一部力作?“Clean Code That Works?是敏捷开发的目标之一Q那么如何达到这个目标? TDD l出了一U方式。测试实质上是需求。由需求生出的代码肯定是能够工作的功能代码,而要实现 Class 本n的可试性,׃得不写出高度解耦合?Clean 的代码。本书从一?Money 的例子入手,从最初的一炚w求开始,逐步增加需求,完成整个货币pȝ的代码。后面又l出?Unit Test 中的一些最?jng)_践和模式供参考?
然而,本书的教导意义比其实跉|义更H出。作Z?TDD 的教E或入门教材Q这本书无疑是最佳的Q其中提出的一些最?jng)_跉|是值得l常阅读来温?fn)。本书面向的是单元测试,而实际开发中面对的数据库试Q?Web 试{问题ƈ不属于单元测试的范畴。因此读者ƈ不能从中直接q入到实战?
另一本同名书?Test Driven Development: A Practical Guide 》由 Davis Astels 撰写Q他该书看作是 Kent 著作的补充,重点阐述利用 TDD 开发所必要的技术和工具上,因此对实际开发更具实用性?
?Refactoring: Improving the Design of Existing Code ?by Martin Fowler
中译版:(x)《重构:(x)改善既有代码的设计》,侯捷Q熊节,中国?sh)力出版C?
重构q本书的意义在于Q他提供了一U让你写出更加优代码的能力。在试的保证下Q重构能够发挥强大的威力。敏捷团队中Q不断的重构出简单且高效的代码才能够保持拥抱不断变化的需求。后来的一本书?Refactoring to Patterns 》(从重构到模式Q?by Joshua Kerievsky Q更是将重构的威力发挥到极限?
重构曾被UCؓ(f)软g开发图书的双璧Q另一本书是?Design Patterns ?( 设计模式 ) by GoF 。当Ӟ对现在的软g开发这二者已l不是最重要的?Thought Works 的首席科学家 Martin Fowler ȝ了朋友们的各U实践心得,写出了这本书。从几年后的目光来看Q这本书中的多数实践都被各种 IDE 做到了操作菜单中。虽?IDE 提供了大量重构功能,但仅?IDE 是无法写出简z美妙代码的Q多数的敏捷团队重构工作做得q是不够?
另外有一本专门介l结对编E的书,?Pair Programming Illuminated 》(l对~程技术) by by Laurie Williams and Robert Kessler Q指ZZ么要l对Qƈ从各U不同水q不同性格的程序员l对情况来讨实践的优劣。对此有兴趣的程序员不妨一诅R?
二、敏捯Y件开发实?
自从 2001 q敏捯盟成立以来,单独推广极限~程的书变少了,而统一口径推广敏捷的书变得来多。两本同名的敏捷软g开发都是不可多得的好书Q?
?Agile Software Development Q?Principles, Patterns, and Practices ?by Robert C. Martin
中译版:(x)《敏捯Y件开发:(x)原则Q模式与实践》,邓辉Q?清华大学出版C?
被业内h士称?Uncle Bob ?Robert C Martin 在沉寂几q后写出了这部书。该书可以算是从软g开发角度对敏捷Ҏ(gu)阐述的最详细和全面的一本。之前的敏捷书籍多是x于过E改q,而对如何从技术角度实施讲的比较少。本书一开始先介绍了敏捯盟和敏捷开发过E。之后详l论qC面向对象设计的原则,q些原则是本书的_֍之一。后面通过几个目介绍了如何将设计模式应用于项目中?
Uncle Bob 不愧是实늚大师Q写出来的书也是拥有很强的实跉|义。在敏捷团队的办公桌上,应当常备此书Q一来可作ؓ(f)参考查询,二来可以作ؓ(f)新成员的必读书目?
?Agile Software Development ?by Alistair Cockburn
中译版:(x)《敏捯Y件开发》,俞涓Qh民邮?sh)出版?
q本书更加适合理者来阅读?Alistair 从项目h数和交流难易E度Q将敏捷的各U方法划分了光用范围。h数多的或分布式项目就需要靠其他手段来加Z,人数的可以靠 pair programming {进行面寚w的交。交和反馈是敏L(fng)核心。同?Alistair 也介l了一下他提出?Crystal Ҏ(gu)族?
?. 敏捷目理和敏捷需求分?
在推q敏捷一D|间后Q敏L(fng)也意识刎ͼ多数书籍更像是面向开发h员,q于技术化Q难以吸引项目经理或ȝ。因此,一扚w向管理者视角的书也开始Q出水面,q些书包括:(x)
?Agile and Iterative Development 》(敏捷q代开发) by Craig Larman
?Lean Software Development 》( 敏捷 软g开发工??_开发方?Q?by Mary Poppendieck
?Agile Software Development Ecosystems 》(敏捷软g开发生态系l) by Jim Highsmith
书中从各U角度比较和分析各种敏捷Ҏ(gu)的优劣,异同Qv源,适用范围{。这些书对于一个项目主决{用何U过E来在自q团队中实跉|h很好的参考作用?
q两q_(d)Z开始逐渐意识到敏捷开发的侧重点不仅仅是开发过E和开发实践,q包括对需求和目理{其他相x面的实践。一些相关的书籍也?zhn)然出现在Z的视野:(x)
?Agile Project Management 》(敏捷目理Q?by Jim Highsmith
?User Stories Applied ?by Mike Cohn
?Agile Estimating and Planning ?by Mike Cohn
?Agile Requirements & User Stories ?by Louis Molnar
q些书不同于以往新方法,新过E的书目。敏捷项目管理类的书主要介绍如何理敏捷团队Q如何计划要开发的需求,如何为客h供最大的价倹{介l敏捷需求分析的书主要帮助商务分析师或项目经理挖掘和分析用户需求,写出用户故事Q评估和计划用户故事{。h们已l意识到Q各U方法论的实质是相同的,都是提供商业价|减少费Q增加交,快速反馈。因此不需要着重于区分是用了那种Ҏ(gu)。对目l理来说Q不同的目或团队应当采用适应其特D情늚Ҏ(gu)Q而这些方法的基本原则是相同的?
?. 敏捷软g开发新方向
Ҏ(gu)构师或程序员来说Q近q来的技术进展,也得敏捷开发有了新的研I方向:(x)
?Agile Web Development with Rails ?by Dave Thomas, David Hansson, Leon Breedt, and Mike Clark
该书是获?2006JOLT 奖的书,讲得是采?Ruby on Rails q个 Web 开发工h贉|快速开?Web 目Q从而达到快速反馈拥抱变化的目的?
?Refactoring Databases ?by Scott W Ambler
此书?Scott 的新作,延箋和承了?Agile Modeling 》(敏捷建模Q和?Agile Database Techniques 》(敏捷数据Q的思想。在敏捷开发过E中Q作为持久化最常见技术的数据库如果不能够敏捷Q怎么能够适应一ơ次q代和一ơ次发布的修改呢Q书中介l了如何q行数据库演化,如何保证升后数据库数据的正性,以及(qing)最?jng)_c?
]]>
2 @PersistenceContext
3 EntityManager entityManager;
4
5 private final static String CONFIGURETION_FILE = " send_message_zh.properties " ;
6 private static Properties properties = null ;
7
8 public static Properties readConfiguretion()
9 {
10 if (properties == null )
11 {
12 try
13 {
14 properties = new Properties();
15 ClassLoader cl = Thread.currentThread().getContextClassLoader();
16 InputStream inputStream = null ;
17 if (cl != null )
18 {
19 inputStream = cl.getResourceAsStream(CONFIGURETION_FILE);
20 }
21 if (inputStream != null )
22 {
23 properties.load(inputStream);
24 inputStream.close();
25 }
26 }
27 catch (Exception e)
28 {
29 e.printStackTrace();
30 }
31 }
32 return properties;
33 }
34
35
36 /** */ /**
37 *
38 * @param type 接收者类?br /> 39 * @param id 接收者id
40 * @param name 接收者名U?br /> 41 * @param contentVariable 内容中的变动部分
42 * @param url IP地址、端口号、项?br /> 43 * @param value 生计划单号
44 * @param configureInformType 通知cd
45 */
46 public static void sendMessage( int type,
47 String id,
48 String name,
49 Object[] contentVariable,
50 String url,
51 Object[] value,
52 String configureInformType)
53 {
54 String applictionName = "" ;
55 String content = "" ;
56 String URL = "" ;
57 ReceiveType rt = ReceiveType.DEPARTMENT;
58
59 // d资源文g
60 Properties properties = readConfiguretion();
61 applictionName = properties.getProperty( " system.module.appliction.name " );
62 content = MessageFormat.format(properties.getProperty(configureInformType), contentVariable);
63
64 URL = url + MessageFormat.format(properties.getProperty(configureInformType + " .url " ), value);;
65
66
67 if (type == 0 )
68 {
69 rt = ReceiveType.PEOPLE;
70 }
71 if (type == 1 )
72 {
73 rt = ReceiveType.DEPARTMENT;
74 }
75 if (type == 2 )
76 {
77 rt = ReceiveType.ROLE;
78 }
79
80 System.out.println( " ****************************************** " );
81 System.out.println( " * cdQ?" + rt);
82 System.out.println( " * IDQ?" + id);
83 System.out.println( " * 接收者名Uͼ(x) " + name);
84 System.out.println( " * 内容Q?" + content);
85 System.out.println( " * urlQ?" + URL);
86 System.out.println( " ****************************************** " );
87 StartupMessage sm = new StartupMessage(applictionName, rt, " 117 " , " tonywu " , id, name, content, URL);
88
89 SendMessage s = new SendMessage();
90 s.sendMessage(sm);
91 }
92
93 /** */ /**
94 * 从request中得到地址中的参数Q?br /> 95 * @param taskID 接收者类?br /> 96 * @param processorID 处理者ID
97 * @param processorName 处理者名U?br /> 98 * @param processorTime 处理旉
99 */
100 public static void overMessage(String[] processorInfo)
101 {
102 // d资源文g
103 Properties properties = readConfiguretion();
104 String applictionName = properties.getProperty( " system.module.appliction.name " );
105 // Calendar date = Calendar.getInstance();
106 // String t = date.get(Calendar.YEAR)+"-"+date.get(Calendar.MONTH)+"-"+date.get(Calendar.DATE);
107 BeOverMessage bm = new BeOverMessage(applictionName, processorInfo[ 1 ],
108 " 117 " , " tonywu " , new Date());
109
110 System.out.println( " ****************************************** " );
111 System.out.println( " * taskIDcdQ?" + processorInfo[ 1 ]);
112 System.out.println( " * processorIDIDQ?" + processorInfo[ 2 ]);
113 System.out.println( " * processorName接收者名Uͼ(x) " + processorInfo[ 3 ]);
114 System.out.println( " * 旉Q?" + new Date());
115 System.out.println( " ****************************************** " );
116
117 SendMessage s = new SendMessage();
118 s.sendMessage(bm);
119 }
120 }
121
几乎所有的pȝ都需要通过获取配置/资源文g来方侉K|系l?
但怎样获取资源文g?
java的应用通常把配|文件和工程中的其他class攑֜一P如log4j)Q原因是可以方便的用classLoader?getResourceAsStreamQ)Ҏ(gu)获取资源Q其实java内部是q样?
load class的)Q下面是一个简单例子:(x)
比如你把文g(abc.properties)攑ֈcom.yourcompany.common包里面,在确保classpath包括该包的情?
下就可以按下面的Ҏ(gu)获取资源
ClassLoader cl = this.getClass().getClassLoader();
InputStream is = cl.getResourceAsStream("com/yourcompany/"+abc.properties)
q一不,如果abc.properties是一个标准的properties文g的话Q比如其内容如下
messageA = Ok!
q可以这栯取配|信?
Properties props = new Properties();
props.load(is);
String messageA = props.getProperty("messageA ");
则messageA== "Ok"
当然properties也可以是XML格式Q只要他W合http://java.sun.com/dtd/properties.dtd的规范ƈ且包?
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">的DOCTYPE declarationQ就可以用props.loadFromXML(InputSteam in)Ҏ(gu)载入property
ps:property 也提供store()和storeToXMLҎ(gu)保存属?
关于classLoader也可以看看?br />
classloader相关基础知识JVM
jvm是jre里头一个动态连接函数库,jdk里面的jre一般用于运行java本n的程?比如javac,{等.programfiles下面的jre用于q行用户~写的javaE序.
JRE下的bin\client 或?bin\server 的jvm.dll是JVM?
当一台机器上有多个jvm可选择的时?jvm的选择步骤:
1)当前目录有没有jre目录(不准?,
2)父目录下的jre子目?
3)注册表HEKY_LOCAL_MACHINE\SoftWare\Java\Java Runtime Environment\
所以当q行的是jdk\bin\java.exe的时?用的jre是bin的父目录jdk下面的jre\
q行java.exe扑ֈ了jre后有一个验证程?验证jre和java.exe的版本是否一?如果不一致则?x)发生错?/ul>java -verbose:class Main 昄调用的详l信?/ul>
classloader的两U蝲入方?1)pre-loading预先载入,载入基础c?2)load-on-demand按需求蝲?
只有实例化一个类才会(x)被classloader载入,仅仅xq不?x)蝲?/ul>java动态蝲入class的两U方?
1)implicit隐式,卛_用实例化才蝲入的Ҏ(gu)来动态蝲入class
2)explicit昑ּ方式,又分两种方式:
1)java.lang.Class的forName()Ҏ(gu)
2)java.lang.ClassLoader的loadClass()Ҏ(gu)static块在什么时候执?
1)当调用forName(String)载入class时执?如果调用ClassLoader.loadClassq不?x)执?forName(String,false,ClassLoader)时也不会(x)执行.
2)如果载入Class时没有执行static块则在第一ơ实例化时执?比如new ,Class.newInstance()操作
3)static块仅执行一?/ul>
Classcȝ实例.
>>ClasscL法手工实例化,当蝲入Q意类的时候自动创Z个该cd应的Class的实?
>>某个cȝ所有实例内部都有一个栏位记录着该类对应的Class的实例的位置.,
>>每个javacd应的Class实例可以当作是类在内存中的代理h.所以当要获得类的信?如有哪些cd?有哪些方??都可以让cd应的Class的实例代?java的Reflection机制大量的使用q种Ҏ(gu)来实?
>>每个javac都是由某个classLoader(ClassLoader的实?来蝲入的,因此Classcd的实例中都会(x)有栏位记录他的ClassLoader的实?如果该栏位ؓ(f)null,则表Ccd是由bootstrap loader载入?也称root laoder),bootstrap loader不是java所写成,所以没有实?
原生Ҏ(gu):forName0(){方?native修饰W?/ul>自定义ClassLoader:
如实例化一个URLClassLoader. URLClassLoader ucl = new URLClassLoader(new URL[]{new URL("file:/e:/bin/")}),URLClassLoader优先扑ֽ前目?再在url中找.class加蝲.URL中别忘在最后加"/"表示目录各个javacȝ哪些classLoader加蝲?
1)javacd以通过实例.getClass.getClassLoader()得知
2)接口由AppClassLoader(System ClassLoader,可以由ClassLoader.getSystemClassLoader()获得实例)载入
3)ClassLoadercȝbootstrap loader载入ClassLoader hierachy:
jvm建立->初始化动?>产生W一个ClassLoader,即bootstrap loader->bootstrap loader在sum.misc.Launcherc里面的ExtClassLoader,q设定其Parent为null->bootstrap loader载入sun.misc.Launcher$AppClassLoader,q设定其parent为ExtClassLoader(但是AppClassLoader也是由bootstrap loader所载入?->AppClassLoader载入各个xx.class,xx.class也有可能被ExtclassLoader或者bootstrap loader载入.
>>自定义的ClassLoader?getParent()是AppClassLoader.parent和他的加载器q没有关p?
>>ExtClassLoader和AppClassLoader都是URLClassLoader的子c?AppClassLoader的URL是由pȝ参数java.class.path取出的字W串军_,而java.class.path?q行java.exe??cp?classpath或CLASSPATH环境变量军_
>>ExtClassLoader查找的url是系l变量java.ext.dirs,java.ext.dirs默认为jdk\jre\lib\ext
>>Bootstrap loader的查找url是sun.boot.class.path
>>在程序运行后调用System.setProperty()来改变系l变量ƈ不能改变以上加蝲的\?因ؓ(f)classloaderd在System.setProperty之前.sun.boot.class.path是在E序中写ȝ,完全不能修改
委派模型
当classloader有类需要蝲入时先让其parent搜寻其搜寻\径帮忙蝲?如果parent找不?在由自己搜寻自己的搜寻\径蝲?ClassLoader hierachy本来有q种性质
NoClassDefFoundError和ClassNotFoundException
NoClassDefFoundError:当java源文件已~译?class文g,但是ClassLoader在运行期间在其搜寻\径load某个cL,没有扑ֈ.class文g则报q个?
ClassNotFoundException:试图通过一个String变量来创Z个ClasscL不成功则抛出q个异常
]]>
aab application/x-authoware-bin
aam application/x-authoware-map
aas application/x-authoware-seg
ai application/postscript
aif audio/x-aiff
aifc audio/x-aiff
aiff audio/x-aiff
als audio/X-Alpha5
amc application/x-mpeg
ani application/octet-stream
asc text/plain
asd application/astound
asf video/x-ms-asf
asn application/astound
asp application/x-asap
asx video/x-ms-asf
au audio/basic
avb application/octet-stream
avi video/x-msvideo
awb audio/amr-wb
bcpio application/x-bcpio
bin application/octet-stream
bld application/bld
bld2 application/bld2
bmp application/x-MS-bmp
bpk application/octet-stream
bz2 application/x-bzip2
cal image/x-cals
ccn application/x-cnc
cco application/x-cocoa
cdf application/x-netcdf
cgi magnus-internal/cgi
chat application/x-chat
class application/octet-stream
clp application/x-msclip
cmx application/x-cmx
co application/x-cult3d-object
cod image/cis-cod
cpio application/x-cpio
cpt application/mac-compactpro
crd application/x-mscardfile
csh application/x-csh
csm chemical/x-csml
csml chemical/x-csml
css text/css
cur application/octet-stream
dcm x-lml/x-evm
dcr application/x-director
dcx image/x-dcx
dhtml text/html
dir application/x-director
dll application/octet-stream
dmg application/octet-stream
dms application/octet-stream
doc application/msword
dot application/x-dot
dvi application/x-dvi
dwf drawing/x-dwf
dwg application/x-autocad
dxf application/x-autocad
dxr application/x-director
ebk application/x-expandedbook
emb chemical/x-embl-dl-nucleotide
embl chemical/x-embl-dl-nucleotide
eps application/postscript
eri image/x-eri
es audio/echospeech
esl audio/echospeech
etc application/x-earthtime
etx text/x-setext
evm x-lml/x-evm
evy application/x-envoy
exe application/octet-stream
fh4 image/x-freehand
fh5 image/x-freehand
fhc image/x-freehand
fif image/fif
fm application/x-maker
fpx image/x-fpx
fvi video/isivideo
gau chemical/x-gaussian-input
gca application/x-gca-compressed
gdb x-lml/x-gdb
gif image/gif
gps application/x-gps
gtar application/x-gtar
gz application/x-gzip
hdf application/x-hdf
hdm text/x-hdml
hdml text/x-hdml
hlp application/winhlp
hqx application/mac-binhex40
htm text/html
html text/html
hts text/html
ice x-conference/x-cooltalk
ico application/octet-stream
ief image/ief
ifm image/gif
ifs image/ifs
imy audio/melody
ins application/x-NET-Install
ips application/x-ipscript
ipx application/x-ipix
it audio/x-mod
itz audio/x-mod
ivr i-world/i-vrml
j2k image/j2k
jad text/vnd.sun.j2me.app-descriptor
jam application/x-jam
jar application/java-archive
jnlp application/x-java-jnlp-file
jpe image/jpeg
jpeg image/jpeg
jpg image/jpeg
jpz image/jpeg
js application/x-javascript
jwc application/jwc
kjx application/x-kjx
lak x-lml/x-lak
latex application/x-latex
lcc application/fastman
lcl application/x-digitalloca
lcr application/x-digitalloca
lgh application/lgh
lha application/octet-stream
lml x-lml/x-lml
lmlpack x-lml/x-lmlpack
lsf video/x-ms-asf
lsx video/x-ms-asf
lzh application/x-lzh
m13 application/x-msmediaview
m14 application/x-msmediaview
m15 audio/x-mod
m3u audio/x-mpegurl
m3url audio/x-mpegurl
ma1 audio/ma1
ma2 audio/ma2
ma3 audio/ma3
ma5 audio/ma5
man application/x-troff-man
map magnus-internal/imagemap
mbd application/mbedlet
mct application/x-mascot
mdb application/x-msaccess
mdz audio/x-mod
me application/x-troff-me
mel text/x-vmel
mi application/x-mif
mid audio/midi
midi audio/midi
mif application/x-mif
mil image/x-cals
mio audio/x-mio
mmf application/x-skt-lbs
mng video/x-mng
mny application/x-msmoney
moc application/x-mocha
mocha application/x-mocha
mod audio/x-mod
mof application/x-yumekara
mol chemical/x-mdl-molfile
mop chemical/x-mopac-input
mov video/quicktime
movie video/x-sgi-movie
mp2 audio/x-mpeg
mp3 audio/x-mpeg
mp4 video/mp4
mpc application/vnd.mpohun.certificate
mpe video/mpeg
mpeg video/mpeg
mpg video/mpeg
mpg4 video/mp4
mpga audio/mpeg
mpn application/vnd.mophun.application
mpp application/vnd.ms-project
mps application/x-mapserver
mrl text/x-mrml
mrm application/x-mrm
ms application/x-troff-ms
mts application/metastream
mtx application/metastream
mtz application/metastream
mzv application/metastream
nar application/zip
nbmp image/nbmp
nc application/x-netcdf
ndb x-lml/x-ndb
ndwn application/ndwn
nif application/x-nif
nmz application/x-scream
nokia-op-logo image/vnd.nok-oplogo-color
npx application/x-netfpx
nsnd audio/nsnd
nva application/x-neva1
oda application/oda
oom application/x-AtlasMate-Plugin
pac audio/x-pac
pae audio/x-epac
pan application/x-pan
pbm image/x-portable-bitmap
pcx image/x-pcx
pda image/x-pda
pdb chemical/x-pdb
pdf application/pdf
pfr application/font-tdpfr
pgm image/x-portable-graymap
pict image/x-pict
pm application/x-perl
pmd application/x-pmd
png image/png
pnm image/x-portable-anymap
pnz image/png
pot application/vnd.ms-powerpoint
ppm image/x-portable-pixmap
pps application/vnd.ms-powerpoint
ppt application/vnd.ms-powerpoint
pqf application/x-cprplayer
pqi application/cprplayer
prc application/x-prc
proxy application/x-ns-proxy-autoconfig
ps application/postscript
ptlk application/listenup
pub application/x-mspublisher
pvx video/x-pv-pvx
qcp audio/vnd.qcelp
qt video/quicktime
qti image/x-quicktime
qtif image/x-quicktime
r3t text/vnd.rn-realtext3d
ra audio/x-pn-realaudio
ram audio/x-pn-realaudio
rar application/x-rar-compressed
ras image/x-cmu-raster
rdf application/rdf+xml
rf image/vnd.rn-realflash
rgb image/x-rgb
rlf application/x-richlink
rm audio/x-pn-realaudio
rmf audio/x-rmf
rmm audio/x-pn-realaudio
rmvb audio/x-pn-realaudio
rnx application/vnd.rn-realplayer
roff application/x-troff
rp image/vnd.rn-realpix
rpm audio/x-pn-realaudio-plugin
rt text/vnd.rn-realtext
rte x-lml/x-gps
rtf application/rtf
rtg application/metastream
rtx text/richtext
rv video/vnd.rn-realvideo
rwc application/x-rogerwilco
s3m audio/x-mod
s3z audio/x-mod
sca application/x-supercard
scd application/x-msschedule
sdf application/e-score
sea application/x-stuffit
sgm text/x-sgml
sgml text/x-sgml
sh application/x-sh
shar application/x-shar
shtml magnus-internal/parsed-html
shw application/presentations
si6 image/si6
si7 image/vnd.stiwap.sis
si9 image/vnd.lgtwap.sis
sis application/vnd.symbian.install
sit application/x-stuffit
skd application/x-Koan
skm application/x-Koan
skp application/x-Koan
skt application/x-Koan
slc application/x-salsa
smd audio/x-smd
smi application/smil
smil application/smil
smp application/studiom
smz audio/x-smd
snd audio/basic
spc text/x-speech
spl application/futuresplash
spr application/x-sprite
sprite application/x-sprite
spt application/x-spt
src application/x-wais-source
stk application/hyperstudio
stm audio/x-mod
sv4cpio application/x-sv4cpio
sv4crc application/x-sv4crc
svf image/vnd
svg image/svg-xml
svh image/svh
svr x-world/x-svr
swf application/x-shockwave-flash
swfl application/x-shockwave-flash
t application/x-troff
tad application/octet-stream
talk text/x-speech
tar application/x-tar
taz application/x-tar
tbp application/x-timbuktu
tbt application/x-timbuktu
tcl application/x-tcl
tex application/x-tex
texi application/x-texinfo
texinfo application/x-texinfo
tgz application/x-tar
thm application/vnd.eri.thm
tif image/tiff
tiff image/tiff
tki application/x-tkined
tkined application/x-tkined
toc application/toc
toy image/toy
tr application/x-troff
trk x-lml/x-gps
trm application/x-msterminal
tsi audio/tsplayer
tsp application/dsptype
tsv text/tab-separated-values
tsv text/tab-separated-values
ttf application/octet-stream
ttz application/t-time
txt text/plain
ult audio/x-mod
ustar application/x-ustar
uu application/x-uuencode
uue application/x-uuencode
vcd application/x-cdlink
vcf text/x-vcard
vdo video/vdo
vib audio/vib
viv video/vivo
vivo video/vivo
vmd application/vocaltec-media-desc
vmf application/vocaltec-media-file
vmi application/x-dreamcast-vms-info
vms application/x-dreamcast-vms
vox audio/voxware
vqe audio/x-twinvq-plugin
vqf audio/x-twinvq
vql audio/x-twinvq
vre x-world/x-vream
vrml x-world/x-vrml
vrt x-world/x-vrt
vrw x-world/x-vream
vts workbook/formulaone
wav audio/x-wav
wax audio/x-ms-wax
wbmp image/vnd.wap.wbmp
web application/vnd.xara
wi image/wavelet
wis application/x-InstallShield
wm video/x-ms-wm
wma audio/x-ms-wma
wmd application/x-ms-wmd
wmf application/x-msmetafile
wml text/vnd.wap.wml
wmlc application/vnd.wap.wmlc
wmls text/vnd.wap.wmlscript
wmlsc application/vnd.wap.wmlscriptc
wmlscript text/vnd.wap.wmlscript
wmv audio/x-ms-wmv
wmx video/x-ms-wmx
wmz application/x-ms-wmz
wpng image/x-up-wpng
wpt x-lml/x-gps
wri application/x-mswrite
wrl x-world/x-vrml
wrz x-world/x-vrml
ws text/vnd.wap.wmlscript
wsc application/vnd.wap.wmlscriptc
wv video/wavelet
wvx video/x-ms-wvx
wxl application/x-wxl
x-gzip application/x-gzip
xar application/vnd.xara
xbm image/x-xbitmap
xdm application/x-xdma
xdma application/x-xdma
xdw application/vnd.fujixerox.docuworks
xht application/xhtml+xml
xhtm application/xhtml+xml
xhtml application/xhtml+xml
xla application/vnd.ms-excel
xlc application/vnd.ms-excel
xll application/x-excel
xlm application/vnd.ms-excel
xls application/vnd.ms-excel
xlt application/vnd.ms-excel
xlw application/vnd.ms-excel
xm audio/x-mod
xml text/xml
xmz audio/x-mod
xpi application/x-xpinstall
xpm image/x-xpixmap
xsit text/xml
xsl text/xml
xul text/xul
xwd image/x-xwindowdump
xyz chemical/x-pdb
yz1 application/x-yz1
z application/x-compress
zac application/x-zaurus-zac
zip application/zip
]]>
写入Blob字段和写入其它类型字D늚方式非常不同Q因为Blob自n有一个cursorQ你必须使用cursor对blobq行操作Q因而你在写入Blob之前Q必获得cursor才能q行写入Q那么如何获得Blob的cursor呢?
q需要你先插入一个empty的blobQ这创Z个blob的cursorQ然后你再把q个empty的blob的cursor用select查询出来Q这样通过两步操作Q你p得了blob的cursorQ可以真正的写入blob数据了?
看下面的JDBC的demoQ把oraclejdbc.jarq个二进制文件写入数据库表javatest的content字段(q是一个blob型字D?
import java.sql.*;
import java.io.*;
import oracle.sql.*;
public class WriteBlob {
public static void main(String[] args) {
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","fankai","fankai");
conn.setAutoCommit(false);
BLOB blob = null;
PreparedStatement pstmt = conn.prepareStatement("insert into javatest(name,content) values(?,empty_blob())");
pstmt.setString(1,"fankai");
pstmt.executeUpdate();
pstmt.close();
pstmt = conn.prepareStatement("select content from javatest where
}
]]>
1.xtree?a target="_blank">xloadtree,M来说,实现q不?提供了一ơ性构建树(wi),和动态加载树(wi)(生成指定格式的XML才可?,改变Style,功能中等,用法中等.
2.yui?a target="_blank">treeview,q也是不错的实现,是Yahoo提供?支持一ơ性构?动态构?改变Style,Menu样式{等,功能很多,但用法比较复?br />
没用q,只是听说?br />
3.dtree,比较中规中矩的一个实?用法?不支持动态加载?/p>
q有其他的好的jsQ大家可以补充?br />
作者:(x)Kuassi Mensah
利用Java存储q程沟通SQL、XML、Java、J2EE和W(xu)eb服务?
存储q程Qstored procedureQ允许将q行于数据库层中的持久性逻辑与运行于中间层中的商务逻辑有效地分d来。这U分d以降低整个应用程序的复杂性,q提供其重用性、安全性、性能和可伸羃性?
但是Q妨存储过E广泛采用的一个主要障是不同数据库厂商用各U专有的、且依赖于数据库的实现语a。用基于Java的存储过E可以解册一问题。Oracle已经实现了ANSI标准Q这些标准规定了从SQL中将静态JavaҎ(gu)作ؓ(f)q程或函数进行调用的能力。这U实现被单地UC"Java存储q程"?/p>
在本文中Q你了解基于Java的存储过E如何帮助简化商务逻辑、提高其性能Qƈ扩展数据库的功能。本文将介绍Oracle如何在数据库内启用基于Java的存储过E。还?x)介lJava存储q程如何讉K数据Q以?qing)如何创建基本Java存储q程?
选择PL/SQLq是Java
在考虑Oracle存储q程Ӟ你可能会(x)惛_PL/SQL。不q,从Oracle8i开始,Oracle已经在数据库中支持JavaQ从而ؓ(f)存储q程提供了不同于PL/SQL的开攑ּ和可UL的方法。我可以听到"$64 000问题"Q?我如何在PL/SQL和Java之间做出选择Q我是否应当忘记已经学习(fn)的所有PL/SQL相关知识Q而变Z个Java天地的新手?"
两种语言都适用于数据库~程Q都有自q优点和弱炏V在军_选择哪一U语aӞ可以参考下面根据经验得出的通用规则Q?
对于要求与SQLq行无缝集成的数据库中心来说则逻辑使用PL/SQLQ从而完成对数据库对象、类型和Ҏ(gu)的讉K?
Z与数据库的无x考虑Ӟ可以选择Java作ؓ(f)开攑ּ的语a来取代PL/SQLQ同时也Z集成和沟通SQL、XML、J2EE和W(xu)eb服务{各个领域?
OralceJVM使得Java可以q行在数据库?/p>
从Oracle8i版本1QOralce8.1.5Q开始,Oracle便提供紧密集成的Java虚拟机(JVMQ,JVM支持Oralce的数据库?x)话期结构。Q何数据库对话期都可以在第一Java代码调用时启动一个虚拟上专用的JVMQ后l的用户可以使用q一已经存在的支持Java的会(x)话期。事实上Q所有会(x)话共享同一JVM代码q保?仅静?的私有状态,而垃圑ֈ攉在单个对话期I间内,从而ؓ(f)各个Java对话期提供了和SQL操作相同的对话期隔离和数据完整性能力。这里,不需要ؓ(f)了数据完整性而进行单独的Java支持的过E。这一Z对话期的l构提供了较?yu)的内存占用率,qOracleJVMh与Oracle数据库一L(fng)U性SMP可~性?
创徏Java存储q程
要将JavaҎ(gu)转换为Java存储q程需要几个步骤,包括Q用loadjava实用E序Javacd载到数据库中Q利用调用规范(Call SpecQ发布JavaҎ(gu)Q将JavaҎ(gu)、参数类型和q回cd映射到其SQL的对应部分。下面部分说明如何完成这些步骤?
我将使用一个简单的Helloc,它有一个方法Hello.world()Q返回字W串"Hello world"Q?/p>
public class Hello { public static String world () { return "Hello world"; } }
Loadjava 实用E序
Loadjava是加载Java源文件、JavacL件和Java资源文g的实用程序,它可以用来验证字节码QƈJavacdJAR文g布置到数据库中。它既可以通过命o(h)行调用,也可以通过包含于DBMS_JAVAcM的loadjava()Ҏ(gu)调用。ؓ(f)了加载我们的Hello.classCZQ输入:(x)
loadjava -user scott/tiger Hello.class
从Oracle9i版本2开始,loadjava允许通过为包含在被处理的cM的方法创建相应的Call Specs来自动将Javacd布ؓ(f)存储q程。Oracle为开发、测试、调试和布置Java存储q程提供了Oracle9i JDeveloper?/p>
The Resolver Spec
ZJDK的JVM在列于CLASSPATH中的目录中查扄引用Qƈ对其q行解析。因为Oracle数据库类存在于数据库模式中,所以OracleJVM利用数据库解析器QresolverQ通过列于Resolver Spec中的模式查找q解析类引用。与CLASSPATH不同QCLASSPATH可以应用于所有的c)QResover SpecҎ(gu)每类的情况进行应用。缺省解析器首先在加载类的模式中搜寻c,然后在公共同义词Qpublic synonymsQ中搜烦?
loadjava -resolve <myclass>
你可能需要指定不同的解析器,也可以在使用loadjava时强制进行解析,从而在布置时确定可能在以后q行时发生的M问题?
loadjava -resolve -resolver "((* SCOTT) (foo/bar/* OTHERS) (* PUBLIC))"
Call Spec和存储过E调?
Z从SQL中调用JavaҎ(gu)Q以?qing)从PL/SQl和JDBC中调用)Q必首先通过Call Spec发布公共静态方法,它ؓ(f)SQL定义Ҏ(gu)采用的参C?qing)返回的SQLcd?/p>
在我们的例子中,我们利用SQLQPlusq接到数据库Qƈ为Hello.world()定义一个顶UCall SpecQ?
SQL> connect scott/tiger SQL> create or replace function helloworld return VARCHAR2 as language java name 'Hello.world () return java.lang.String'; / Function created.
可以像下面这栯用Java存储q程Q?/p>
SQL> variable myString varchar2[20]; SQL> call helloworld() into :myString; Call completed. SQL> print myString; MYSTRING --------------------- Hello world
Java存储q程可以通过其Call Spec从以下各中q行调用QSQL DML语句QINSERT, UPDATE、DELETE、SELECT、CALL、EXPLAIN PLAN、LOCK TABLE和MERGEQ、PL/SQL块、子E序、程序包以及(qing)数据库触发器。Call Spec的美妙之处在于存储过E实现可以从PL/SQL转换为JavaQ反之亦可,q一点对于请求者是透明的?/p>
Call Spec从实现语a中(PL/SQL或JavaQ中抽象用界面,因而之能够在原有应用E序和新的基于JavaQJ2EE的应用程序之间共享商务逻辑。但是,在从Java客户E序调用在数据库ȝ的JavacLQ你可能不希望通过PL/SQL包装?wrapper)。在以后的版本中QOracle计划提供一U机Ӟ它可以开发h员略qCall Spec?/p>
高数据讉K控制
Java存储q程可用于控制和限制对Oracle数据的访问,其方法是只允许用户通过存储q程理数据Q而存储过E在其调用者的权限内执行,而不能对表本w进行访问。例如,你可以在特定旉内禁止更新数据,或者ɽ理者只h查询工资数据的权利,而不能进行更斎ͼ或者记录所有的讉Kq知某一安全机构?/p>
原有应用E序与J2EE应用E序之间的数据逻辑׃n
因ؓ(f)原有应用E序与J2EE应用E序都通过Call Spec调用存储q程Q所以J2EE和非J2EE应用E序可以׃n相同的数据逻辑。由于有了Call SpecQ所以不用考虑所用的是何U实现语aQ无论是PL/SQLq是JavaQ,该数据逻辑都可以共享?
为BMP实体Bean自动生成d键字
在对EJB实体bean应用BMPӞ一个bean实例可以p动生成的与新插入的数据相兌的主关键字惟一定Q它是ejbCreate()的返回倹{可以利用一个插入相应数据的存储q程在一个数据库操作中检索ejbCeater()中的该|q检索或计算d键字。作为另一U方法,也可以利用JDBC3.0的RETURN_GENERATED_KEYSҎ(gu),以一个SQL语句插入该数据ƈ索相应的关键字(或ROWIDQ。但是,存储q程Ҏ(gu)在各个JDBC驱动器版本和数据库之间更具可UL性?/p>
可以用以下三个步骤实现这一模式Q?br />>
创徏一个Java存储q程Q在公共GenPkcM定义一个公共静态JavaҎ(gu)insertAccount()。此Ҏ(gu)插入数据、计惟一的关键字Q通过发出一个序列号Q,q返回计出的关键字作ؓ(f)d键字?
定义Call Spec
CREATE OR REPLACE PROCEDURE insertAccount(owner IN varchar, bal IN number, newid OUT number) AS LANGUAGE JAVA NAME 'GenPK.insertAccount( java.lang.String [])'; /
在ejbCreate()内调用存储过E?
Public AccountPK ejbCreate(String ownerName, int balance) throws CreateException { try { CallableStatement call = conn.prepareCall{ "{call insertAccount(?, ?, ?)}"}; return new AccountPK(accountID); } }
为CMP实体Bean定制d键字查找?
查找器方法(F(tun)inder methodsQ用于检索已存在的EJB实体bean实例。主关键字查扑֙使你能够索惟一标识的EJB实例。对于CMP实体beanQEJB容器Ҏ(gu)声明描述Q自动生成主关键字查扑֙findByPrimaryKey()Ҏ(gu)。但是,在某些情况下Q可能需要更多的控制Q例如可能需要专门的查找器,如findByStoredProcKey()。在q些情况下,你可以结合用Java存储q程和对象关pLӞ如Oracle9i应用服务器[Oracle9iAS] TopLinkQ来实现定制的主关键字查扑֙Ҏ(gu)。在EJB查找器定义ؓ(f)REDIRECT或NAMED查找器后QTopLink生成一个SQL查询用于索bean实例?/p>
数据驱动的EJB调用
在数据驱动体pȝ构中Q商务逻辑调用可以作ؓ(f)数据库操作(如插入、更新或删除Q的l果来触发。实现该数据逻辑的Java存储q程可以被声明ؓ(f)数据库触发器Q用以调用运行于中间层J2EE应用服务器的EJB。EJB的调用既可以采用J2EE1.3兼容的服务器通过Interoperable Inter-ORB ProtocolQIIOPQ标准远E方法调用(remote method invocationQRMIQ实玎ͼ也可以通过销售商特定的传输协议(如Oracle9iAS/Oc4J的ORMIQ或者通过BEA WebLogic的T3Q用RMI来实现。每个应用服务器提供商在提供ZIIOP的RMIQ以提供互操作性的同时Q都有其自己优化的协议。Oracle9iAS同时支持ZIIOP的RMI调用和基于ORMI协议的RMI调用?
数据驱动的消息传?
Oracle9i数据库嵌入了Advanced QueuingQAQQ高U排队)Q它是一U集成的、稳定、可靠、安全、可扩展和事务处理式的消息排队框架。Oracle通过标准的Java消息传送系l(Java Messaging SystemQJMSQAPI为Java开发h员提供AQ功能。Java存储q程可以通过JMS接口调用AQ操作Q从而能够实现快速、在?x)话期内、可扩展的、数据驱动的消息传送?
Java存储q程可以利用JMS调用AQ操作。可以用以下4个步骤实现这一模式Q?/p>
创徏q启动JMS QueueQؓ(f)此,可以以下一些操作嵌入SQL脚本内)Q?
execute dbms_aqadm.create_queue_table(queue_table => 'queue1', queue_payload_type => 'SYS.AQ$_JMS_TEXT_MESSAGE', comment => 'a test queue', multiple_consumers => false, compatible => '8.1.0'); execute dbms_aqadm.create_queue( queue_name => 'queue1', queue_table => 'queue1' ); execute dbms_aqadm.start_queue(queue_name => 'queue1');
创徏Java存储q程Q代码摘录如下)Q?
public static void runTest(String msgBody) { try { // get database connection ora_drv = new OracleDriver(); db_conn = ora_drv.defaultConnection(); // setup sender (cf online code sample) .. // create message s_msg = s_session.createTextMessage(msgBody); // send message sender.send(s_msg); s_session.commit(); // receive message r_msg = (TextMessage) receiver.receive(); r_session.commit(); // output message text String body = r_msg.getText(); System.out.println("message was '"+body+"'"); ..} }
创徏Call SpecQ?
create or replace procedure jmsproc (t1 IN VARCHAR) as language java name 'jmsSample.main (java.lang.String[])'; /
调用存储q程Q?
call jmsproc('hello');
数据库辅助的Web发布Q缓冲失效)
各应用程序结构必面对的一个共同问题是如果可靠地将数据库信息进行缓存,以提高整个系l的性能。JCACHE是一U即公布的标准规范QJSR 107Q,它可以解册一问题。它说明了一U对Java对象临时在内存中q行~存的方法,包括对象的创建、共享访问、假脱机QspoolingQ、失效、各JVM的一致性等。它可被用于~存JSP内最l常d的数据,如品目录和h列表。利用JCACHEQ多数查询的反应旉?x)因为有~存的数据而加快(内部试表明反应旉大约?5倍)?
Z跟踪原始数据的所有变化,q刷新已~存的数据,Java存储q程?x)作Z个触发器被附加在一个表上。这个表的Q何变化都?x)自动调用该存储q程Q后者再调出一个已定义的JSP使JCACHE对象失效Q该对象其状态映到该数据库表。在失效Ӟ紧跟其后的查询将强制~存器根据数据库的数据进行更新?下面的步?
阅读关于Java存储q程的更多信?br />本文摘自白皮?释放Java存储q程的能量(Unleash the Power of Java Stored ProceduresQ?Q可以在以下位置扑ֈ该白皮书Q?br />otn.oracle.com/tech/java/java_db/pdf/
OW_30820_JAVA_STORED_PROC_paper.PDF
Oracle9i数据库第2版中的新PL/SQLҎ(gu)?br />otn.oracle.com/tech/pl_sql/pdf/
Paper_30720_Doc.pdf
Resolver Spec
otn.oracle.com/docs/products/oracle9i/
doc_library/release2/java.920/a96659.pdf
OracleJVM and Java 2 Security
otn.oracle.com/docs/products/oracle9i/
doc_library/release2/java.920/a96656.pdf
下蝲代码
l习(fn)本文中的代码CZQ?
otn.oracle.com/sample_code/tech/
java/jsp/Oracle9iJSPSamples.html
了解作ؓ(f)Web服务的存储过E?br />otn.oracle.com/tech/webservices
扩展数据库的功能
在数据库中直接运行Java代码的一个妙处就在于要实现新的功能,只需要简单地加蝲代码或库Qƈ利用Call Spec制作可用于SQL、PL/SQL、Java、J2EE和非Java API的进入点Q公共静态方法)。Oracle9i数据库用户可以很Ҏ(gu)地扩展数据库
功能。Oracle自己利用q种能力来获得新的应用程序和工具包,如XML Developer KitsQXDKsQ?
沟通SQL、PL/SQL、Java、J2EE?NET和XML
Oracle XDK是用Java~写的,q将其公共方法可用作Java存储q程Q从而扩展了数据库的XML可编E能力。SQL、PL/SQL、Java、J2EE和非JavaQ?NETQ商务逻辑都能够访问XML分析器、XSLT处理器、XPath引擎和XML SQL UtilityQXSUQ?
XML分析器可以通过xmlparser和xmldom包进行访问。XSU是一UJava实用E序Q它可以由SQL查询l果或JDBC ResultSet生成XML文档QƈXML文档中的数据写入数据库表或视图中。利用XSUQXML输出可以输出为文本、Dom?wi)或DTS。通过dbms_xmlquery和dbms_xmlsave包,XSU卛_用于PL/SQL?
l论
Oracle数据库与Java VM的集成可以创建可UL、功能强大和与数据库无关的数据逻辑和持l性逻辑Qpersistence logicQ。运行于中间层的商务逻辑和运行于数据库层的数据逻辑之间的分L高了应用E序的可扩展性、灵zL和可维护性?/p>
定义Q?/p>
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>目录的徏?查与删除</title>
</head>
<body>
<%
String path=request.getRealPath("");
path=path + "\\Sub";//要建立的目录\?
File d=new File(path);//建立代表Sub目录的File对象Qƈ得到它的一个引?
if(d.exists()){//查Sub目录是否存在
d.delete();
out.println("Sub目录存在Q已删除");
}else{
d.mkdir();//建立Sub目录
out.println("Sub目录不存在,已徏?);
}
%>
</body>
</html>
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>JSP中如何处理虚拟目?lt;/title>
</head>
<body>
取得虚拟目录对应的磁盘\?lt;br>
Web站点ȝ录的位置?lt;font color=#ff0000><%=request.getRealPath("/")%></font><br>
JSP|页所在的目录位置<font color=#ff0000><%=request.getRealPath("./")%></font><br>
JSP|页所在目录上一层目录的位置<font color=#ff0000><%=request.getRealPath("../")%></font><br>
</body>
</html>
文g属性的取得
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date,java.io.*"%>
<html>
<head>
<title>文g属性的取得</title>
</head>
<body>
<%
String path=request.getRealPath("/");
File f=new File(path,"ReadData.txt");
if(f.exists()){
%>
<%=f.getName()%>的属性如下:(x)<br><br>
文g长度为:(x)<%=f.length()%>
<%=f.isFile()?"是文?:"不是文g"%><br>
<%=f.isDirectory()?"是目?:"不是目录"%><br>
<%=f.canRead()?"可读?:"不可d"%><br>
<%=f.canWrite()?"可写?:"不可写入"%><br>
<%=f.isHidden()?"是隐藏文?:"不是隐藏文g"%><br>
文g的最后修Ҏ(gu)期ؓ(f)Q?lt;%=new Date(f.lastModified())%><br>
<%
}else{
f.createNewFile();//在当前目录下建立一个名为ReaData.txt的文?
%>
<%=f.getName()%>的属性如下:(x)<br><br>
文g长度为:(x)<%=f.length()%>
<%=f.isFile()?"是文?:"不是文g"%><br>
<%=f.isDirectory()?"是目?:"不是目录"%><br>
<%=f.canRead()?"可读?:"不可d"%><br>
<%=f.canWrite()?"可写?:"不可写入"%><br>
<%=f.isHidden()?"是隐藏文?:"不是隐藏文g"%><br>
文g的最后修Ҏ(gu)期ؓ(f)Q?lt;%=new Date(f.lastModified())%><br>
<%
}
%>
</body>
</html>
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>取出目录中文件的Ҏ(gu)--列出目录中的文g</title>
</head>
<body>
<%
String path=request.getRealPath("/");
File d=new File(path);//建立当前目录中文件的File对象
File list[]=d.listFiles();//取得代表目录中所有文件的File对象数组
out.println("<font color=#ff0000>" + path + "目录下的文gQ?lt;/font><br>");
for(int i=0;i<list.length;i++){
if(list<I>.isFile()){
out.println(list<I>.getName() + "<br>");
}
}
out.println("<br><font color=#ff0000>" + path + "目录下的目录Q?lt;/font><br>");
for(int i=0;i<list.length;i++){
if(list<I>.isDirectory()){
out.println(list<I>.getName() + "<br>");
}
}
%>
</body>
</html>
判断是否为空白文?
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>判断是否为空白文?lt;/title>
</head>
<body>
<%
String path=request.getRealPath("/");
out.println(path);
FileReader fr=new FileReader(path + "\\AtEnd.txt");//建立FileReader对象Qƈ实例化ؓ(f)fr
//对FileReadercȝ成的对象使用read()Ҏ(gu)Q可以从字符中d下一个字W?
if(fr.read()==-1)//判断是否已读到文件的l尾
{
out.print("AtEnd.txt文g中没有数?lt;br>");
}else{
out.println("AtEnd.txt文g中有数据");
}
fr.close();
%>
</body>
</html>
<B>d所有的文g数据</B>
<ccid_nobr>
<table width="400" border="1" cellspacing="0" cellpadding="2"
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">
<tr>
<td bgcolor="e6e6e6" class="code" style="font-size:9pt">
<pre><ccid_code> <%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*,java.lang.*"%>
<html>
<head>
<title>d所有的文g数据</title>
</head>
<body>
<%
String path=request.getRealPath(".");
FileReader fr=new FileReader(path + "\\ReadData.txt");
//关键在于dq程中,要判断所d的字W是否已l到了文件的末尾Q?
q且q个字符是不是文件中的断行符Q即判断该字W值是否ؓ(f)13?
int c=fr.read();//从文件中d一个字W?
//判断是否已读到文件结?
while(c!=-1){
out.print((char)c);//输出d的数?
c=fr.read();//从文件中l箋d数据
if(c==13){//判断是否为断行字W?
out.print("<br>");//输出分行标签
fr.skip(1);//略过一个字W?
//c=fr.read();//d一个字W?
}
}
fr.close();
%>
</body>
</html>
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>文gd</title>
</head>
<body>
<%
String path=request.getRealPath("");//取得当前目录的\?
FileReader fr=new FileReader(path + "\\file\\inc\\t.txt");//建立FileReader对象Qƈ实例化ؓ(f)fr
BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象Qƈ实例化ؓ(f)br
String Line=br.readLine();//从文件读取一行字W串
//判断d到的字符串是否不为空
while(Line!=null){
out.println(Line + "<br>");//输出从文件中d的数?
Line=br.readLine();//从文件中l箋d一行数?
}
br.close();//关闭BufferedReader对象
fr.close();//关闭文g
%>
</body>
</html>
略过文g中的字符不读?
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>略过字节不读?lt;/title>
</head>
<body>
<%
String path=request.getRealPath(".");
FileReader fr=new FileReader(path + "\\ReadData.txt");
fr.skip(2);//跌2个字?
int c=fr.read();//d一个字?
while(c!=-1){
out.print((char)c);
c=fr.read();
}
fr.close();
%>
</body>
</html>
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>数据写入文?lt;/title>
</head>
<body>
<%
String path=request.getRealPath(".");
FileWriter fw=new FileWriter(path + "\\WriteData.txt");//建立FileWriter对象Qƈ实例化fw
//字W串写入文g
fw.write("大家好!");
fw.write("本书是《JSP~程技巧?);
fw.write("请多多指教!");
fw.write("email:stride@sina.com");
fw.close();
FileReader fr=new FileReader(path + "\\WriteData.txt");
BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象Qƈ实例化ؓ(f)br
String Line=br.readLine();
//d一行数?
out.println(Line + "<br>");
br.close();//关闭BufferedReader对象
fr.close();
%>
</body>
</html>
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>写入文件的数据分行</title>
</head>
<body>
<%
String path=request.getRealPath(".");
FileWriter fw=new FileWriter(path + "\\WriteData.txt");
BufferedWriter bw=new BufferedWriter(fw);
bw.write("大家好!");
bw.write("本书是《JSP~程技巧》?);
bw.newLine();//断行
bw.write("请多多指教!");
bw.newLine();//断行
bw.write("email: stride@sina.com");
bw.flush();//数据更新至文g
fw.close();//关闭文g?
out.println("写入文g内容为:(x)<br>");
FileReader fr=new FileReader(path + "\\WriteData.txt");
BufferedReader br=new BufferedReader(fr);
String Line=br.readLine();//d一行数?
while(Line!=null){
out.println(Line + "<br>");
Line=br.readLine();
}
fr.close();
%>
</body>
</html>
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*"%>
<html>
<head>
<title>写入文件的数据分行</title>
</head>
<body>
<%
String path=request.getRealPath(".");
RandomAccessFile rf=new RandomAccessFile(path + "\\WriteData.txt","rw");
//定义一个类RandomAccessFile的对象,q实例化
rf.seek(rf.length());//指针移动到文g末尾
rf.writeBytes("\nAppend a line to the file!");
rf.close();//关闭文g?
out.println("写入文g内容为:(x)<br>");
FileReader fr=new FileReader(path + "\\WriteData.txt");
BufferedReader br=new BufferedReader(fr);//d文g的BufferedRead对象
String Line=br.readLine();
while(Line!=null){
out.println(Line + "<br>");
Line=br.readLine();
}
fr.close();//关闭文g
%>
</body>
</html></I></I></I></I>
首先我们需要知道Java和J2EE是两个不同概念,Java不只是指一U语aQ已l代表与微Y不同的另外一个巨大阵营,所以Java有时是指一UY件系l的派Q当然目前主要是.NET和Java两大L体系?/p>
J2EE可以说指Java在数据库信息pȝ上实玎ͼ数据库信息系l从早期的dBase、到Delphi/VB{C/Sl构Q发展到B/SQBrowser览?Server服务器)l构Q而J2EE主要是指B/Sl构的实现?/p>
J2EE又是一U框架和标准Q框架类似API、库的概念,但是要超出它们。如果需要详l了解框Ӟ可先?a target="_blank">设计模式开始学?fn)?/p>
J2EE是一个虚的大的概念,J2EE标准主要有三U子技术标准:(x)WEB技术、EJB技术和JMSQ谈到J2EE应该说最l要落实到这三个子概念上?/p>
q三U技术的每个技术在应用旉涉及(qing)两个部分Q容器部分和应用部分QW(xu)eb容器也是指Jsp/Servlet容器Q你如果要开发一个Web应用Q无论是~译或运行,都必要有Jsp/Servlet库或API支持Q除了JDK/J2SE以外Q?/p>
Web技术中除了Jsp/Servlet技术外Q还需要JavaBeans或Java Class实现一些功能或者包装携带数据,所以Web技术最初裸体简UCؓ(f)Jsp/Servlet+JavaBeanspȝ?/p>
谈到JavaBeans技术,涉?qing)到lg构g技术(componentQ,q是Java的核心基部分Q很多Y件设计概念(设计模式Q都是通过JavaBeans实现的?/p>
JavaBeans不属于J2EE概念范畴中,如果一个JavaBeans对象被Web技术(也就是Jsp/ServletQ调用,那么JavaBeansp行在J2EE的Web容器中;如果它被EJB调用Q它?yu)p行在EJB容器中?/p>
EJBQ企业JavaBeansQ是普通JavaBeans的一U提升和规范Q因Z业信息系l开发中需要一个可伸羃的性能和事务、安全机Ӟq样能保证企业系l^滑发展,而不是发展到一U规模重新更换一套Y件系l?/p>
xQJavaBeanslg发展到EJB后,q不是说以前的那UJavaBeans形式消׃Q这p然Ş成了两种JavaBeans技术:(x)EJB和POJOQPOJO完全不同于EJB概念Q指的是普通JavaBeansQ而且q个JavaBeans不依附某U框Ӟ或者干脆可以说Q这个JavaBeans是你个应用程序单独开发创建的?/p>
J2EE应用pȝ开发工h很多Q如JBuilder、Eclipse{,q些IDE首先是Java开发工P也就是说Q它们首要基本功能是可以开发出JavaBeans或Java classQ但是如果要开发出J2EEpȝQ就要落实到要么是Web技术或EJB技术,那么有可能要一些专门模块功?如eclipse需要lomboz插g)Q最重要的是Q因为J2EEpȝ区分为容器和应用两个部分Q所以,在Q何开发工具中开发J2EE都需要指定J2EE容器?/p>
J2EE容器分ؓ(f)WEB容器和EJB容器QTomcat/Resin是Web容器QJBoss是EJB容器+Web容器{,其中Web容器直接使用Tomcat实现的。所以你开发的Web应用E序可以在上面两U容器运行,而你开发的Web+EJB应用则只可以在JBoss服务器上q行Q商业品Websphere/Weblogic{和JBoss属于同一U性质?/p>
J2EE容器也称为J2EE服务器,大部分时它们概念是一致的?/p>
如果你的J2EE应用pȝ的数据库q接是通过JNDI获得Q也是说是从容器中获得Q那么你的J2EE应用pȝ基本与数据库无关Q如果你在你的J2EE应用pȝ耦合了数据库JDBC驱动的配|,那么你的J2EE应用pȝ有数据库概念色彩,作ؓ(f)一个成熟需要推q的J2EE应用pȝQ不推荐和具体数据库耦合Q当然这其中如何保证J2EE应用pȝq行性能又是体现你的设计水^了?/p>
衡量J2EE应用pȝ设计开发水q高低的标准是Q解耦性;你的应用pȝ各个功能是否能够dqQ是否不怺依赖Q也只有q样Q才能体现可l护性、可拓展性的软g设计目标?/p>
Z辑ֈq个目的Q诞生各U框架概念,J2EE框架标准一个系l划分ؓ(f)WEB和EJB主要部分Q当然我们有时不是以q个具体技术区分,而是从设计上抽象现层、服务层和持久层Q这三个层次从一个高度将J2EE分离开来,实现解耦目的?/p>
因此Q我们实际编E中Q也要将自己的功能向q三个层ơ上靠,做到大方向清楚,泾渭分明Q但是没有技术上U束限制要做到这Ҏ(gu)很不Ҏ(gu)的,因此我们q是必须借助J2EE具体技术来实现Q这Ӟ你可以用EJB规范实现服务层和持久层,W(xu)eb技术实现表现层Q?/p>
EJBZ么能服务层从Jsp/Servlet手中分离出来Q因为它对JavaBeans~码有强制的U束Q现在有一U对JavaBeansq束,使用Ioc模式实现的(当然EJB 3.0也采取这U方式)Q在Ioc模式诞生前,一般都是通过工厂模式来对JavaBeansU束QŞ成一个服务层Q这也是是Jiveq样开源论坛设计原理之一?/p>
由此Q将服务层从表现层中分离出来目前有两U可选架构选择Q管理普通JavaBeansQPOJOQ框?如Spring?a target="_blank">JdonFramework)以及(qing)理EJB的EJB框架Q因为EJB不只是框Ӟq是标准Q而标准可以扩展发展,所以,q两U区别将来是可能模糊Q被U_同一个标准了。 但是Q个为:(x)标准制定是ؓ(f)某个目的服务的,总要牺牲一些换取另外一些,所以,q两U架构会(x)长时间ƈ存?/p>
q两U架构分歧也曄诞生一个新名词Q完全POJO的系l也UCؓ(f)轻量U系l?lightweight)Q其实这个名词本w就没有一个严格定义,更多是一个吸引h的招牌,轻量是指Ҏ(gu)学习(fn)Ҏ(gu)使用吗?按照q个定义Q其实轻量Spring{系lƈ不容易学?fn);而且EJB 3.0Q依然叫EJBQ以后的pȝ是否可称量了呢Q?/p>
前面谈了服务层框Ӟ使用服务层框架可以将JavaBeans从Jsp/Servlet中分d来,而用表现层框架则可以将Jsp中剩余的JavaBeans完全分离Q这部分JavaBeans主要负责昄相关Q一般是通过标签库(taglibQ实玎ͼ不同框架有不同自q标签库,Struts是应用比较广泛的一U表现层框架?/p>
q样Q表现层和服务层的分L通过两种框架辑ֈ目的Q剩余的是持久层框架了Q通过持久层的框架数据库存储从服务层中分d来是其目的,持久层框架有两种方向Q直接自q写JDBC{SQL语句Q如iBatisQ;使用O/R Mapping技术实现的Hibernate和JDO技术;当然q有EJB中的实体Bean技术?/p>
持久层框架目前呈现百花齐放,各有优缺点的现状Q所以正如表现层框架一P目前没有一个框架被指定为标准框Ӟ当然Q表现层框架现在又出来了一个JSFQ它代表的页面组件概忉|一个新的发展方向,但是复杂的实现让人有些忘而却步?/p>
在所有这些J2EE技术中Q虽然SUN公司发挥了很大的作用Q不qM来说Q网l上有这样一个评P(x)SUN的理论天下无敌;SUN的品用h撞墙Q对于初学者,特别是那些试N过或已l通过SUN认证的初学者,赶快摆脱SUN的阴影,立即开溜,使用开源领域的产品来实现自q应用pȝ?/p>
最后,你的J2EE应用pȝ如果采取上面提到的表现层、服务层和持久层的框架实玎ͼ基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系l了?/p>
q要注意的是: 开发出一个高质量的J2EEpȝq需要正的业务需求理解,那么域徏模提供了一U比较切实可行的正确理解业务需求的Ҏ(gu)Q相兌l知识可从UML角度l合理解?/p>
当然Q如果你惌计自q行业框架Q那么第一步从设计模式开始吧Q因计模式提供你一个实现JavaBeans或类之间解耦参考实现方法,当你学会(x)了系l基本单元JavaBean或类之间解耦时Q那么系l模块之间的解耦你可能掌握,q而你可以实现行业框架的提炼了,q又是另外一个发展方向了?/p>
以上理念可以ȝZ句话Q?br />J2EE开发三件宝: Domain ModelQ域建模Q、patternsQ模式)和frameworkQ框Ӟ?/p>
推荐一套高质量的J2EE开源系l:(x) JPestore
如果初学者没有理解,Ƣ迎l箋讨论Q大胆提Z心中的疑问?/p>
我曾写过一叫<<配置Eclpise+tomcatq实现JSP的编写与部v>>Q现在写的这些算是它的后l.
一Q ?软g下蝲
Mysql
下蝲版本Q?.1.11
http://dev.mysql.com/downloads/mysql/4.1.html
JDBC驱动
下蝲版本Q?.1.8
http://dev.mysql.com/downloads/connector/j/3.1.html
Mysql界面插g:mysql-front
下蝲版本镜像QHongKongQ我下回来安装就是中文版了)
http://www.mysqlfront.de/download.html
二. 软g安装
1.安装mysql
如我上面所说的Q我是参考了saulzy的文章,现在l出saulzyq篇文章的连接:(x)
http://blog.csdn.net/saulzy/archive/2005/04/23/359648.aspx
里面图文q茂Q说得非常清?br />Q在q里再一ơ感谢saulzyQ?/p>
2.JDBC驱动Qmysql-connector-java-3.1.8
q只是一个压~包Qƈ不需要安装,只要其解压Q我么用的是文件夹mysql-connector-java-3.1.8里的文gQmysql-connector-java-3.1.8-bin.jarQ?/p>
3. Mysql界面插g:mysql-front
q是一个安装程序,按照提示安装可以了Q?/p>
三. 环境配置
首先Q我要说明的是我现在
tomcat的安装\径是: D:\Program Files\Java\Tomcat
JDK的安装\径是QD:\Program Files\Java\j2sdk
在这里,需要配|环境变量的是JDBC驱动Q在配置前先要把刚才说到的mysql-connector-java-3.1.8-bin.jar本地盘某处Q我攄地方QD:\Program Files\Java\mysqlforjdbcQ,然后Ҏ(gu)你放的地方,配置classpathQ我的配|是q样的:(x)
.;D:\Program files\Java\j2sdk\lib\tools.jar;D:\Program Files\Java\j2sdk\lib\mysql-connector-java-3.1.8-bin-g.jar;D:\Program Files\Java\mysqlforjdbc\mysql-connector-java-3.1.8-bin.jar
配置q个的目的是让你的java应用E序扑ֈq接mysql的驱动.
配置完环境变量后q有很重要一步就是ؓ(f)JSPq接数据库配|驱动,q个其实很简单,是把mysql-connector-java-3.1.8-bin.jar拷到某些文g多wp了,我在|上看了很多资料问了很多人,各种说法都有Q我l合了一下,Z保险Q我都全做了Q呵呵,反正是拷一?00K的文件而已Q现列出要把mysql-connector-java-3.1.8-bin.jar拯ȝ文g夹,如下Q?br />D:\Program Files\Java\Tomcat\common\lib
D:\Program Files\Java\Tomcat\shared\lib
四. 数据库的使用
Mysql安装完毕以后Q还有一些要注意的地方,q里saulzy也写了篇文章Q大家看看就清楚了,q接如下Q?a >http://blog.csdn.net/saulzy/archive/2005/04/23/359811.aspx
p在saulzy的文章力提到的,mysql安装好后最重要一样就是要看数据库有没有作为系l服务启动了Q所以在大家q行数据库操作前Q应要看看,在操作系l的
开始-Q运行-Q输入services.mscQ确定你在安装时你设|的关于mysql的那个服务已l启动,q样你在操作数据库时不会(x)报连接不上的错误Q?br />上面提到了一个较方便的mysql界面插gQ但是这个界面是我在已经开始用mysql后才扑ֈ的,刚开始我是在dos下用命o(h)行进行操作的Q虽焉个界面也可以q行建库啊,讑֮权限{操作,但是Q我觉得懂得在用命令行也是一个很重要的技能,所以我先从命o(h)行开始说Q怎样单用mysqlQ到后面?x)谈及(qing)mysqlQfront的用.
现在我想在mysql里徏一个数据库shujukuQ以?qing)在数据库里Z个表biaoQ具体的命o(h)如下Q假设mysql我是刚安装好的)
1. q入dos状态(C命o(h)行的要运行在mysql的安装目录下的bin目录的)如下图一Q?br />
2. q接mysql
输入Qmysql ?h localhost ?u root ?p
出现要求输入密码的界面(如图二)
输入在安装时已设好的密码Q就q入了mysql的命令编辑界面了Q如图三Q?br />
3. 使用mysql的基本命?在mysql命o(h)行编辑每输入完命令后最后一定要有分P不然?x)报?
昄数据库:(x)show databases;
使用数据库:(x)use 数据库名Q?br />例子如图四:(x)
4Q徏?br />命o(h)Qcreate database shujuku;
5.为数据库讄权限Q用户和密码Q?br />命o(h)Qgrant all privileges on shujuku.* to test@localhost identified by ?23456?
当你执行完这个命令以后,只要你再以用户名Qtest,密码Q?23456d时你只可以对shujukuq个数据库操作,q样避开使用rootQ对数据库的安全有很大帮助.如图?br />
6.
命o(h)Qcreate table biao(id int(8) primary key,name varchar(10));
如图?
剩下来的与标准sqsl命o(h)基本上是一L(fng)Q具体操作略
值得一提的是,你在命o(h)行上输入Q?Q,׃(x)有mysql命o(h)的简单帮助,如图八:(x)
呵呵Q那P我们q可以知道退出,是QexitQ,呵呵Q?/p>
五. 关于mysql-front的?br />我找了好几个mysql的界面工P觉得最z方便还是mysql-frontQ可惜的是要收费Q不q还好有试用期,呵呵Q可以先感受感受一下,最重要一Ҏ(gu)mysql-front有简体中文版的,英文不好的我用v来就舒服多了Q下面简单说说用吧Q?br />首先Q安装就不用说了Q有向导Q而且很简单.安装好后W一ơ运行时?x)蟩出来一个要求添加对话的框,在这里你可以d例如上面已经讑֮好的shujukuQ过E如图九(ji)Q十Q十一:
当你在注册的复选框里填上你在上面mysql讑֮好的用户名和密码后,在选择数据库框里就有shujuku 的数据库了,选上Q按定Q进入mysql-fron后,你就?x)看C面的界面Q这是你可以进行操作了Q如囑֍?br />
要说明的是,你还可以把root用户也加q去Q这要你在mysql-fron的界面上?br />讄Q>对话Q>新徏Q再按上面进行就可以Q出了root你还可以加入更多的用PҎ(gu)q是一L(fng)Q设|不同的用户Q是方便对不同数据库q行理Q呵呵,root是权限最高的Q可不要随便让别Z用你的root用户Q保正你数据库的安全Q?/p>
六. JSPq接mysql
现在是试用jspq接mysql?br />我在eclipse里徏了个test_mysql.jsp面Q代码如下:(x)
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page language="java" %>
<%@ page import="com.mysql.jdbc.Driver" %>
<%@ page import="java.sql.*" %>
<%
//驱动E序?br /> String driverName="com.mysql.jdbc.Driver";
//数据库用户名
String userName="cl41";
//密码
String userPasswd="123456";
//数据库名
String dbName="db";
//表名
String tableName="dbtest";
//联结字符?br /> String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPasswd;
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection connection=DriverManager.getConnection(url);
Statement statement = connection.createStatement();
String sql="SELECT * FROM "+tableName;
ResultSet rs = statement.executeQuery(sql);
//获得数据l果集合
ResultSetMetaData rmeta = rs.getMetaData();
//定数据集的列数Q亦字段?br /> int numColumns=rmeta.getColumnCount();
// 输出每一个数据?br /> out.print("id");
out.print("|");
out.print("num");
out.print("<br>");
while(rs.next()) {
out.print(rs.getString(1)+" ");
out.print("|");
out.print(rs.getString(2));
out.print("<br>");
}
out.print("<br>");
out.print("数据库操作成功,恭喜?);
rs.close();
statement.close();
connection.close();
%>
然后把testR_mysql.jsp部v到tomcat处,如何部v可参考我的另一文?lt;<配置Eclpise+tomcatq实现JSP的编写与部v>>
在浏览器Q你可以看到如囑֍三的Q?br />
呵呵Q文章终于写完了Q原来写简z清晎ͼ图文q茂的文章真的不Ҏ(gu)Q还是那句话Q希望对度这文章的你有帮助吧!Good luck!
׃q里不能贴图片,我把我文章里面的囄都打包了Q在附g处!
Q如有{载,h明原作者是cl41,谢谢合作Q)
} catch (Exception e) {
}
通用惟一标识W是作ؓ(f)tModel 数据l构中的一部分Q这U数据结构标识通用描述、发玎ͼ和整合(UDDIQ注册中的一U服务的cdQ注册服务的通用表示法)。这U机制可用来发现|络服务。
通用惟一标识W还可以用来指向大多数的可能的物体。微软和其他一些Y件公叔R們使用全球惟一标识W(GUIDQ,q也是通用惟一标识W的一U类型,可用来指?a class="bluekey" target="_blank">l徏对象模块对象和其他的软glg。第一个通用惟一标识W是在网|计机pȝQNCSQ中创徏Qƈ且随后成为开放Y?a class="bluekey" target="_blank">基金?x)(OSFQ的分布式计环境(DCEQ的lg?br />