??xml version="1.0" encoding="utf-8" standalone="yes"?>
|址Q?a >http://www.anymobile.org
q篇文章介绍了Apache虚拟L的配|方法,可以看作上一文章(Windows 2003下配|?/span>Apache代理Tomcat集群Q的后箋?/p>
1、需求:只有一台固|IP的服务期Q要求不同的域名可以使用不同的技术,ASP、PHP、J2EE{。当Ӟ主要以J2EE的处理ؓ丅R?/p>
2、解x法:一个Apache服务QA1Q充当虚拟主机,W二个Apache服务QA2Q解析PHP脚本Q第三个Apache服务QA3Q实现Tomcat集群的代理,另外Q用IIS解析ASPE序?br>
l构囑֦下:
3、Y件安装:Apache 2.2E序一套(D:\Apache\Apache2.2Q;Tomcat 5.5 安装E序拯2份;IIS使用Win2003自带的?/p>
4、安装步骤:
4.1 安装Apache2.2
4.2 修改A1的配|文Ӟconf/httpd.confQ支持虚拟主?/p>
4.3 修改虚拟L配置文gQconf/extra/httpd-vhosts.conf
4.4 修改A2的配|文Ӟconf/httpd2.confQ支持PHP
监听82端口Q配|略?br>
4.5 修改A3的配|文Ӟconf/httpd3.confQ支持代理Tomcat负蝲均衡
监听83端口Q配|略Q参考上一文章?br>
4.6 修改两个Tomcat配置文gQ支持集?br> 略,参考上一文章?br>
4.7 修改IISQ监?1端口?br>
4.8 开启所有的服务
Apache HTTP Server 2.2中文手册 http://docs.huihoo.com/apache/httpd/2.2-cn/platform/windows.html
配置完毕Q下面就可以讉K不同的域名了?br>
注:在具体的实践中,请将域名|换为相关的商业域名Q另外,需要用到host name的地方(如tomcat集群Q,代理转向处理地址Q一定要写域名;其他情况Q可以用本地ip地址加端口号的方法进行配|?br>Q全文完Q?/p>
资料Q?br>Windows 2003下配|?/span>Apache代理Tomcat集群 http://m.tkk7.com/anymobile/articles/112982.html
索引
0、工作原?br>1、Y件准?br> 1.1 软g条目
1.2 安装JDK
1.3 安装Tomcat
1.4 安装Apache
2、配|Tomcat集群
2.1 修改Tomcat默认应用
2.2 dROOT应用
2.3 修改server.xml
2.4 修改web.xml
3、配|Apache HTTP代理
4、优化Tomcat配置
4.1 屏蔽HTTP Connector
4.2 配置虚拟L
4.3 配置GBK~码
5、测试程?nbsp;
0、工作原?nbsp;
ApacheQHTTP ServerQ?.2新增了代理服务器QProxyingQ功能:新的代理均衡模块Qmod_proxy_balancerQ提供负载均衡服务;AJP 1.3QApache JServ ProtocolQ替代jk/jk2{连接器与Tomcat通信?br> l合Tomcat的集(ClusterQ功能,服务器结构如下:
Load Balancer(Apache 2.2 Proxy) |
注:l色部分为本文采用的配置情况?br>
1?nbsp;软g准备
1.1 软g条目
操作pȝ WinXP/Win2003 |
JDK_5.0 http://java.sun.com/javase/downloads/index_jdk5.jsp (MSI Installer) |
1.2 安装JDK
安装至目?D:\Java\jdk1.5.0 下,讄JAVA_HOME/CLASSPATH/PATHQ略?br>
1.3 安装Tomcat
解压~Zip文g至目?D:\Apache\Tomcat 5.5.23_S1 下;待配好后Q复制到D:\Apache\Tomcat 5.5.23_S2Q修改相关的端口和\径?br>
1.4 安装Apache
安装至目?D:\Apache\Apache2.2 下,可在Tomcat集群配置完成后再安装?/p>
2?nbsp;配置Tomcat集群
2.1 修改Tomcat默认应用
删除$CATALINA_HOME/webapps?CATALINA_HOME/temp目录Q?br>文件夹$CATALINA_HOME/conf/Catalina改名为Standalone?/p>
2.2 dROOT应用
$CATALINA_HOME/conf/Standalone/localhost/ROOT.xml |
<?xml version=”1.0” encoding=”utf-8”?> <!—Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context> |
2.3 修改server.xml
$CATALINA_HOME/conf/server.xml |
|||
操作步骤 |
默认 |
Tomcat 1 |
Tomcat 2 |
2.3.1 修改Server端口 |
8005 |
10005 |
20005 |
2.3.2 修改AJP Connector端口 Apache JServ Protocol 1.3 |
8009 |
10009 |
20009 |
2.3.3 修改HTTPConnector端口 |
8080 |
10001 |
20001 |
2.3.4 修改redirectPort端口 |
8443 |
10043 |
20043 |
2.3.5 屏蔽CatalinaQ打开StandaloneQƈ修改jvmRoute的gؓTomcat1/Tomcat2 |
|||
2.3.6打开ClusterQ修改tcpListenPort |
4001 |
10011 |
20011 |
2.4 修改web.xml
$CATALINA_HOME/conf/web.xml |
Q添加)<distributable/> |
或?/p>
$CATALINA_HOME/conf/Standalone/*/ROOT.xml |
Q设|)<Context distributable="true" …/> |
讄集群Qsession׃n?/p>
3?nbsp;配置Apache HTTP代理Q实现负载均?/p>
有三U方法实现Tomcat的负载均衡:
aQ?nbsp;使用JK本地q接器(Tomcat-Apache通信插gQJServ->JK->JK2->AJServPQ;
bQ?nbsp;使用2.x版本的Aache HTTP服务器的代理模块Q?br>cQ?nbsp;使用Tomcat的blancer web应用?/p>
$APACHE_HOME/conf/httpd.conf |
# d下面q段代码 |
xQApache和Tomcat已经安装、配|完毕,可以依次q行两个TomcatQ?bin/startup.batQ和ApacheE序QApache MonitorQ?br>
注:
(1) 若系l设|了pȝ变量CATALINA_HOMEQ需修改/bin/startup.batQ屏蔽下面的代码Q?br>#if not "%CATALINA_HOME%" == "" goto gotHome
(2) Apache只是一个代理服务器Q所有的h全部转至Tomcat处理Q故启用ROOT应用?br>
4?nbsp;优化Tomcat配置
4.1 屏蔽HTTP Connector
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 --> |
<!-- Define a SSL HTTP/1.1 Connector on port 8443 --> |
4.2 配置虚拟L
4.2.1 ~辑server.xml的EngineQ添加Host信息
$CATALINA_HOME/conf/server.xml |
<Engine name="Standalone" defaultHost="localhost" jvmRoute="Tomcat1"> <Host name="localhost" appBase="webapps" …>… …</Host> <Host name="www.site.com" appBase="webapps/www.site.com"/> <Host name="www.site.net" appBase="webapps/www.site.net"/> </Engine> |
4.2.2 创徏虚拟L对应的Webapp目录
$CATALINA_HOME/webapps/www.site.com $CATALINA_HOME/webapps/www.site.net |
均ؓI目?/p> |
4.2.3 创徏虚拟L
$CATALINA_HOME/conf/Standalone/www.site.com/ROOT.xml $CATALINA_HOME/conf/Standalone/www.site.net/ROOT.xml |
<?xml version="1.0" encoding="utf-8"?> <Context path="" docBase="E:\Project\{site name}" …> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context> |
另一个Tomcat Node也做cM的修改,q分别重启两个Tomcat?br>
4.3 配置GBK~码
$CATALINA_HOME/conf/server.xml |
<!-- Define an AJP 1.3 Connector on port 10009 --> <Connector port="10009" URIEncoding="GBK" enableLookups="false" redirectPort="10443" protocol="AJP/1.3" /> |
5、测试程?nbsp;
init.jsp |
<% session.setAttribute("name",request.getParameter("name")); out.println("success!" + session.getId()); %> |
testRoute.jsp |
<% String test = session.getId() + " - " + session.getAttribute("name"); System.out.println( new java.util.Date() + ":" + test); out.println( test ); %> |
讉K http://localhost/init.jsp?name=HAHAQ只L行一ơ)
讉K http://localhost/testRoute.jsp
讉K多次可以发玎ͼ两个Tomat服务器是均衡的,且session׃n?br>
另外Q还可以讄路由JSESSIONID
$CATALINA_HOME/conf/server.xml |
<!-- sessionIdAttribute default attribute name is org.apache.catalina.cluster.session.JvmRouteOrignalSessionID. JSESSIONID.{orignal node id} à <Valve className="org.apache.catalina.cluster.session.JvmRouteBinderValve" enabled="true" sessionIdAttribute="takeoverSessionid"/> <ClusterListener className="org.apache.catalina.cluster.session.JvmRouteSessionIDBinderListener" /> |
参考资?br> Apache Proxy Module http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
Apache Balancer Module http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html
Tomcat 5.5 Load Balancer http://tomcat.apache.org/tomcat-5.5-doc/balancer-howto.html
Tomcat 5.5 Clustering/Session Replication http://tomcat.apache.org/.../cluster-howto.html
Apache Tomcat 5.5 Proxy http://tomcat.apache.org/tomcat-5.5-doc/proxy-howto.html
1/ 不支持嵌套标{?br /> 如按钮的名称׃可以直接d配置Q另外标{默认值是在strutscM写死了,如submit?/p>
钮的默认值就?submit"
<html:input name="keywords" values="<bean:message value="m_k">"/>
2/ radio按钮讄默认
2.1/ 在form构造函C讄默认?br /> 2.2/ 在form的resetҎ中设|默认?br /> 2.3/ 使用js脚本讄默认?br /><script>
document.all("sex")[0].checked=true;//W一个radio选中
</script>
3/ 配置资源文g
3.1/ web.xml(from 1.1)
3.2/ struts-config.xml(from 1.2)
web.xml中的配置优先Q解军_配置文g的方法:别名bundle(since 1.2)Q徏议?.2?/p>
a. web.xml
b. struts-config.xmlQ如果web.xml配置了资源文Ӟ可以加个资源文gQ内容ؓI?/p>
c. /org/anymobile/test/struts/ApplicationResources.properties
d. java E序
e. jsp E序
4/ ?gnujaxp.jar 冲突
Tomcat启动报错QWeb面可以昄Q提交后Q?.do会报错?br /> 使用JFreeChart开源Y件时Q只djcommon.jarQjfreechart.jar两个包?/p>
5/ checkbox
private boolean syaken = true;(default true,false)
<html:checkbox property="syaken"/>
<input type="hidden" name="syaken" value="false">
private String type;(default 0,1)
<html:checkbox property="syaken" value="1"/>
1.1/ Oracle
jdbc驱动需要注意版本,class111.jarQo_jdbc.jar?br> 1.2/ MS SQL Server
注意版本和网l配|(tcp和管道的权限Q?br> 官方驱动Q?000Q?个jar包;2005Q一个jar包?br> jrds驱动Q评h遍比官方的好Q注意各个版本?br> 1.3/ MySQL
2/ 数据库连?session
2.1/ hibernate.cfg.xml配置jdbc驱动
2.2/ hibernate.cfg.xml配置datasource
2.3/ 在获取session时加载Connection
struts的datasource
web server的datasource
dbcp的datasource
3/ 事务Transaction ?commit
一ơ事务只可以提交一ơ,多次提交会报错?br> javax.servlet.ServletException: JDBC commit failed
4/ 一张表转换成了2个对象,修正Z个对?/p>
4.1 修改*.hbm.xmlQ去除composite-id标签Q将主键对应的key-property改ؓidQ其它key-property改ؓpropertyQ?br> 4.2 删除*.java和Abstract*.javaQ将*Id.java和Abstract*Id.java分别重构?.java和Abstract*.javaQ?br> 4.3 修改*DAO.jarQ将findById的参C正ؓ主键的类型,注意?.hbm.xml匚w?br>
修改前:
5/ 递增字段Q整型)
5.1 Oracle <generator class="sequence">SEQ_NAME</generator>
5.2 MySQL <generator class="increment"/>
5.3 SQL SERVER <generator class="identity"/>
6/ MS SQL SERVER Exception
6.1 [Microsoft][SQLServer 2000 Driver for JDBC]Underlying input stream returned zero bytes
jdbc bug,text字段的DZI或''Q改? '卛_Q?005中也怿正此bug?/p>
6.2 [Microsoft][SQLServer 2000 Driver for JDBC]Can't start a cloned connection while in manual transaction mode.
在手工事务模?(AutoCommit=false) 下,如果使用直接 (SelectMethod=direct) 模式Q当您尝试对使用 JDBC 驱动E序?SQL Server 数据库执行多个语句时Q将会出现此问题。直接模式是该驱动程序的默认模式?
url=jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=whm;SelectMethod=cursor
6.3 [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.
com.microsoft.sqlserver.jdbc.SQLServerException: C?nbsp; ?TCP/IP q接p|?
客户端:10.170.10.2; WinXP SP2; SQL Server 2000(SP4)
服务端:10.170.10.3; Win2003 Server; SQL Server 2000(SP4)
1/ Microsoft SQL Server 2000 Driver for JDBC(Service Pack 1)
msbase.jar;mssqlserver.jar;msutil.jar
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url = "jdbc:microsoft:sqlserver://10.170.10.3:1433;DatabaseName=xschool";
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.
at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
at com.microsoft.jdbc.sqlserver.tds.TDSConnection.<init>(Unknown Source)
at com.microsoft.jdbc.sqlserver.SQLServerImplConnection.open(Unknown Source)
at com.microsoft.jdbc.base.BaseConnection.getNewImplConnection(Unknown Source)
at com.microsoft.jdbc.base.BaseConnection.open(Unknown Source)
at com.microsoft.jdbc.base.BaseDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at com.inc.xchool.test.TestJDBC.main(TestJDBC.java:31)
2/ Microsoft SQL Server 2005 JDBC Driver
sqljdbc.jar
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
String url = "jdbc:sqlserver://10.170.10.3:1433;DatabaseName=xschool";
com.microsoft.sqlserver.jdbc.SQLServerException: C?nbsp; ?TCP/IP q接p|?java.net.ConnectException: Connection timed out: connect
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(Unknown Source)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at com.inc.xchool.test.TestJDBC.main(TestJDBC.java:34)
3/ Win的数据源(ODBC)Q系lDSN
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
可以建立q接
解决ҎQ在10.3的防火墙讄中开?433的TCP权限?br>
6.4 org.eclipse.core.internal.resources.ResourceException: A resource exists with a different case: /ok/hibernate.reveng.xml.
状况Q新Z2个web目Q一个叫okQ一个叫okadminQ都d了hibernate兌Q后者反转数据库l构的时候,eclipse?log中留下以上的log?br>解决ҎQ时remove另外一个项目?br>
6.5 ORA-01461 can bind a LONG value only for insert into a LONG column
状况QJDBC驱动与连接的Oracle数据库版本不一致?br>解决ҎQ置换JDBC驱动为Oraclepȝ自带的?/p>
作者:徐徏( netpirate@gmail.com Q?/span>
旉Q?/span>
|址Q?/span> http://www.anymobile.org
1?span style="FONT: 7pt 'Times New Roman'">
目介绍
××××目是基于……(背景Q范_术语Q?/span>
2?span style="FONT: 7pt 'Times New Roman'">
pȝ设计
Z降低pȝ的耦合性,提高pȝ的实用性和灉|性,对系l的面逻辑、业务逻辑和数据逻辑q行分层。集合当前的 Web 技术,?/span> Java 环境下,采用实现?/span> MVC 模式?/span> Struts 和实C数据持久化的 Hibernate 的开源框架组合, ?/span> Hibernate 中整?/span> EhCache Q对数据q行~存?/span>
本系l的体系l构如下Q?/span>
其中Q应用表C层Z Struts 框架Q业务逻辑层包含了供应用程序调用的业务逻辑规则Q以帮助应用E序完成业务操作Q数据持久层Z Hibernate 框架Q采?DAOQ?/span>Data Access ObjectQ模式操作数据库Q?/span>应用服务器采?/span> Tomcat ?/span>
3?span style="FONT: 7pt 'Times New Roman'">
详细设计
本系l具有多个模块,但各个模块的基本设计原理相同Q下面将逐个描述?/span>
…?/span>
4?span style="FONT: 7pt 'Times New Roman'">
数据库设?/span>
…?/span>
5?span style="FONT: 7pt 'Times New Roman'">
开发示?/span>
5.1 开发环?/span>
WinXP
JDK
Eclipse
MyEclipse 5.0GA Q?/span> Struts 1.2 Q?/span> Hibernate 3.1 Q?/span>
Tomcat 5.5
5.2 新徏 Web Project
File->New Project->MyEclipse->J2EE Projects->Web Project
5.3 建立 Struts 兌
MyEclipse->Add Struts Capabilities
5.4 建立数据库浏?/span>
Window-> Preferences->MyEclipse->Database Explorer->New Driver
Window->Customize Perspective->Commands Q选上 Profile
Profile H口Q?/span> Connection it
5.5 建立 Hibernate 兌
MyEclipse->Add Hibernate Capabilities
5.6 配置应用服务?/span>
Window-> Preferences-> Application Server->Tomcat 5 Q选择 Enable Q浏?/span> Tomcat 的安装目录,览 JDK 的安装目?/span>
右键点击 Project Q?/span> MyEclipse-> Add and Remove Project Deployment Q点?/span> Add Q?/span> Server 选择 Tomcat 5 Q?/span> Finish ?/span>
点击 Run server Q切换到 Web Browser H口Q就可以讉K了?/span>
参考文?/span>
Eclipse->Help->Help Contents->
Eclipse->Help->Help Contents->
Struts-Hibernate-Integration-Tutorial http://www.laliluna.de/download/struts-hibernate-integration-tutorial-en.pdf
<全文?gt;
扩展?
Extender)
――添加插?/span>
贡献法则Q?/span> Contribution Rule Q:一切皆是A献?/span>
遵@法则Q?/span> Conformance Rule Q:插g必须遵@预期的接口?/span>
׃n法则Q?/span> Sharing Rule Q:增加Q不要取代?/span>
有样学样法则Q?/span> Monkey See/Monkey Do Rule Q:遇到问题Ӟ首先复制cM插g的结构?/span>
相关性法则( Relevance Rule Q:只有在操作有可能成功时菜昄你所贡献的操作?/span>
整合法则Q?/span> Integration Rule Q:要整合,不要分裂?/span>
责Q法则Q?/span> Responsibility Rule Q:明确指出你所开发的插g旉题的源头?/span>
针对 API 契约~程法则Q?/span> Program to API Contract Rule Q:首先?/span> Eclipse API 契约Q然后针对契U编E?/span>
Other 法则Q?/span> Other Rule Q:让用户可以选择所有东西,但把那些通常不用于当前视角的选项攑֜ Other?/span> 对话框中?/span>
IResource 适配法则Q?/span> Adapt to IResource Rule Q:应该量为领域对象定?/span> IResource 适配器?/span>
分层法则Q?/span> Strata Rule Q:语a无关的功能与特定于具体语a的功能分开Q将核心性能?/span> UI 分开?/span>
用户q诏性法则( User Continuity Rule Q:在多ơ会话之_应该保持 UI 状态一致?/span>
促成?
Enabler
)
――发布扩展点
邀h则( Invitation Rule Q:可能的邀请别Zؓ你的作品作出贡献Q发布扩展点?/span>
懒加载法则( Lazy Loading Rule Q:只有在真正需要的时候才加蝲插g?/span>
安全q_法则Q?/span> Safe Platform Rule Q:作ؓ扩展点的提供者,你必M护好自己Q不要让扩展者的误操作给你造成损失?/span>
公^竞争法则Q?/span> Fair Play Rule Q:所有用者遵守同L游戏规则Q包括我自己?/span>
明确扩展法则Q?/span> Explicit Extension Rule Q:明确说明q_的什么地方可供扩展?/span>
发散性法则( Diversity Rule Q:一个扩展点接纳多个扩展?/span>
良好防M法则Q?/span> Good Fences Rule Q:如果要交出程序的控制权,首先保护好你自己?/span>
用户军_法则Q?/span> User Arbitration Rule Q:如果有多个选择Q由用户军_使用哪一个?/span>
明确 API 法则Q?/span> Explicit API Rule Q:?/span> API 与插件内部用的cd开?/span>
E_性法则( Stability Rule Q:如果你已l开始邀请其它h作出贡献Q就不要再改变游戏规则?/span>
保守 API 法则Q?/span> Defensive API Rule Q:只暴露你有信心的 API Q但同时也应该做好准备暴露更多的 API Q因Z用者会要求你这样做。(不含 internal 的包被认为是公开的、允许后l的扩展者用的Q不?/span> internal 的包Q则不是打算拿到插g外用的。)
发布?
Publisher)
――发布插?/span>
何时需要一个插件类
每个插g都由一个插件类来代表。插件类是一?/span>SingletonQ其中提供了一些钩子方法,可以Ҏ件的什么周期事件作出响应。可以在插gW一ơ加载时d所需的资源,也可以在插g停止时做必要的清理工资。另外,插gq负责提高一些共享信息?/span>
投媄Q?/span>ShadowQ的世界
Eclipseq_启动时会所有插件清单文件读入一个插件注册表中,为每个插件创Z个投影。此时不会加载插件本w,只加载它们的描述信息。(Platform.getPluginRegistry()Q?/span>
开发插件时Q不要在目属性中修改构徏classpathQ始l在清单文g中修攏V?/span>
?/span>Eclipse中,每个插g都有自己的类加蝲器(class loaderQ和自己的类查找路径Q?/span>classpathQ,后者将l承该插件所导入的其它插件的classpath。当插g的类加蝲器加载插件的W一个类Ӟ׃Ȁz该插g?/span>
插gcd载器
1?span style="FONT: 7pt 'Times New Roman'">
插gcd载器的上U加载器Q?/span>Eclipse的引导加载器Q?/span>boot.jar2?span style="FONT: 7pt 'Times New Roman'">
插g本n的类加蝲器,plugin.xml清单文g中的<run-time>元素中描q的cR?/span>3?span style="FONT: 7pt 'Times New Roman'">
怾插g的类加蝲器,如果插g依赖于其它插Ӟ在类查找Ӟ会在内部使用一?/span>URLcd载器?/span>4?span style="FONT: 7pt 'Times New Roman'">
不包括应用程序类/pȝCLASSPATH变量的加载器?/span>加蝲扩展的全q程
1?span style="FONT: 7pt 'Times New Roman'">
?/span>Eclipseq_取得扩展炏V?/span>2?span style="FONT: 7pt 'Times New Roman'">
取得以在此扩展点上注册的扩展Q实?/span>IExtension接口Q?/span>3?span style="FONT: 7pt 'Times New Roman'">
对于每个扩展Q取出其中以XML方式声明的配|元素(实现IConfigurationElement接口Q?/span>4?span style="FONT: 7pt 'Times New Roman'">
对于每个配置元素Q根据该元素XML声明?/span>class属性的值创Z个对象,保定义的属性完整、有效?/span>5?span style="FONT: 7pt 'Times New Roman'">
新创徏的扩展对象保存到一个集合中Q而不是直接返回一个扩展对象?/span>理想的开发策略:
1?span style="FONT: 7pt 'Times New Roman'">
信心Q在增加新性能或修Ҏl构Ӟ不比担心对原代码造成破坏?/span>2?span style="FONT: 7pt 'Times New Roman'">
学习Q快速而自信地学习Eclipse地新领域?/span>3?span style="FONT: 7pt 'Times New Roman'">
设计Q鼓p己和同事认真考虑设计Q尤其是代码地外在接口,然后去考虑如何实现?/span>试驱动开发(Test-Driven Development, TDDQ的开发@环:
1?span style="FONT: 7pt 'Times New Roman'">
~写Ʋ添加功能的试?/span>2?span style="FONT: 7pt 'Times New Roman'">
针对q个试引用到、暂未存在的cdҎQ创ZD늩的占用程序,使测试通过~译?/span>3?span style="FONT: 7pt 'Times New Roman'">
实现试Q测试测试应该失败?/span>4?span style="FONT: 7pt 'Times New Roman'">
量对实C码加以清扫,例如去除其中的重复代码?/span>插g的测试策?/span>
从审的角度Q每个插件应该尽可能的依赖其它插gQ从实用的角度,以测试驱动的方式开发插件的每个部分。应该首先创建测试插Ӟ让它依赖于新插gQ以便完全用试来驱动新插g的开发?/span>
工作副本Q?/span>working copyQ是Eclipse JDT引入的一个概念,是原有的~译单元在内存中的复制品。让用户修改Ӟ操作的实际是Java~辑器所创徏的工作副本;当用户保存编译单元时Q?/span>Java~辑器才把副本提交到文gpȝQ此时对~译单元的修Ҏ会以Java元素变化增量的Ş式广播出厅R(JavaUI.getWorkingCopyManager()Q?/span>
视角Q定义了Q一l)视图和编辑器的排列方式,工作台页面的布局Q解x个完整问题的环境?/span>
降低插g的维护成本:良好的异常处理和错误报告机制Q提供联机帮助文档(Eclipse?/span>help扩展点的扩展Q?/span>
分段Q?/span>fragmentQ开发者能够向现有的插件中d代码和资源。(fragment.xmlQ?/span>
分段的用途:
1?span style="FONT: 7pt 'Times New Roman'">
为插件提供额外的字符串翻译(语言包)?/span>2?span style="FONT: 7pt 'Times New Roman'">
为现有组件提供特定于q_的内宏V?/span>
Principles,Patterns,and Plug-Ins
[ ?/span> ] Erich Gamma, Kent Beck ?/span>
熊节 ?/span>
每个人都需要别人的兛_和帮助,每个Z同样需要关心和帮助别h?br />
每天?/span> 6 个小时读代码Q再用一个小时写代码?/span>
学习 Eclipse 的方法,览 org.eclipse.core.runtime 的源代码?/span>
全书分四个@环:
1?span style="FONT: 7pt 'Times New Roman'"> W零循环Q做好插件开发的准备Q然后以最快速度开发一个小插g――从构思到实现?/span>
2?span style="FONT: 7pt 'Times New Roman'"> W一循环Q介l插件的内容和测试用例,开发ƈ部v用于q行单元试的插件?/span>
3?span style="FONT: 7pt 'Times New Roman'"> W二循环Q在基本功能之外Qؓ插g加上一个完?/span> Eclipse 插g的所应该h的特性?/span>
4?span style="FONT: 7pt 'Times New Roman'"> W三循环Q纵?/span> Eclipse 的设计,着重之处其中值得早x的地斏V(设计模式及实玎ͼ
大家谈论的EclipseQ通常都是指的Eclipse Software Development kitQSDKQ,包括java integrated development environment QIDEQ和最好的ZEclipse q_的单一开发品的工具?br />
Eclipse SDK
是几个有影响的Eclipse目的集合体Q包括众多扩展点和符合相同接口的扩展?br />Eclipse IDE 搭徏了一个完全由lgl成的环境,q且始终保证快速启动?br />
Eclipse 的三层体pȝ构:
1?span style="FONT: 7pt 'Times New Roman'"> q_( Platform )Q定义了通用的、独立于~程语言的基设施?/span>
2?span style="FONT: 7pt 'Times New Roman'"> Java 开发工? Java Development Tools , JDT) Q基?/span> Eclipse Q功能齐备的 Java IDE ?/span>
3?span style="FONT: 7pt 'Times New Roman'"> 插g开发环? Plug-in Development Environment , PDE) Q对 JDT q行了扩展,提供了对插g开发的支持?/span>
Eclipse
PlatformQ主要包括独立于用户界面的核?
Core)层和UI(User Interface)层,以及 Team ?Help lg?br />
Figure 1 - Eclipse Platform architecture
1?span style="FONT: 7pt 'Times New Roman'">
q行? Runtime) Q定义了插g的基设施Q在启动时发现所有可用的插gQƈ负责理插g的加载?/span>2?span style="FONT: 7pt 'Times New Roman'">
工作? Workspace) Q负责一个或多个目?/span>3?span style="FONT: 7pt 'Times New Roman'">
标准H体lg工具? Standard Widget Toolkit , SWT) Q提供了囑Ş展示功能Qƈ定义了一l标准的H体lg?/span>4?span style="FONT: 7pt 'Times New Roman'">
JFace Q一l较的 UI 框架Q徏立在 SWT 之上Q提供对常用 UI d的支持?/span>5?span style="FONT: 7pt 'Times New Roman'">
工作? Workbench) Q定义了 Eclipse ?/span> UI 聚合体,其核心要素是~辑器、视囑֒视角?/span>
6?span style="FONT: 7pt 'Times New Roman'">
团队支持( Team Support )Q?/span> Eclipse q_允许 workspace 中的目建立在版本和配置理的团队知识库之上。^台含有扩展点和可以实现新的团队知识库插g的知识库供给 API 。多个团队知识库可以和^共存在^CQ?/span> Eclipse q_包含了对 CVS 的支持?/span>7?span style="FONT: 7pt 'Times New Roman'">
帮助( Help)Q?/span>Eclipseq_的帮助机制允许定义和捐赠文档C个或多个在线手册的工兗比如,通过一个工h赠了帮助风格文的用h册,API文Q如果有多个Q捐赠给一个独立的~程指南?/span>
资源Q?br />
Eclipse Corner Articles http://www.eclipse.org/articles/
Eclipse Platform Technical Overview http://www.eclipse.org/articles/Whitepaper-Platform-3.1/eclipse-platform-whitepaper.html
XML 是元标记语言Q?/span> XML 元素pv始标记、结束标记和二者之间的数据l成Q广泛运用于数据存储和交换?/span>
2?span style="FONT: 7pt 'Times New Roman'"> XMLBeans ?/span>
XMLBeans==XML+JavaBeans
Q是一U?/span>
XML-Java
cdl定技术,提供了完整的
XML Schema
?/span>
Infoset
支持。由
BEA
公司发明Q于
2003
q?/span>
9
月捐赠给
Apache
软g基金会的
XML
目l,目前的最新版本ؓ
XMLBeans 通过~译 XML Schema 文gQ把 XML 实例和底层架构映ؓ JavaBeans 风格的对象,开发h员通过 getter ?/span> setter 讉K器轻松检索、定位和操作 XML 数据文g?/span>
3?span style="FONT: 7pt 'Times New Roman'"> XMLBeans 操作步骤
3.1 准备 XML Schema 文g
XML Schema 文g是一?/span> XML 数据文g的约束文Ӟ它定义了 XML 文g的结构和元素Q以及对元素和结构的U束。二者相当于数据表结构与数据的关pR?/span>
XML Spy 可以通过 XML 文g生成 Schema 文gQ或者?/span> Workshop {Y件创建?/span>
3.2 利用 scomp 来生?/span> Java Classes
scomp ?/span> XMLBeans 提供的一个编译工P通过 schema 文g生成相应?/span> XML Bean cd元数据,在其安装目录下的 bin 目录下?/span>
scomp 命o的语法如下: scomp [opts] [dirs]* [schema.xsd]* [service.wsdl]* [config.xsdconfig]*
主要的参数说明:
-src [dir] -- 生成?/span> Java 源码存放目录
-srconly -- 只生?/span> Java 源码Q不~译、?/span> Jar 文g
-out [jarFileName] -- 生成?/span> Jar 文gQ缺省是 xmltypes.jar
-compiler -- Java ~译器的路径Q即 Javac 的位|?/span>
schema.xsd -- XML Schema文g的\?/span>
config.xsdconfig -- xsdconfig 文g的\?/span> , 主要用来制定生成?/span> Java Classes 的文件名规则?/span> Package 名称Q否?/span> package name 以 schema ?/span> xmlns 为准?/span>
3.3 d XML 数据文g
生成的 jar 包添加到目?/span> libraries/classpath 中,新徏一?/span> java E序Q?/span>
3.4 ?/span> XML 数据文g
3.5 修改 XML 数据文g
3.6 删除 XML l点
3.7 查询 XML 数据
(
未完待箋
)
资源Q?br />Apache XMLBeans——XMLBeans官方|站
Configuring XMLBeans by Hetal Shah 2005-03-10
XMLBeans 2.0 —?一位Java开发h员的视点 by Jacob Danner, Raj Alagumalai 2006-07-13
了解Apache XMLBeans 2.0中的一些新Ҏ,包括XPath/Xquery集成以及Ҏ型的支持?/span>
XML是原标记语言Q在Java中广泛应用于数据存储和交换?br />
1、配|文?/p>
1.1 Windows风格
文g名:config.properties
数据格式Q?/span>
讉K方式Q?/span> Product.Name
如: QQ
1.2 OO风格
文g名:
config.xml
数据格式Q?/span>
讉K方式Q?/span> product.name
如:
Jive
2、XML解析?br />
2.1 DOM
DOM 是用与^台和语言无关的方式表C?XML 文档的官?W3C 标准。DOM 是以层次l构l织的节Ҏ信息片断的集合,允许开发h员在树中L特定信息。分析该l构通常需要加载整个文和构造层ơ结构。由于它是基于信息层ơ的Q因?DOM 被认为是Z树或Z对象的?br />
?DOM 解析模型的优Ҏ~程ҎQ可以很Ҏ的添加和修改树中的元素。然而由于?DOM 解析器的时候需要处理整?XML 文Q所以对性能和内存的要求比较高,其是遇到很大的 XML 文g的时候。由于它的遍历能力,DOM 解析器常用于 XML 文档需要频J的改变的服务中?br />
2.2 SAX
SAX 解析器采用了Z事g的模型,它在解析 XML 文的时候可以触发一pd的事Ӟ当发现给定的tag的时候,它可以激zM个回调方法,告诉该方法制定的标签已经扑ֈ。只是在d数据时检查数据,不需要将数据存储在内存中Q对内存的要求通常会比较低。但?SAX 解析器的时候编码工作会比较困难Q而且很难同时讉K同一个文中的多处不同数据?br />
2.3 JDOM
JDOM 自n不包含解析器Q它通常使用 SAX2 解析器来解析和验证输?XML 文?br />JDOM 的目的是成ؓ Java 特定文档模型Q仅使用具体c而不使用接口QAPI 大量使用?Collections c,化了?XML 的交互,q且比?DOM 实现更快?br />
2.4 DOM4J
DOM4J 合ƈ了许多超出基?XML 文表示的功能,包括集成?XPath 支持、XML Schema 支持以及用于大文或化文的基于事件的处理。它q提供了构徏文表示的选项Q它通过 DOM4J API 和标?DOM 接口hq行讉K功能?/p>
DOM4J 是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的Y件?br />
3、DTD vs. XML Schema
XML Schema 指定 XML Schema 定义语言Q该语言提供了描q?XML 1.0 文档l构和限制其内容的工P其中包括那些利用 XML Namespace 的工兗模式语a自n?XML 1.0 表示q用名U空_它在很大E度上重构了 XML 1.0 DTD h的能力,q在一定程度上扩展了这些能力?br />
DTD 的局限?
?对于复杂需求通常很难使用内容模型?br />?不支持名U空间?br />?Ҏ块化和重用的支持非常有限?br />?不支持对声明扩展或ѝ?br />?~写、维护和d大型 DTD 以及定义pd相关模式都很困难?br />?没有嵌入式、结构化自我文档~制(self-documentation)(只有 可用)?br />?内容和属性声明不能依靠属性或元素上下?许多 XML 语言用到q一点,但它们的 DTD 必须“允许过多东襎??br />?只能使用一个简单的标识属性机?换句话说Q没有唯一性作用域)?br />
XML Schema 的局限?
?XML Schema 比较复杂;只需要偶?XML 的程序员可能觉得它难得有些过头?br />?XML Schema 不能h特定的根元素(因此Q即佉K证最单的文也要求额外的信息)?br />?当描q合内ҎQ根本无法约束字W数据?br />?内容和属性声明不能依靠属性或元素上下?q也?DTD 的主要问??br />?不能d声明指定~省倹{?br />?元素~省值只能是字符数据(不包含标??br />
Apache MINA is a network application framework which helps users develop high performance and high scalability network applications easily. It provides an abstract · event-driven · asynchronous API over various transports such as TCP/IP and UDP/IP via Java NIO.
Apache MINA is often called:
--updated 2008/03/12
Java Caching System
JCS(Java Caching System)是一个用分布式的~存pȝQ是Z服务器的java应用E序。它是通过提供理各种动态缓存数据来加速动态web应用?
JCS和其他缓存系l一P也是一个用于高速读取,低速写入的应用E序?
动态内容和报表pȝ能够获得更好的性能?
如果一个网站,有重复的|站l构Q用间歇性更新方式的数据库(而不是连l不断的更新数据库)Q被重复搜烦出相同结果的Q就能够通过执行~存方式改进其性能和~性?
官方|站 http://jakarta.apache.org/turbine/jcs/
EHCache
EHCache 是一个纯java的分布式~存Q支持磁盘存储,它具有以下特性:快速,单,为Hibernate2.1充当可插入的~存Q最的依赖性,全面的文和试?
官方|站 http://ehcache.sourceforge.net/
OSCache
OSCache是一个广泛采用的高性能的J2EE~存框架QOSCache能用于Q何Java应用E序的普通的~存解决Ҏ?
OSCache有以下特点:
~存M对象Q你可以不受限制的缓存部分jsp面或HTTPhQQ何java对象都可以缓存?
拥有全面的API--OSCache APIl你全面的程序来控制所有的OSCacheҎ?
怹~存--~存能随意的写入盘Q因此允许昂늚创徏Qexpensive-to-createQ数据来保持~存Q甚臌让应用重启?
支持集群--集群~存数据能被单个的进行参数配|,不需要修改代码?
~存记录的过?-你可以有最大限度的控制~存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时Q?
官方|站 http://www.opensymphony.com/oscache/
Cache4J
Cache4J是一个接口简单,可以快速上手,ZBSD许可的开源缓存Y件?br /> Cache4J有以下特点:
暂只只是内存~存Q?br /> 多线E环境设计;
2U实玎ͼsynchronized, blockingQ?br /> 支持LFU, LRU, FIFO法?br /> 支持盘存储Q分布式引用Q以及LFU2, LRU2{算法将是Cache4J接下来要实现的功能;另外Q该软g的用指南和API文均是俄文?br />官方|站Q?a >http://cache4j.sourceforge.net/
JCache(FKache)
JCache是个开源程序,正在努力成ؓJSR-107开源规范,JSR-107规范已经很多q没改变了。这个版本仍然是构徏在最初的功能定义上?
官方|站 http://jcache.sourceforge.net/
ShiftOne
ShiftOne Java Object Cache是一个执行一pd严格的对象缓存策略的JavalibQ就像一个轻量的配|缓存工作状态的框架?
官方|站 http://jocache.sourceforge.net/
SwarmCache
SwarmCache是一个简单且有效的分布式~存Q它使用IP multicast与同一个局域网的其他主行通讯Q是特别为集和数据驱动web应用E序而设计的。SwarmCache能够让典型的L作大大超q写操作的这cd用提供更好的性能支持 SwarmCache使用JavaGroups来管理从属关pd分布式缓存的通讯?
官方|站 http://swarmcache.sourceforge.net
TreeCache / JBossCache
JBossCache是一个复制的事务处理~存Q它允许你缓存企业应用数据来更好的改善性能。缓存数据被自动复制Q让你轻松进行JBoss服务器之间的集群工作。JBossCache能够通过JBoss应用服务或其他J2EE容器来运行一个MBean服务Q当Ӟ它也能独立运行?
JBossCache包括两个模块QTreeCache和TreeCacheAOP?
TreeCache --是一个树形结构复制的事务处理~存?
TreeCacheAOP --是一个“面向对象”缓存,它用AOP来动态管理POJO(Plain Old Java Objects)
注:AOP是OOP的gl,是Aspect Oriented Programming的羃写,意思是面向斚w~程?
官方|站 http://www.jboss.org/products/jbosscache
WhirlyCache
Whirlycache是一个快速的、可配置的、存在于内存中的对象的缓存。它能够通过~存对象来加快网站或应用E序的速度Q否则就必须通过查询数据库或其他代h较高的处理程序来建立?
官方|站 https://whirlycache.dev.java.net/
Jive Cache
Jive论坛曄是一个广受欢q的开放源码的论坛目Q现在已l商业化了,它有很多值得我们学习的地斏Vjive 2.6.0 的缓存机Ӟ把所要缓存的对象加到HashMap哈希映射表中Q用两个LinkedListedlist双向链表分别l持着~存对象和每个缓存对象的生命周期Q如果一个缓存对象被讉K刎ͼ那么把它放到链表的最前面Q然后不定时的把要缓存对象的对象加入链表中,把过期对象删除,如此反复?br />官方|站 http://www.jivesoftware.com
OFBiz Cache
OFBiz是一个非常著名的开源项目,提供了创建基于最新J2EE/XML规范和技术标准,构徏大中型企业、跨q_、跨数据库、跨应用服务器的多层、分布式电子商务cWEB应用pȝ的框架?OFBiz最主要的特ҎOFBiz提供了一整套的开发基于Java的web应用E序的组件和工具。包括实体引? 服务引擎, 消息引擎, 工作引? 规则引擎{。Ofbiz与Jive实现的CachecMQ只是Ofbiz中根本都不关心每个对象的SizeQ只兛_M的HashMap的SizeQJiveZ实现双向联表Q而在Ofbiz中用的是java.util.LinkedList?br />官方|站 http://www.ofbiz.org/
附:cache4j_perfomance_tester?span class="style7">几个常用Cache的性能试报告Q?br />
[java] ---------------------------------------------------------------
[java] java.version=1.4.2_09
[java] java.vm.name=Java HotSpot(TM) Client VM
[java] java.vm.version=1.4.2-54
[java] java.vm.info=mixed mode
[java] java.vm.vendor="Apple Computer, Inc."
[java] os.name=Mac OS X
[java] os.version=10.4.5
[java] os.arch=ppc
[java] ---------------------------------------------------------------
[java] This test can take about 5-10 minutes. Please wait ...
[java] ---------------------------------------------------------------
[java] |GetPutRemoveT |GetPutRemove |Get |
[java] ---------------------------------------------------------------
[java] cache4j 0.4 |9410 |9053 |5865 |
[java] oscache 2.2 |28076 |30833 |8031 |
[java] ehcache 1.2 |8753 |7072 |3479 |
[java] jcs 1.2.7.0 |8806 |9522 |4097 |
[java] ---------------------------------------------------------------
作者:徐徏(netpirate@gmail.comQ?/span>
旉Q?/span>
如果你不定你的Apache是否配置好了WAP支持Q可以看一下Apache的配|文?mime.types"。如果配|文件中q么一行:
text/vnd.wap.wml wml
如果没有的话Q也不用着急,加上q一行就行了。如果你要配|全面一些的话还要加上以下几行:
image/vnd.wap.wbmp wbmp
text/vnd.wap.wmls wmls
application/vnd.wap.wmlc wmlc
application/vnd.wap.wmlscriptc wmlsc
text/vnd.wap.wmlscript wsc
text/vnd.wap.wmlscript wmlscript
修改好以后,重新启动Apache可以了?/p>
如果要系l支持index.wml的话Q还得配|Apache的httpd.confQ类似添加index.php的配|了Q略?/p>
只所以说支持的是一般WAPQ像一些安装文件jarQjadQsis之类的安装文件就没有默认支持?/p>
如果要Apache支持OTAQWAP PUSHQ下载的话,q得在mime.types中添加下面几行:
AddType image/vnd.nokia.ota-bitmap ota
AddType text/vnd.sun.j2me.app-descriptor jad
AddType application/java-archive jar
AddType application/vnd.Nokie.ringing-tone rng
AddType application/vnd.symbian.install sis
Q不加的话,下蝲cMsis的安装文件会直接打开该文Ӟ而不会直接执行。)
更详l的文gcd配置如下Q?br />AddType text/vnd.sun.j2me.app-descriptor jad
AddType application/java-archive jar
AddType text/vnd.wap.wml wml
AddType audio/amr amr
AddType audio/midi mid
AddType audio/midi midi
AddType application/vnd.Nokie.ringing-tone rng
AddType application/vnd.symbian.install sis
AddType application/vnd.wap.wmlc wmlc
AddType text/vnd.wap.wmlscript wmls
AddType text/vnd.wap.wmlscript wmlsc
AddType application/vnd.wap.sic sic
AddType text/vnd.wap.si si
AddType text/vnd.wap.sl sl
AddType application/vnd.wap.slc slc
AddType text/x-vCalendar vcs
AddType text/v-vCard vcf
AddType application/vnd.nokia.gamedata nqd
AddType application/x-nokiagamedata ngd
AddType image/vnd.wap.wmbp wbmp
AddType image/x-bmp bmp
AddType image/x-epoc-mbm mbm
AddType image/vnd.nok-3dscreensaver n3a
AddType text/x-co-desc cod
AddType image/vnd.nok-oplogo-colornokia-op-logo nok
AddType application/x-pmd .pmd
AddType audio/vnd.qcelp .qcp
AddType application/x-smaf .mmf
AddType application/vnd.smaf
保存后,重启ApacheQOKQ?/p>
作者:徐徏(netpirate@gmail.comQ?/span>
旉Q?/span>
soap 应用l构图:
SVN(Subversion)Q-源码版本控制工具
作者:徐徏(netpirate@gmail.comQ?BR>旉Q?/SPAN>
1、何谓SVN ..........................................................................1
2、安装用TortoiseSVN ...........................................................1
3、Eclipse的SVN 插gQSubclipse ...............................................2
TortoiseSVN