??xml version="1.0" encoding="utf-8" standalone="yes"?> q个E序我写的是两个ҎQ支持从命o行操作?br>例一Q?br>package org.stonecn.kernel; } 我们来看W二个例?/p>
例二Q?br>package org.stonecn.kernel; public class FileCopy2{ 同样的方式,两种实现Q这是我们所说的l果一P而过E也是千变万化?br>例二所涉及的包是我以前所没有接触到的?br>Ƣ迎朋友们来指正?/p>
Java最初是在浏览器和客L机器中粉墨登场的。当Ӟ很多疑它是否适合做服务器端的开发。现在,随着对Java2q_企业?J2EE)W三Ҏ持的增多QJava被广泛接Uؓ开发企业服务器端解决Ҏ的首选^C一?/p>
J2EEq_׃整套服务(Services)、应用程序接?APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持。在本文中将解释支撑J2EE?3U核心技术:JDBC,JNDI,EJBs,RMI,JSP,Javaservlets,XML,JMS,JavaIDL, JTS,JTA,JavaMail和JAFQ同时还描q在何时、何处需要用这些技术。当Ӟ我还要介l这些不同的技术之间是如何交互的。此外,Z让您更好地感受J2EE的真实应用,在WebLogic应用服务?来自BEA Systems公司的一U广为应用的产品环境下来介绍q些技术。不论对于WebLogic应用服务器和J2EE的新手,q是那些想了解J2EE能带来什么好处的目理者和pȝ分析员,怿本文一定很有参考h倹{?/p>
宏观印象:分布式结构和J2EE q去Q二层化应用--通常被称为client/server应用--是大家谈论的最多的。在很多情况下,服务器提供的惟一服务是数据库服务。在q种解决Ҏ中,客户端程序负责数据访问、实C务逻辑、用合适的样式昄l果、弹出预讄用户界面、接受用戯入等。client/serverl构通常在第一ơ部|的时候比较容易,但难于升U或改进Q而且l常Z某种专有的协议,通常是某U数据库协议。它使得重用业务逻辑和界面逻辑非常困难。更重要的是Q在Web时代Q二层化应用通常不能体现出很好的伸羃性,因而很N应Internet的要求?/p>
Sun设计J2EE的部分v因就是想解决二层化结构的~陷。于是,J2EE定义了一套标准来化N层企业应用的开发。它定义了一套标准化的组Ӟqؓq些lg提供了完整的服务。J2EEq自动ؓ应用E序处理了很多实现细节,如安全、多U程{?/p>
用J2EE开发N层应用包括将二层化结构中的不同层面切分成许多层。一个N层化应用A能够Z下的每种服务提供一个分开的层Q?/p>
׃J2EE建立在Java2q_标准?J2SE)的基上,所以具备了J2SE的所有优点和功能。包括“编写一ơ,到处可用”的可移植性、通过JDBC讉K数据库、同原有企业资源q行交互的CORBA技术,以及一个经q验证的安全模型。在q些基础上,J2EE又增加了对EJB(企业U?Javalg)、Javaservlets、Java服务器页?JSPs)和XML技术的支持?/p>
分布式结构与WebLogic应用服务?/strong> J2EE提供了一个框?-一套标准API--用于开发分布式l构的应用,q个框架的实际实现留l了W三方厂商。部分厂商只是专注于整个 J2EE架构中的的特定组Ӟ例如Apache的Tomcat提供了对JSP和servlets的支持,BEApȝ公司则通过其WebLogic应用服务器品ؓ整个J2EE规范提供了一个较为完整的实现?br /> WebLogic服务器已使徏立和部v伸羃性较好的分布式应用的q程大ؓ化。WebLogic和J2EE代你处理了大量常规的~程dQ包括提供事务服务、安全领域、可靠的消息、名字和目录服务、数据库讉K和连接池、线E池、负载^衡和定w处理{?/p>
通过以一U标准、易用的方式提供q些公共服务Q象WebLogic服务器这L产品造就了具有更好~性和可维护性的应用pȝQ其ؓ大量的用h供了增长的可用性?/p>
J2EE技?/strong> 在接下来的部分里Q我们将描述构成J2EE的各U技术,q且了解WebLogic服务器是如何在一个分布式应用中对它们q行支持的。最常用的J2EE技术应该是JDBC、JNDI、EJB、JSP和servletsQ对q些我们作更仔l的考察?/p>
Java Database Connectivity(JDBC) JDBCAPI以一U统一的方式来对各U各L数据库进行存取。和ODBC一PJDBC为开发h员隐藏了不同数据库的不同Ҏ。另外,׃JDBC建立在Java的基?因此q提供了数据库存取的q_独立性?/p>
JDBC定义?U不同的驱动E序Q现分述如下Q?/p>
在JDBC出现的初期,JDBC-ODBC桥显然是非常有实用意义的Q通过JDBC-ODBC桥,开发h员可以用JDBC来存取ODBC数据源。不的是,他需要在客户端安装ODBC驱动E序Q换句话_必须安装MicrosoftWindows的某个版本。用这一cd你需要牺牲JDBC的^台独立性。另外,ODBC驱动E序q需要具有客L的控制权限?/p>
JDBC本地驱动E序桥提供了一UJDBC接口Q它建立在本地数据库驱动E序的顶层,而不需要用ODBC。JDBC驱动E序对数据库的API从标准的JDBC调用转换为本地调用。用此cd需要牺牲JDBC的^台独立性,q要求在客户端安装一些本C码?/p>
JDBC|络桥驱动程序不再需要客L数据库驱动程序。它使用|络上的中间服务器来存取数据库。这U应用得以下技术的实现有了可能Q这些技术包括负载均衡、连接缓冲池和数据缓存等。由于第3U类型往往只需要相Ҏ的下蝲旉Q具有^台独立性,而且不需要在客户端安装ƈ取得控制权,所以很适合于Internet上的应用?/p>
W?U类型通过使用一个纯Java数据库驱动程序来执行数据库的直接讉K。此cd实际上在客户端实C2层结构。要在N-层结构中应用Q一个更好的做法是编写一个EJBQ让它包含存取代码ƈ提供一个对客户端具有数据库独立性的服务?/p>
WebLogic服务器ؓ一些通常的数据库提供了JDBC驱动E序Q包括Oracle,Sybase,MicrosoftSQLServer以及Informix。它也带有一UJDBC驱动E序用于CloudscapeQ这是一U纯Java的DBMSQWebLogic服务器中带有该数据库的评估版本?br /> 以下让我们看一个JDBC实例Q在q个例子中我们假定你已经在Cloudscape中徏立了一个PhoneBook数据库,q且包含一个表Q名?CONTACT_TABLEQ它带有2个字D:NAME和PHONE。开始的时候先装蝲CloudscapeJDBCdriverQƈh drivermanager得到一个对PhoneBookCloudscape数据库的q接。通过q一q接Q我们可以构造一个Statement对象q用它来执行一个简单的SQL查询。最后,用@环来遍历l果集的所有数据,q用标准输出NAME和PHONE字段的内容进行输出?/p>
OK。接着来看一看JDBC是如何在企业应用中的q行使用?/p>
JDBC在企业应用中的应用。以上实例其实是很基本的Q可能有些微不道。它假定了一?层结构。在一个多层的企业U应用中Q更大的可能是在客户端和一个EJBq行通信Q该EJB徏立数据库q接。ؓ了实现和改进可~性和pȝ性能Q?WebLogic服务器提供了对连接缓冲池connection pool的支持?/p>
Connection pool减少了徏立和释放数据库连接的消耗。在pȝ启动以后卛_建立q样的缓冲池Q此后如故再有对数据库的hQWebLogic服务器可以很单地从缓冲池中取出数据。数据缓冲池可以在WebLogic服务器的 weblogic.properties 文g中进行定义?/p>
在企业应用的另一个常见的数据库特性是事务处理。事务是一l申明statementQ它们必d为同一个statement来处理以保证数据完整性。缺省情况下JDBC使用 auto-commit 事务模式。这可以通过使用ConnectioncȝsetAutoCommit() Ҏ来实现。现在已l对JDBC有了一些认识,下面该{向JNDI了?/p>
Java Naming and Directory Interface (JNDI) JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业U的资源如DNS和LDAPQ本地文件系l,后者在应用服务器中的对象。在JNDI 中,在目录结构中的每一个结点称为context。每一个JNDI名字都是相对于context的。这里没有绝对名字的概念存在。对一个应用来_它可以通过使用 InitialContext cL得到其第一个context:
应用可以通过q个初始化的contextl有q个目录树来定位它所需要的资源或对象。例如,假设你在Weblogic服务器中展开了一个EJBq将home接口l定到名?myApp.myEJB Q那么该EJB的某个客户在取得一个初始化context以后Q可以通过以下语句定位home接口Q?/p>
在这个例子中Q一旦你有了对被h对象的参考,EJB的home接口可以在它上面调用方法。我们将在下面的"Enterprise Java Beans"章节中做更多的介l?/p>
以上关于JNDI的讨论只是冰׃一角而已。如果要更进一步地在context中查扑֯象,JNDI也提供了一些方法来q行以下操作Q将一个对象插入或l定到context。这在你展开一个EJB的时候是很有效的。从context中移d象。列出context中的所有对象。创建或删除子一U的context。接下来Q要开始关注EJB了?/p>
Enterprise Java Beans (EJB) J2EE技术之所以赢得某体广泛重视的原因之一是EJB。它们提供了一个框架来开发和实施分布式商务逻辑Q由此很显著地简化了h可~性和高度复杂的企业应用的开发。EJB规范定义了EJBlg在何时如何与它们的容器进行交互作用。容器负责提供公用的服务Q例如目录服务、事务管理、安全性、资源缓冲池以及定w性?/p>
EJB规范定义了三U基本的beancd: 管有以上的区别Q所有的EJBq是有许多的共同之处。它们都处理homeinterface。它定义了一个客L是如何创Z消亡EJB的。可以在bean中对定义了客LҎ的远E接口进行调?beancd执行了主要的商务逻辑。描qEJB的开发已l超Z本文的范围。但是,如果一?EJB已经被开发了或者从W三方进行了购买Q它必d应用服务器中q行发布。WebLogic Server 5.1带有一个EJB Deployer Tool来协助处理EJB的发布。当你用EJB Deployer Tool的时候,你要定义客户端所用的JNDI名字来定位EJB。Deployer Tool生成wrappercL处理和容器的通信以及在一个jar文g中把被请求的Javacȝ定在一赗?/p>
一旦EJB被发布,客户端就可以使用它的JNDI名字来定位EJB。首先,它必dC个到home接口的reference。然后,客户端可以用该接口Q调用一个create() Ҏ来得到服务器上运行的某个bean实例的句?最后,客户端可以用该句柄在bean中调用方法。了?EJB后,让我们再来看JSP?br /> JavaServer Pages (JSPs) 可能已经有许多h已经熟悉Microsoft的Active Server Pages(ASP)技术了。JSP和ASP相对应的Q但更具有^台对立性。他们被设计用以帮助Web内容开发h员创建动态网,q且只需要相对较的代码?即Web设计师不懂得如何~程也可以用JSPQ因为JSP应用是很方便的?JSP面由HTML代码和嵌入其中的Java代码所l成。服务器在页面被客户端所h以后对这些Java代码q行处理Q然后将生成的HTML面q回l客L的浏览器?/p>
下面来看一个JSP的简单实例。它只显CZ服务器的当前日期和时间。虽Ӟ对语法的具体解释已经出了本文的范围Q但我们q是可以很直观地看到QJava代码被放?W号的中_而Java的表辑ּ则放在符号之间?/p>
下面? Java servlets Java Servlets Servlet提供的功能大多与JSPcMQ不q实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码Q?servlets全部由Java写成q且生成HTML。Servlet是一U小型的JavaE序Q它扩展了Web服务器的功能。作ZU服务器端的应用Q当被请求时开始执行,q和CGI Perl脚本很相伹{Servlets和CGI脚本的一个很大的区别是:每一个CGI在开始的时候都要求开始一个新的进E?-- 而servlets是在servlet引擎中以分离的线E来q行的。因此servlets在可伸羃性上提供了很好的改进?/p>
在开发servlets的时候,您常帔R要扩展javax.servlet.http.HttpServletc,q且override一些它的方法,其中包括Q?/p>
其它的方法还包括处理不同cd的HTTPh -- 可以参考HttpServlet API文档。以上描q的是标准J2EE Servlet API的各U方法。WebLogic服务器提供了一个该API完整的实现途径。一旦你开发了一个servletQ你可以在 weblogic.properties 中加以注册ƈ由此可以在WebLogic服务器中对它q行配置?/p>
通过Java servlets,我们已经到达了J2EE主要技术的末尾了。但J2EE所提供的ƈ不止于这些。下面的D落中我们将要地看一下现存的一些技术,包括RMI,Java IDL和CORBA, JTA, 以及XMLQ等{?br /> Remote Method Invocation (RMI) 正如其名字所表示的那PRMI协议是在q程对象上调用一些方法。它使用了连l序列方式在客户端和服务器端传递数据。RMI是一U被EJB使用的更下层的协议?/p>
Java IDL/CORBA 在Java IDL的支持下Q开发h员可以将Java和CORBA集成在一赗?他们可以创徏Java对象q之可在CORBA ORB中展开, 或者他们还可以创徏Javacdƈ作ؓ和其它ORB一起展开的CORBA对象的客戗后一U方法提供了另外一U途径Q通过它Java可以被用于将你的新的应用和legacypȝ盔R成?/p>
Java Transaction Architecture (JTA)/Java Transaction Service (JTS) JTA定义了一U标准的APIQ应用系l由此可以存取各U事务监控。JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务理器是在高层支持Java Transaction API (JTA)规范Qƈ且在较底层实现OMG OTS specification的Java映像。JTS事务理器ؓ应用服务器、资源管理器、独立的应用以及通信资源理器提供了事务服务?/p>
JavaMail and JavaBeans Activation Framework JavaMail是用于存取邮件服务器的APIQ它提供了一套邮件服务器的抽象类。仅支持SMTP服务器,也支持IMAP服务器?JavaMail利用JavaBeans Activation Framework (JAF)来处理MIME-~码的邮仉件。MIME的字节流可以被{换成Java对象Q或者{换自Java对象。由此大多数应用都可以不需要直接?JAF?/p>
Java Messaging Service (JMS) JMS是用于和面向消息的中间g怺通信的应用程序接?API)。它既支持点对点的域Q有支持发布/订阅 (publish/subscribe)cd的域Qƈ且提供对下列cd的支持:l认可的消息传?事务型消息的传递,一致性消息和h持久性的订阅者支持。JMSq提供了另一U方式来Ҏ的应用与legacy backendpȝ盔R成?/p>
Extensible Markup Language (XML) XML是一U可以用来定义其它标记语a的语a。它被用来在不同的商务过E中׃n数据。XML的发展和Java是相互独立的Q但是,它和Java h的相同目标正是^台独立性。通过Java和XML的组合,您可以得C个完的hq_独立性的解决Ҏ。目前正有许多不同的公司在ؓJava?XML的组合而努力。如果要了解更多的这斚w的信息,可以讉KSun的Java-XML面Q或者IBM developerWorks的XML Zone?/p>
选择对应的Solaris版本Q目前需要安装的版本是Solaris 10 SPARC 64-bit
2 解压MySQL
转到下蝲目录Q目前本机器攑֜ /u02/mysqltemp 目录?br />
#gunzip -d mysql-5.1.49-solaris10-sparc-64bit.pkg.gz
3 创徏mysql 的用L和用?q指定目?br />
#groupadd mysql
#useradd -G mysql mysql
Q=Q=
mkdir /export/home/mysql
chgrp mysql /export/home/mysql
chown mysql /export/home/mysql
usermod -d /export/home/mysql mysql
Q=Q=
如果觉得不需要指定目录,可以个略q创建步骤?br />
4 使用pkgadd 安装MySQl ?br />
#pkgadd -d mysql-5.1.49-solaris10-sparc-64bit.pkg
安装后的MySQL 位于 /opt/mysql/mysql 目录?br />
如果不用此文件可以略q此步骤?br />
4.1 建立目录q接
#cd /usr/local
#ln -s /opt/mysql/mysql/mysql
如果不需要,可以略过此步骤?br />
5 在目?etc下创建mysql.cnf 文gQ内如如下:
[mysqld]
basedir=/opt/mysql/mysql
datadir=/opt/mysql/mysql/data
6 q行MySQL 的post-install 文gQ创建数据库 repository 或者叫初始化MySQL
#cd /opt/mysql/mysql
#./scripts/mysql_install_db --defaults-file=/etc/mysql.cnf --user=mysql
或者用:
#./scripts/mysql_install_db --user=mysql
7 启动MySQL
#cd /opt/mysql/mysql
#./bin/mysql_safe -defaults-file=/etc/mysql.cnf -user=mysql
也可以用如下的Ҏ启动MySQL
#/etc/init.d/mysql start
8 更改MySQL root用户的口?br />
#/opt/mysql/mysql/bin/mysqladmin -u root password 'new-password'
#/opt/mysql/mysql/bin/mysqladmin -u root -h 机器名称 password 'new-password'
或者登录MySQL 之后用如下的Ҏ更改Q?br />
update user set password=PASSWORD('root') where user='root';
9 dMySQL 命o
#mysql -p
输入新的密码Q?br />
或者用如下Ҏd
mysql -u root mysql
10 停止MySQL
#/etc/init.d/mysql stop
import java.io.*;
public class FileCopy {
/**
* 试E序
*/
public static void main(String[] args){
if(args.length!=2)
System.err.println("Usage: java FileCopy<source><destination>");
else{
try{
copy(args[0],args[1]);
}
catch(IOException e){
System.err.println(e.getMessage());
}
}
}
public static void copy(String from_name,String to_name)throws IOException{
File from_file=new File(from_name);
File to_file=new File(to_name);
if(!from_file.exists())
abort("no such source file:"+from_name);
if(!from_file.isFile())
abort("can't copy directory:"+from_name);
if(!from_file.canRead())
abort("source file is unreadable:"+from_name);
/**
* 如果目标是一个目录,则用源文g名作为目标文件名
*/
if(to_file.isDirectory())
to_file=new File(to_file,from_file.getName());
/**
* 如果目标文g存在Q则保它是可写?q且在覆盖之前先询问
* 如果目标文g不存在,则确保存在目录,而且是可写的?br> */
// 此处支持命o行,如果不用可以注视掉?nbsp; sart
if(to_file.exists()){
abort("destination file is unwriteable:"+to_name);
//询问是否覆盖
System.out.print("Overwrite existing file:"+to_file.getName()+"?(Y/N):");
//得到用户响应
System.out.flush();
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String response=in.readLine();
//查响应,如果不是yes(未做认),则终止复?br> if(!response.equals("Y") && !response.equals("y"))
abort("existing file was not overwritten.");
}
else{
/**如果文g不存在,查是否存在目录且是否可写
* 如果getParent()q回nullQ则目录是当前dirQ?br> * 因此查找user.dirpȝҎ,以得出它是什?br> */
String parent=to_file.getParent(); //目标目录
if(parent == null)
parent=System.getProperty("user.dir");
File dir=new File(parent);
if(!dir.exists())
abort("destination directory doesn't exist:"+parent);
if(dir.isFile())
abort("destination is not a directory:"+parent);
if(!dir.canWrite())
abort("destination directory is unwriteable:"+parent);
}
//到此l束 end
/**
* 如果走到q了Q则一切正常?br> * 因此可以复制文gQ一ơ复制一个字节缓冲区
*/
FileInputStream from=null; //从源d的流
FileOutputStream to=null; //写至目标的流
try{
from=new FileInputStream(from_file); //创徏输入?br> to=new FileOutputStream(to_file); //创徏输出?br> byte[] buffer=new byte[4096];
int bytes_read;
/**
* 一块字节读入缓冲区Q然后将其写?br> * 如果循环Q知道达到文件结?read()q回-1)
* 注意Q在此while循环中结合了赋值和比较
*/
while((bytes_read=from.read(buffer))!=-1) //读,直到EOF
to.write(buffer,0,bytes_read); //?br> }
finally{
if(from!=null)
try{
from.close();
}
catch(IOException e){
;
}
if(to!=null)
try{
to.close();
}
catch(IOException e){;}
}
}
/**
* q是抛出异常的一个便利方?br> */
private static void abort(String msg)throws IOException{
throw new IOException("FileCopy:"+msg);
}
q个E序的好处是一个安全的。因为有一个静态的copyҎ。其他程序也可以使用此方法来复制文g
import java.io.*;
import java.nio.channels.*;
public static void main(String[] args){
FileInputStream fin=null; //两个文g的流
FileOutputStream fout=null; //q些要在finally块中关闭
try{
//打开输入文g的一个流Qƈ从中得到一个通道
fin=new FileInputStream(args[0]);
FileChannel in=fin.getChannel();
//下面得到输出通道
WritableByteChannel out;
//如果有第二个文g?br> if(args.length>1){
fout=new FileOutputStream(args[1]);
out=fout.getChannel();
}
else{
//没有目标文g?br> out=Channels.newChannel(System.out); //包装stdout?br> }
//查询输入文g的大?br> long numbytes=in.size();
/**
*采用扚w传输的方式将所有字节从一个通道传输到另一个通道
*q是fileChannel通道的一个特D特?br> *参见FileChannel.transferForm()
*/
in.transferTo(0,numbytes,out);
}
catch(IOException e){
System.out.println(e);
}
finally{
try{
if(fin!=null) fin.close();
if(fout!=null) fout.close();
}
catch(IOException e){
}
}
}
}
而这个程序将其第一个参C指定的文件复制到W二个参数所指定的文件中?br>如果没有W二个参数则复制到标准输出?/p>
在本文中解释支撑J2EE?3U核心技术:JDBC,JNDI,EJBs,RMI,JSP,Javaservlets,XML,JMS,JavaIDL,JTS,JTA,JavaMail和JAFQ同时还描q在何时、何处需要用这些技术?/h5>
import java.sql.*;
public class JDBCExample...{
public static void main( String args[] )
...{
try...{
Class.forName("COM.cloudscape.core.JDBCDriver");
Connection conn = DriverManager.getConnection("jdbc:cloudscape:PhoneBook"); Statement stmt = conn.createStatement();
String sql = "SELECT name, phone FROM CONTACT_TABLE ORDER BYname";
ResultSet resultSet = stmt.executeQuery( sql );
String name;
String phone;
while ( resultSet.next() )
...{
name = resultSet.getString(1).trim();
phone = resultSet.getString(2).trim();
System.out.println( name + ", " + phone );
}catch ( Exception e )
...{// Handle exception heree.printStackTrace();
}
}
}
Context ctx = new InitialContext();
MyEJBHome home = ctx.lookup( "myApp.myEJB" );
QH1QDate JSP sampleQ?H1Q?br />QH2Q
Q? response.setHeader("Refresh", 5); %Q The current date is Q?= new Date() %Q? Q?H2Q?/font>
1、对象的初始?/strong>
在创建对象时Q对象所在类的所有数据成员会首先q行初始化?/p>
d所有类成员初始化完成之后,才调用本cȝ构造方法创建对象?/p>
构造方法的作用是初始化?/p>
E序中主cȝ静态变量会在mainҎ执行前初始化?/p>
不仅W一ơ创建对象时Q类中的所有静态变量都初始化,q且W一ơ访问某c?注意此时未创建此cd?的静态对象时Q所 有的静态变量也要按它们在类中的序初始化?/p>
2、承时Q对象的初始化过E?/strong>
3、关于构造方?/strong>
4、有关public、private和protected
5、抽象类
6、final关键?/strong>
7、接口interface(用implements来实现接?
8、多重?/strong>
9、接口的嵌入
10、类的嵌?/strong>
手段有两U:
class A ...{ class B ...{} B getB() ...{ B b = new B(); return b; } } static void m() ...{ A a = new A(); A.B ab = a.getB(); // 或者是 A.B ab = a.new B(); } |
(3)一个类l承了另一个类的内部类Q因cL内部c,而内部类的构造方法不能自动被调用Q这样就需要在子类的构造方法中明确的调用超cȝ构造方法。接上例Q?class C extends A.B ...{
class C extends A.B ...{ C() ...{ new A().super(); // q一句就实现了对内部cL造方法的调用。? } } |
构造方法也可这样写Q?
C(A a) ...{ a.super(); } // 使用q个构造方法创建对象,要写成C c = new C(a); a是A的对象?/font> |
11、异常类
JAVA中除了RunTimeExceptionc,其他异常均须捕获或抛出?/p>
DWR 2.0版本 ?的里E碑
q是我们在新Ҏ方面的最大发布!
反向的AJAX
最大的Ҏ是我们成ؓ反向的Ajax。DWR1.x允许你用javascript异步的访问java代码?br />DWR2.0在这上允怽建立异步java讉Kjavascript代码?br />反向的Ajax使你~写应用E序更容易得多?/p>
It can use polling or Comet(long-lived HTTP)queries.
我们的‘聊天室’例子包含这样一Djava代码Q?/p>
Q-Q-
//Get the current page Q-得到当前的页
WebContext wctx=WebContextFactory.get();
String currentPage=wctx.getCurrentPage();
// 'messages' is a List of recent messages for a browser to display
// Java objects converted to Javascript hava a declarating and a declared
///variable name.
OutboundVariable ov=wctx.toJavascript(messages);
//Loop over all the users on the current page
for(ScriptSession otherSession:wctx.getScriptSessionsByPage(currentPage)){
otherSession.addScript(ov.getInitCode());
otherSession.addScript("receiveMessages("+ov.getAssignCode()+");");
//receiveMessages is a Javascript function that displays the current list of
///messages
}
Q-Q-
在本质上我们发送一些javascript循环所有用户在当前上更新q显CZ们?br />javascript更简单。你可以启用轮流Q轮询)这U查询方式?/p>
Q-Q-
DWREngine.setPolling(true);
Q-Q-
聊天室例子(在WAR包里下蝲Q包括javascript源码 ?receiveMessages() 是?/p>
DWRUtil的4路线路(U程Q将信息昄到屏q上。 ????
其它q技术的用法包括酒吧Q游戏在U,售票和Q何的pȝ在何处服务器状态变化,
我们需要把更新发布到浏览者或者浏览器上?/p>
跨领?Ajax:<script> 标签QtagQ操作
如果你需要访问不同的领域服务器 我们的遥q(remotingQ计划已成ؓ可能?br />从DWR2.0你可以操?lt;script>标签(tags)增加在XMLHttpRequest 或 iframes.
对于使用你需要做如下Q?/p>
Q-Q-
DRWEngine.setMethod(DWREngine.ScriptTag);
Q-Q-
<signatures>({)元素(Element)
DWR1.0有时需要一?lt;signatures>元素(Element)帮你它得C个类型{换?br />如果你用DWR2.0同JDK5 此时一般的cd你就不要使用更多?lt;signatures>
DWR自动调用类型{换?/p>
DWRUtil 更新
我们已更新DWRUtils.有一U新的DWRUtil.cloneNode(elementID)Ҏ
你可以重复用HTML片段作ؓ模板?br />例如Q?/p>
Q-Q-
// Loop over all the beans
for(var i=0;i<beanArray.length;i++){
//Fill in the blanks in the template. You will have several lines like this.
DWRUtil.setValue("someid",beanArray[i].property);
//Clone the node so we don't overwrite it next time
DWRUtil.cloneNode("template");
}
//Finally hide the template
$("template").style.display="none";
Q-Q-
我们也尝试着写一些的取值的的更新。如果其gؓ假的话,返回false(?.
q有可能破坏反向的兼Ҏ?br />它是d非明显依赖你的观点,我们需要关于这L反馈?/p>
新的属性作用域(Scope)Q-脚本(Script)
有一个新的作用域?br />Servlet与JSP开发者熟悉设|属性在一ơ请求,面Q会话,或者应用水q?br />DWR2.0允许你?script"(脚本)作用域?br />脚本作用域在单一面内,Ajax应用能持l用变量?/p>
脚本作用域其long-lived 有一点像会话作用域,然而它不要cookiesQ甜点).脚本作用?/p>
属性在单一面内,MAjax操作都是可用的?br />创徏dwr.xml它是可用的?/p>
Q-Q-
<create creator="new" javascript="Test" scope="script">
<param name="class" value="com.example.Test"/>
</create>
Q-Q-
脚本作用域也同样可用?programatically:
Q-Q-
WebContextFactory.get().getScriptSession().setAttribute("key",value);
Q-Q-
例子(Example)
开始下载DWR2.0 压羃文g时会比以前有一些大因ؓ我们包括一些例子?br />我们从事单的struts 和 Spring 整理演示?/p>
Refactoring(重用)q个词我叫不准。是应该是重载的呢还是重构。大家可以告诉我Q?/p>
在开发者眼中,重用是一个特性,因ؓ代码整洁?br />但是它也是导致用户向后兼Ҏ问题的原因?br />我们为DWR2.0做了一些重用。但是这里是用户剔除它:
我们使用 org.directwebremoting.* 包 代替模糊的uk.ltd.getahead.dwr.*,
׃兼容性差Q我们已l抛弃存根(stubsQ?
如果我们有所遗漏Q请告诉我们。我们也试图使DWR成ؓ可嵌入的?/p>
同时Q如果现在创建像SOAP或者JSON-RPC一L预备的协议应该是可能的!
呼叫集合数据QCall Meta-dataQ?br />你能像这样用DWR传递请求属性呼叫集合数?
Q-Q-
Remote.getData(42,{
Callback:function(str){alert(str);},
customKey:"Fred",
});
Q-Q-
java 在HttpSevletRequest 中额外的集合数据是可用的。如下代码将q回字符?Fred":
Q-Q-
WebContextFactory.get().getHttpServletRequest().getAttribute("customKey");
Q-Q-
其它事项
虽然我们已经删除了deprecated.jsQ但是有人竟然还能够注意刎ͼҎ我十分怀疑。在
DWR9.0版本出现Ӟ它已l不能满需求了?/p>
安全和稳?/p>
我们十分慎重的对待安全。DWR1.X 到迄今ؓ止是十分安全的,但是Q那不意味着我们停止
在我们的荣誉上?br />DWR2.0介绍许多新的代码。反向的AJAX和脚本ؓ基础的会话管理是疏忽Qslip upQ的地方
?/p>
此外Q里E碑1Q反向的ajax在你的webserver 上创Z些较多的加蝲Q比老版本稳定?br />我们已得?个答案-Q设计允许服务器加蝲监控和动态back-off?/p>
更o人激动的是,我们正与Mortbay一起努力,使DRW能够q用Jetty6的持l性,如果可行的话Q可以满长期HTTP的请求而不冒资源匮乏风险?/p>
因此Q在q之前,请不要用DWR2.0在开发系l,直到我们有更多的试和检查?/p>
未来版本
q是一个o人兴奋的W一个里E碑,我们在未来数周内推?
我们得到更多东西!
下蝲
你可以下载DWR2.0 M1
下蝲地址Q?br />http://getahead.ltd.uk/dwr/download
你写Ajax|站QDWR是你的java开源库?br />DWR能够让运行在服务器端的Java代码像q行在浏览器里一?br />DWR 包括两个主要部分Q?br /> 一 在服务器上运行java servlet hQƈ把应{返回给览?br /> ?在浏览器q行JavaScript h和能动态的更新|页?/p>
DWR动态的通过Javacȝ成Javascript代码,
执行AJAX服务器端的代码就像在本地览器上执行的一?但是是实际上服务器上执行代码和DWR来回的传递数据?br />q从 JAVA到JAVASCRIPT lDWR 用户感到像像RMI或者SOAP一L常规的RPC机制一栗而运行在WEB 上不要浏览器插入?br />JAVA是同步的而AJAX是异步的Q因此当数据从网l返回时Q你向DWR提供一个返回功能调用。DWR 能像javascript的onclick事g一P改变囑Ş昄目录列表的结?br />DWR 能动态的产生一个AjaxServiceQ服务)c?与一些javascript匚w的服务器端代码?br />q是通过事g处理器调用的。然后DWR处理q程的数据(l节Q,包括改变javascript和java之间所有参数和q回倹{?br />用DWR实用工具来执行下面的例子中提供的回调函数来改变网c?br />DWR提供一些javascript库和一套DHTML的例子给你帮助你开发出高效的交互式站点?br />囄如下Q?br />
****************************************************************
Servlet's Job
Servlets are Java programs that run on Web or application servers,
acting as a middle layer between requests coming from Web browsers
or other HTTP clients and databases or applications on the HTTP server.
Read the explicit data sent by the client
The end user normally enters this data in an HTML form on a Web page.
However,the data could also come from an applet or a custom HTTP client program.
Read the implicit HTTP request data sent by the browser
there are really two varieties of data:the explicit data that the end user enters
in a form and the behind-the-scenes HTTP information.
Both varieties are critical.The HTTP information includes cookies,information
about media types and compression schemes.
Generate the results
This process may require talking to a database,executing an RMI or EJB call,invoking
a Web service,or computing the response directly.
Your real data may be in a relational database.Fine.
But your database probably doesn't speak HTTP or return results in HTML,
so the Web browser can't talk directly to the database.Even if it could,for secutity
reasons,you probably would not want it to. The same argument applies to most other
applications.
You need the Web middle layer to extract the incoming data from the HTTP stream,talk
to the application,and embed the results inside a document.
Send the explicit data (i.e.,the document)to the client.
This document can be sent in a variety of formats,including text(HTML or XML),binary
(GIF images),
or even a compressed format like gzip that is layered on top of some other underlying format.
But,HTML is by far the most common format,so an important servlet/JSp task is to
wrap the results inside of HTML.
Send the implicit HTTP response data.
there are really two varieties of data sent:
the document itself and the behind-the-scenes HTTP information.Again,both varieties are critical to effective development.
Sending HTTP response data involves telling the browser or other client what type of
documents is being returned(e.g.,HTML),setting cookies and caching parameters,and
other such tasks.
************************************************************
Servlet 的功?br /> Servlet 是运行在Web 服务器或应用服务器上的JAVAE序Q它是一个中间层Q?br />负责q接来自Web览器或其他HTTP客户E序的请求和HTTP服务器上的数据库或应用程序?/p>
d客户发送的昄数据
最l用户一般在|页的HTML表单中输入这些数据。然而,数据q有可能来自于applet 或定制的
HTTP客户E序?/p>
它们分别为用户在表单中输入的昄数据Q以及后台的HTTP信息Q两U数据都很重要。HTTP
信息包括cookie, 览器所能识别的媒体cd和压~模式等?/p>
***********************************************************
Sensitive 敏感
Concuread 可同时发生的
Absoluteposion l对位置
Cursor 指针
granted 准许
License 许可Q执?br />involve 包括
indirectly 间接?br />directories 目录
ascirbe 归因?/p>
*******
student_survey n 学生调查
Separator n 分隔W?br />generates v 生成
CompareTO v 比较
Otherwise adv 否则Q另?br />Hierarchy n 层次 Class Hierarchy
compatibility 兼容?br />resources 资源
Data resources 数据?br />Constructs v 创徏
Functionality n 功能
Encodes v ~码
specified URL 特定的URL
Raw 原始
************************************************************
You call request.getParameter to get the value of a form parameter.
You can also call request.getParameterValues if the parameter appears more
than once you can call request.getParameterNames if you want a complete list of
all parameters in thecurrent request.
In the rare cases in which you need to read the raw request data and parse it
yourself,call getReader of getInputStream.
********
你可以调用request.getParameter 可以得到表单参数倹{?br />如果参数多次出现Q还可以调用request.getParameterValues.
如果希望得到当前h中所有参数的完整列表Q可以调用request.getParameterNames.
在极数情况下,可能需要读取原始的h数据对它自己q行分析Q此时可以调用getReader?br />getInputStream.
************************************************************03 Servelet 处理表单
Override 覆盖
Resource bundle 资源?br />Scheme 模式
Template 模板
Wildcard 通配W?br />Internationalization 国际?br />Authorization 鉴别
Authentication 授权
Native code 本机代码
Manipulation 处理
Java syntax Java语法
Standardizes 标准?br />approach 路径
extensions 扩展
Vendor 卖主Q供应商
Establish 建立
JDBC provides a standard library for accessing relational databases.
By using the JDBC API, you can access a wide variety of SQL databases with exactly
the same Java syntax.
********译开?/p>
JDBC 提供一套访问关pd数据库的标准库。通过JDBC API Q我们可以适用完全相同的JAVA 语法讉K大量各种各样的SQL数据库?/p>
********
It is important to note that although the JDBC API standardizes the approach for
connection to databases,the syntax for sending queries and committing t
ransactions,
and the data structure representing the result,JDBC does not attmpt to standardize
the SQL syntax.
*******译开?/p>
要主义,虽然JDBC API 标准化了数据库的q接方式Q发送查询和提交事务的语法,以及表示l果的数据结构,但JDBC q不试图SQL的语法也标准化,了解q一Ҏ较重要?/p>
********
So,you can use any SQL extensions your database vendor supports.However,since most
queries follow standard SQL syntax,using JDBC lets you change database hosts,ports,and even database vendors with minimal changes to you code.
*******译开?/p>
故而,我们依旧可以使用数据库提供商支持的Q何扩展,但是׃大多数查询都遵@标准的SQL语法。因此,在用JDBC 的情况下Q对代码做出很少的修改就可以更改数据的主机,端口Q甚x据库提供商?/p>
*******
Following is a summary;details are given in the rest of the section.
Load the JDBC driver. To load a driver,you specify the classname of the database
driver in the Class.forName method.By doing so,you automatically create a driver
instance and register is with the JDBC driver manager.
Define the connection URL. In JDBC,a connection URL specifies the server host,
port ,and database name with which to establish a connection.
*******译开?/p>
下面是一个汇怅R?br />载入JDBC 驱动E序Q如果要载入驱动E序Q只需在Class.forName Ҏ中指定数据库驱动E序的类名。这样做p动创Z驱动E序的实例,产注册到JDBC 驱动E序理器?/p>
定义q接URL
在JDBC 中,q接URL 指定服务器的L名,端口以及希望与之建立q接的数据库名?/p>
********
Estblish the connection.With the connection URL, username,and passwrod, a network
connection to the database can be established. Once the
connection is established,
database queries can be preformed until the connection is closed.
Create a Stantement object. Creating a Statement object enables you to send
queries and commands to the database.
*******译开?/p>
建立q接
有了q接URL,用户名和密码Q就可以建立到数据库的网l连接。连接徏立之后,可以执行数据库的查询,直到数据关闭为止?br />创徏Statement 对象
创徏Statement 对象才能向数据库发送查询和命o?/p>
*************
Execute a query or update. Give a Statement object, you can send SQL stateents to
the database by using the execute, executeQuery, executeUpdate, or executeBatch
methods.
Process the results.When a database query is executed, a ResultSet is returned.
The ResultSet represents a set of rows and columns that you can process by calls
to next and various getXXX methods.
Close the connection. When you are finished performing queries and processing
results, you should close the connection ,releasing resources to the database.
******译开?/p>
执行查询或更?br />有了Statement 对象后,可以用excute,excuteQuery,excuteUpdate ?excuteBatch Ҏ
发送给SQL 语句到数据库?br />l果处理
数据库查询执行完毕后Q返回一个ResultSet 。ResultSet表示一pd的行和列Q我们可?br />调用next 和各U?getXXXҎ对这些行和列q行处理?br />关闭q接
在执行完查询且处理完l果之后Q应该关闭连接,释放与数据库相连的资源?/p>
**************************************************************
**** Cookies
Cookies are small bits of textual information that a Web server sends to a
browser
and that the browser later returns unchanged when visiting the same Web site
of domain.
By letting the server read information it sent the client previously,the site can
provide visitors with a number of conveniences
such as presenting the site the way the visitor previously customized it or
letting identifiable visitors in without their having to reenter a password.
********译开?/p>
Cookie 是小D|本信息,由Web 服务器将它发送到览器,
之后Q在讉K同一|站或域Ӟ览器又它原封不动地返回?br />通过让服务器d它之前发送给客户E序的信息,站点可以问者提供诸多的便利Q?br />比如按照讉K者之前的定制呈现该站点,或让分n已通过验证者进入,不需要再ơ输?br />密码?/p>
************
communicate 通话
dispatch 分布式的
processing 处理
match 匚w
ignored 忽略
overloaded q蝲
Furthermore 此外
purposes 目的目标
************************* 05-Servlet 中处理会?Session
Separate 单独、分?br />Persistent 持久Q稳?br />Multiple 多个、多?br />Maintaining l持、维?br />Inadequacies 不
****
HTTP is a "stateless" protocol:
each time a client retrieves a Web page,the client opens a separate connection to
the Web server and the server does not automatically maintain contextual
information .
about the client.Even with servers that support persistent(Keep-alive)HTTP
connections and keep sockets open for multiple client requests that occur
in rapid succession, there is no built-in support for maintaining contextual
information.
This lack of context causes a number of difficulties.
*******译开?
HTTP 是“无状态”协议:
客户E序每次dWeb面Q都会打开一个单独连接到Web服务器,q且服务器也不自?br />l护客户的上下文信息?br />即哪些支持持箋性HTTP q接的服务器Q尽?多个客户hq接发生且间隔很短时他们
会保持socket打开Q但是,它们也没有提供维护上下文信息的内建支持?br />上下文的~失引v许多困难?/p>
*******
For example, when clients at an online store add an item to their shopping carts,
how does the server know what's already in the carts?
Similarly, when clients decide to proceed to checkout, how can the server
determine which previously created shopping carts are theirs?
These questions seem very simple, yet, because of the inadequacies of HTTP,
answering them is surprisingly complicated.
********译开?/p>
例如Q在U商店的客户向它们的购物车加入商品时Q服务器如何知道购物车中已有何种
物品呢?
cM的,在客户决定结账时Q服务器如何能确定之前创建的购物车中哪个属于客户呢?
q些问题虽然看v来简单,但是׃HTTP的不I解决它们却异常复杂困难?/p>
***********
There are three typical solutions to this problem:cookies,URL rewriting,and
hidden form fields ,session
****译开?/p>
对于q个问题Q存在四U解x案:
cookieQURL重写隐藏的表单域和session
*********************
initialization parameters 初始化参?br />Reference 引用
Logging 日志
Encryption 加密
Chain ?br />executing 执行
tasks d
Authentication 压羃
conversion 转换
*******
A filter is a program that runs on the server before the servlet or JSP page
with which it is associated.
A filter can be attached to one or more servlets or JSp pages and can examine
the request information going into these resources
****************************
Struts采用Validator框架QValidator框架现在是Jakarta Commons目的一部分Q来解决校验问题Q它校验规则代码集中到外部的且对具体的应用E序中立?xml文g中,q样Q就那些到处出现的校验逻辑从应用程序中分离出来QQ何一个Struts应用都可以用这个文Ӟ同时qؓ校验规则的扩展提供了便利。更难能可贵的是׃Validator框架校验中要用到的一些消息等信息与资源绑定有机结合在一P使得校验部分的国际化~程变得十分的便捷和自然?br />
Validator框架大致有如下几个主要组Ӟ
在struts-config.xml文g中,最底下d一l插Ӟ
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,
/WEB-INF/validation.xml"/>
</plug-in>
从struts的例子,拯文g validator-rules.xml ?validation.xml Q?/font>攑ֈ目录 /WEB-INF 下面
?font color="#000080" size="2">validation.xml文g中定义校验的表单和属性?/p>
例子Q?/font>
<form
name=
"customerForm"
>
<field
property=
"name"
depends=
"required"
>
<arg0
key=
"customerForm.name"
/>
</field>
<field
property=
"address"
depends=
"required"
>
<arg0
key=
"customerForm.address"
/>
</field>
</form>
其中Q表单名UcustomerForm必须在struts-config.xml中定义?/p>
property单的属性?/p>
depends为校验规则的名称。validator_rules.xml中缺省定义的校验规则请参考struts的文档?/p>
<arg0 key= "customerForm.name" /> 指定校验规则中用的消息在消息资源文件中的key?/p>
Z使服务器边的验证能够q行Q将用到的formBean从ActionForm的子cL为ValidatorForm的子c,如:
public
class BaseForm extends ValidatorForm implements Serializable
要实现客L校验Q必d提交的时候运行校验框架生成的javascript代码?/p>
?lt;html:form>标签中,d属?onsubmit="return validateCustomerForm(this)"
在标{加上Q?/p>
<
html:javascript
formName
=
"customerForm"
cdata
=
"false"
dynamicJavascript
=
"true"
staticJavascript
=
"false"
/>
<
script
type
=
"text/javascript"
src
=
"
<
c:url
value
=
"/scripts/validator.jsp"
/>
"
></
script
>
在action的配|中加上指定校验的属性:validate="true"Q如Q?/p>
<action path="/customer/customer"
type="com.demo.order.actions.CustomerAction"
name="customerForm"
parameter="method"
input="add"
unknown="false"
validate="true"
>
<forward name="view" path="model.customer.view">
</forward>
<forward name="add" path="model.customer.add">
</forward>
<forward name="list" path="model.customer.list">
</forward>
</action>
2?http://www-900.ibm.com/developerWorks/cn/ ;
IBM的developerWorks|站Q英语好的直接去英文ȝ点看。这里不但是一个极好的面向对象的分析设计网站,也是Web ServicesQJavaQLinux极好的网站。强烈推荐!Q!
3?http://www.java-cn.com/ ;(中文)
JAVA中文站,目前国内资料最全、会员最多的JAVA技术网站,人气极高。有《JAVA电子书库》、《JAVA视频库?国内唯一)、《JAVA技术文摘库》、《JAVA源代码库》、《JAVA工具库》、《招聘求职广场》等主要栏目Q还有一些专家栏目。目前会员有5万多QVIP会员q?000人。无论是菜鸟q是老鸟Q都能在此网站中扑ֈ自己所需要的东东Q! 最强烈推荐Q!Q!Q!
4?http://www.javaworld.com/ ;(英文)
关于Java很多新技术的讨论和新闅R想多了解Java的方斚w面的应用Q这里比较好?
5?http://dev2dev.bea.com.cn/index.jsp ;
BEA的开发者园圎ͼBEA作ؓ最重要的App Server厂商Q有很多独到的技术,在Weblogic上做开发的朋友不容错过?
6?http://www.huihoo.com/ ;
灰狐动力|站Q一个专业的中间件网站,虽然不是专业的Java|站Q但是在J2EE企业应用技术方面有深厚的造诣?
7?http://www.theserverside.com/home/ ;(英文)
TheServerSide是一个著名的专门面向Java Server端应用的|站?
8?http://www.javaresearch.org/ ;
Java研究l织Q有很多优秀的Java斚w的文章和教程Q特别是在JDO斚w的文章比较丰富?
9?http://www.cnjsp.org/ ;
JSP技术网站,有相当多的Java斚w的文章和资源?
10?http://www.jdon.com/ ;
q有www.javaeye.com
下蝲地址Q?br />
相关下蝲 ModelsTry_SSH_V1下蝲Q请点击q里
ModelsTry_SSH_V1的评估版License下蝲Q请点击q里
ModelsTry属性编辑器下蝲Q请点击q里
ModelsTry安装演示录像的下载,L?a href="ftp://modelstry:modelstry@61.129.117.61/install.zip">q里下蝲Qƈ请阅?a >安装说明
ModelsTry使用演示录像的下载,L?a href="ftp://modelstry:modelstry@61.129.117.61/use_modelstry.zip">q里下蝲?
下蝲JDK 5.0Q请?
http://java.sun.com/j2se/downloads.html 下蝲
Eclipse 3.1 SDK 和GEF3.1Q请到http://www.eclipse.org/downloads/index.php
Eclipse3.2发布了:
官方下蝲Q?br />http://download.eclipse.org/eclipse/downloads/drops/S-3.2M6-200603312000/index.php
通过Jpetstore学习WSAD、ROSE、WEBSPHERE
http://www.matrix.org.cn/resource/article/43/43859_Jpetstore_Websphere.html
Tomcat |站:
http://jakarta.apache.org/tomcat
BEA Weblogic |站:
http://commerce.bea.com/index.jsp
IBM Webshpere |站:
http://www7b.software.ibm.com
developerWorks中文|站的连接是Q?br />http://www-900.ibm.com/developerWorks/cn/wsdd/
Jboss 下蝲:
http://www.jboss.org/index.html
BEA dev2dev在线
http://dev2dev.bea.com.cn/