??xml version="1.0" encoding="utf-8" standalone="yes"?> JFreeChart ?/span> SourceForge.net 上的一个开源项目,它的源码?/span> API 都可以免费获得?/span> JFreeChart 的功能非常强大,可以实现饼图 ( 二维和三l?/span> ) , q?/span> ( 水^ , 垂直 ), U图 , 点图 , 时序?/span> , 甘特?/span> , 股票行情?/span> , 混和?/span> , 温度计图 , d囄常用商用图表Q?/span> 囑Ş可以导出?/span> PNG ?/span> JPEG 格式Q同时还可以?/span> PDF ?/span> EXCEL 兌Q支持对囑Ş的放大、羃,支持常见囑Ş?/span> 3D 昄?/span> JFreeChart 可以生成很多囑Ş对象Q它的工厂类提供?/span> 33 个工厂方法用于生成不同的囑Ş对象Q具体的工厂Ҏ可以参见 JFreeChart ?/span> API 手册或者源码中?/span> ChartFactory c?/span> Q?/span> JFreechart 对图形对象的抽象具体化。图形对象( JFreeChart Q,?/span> Title( L?/span> ) Q?/span> SubTitle Q子标题 ) Q?/span> Plot Q图形的l制l构Q等几个主要对象l成。各个组成部分如下图所C: q是一?/span> JFreeChart 对象Q上面的“ chart 标题”?/span> Title 对象Q中间区域是 Plot 对象Q包括绘囑域和坐标轴区域)Q下面的区域?/span> LegendTitle 对象Q是一U?/span> SubTitle 对象?/span> 每个 JFreeChart 对象只能?/span> 1 ?/span> Title 对象Q?/span> 1 ?/span> Plot 对象Q可以有多个 SubTitle 对象?/span> JFreeChart 对象可以q行的操作有Q背景的讄Q背景颜艌Ӏ背景图片、透明度等Q、边框的讄Q是否可见、笔甅R?/span> Paint {)、渲染方式的讄、标题对象的讄、子标题对象的增删查操作。(本文中的所有操作都不提供代码的介l,可参?/span> API 手册或者源码) L题对象是 TextTitle cdQ可以进行的操作有:背景讄、字体设|(字体cd、颜艌Ӏ内宏V对齐方式等操作Q?/span> tooltip 讄?/span> URL 讄?/span> Plot 对象是图形的l制l构对象?/span> JFreeChart 中含有很多不同的 Plot 对象Q每一U图形对象中?/span> Plot 对象都在实例化的时候创建。所有的 Plot 共有的操作有Q背景设|(背景颜色、背景图片、透明度等Q、前景透明度设|、无数据存在情况的设|(昄的字W内宏V显C的字体、显C的 Paint Q、放大羃比例的讄Q大部分 Plot 对象q有讄 Datset 、设|?/span> Renderer 对象操作?/span> JFreeChart 中有 18 U?/span> Plot 抽象cȝ具体实现cR?/span> Plot 的具体实现类主要׃下重要对象组成: Renderer 对象Q图形的l制单元——绘囑֟Q?/span> Datset Q图形的数据源)Q?/span> DomainAxis Q区域uQ相当于 x _Q?/span> RangeAxis Q范围uQ相当于 y _。不同的 Plot 对象l成方式不尽相同Q有的不含有 Renderer 对象Q比?/span> CompassPlot ?/span> ContourPlot ?/span> MultiplePiePlot ?/span> PiePlot {,有的不含?/span> DomainAxis ?/span> RangeAxis 对象Q另外除?/span> FastScatterPlot c都含有 Datset 对象Q?/span> FastScatterPlot 使用 float 的二l数l充当数据源。尤其说明一点,饼状囄关的 Plot 对象Q?/span> MultiplePiePlot ?/span> PiePlot ?/span> PiePlot3D ?/span> RingPlot Q中都不含有 Renderer 对象?/span> DomainAxis 对象?/span> RangeAxis 对象?/span> 一般来_ Datset 对象存储数据模型Q?/span> Renderer 对象存储昄模型Q?/span> Plot 对象Ҏ Datset 对象?/span> Renderer 对象完成d操作?/span> 仍以上面的图形讲?/span> Plot 对象的组成?/span> 上图的中间区域是是一?/span> XYPlot 对象。其中的折线部分x囑Ş的绘制单?/span> Renderer 对象?/span> X 轴是 DomainAxis Q?/span> y 轴是 RangeAxis Q其?/span> Datset 对象属于数据模型范畴Q是 UI 不可见对象。该图中?/span> plot 背景艌Ӏ网格线的各U设|可以通过 XYPlot 对象本n完成?/span> 下面讲解 Renderer 对象?/span> Axis 对象Q?/span> X 轴?/span> y 轴都属于 Axis 对象Q, Datset 对象在后l章节中专门讲解?/span> Renderer 对象是图形的l制单元?/span> JFreeChart 提供了两个接?/span> CategoryItemRenderer ?/span> XYItemRenderer ?/span> 1 个抽象类 AbstractRenderer 供具体的 Renderer cd玎ͼl出了将q?/span> 50 U具体实现类?/span> 一般来?/span> Renderer 对象可进行的操作有:?/span> item label Q下图中的柱状图上的U色数字即ؓ item label 的示例)的默认设|( item label 的生方式、是否可见、字体?/span> Paint 、正反向 item label 的位|设|等Q、绘制图形的Ҏ默认讄Q?/span> Paint 、笔甅R是否可见等Q、绘制图形的默认讄QŞ状、笔甅R是否可见、对应的图例中是否可见等Q折U图q有U条是否可见、折点图形是否可见、折点图形是否填充、折点图形的形状、对应的图例中线条是否可见、图形是否可见、整体是否可见等Q、以及对指定 item label 的设|、指定绘制图形的讄。可以说和具体绘制的囑Ş相关的属性都可以通过 Renderer 对象讄?br />
不同?/span> Renderer 的实现类实现了不同的昄方式Q在含有 Renderer 对象?/span> JFreeChart 对象中, R enderer 对象军_?span lang="EN-US">JFreeChart对象的显C方式。例如:q囄Plot对象中默认的Renderer对象?/span> CategoryItemRenderer 对象Q通过讄 Plot 对象?span lang="EN-US">Renderer对象 ?/span> LineAndShapeRenderer Q则q囑֏为线图。用中一般不需要显式的实例化一?/span> R enderer 对象Q一般通过 JFreeChart 对象?/span> Plot 对象调用现有?/span> R enderer 对象q行重新讄{操作?span lang="EN-US"> JFreeChart 提供了两U类型的坐标_ CategoryAxis Q等UuQ和 ValueAxis QDuQ, ValueAxis 又有 3 个子c: DateAxis Q时间uQ?/span> NumberAxis Q数字uQ?/span> PeriodAxis Q时期uQ。这些坐标uq有更详l的子类Q不再一一列D Axis 对象可进行的操作有:标题的设|(内容、字体?span lang="EN-US">Paint、显C度等Q、坐标线的设|(W画?span lang="EN-US">Paint、是否可见等Q、刻度线的设|(是否可见、笔甅R?span lang="EN-US">Paint、位于绘囑域的长度、位于绘囑域外的长度等Q、刻度标C的讄Q笔甅R?span lang="EN-US">Paint、字体、与轴的距离{)、坐标u范围讄{?span lang="EN-US"> CategoryAxis 对象q可以进行的操作有: d标示间距 讄Q?/span> 最间距、最大间距、指定间距){?span lang="EN-US"> ValueAxis 对象可进行的操作有:轴端讄Q显C的囑Ş形状Q、范围设|(是否自动产生范围、自动生的最范围、最大范围、指定确定范围、指定范围大等Q、间隔设|(是否自动产生间隔、指定间隔){?/span> DateAxis 对象q有Ҏ间刻度显C格式的讄操作?/span> 子标题对象是 Title cd的对象,一?span lang="EN-US">JFreeChart可以有多个子标题对象?span lang="EN-US">JFreeChart提供?span lang="EN-US">5U?span lang="EN-US">Title的实玎ͼ可以是图片、文本、图例等的Ş式?/span> Q数据源以及常用囑Ş的处理以及进一步的讨论在后l文章中介绍Q?br />
2、n元模式:参与对象Q徏造工厂、抽象n元、具体n?br /> 分析对象的内蕴与外蕴状态,即不变的U有属性与变化的私有属性。徏造工厂用备忘录模式存储已经建造的对象Q徏造对象的时候,以参数的形式传递n元对象的内蕴属性。实际调用中Q用传递外部参数的Ҏ使用外蕴变量?/p>
复合的n元对象组成的对象Q不可以整体使用享元模式Q但可以单个的n元对象属性用该模式 3、门面模式:l构模式。ؓ包含有很多对象的子系l提供统一的操作接口类Q所有对该子pȝ的调用都通过q个c,降低子系l之间调用的复杂度,也符合笛比特法则Q一个对象的朋友量,只与朋友说话Q?/p>
4、桥梁模式:参与角色Q抽象化角色、抽象化的具体角艌Ӏ实现化角色、实现化的具体角?br /> 两个有承等U的对象,一个对象群对另一个对象群有调用关pȝ时候?br /> 目的Q抽象化与实现化解?/p>
LazySingleton对象的初始化推q到调用的时候。ƈ且ؓ了防止多U程环境下生多个实例,使用synchronized关键字保证函数getInstance调用的线E安全。synchronized关键字的存在保证了只会生一个对象,但也成了多线E环境下的性能瓉。一个多U程的程序,Cq里却要排队{候成了一个单U程式的执行程Q这在高q发环境下是不可容忍的。而c++中可以用双重检查机制将q种性能问题仅仅限制在第一ơ构造对象的时候,而java中不可以使用双重查机制?br /> 但是java可以实现EagerSingletonQ实现如下: 该类含有一U有属性valueQ在多线E环境下不能保证value值的合理逻辑Q一U程getValueByName?马上printValueQ也有可能value的值已l被其他U程修改。这U情况就属于单例模式的滥用,该类Ҏ不适合做成单例?br /> 消除非法逻辑的陷阱,可以通过该c重构ؓUa的行为类完成。重构后的代码如下: 通过调用printName(String name)直接完成操作程Q将其中的私有属性处理成q程式的参数传递,该cMҎUa的行为类?/p> 含有U有属性ƈ且含有对它赋值操作的cdƈ非都会调入该陷阱Q构造函数里q行对私有属性赋g会引起非法逻辑Q如下代?/p> 构造函数里不必要加U程安全关键字也可以保证U程安全Q因为类加蝲器是U程安全的,EagerSingleton只会在类加蝲的时候实例化一ơ,q样不会出现单例模式的线E不安全Q也不会造成非法逻辑?br />Q?Q陷阱四Q单例陷q传?br /> 当含有对象作为单例类的私有属性时Q陷׃仅会出现在该cLw,q会传递到U有对象所在的cM。看如下代码Q?/p> java中设计不当的c:calendar:作ؓ接口Q含有与具体的历法(|马历法Q相关的帔RQ不能扩展到中国的阴历历法(不符合开闭原则) 8、笛比特法则Q只与自q直接朋友通信Q不与陌生h通信Q?Q狭义笛比特法则Q只与朋友通讯Q通过自己的朋友传递间接的调用Q?Q结合依赖倒{原则修改Q不必通过朋友传递间接的调用Q通过陌生人的抽象接口调用陌生人的行ؓQ依旧不能与具体的陌生h发生通信Q?br />
9、尽量降低类中成员的讉K权限Q不要设计退化类Q类似c中structQ?br />
java中的point2D以及Dinmension2DcLq种设计~陷Q不q这U情况问题不大) ~点Q添加新产品的时候,虽然产品相关代码W合开闭原则,但对工厂cLwƈ不符合,需要修改其中的产生产品Ҏ或者添加新的生方法(工厂里实现的不同造成的修改不同)来支持新的品类 2、工厂方法模式:参与角色Q抽象工厂类/具体工厂c?抽象产品c?具体产品c?br />
消除了简单工厂的~点 4、单例模式:饿汉和懒汉两U,前者将本n对象作ؓ静态私有属性事先生成,后者推q到调用的时候,后者需要考虑多线E的时候,前面需要加U程安全关键字(注意Q,java中还是前者ؓ优?br />
不要滥用单例Q只有系l要求只有一个类的实例的时候才调用
6、观察者:常见Q类g模型视图的关p,java中提供了obervercdobservable接口
7、调停者:处理混ؕ的类交互Q抽象出中间c,类间的交互都通过q个cd?br />8、模版:拥有同一父类的多个具体子cȝ共同操作提取出来形成抽象模版c?br /> 原则Q具体的U有属性应该放到具体类中,抽象cM调用属性通过属性方法而不是直接调用属?br /> 私有属性放到具体的cMQ才能方便对父类q行多个实现?br /> 行为看作划分类的标准,以前我都是将数据模型看作划分cȝ思想Q以后应该重新审视行为在cM的重要作用,特别是在的承等U中?img src ="http://www.tkk7.com/JavaExplore/aggbug/69260.html" width = "1" height = "1" />2 囑Ş 对象的处?/span>
2 Q?span lang="EN-US">1 JFreeChart对象
2 Q?span lang="EN-US">2 L题对?span lang="EN-US">
2 Q?span lang="EN-US">3 Plot 对象
2 Q?span lang="EN-US">3Q?span lang="EN-US">1 Renderer对象
2 Q?span lang="EN-US">3Q?span lang="EN-US">2 Axis对象
2 Q?/span> 4 子标题对?/span>
安全代理Q调用真实的对象之前插入权限验证模块
引用代理Q调用真实的对象之后调用l计{相x作模?/p>
优点Q降低内存中的对象?~点Q设计复杂?br />
在c++中,单例只有一U实现方式——LazySingleton, 实现如下(本文全部使用java代码)Q?/p>
public
class
LazySingleton
{
private
static
LazySingleton m_instance
=
null
;
private LazySingleton(){};
synchronized public static LazySingleton getInstance(){
if(m_instance==null)
m_instance=new LazySingleton();
return m_instance;
}
}
public
class
EagerSingleton
{
private
static
EagerSingleton m_instance
=
new
EagerSingleton();
private EagerSingleton(){};
public static agerSingleton getInstance(){
return m_instance;
}
}
public class EagerSingleton{
private static EagerSingleton m_instance=new EagerSingleton();
private HashMap map=new HashMap();
private EagerSingleton(){};
public static agerSingleton getInstance(){
return m_instance;
}
public void refreshMap(Object key){
synchronized(map){
if(!map.contains(key))
map.put(key,value);//value为此时的实时数据
}
}
}
q种情况一般是滥用单例模式造成的,下面考虑一U滥用单例的情况。下面的代码的作用是getValueByName?马上printValue卛_成操作流E?br />public class EagerSingleton{
private static EagerSingleton m_instance=new EagerSingleton();
private String value=null;
private EagerSingleton(){};
public static agerSingleton getInstance(){
return m_instance;
}
synchronized public void getValueByName(String name){
value=getByNameFromDateBase(name);
}
public viod printValue(){
System.out.println(this.vaue);
}
}
public class EagerSingleton{
private static EagerSingleton m_instance=new EagerSingleton();
private EagerSingleton(){};
public static agerSingleton getInstance(){
return m_instance;
}
private String getValueByName(String name){
return getByNameFromDateBase(name);
}
public viod printName(String name){
String value=getValueByName(String name);
System.out.println(value);
}
}
public class EagerSingleton{
private static EagerSingleton m_instance=new EagerSingleton();
private HashMap map==new HashMap();
private EagerSingleton(){
map.put(key,value);//value为此时的实时数据
}
public static agerSingleton getInstance(){
return m_instance;
}
}
public class EagerSingleton{
private static EagerSingleton m_instance=new EagerSingleton();
private NewClass newClass=nll;
private EagerSingleton(){
newClass=new NewClass();
};
public static agerSingleton getInstance(){
return m_instance;
}
public viod printName(String name){
String value=newClass.operationByNameAndReturnValue(String name);
System.out.println(value);
}
}
一 lD:
1、不要用接口定义常?br />
2、自己少用标志接?br />
3、不要承具体类
4、类层次的中间节点应该是接口或者抽象类Q叶子是具体c?br />
5、子cd当扩展父cȝ责QQ而不是覆写父cȝ责Q
6、面向接口编E?br />
7、不要滥用承,l合优先于?/p>
properiesc:滥用l承Q承至hashtableQ应当用聚?/p>
10、如果多个具体的产品cL有共同的商业逻辑Q就可以把它们抽象到一个接口中Q如果有共同的商业逻辑Q就把共同的部分抽象到抽象类中,共同的部分尽量向cȝ承层ơ的上层UdQ以辑ֈ复用的目?br />
?nbsp; 工厂模式
1、简单工厂模式:参与角色Q工?抽象产品c?具体产品c?/p>
退化方式:省略掉工厂角Ԍ抽象产品cLd体品类的工厂角Ԍ提供静态的getInstanceҎQ比如javacd中的DateFormatc,Q本样很不符合开闭原则,父类中出C具体子类相关的代码,不方便扩展,dC品的时候,修改的时候缺点与原简单工厂的工厂角色cMQ?/p>
3、抽象工厂模式:单工厂模式与工厂Ҏ模式的结?/p>
有的单例可能有状态属性,q就为多例模式提供了可能
含有U有属性的cM成单例的时候尤其要注意Q一是私有属性的U程安全Q确实需要的时候可以加U程安全关键字,比如pȝ中的logc,二是认q些属性是不是可以所有线E共享的Q类似普通类的static
?nbsp; 各种具体模式Q?Q?br />
1、徏造模式:参与角色4个:指导者、抽象徏造对象、具体徏造对象、?br />
一个复杂的产品有很多的雉Ӟ可以用具体的建造对象来一一构?br />
2、原始模式:深拷贝、浅拯
3、适配器模式:adapteec适配成目标接?br />
4、合成模式:参与角色Qcomposite接口、树枝节点类、树叶节点类
分成透明式和安全式两U,各有优缺?br />
(1)前者将理子对象的Ҏ攑ֈ接口中,q样树型l构中的所有对象都是透明的,都可以统一调用Q但是叶节点q没有管理子对象的能力,因此透明但不安全
(2)后者将理子对象的Ҏ下放到树枝节点类中,q样安全但不透明
5、装饰模式:l承已有cȝ接口Q提供和已有cȝ同的ҎQƈ对已有类的功能提供扩展(通过l合已有对象Q调用已有对象方法的时候加入新的代码)
(1)透明的装饰模式(Ua的装饰模式)Q装饰类、被装饰cȝ承于同一接口Q而且装饰cd实现接口的方法,不提供额外方法的实现Q调用该cȝ时候用接口声明调用(实例化当然还是自q构造函敎ͼQ即该类的所有方法都是透明?br />
(2)半透明的装饰模式(退化的装饰模式Q:装饰cR被装饰cȝ承于同一接口Q装饰类不仅实现接口的方法,q提供额外方法的实现Q这栯调用它独特的Ҏ的时候就必须使用它本w来调用Q退化到一半装饰模式、一半适配器模式?/p>
EJB:2.0
JBoss:4.0.2
关于如何部vEJBQ网上有不少详细介绍的文章。在q里我不在重复ejb的细枝末节。大体说一下,一个简单的EJB包括Q一个承SessionBean的类、一个承EJBObject接口的Remote接口、一个承EJBHome的Home接口、调用该EJB的一个类Q网上的教程一般v名ؓXXXClientQ?BR>l织好这些类的目录结构,写好ejb-jar.xml,基本上就完成了?BR>说明几点Q?BR>1、编译类的时候,引入jboss-j2ee.jar与jbossall-client.jar包;
2、ejb-jar.xml的DOCTYPE处一定要如此Q针对EJB2.0Q我部v的时候时间都费在这儿了Q:
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "3、承SessionBean的那个类臛_要有一个ejbCreate()ҎQ?BR>4、应该抛出的异常一定不能漏掉,特别是那两个接口里面的方法应该抛出的异常Q都应该有java.rmi.RemoteExceptionQ;
5、部|后以dos方式重启jbossQ若部vp|Q可以在dosH口中看到出错的原因?/P>
如果要给一个person的实例设|血型,代码如此Qperson.setBlood(Blood.A);
q个写法的代码中,setBlood的参Cؓ整型Q如果如此调用person.setBlood(9);
~译器无法发现错误,只能靠h为控Ӟ如果在方法setBlood中检参数的有效性,又超了该方法的职责?/p>
重构后的代码如下Q?/p>
如此Q(1Q隐藏了血型的~码l节
Q?Q方便编译期间发现错?br /> Q?Q避免用超数据范围的参数
初来论坛Q见大家一些基问题反复的问Q很是浪Ҏ间与_֊Q下面将常见问题逐一解答QƈƢ迎各位同道跟帖写出常见问题以及解答Ҏ?BR>Q?Q、何处下载jdkQ网址Qjava.sun.com/downloads
何处下蝲tomcatQ网址Q?A >http://jakarta.apache.org/site/binindex.cgiq个面很长Q往下拉扑ֈtomcatQ有很多版本Q现在最新的?5.5.5-alpha exe PGP MD5
Q?Q、ؓ何安装tomcat的时候停在using jvm?x瑞星Q然后打开 控制面板Q》管理工P》服务,扑ֈ瑞星对应的全部服务都停止。然后重新安装即可成功?BR>Q?Q、安装后需要如何配|环境变量?右键单击"我的电脑"Q在弹出菜单中选择"属??pȝҎ? ?高" ?环境变量"Q?弹出环境变量对话框,可以编辑系l的环境变量了。添加PATH、JAVA_HOME、CLASSPATH、TOMCAT_HOME四个变量。PATH=你的jdk目录\bin;JAVA_HOME=你的jdk安装目录QCLASSPATH=你的jdk安装目录\lib\tools.jarQTOMCAT_HOME=你的tomcat安装目录。开启tomcat服务Q然后用:http://localhost:8080/可以测试是不是配置成功?BR>Q?Q、tomcat的目录结构是什么样子的Q下面说一下我们会l常接触到的目录与文件。bin目录下的tomcat5.exe是tomcat服务的启动文Ӟlogs目录是一些日志文Ӟ其中stdout.log是你的System.out.println打印的目的地Q当你打开tomcat服务地dos界面Ӟ向该dos界面打印Q;webapps目录是我们的|站文g攄的地方,webapps\ROOT是tomcat的默认主늛录,可以使用http://localhost:8080来访问该目录。webapps下其他目录下的文Ӟ我们可以使用http://localhost:8080/目录名来讉K?BR>Q?Q、ؓ何我得jsp不能正确昄中文?q个不是配置的问题,大家都知道我们可以在html文g里通过讄<meta http-equiv="Content-Type" content="text/html; charset=gb2312">让html昄中文Qjsp也是一P你设|?lt;%@page contentType="text/html; charset=gb2312" Q?gt;可以显CZ文?BR>Q?Q、如何新拟目录?
修改 Tomcat安装目录\conf\server.xml Q在下列行前
</Host>
</Engine>
d下列行:
<Context path="/my" docBase="c:\myjsp\test" debug="0" reloadable="true">
</Context>
表示增加虚拟目录 myQ对应物理目录位|c:\myjsp\testQ若存在c:\myjsp\test\hello.jspQ则下列地址可访问:
htpp://localhost:8080/my/hello.jsp
修改server.xml后,需要重新启动tomcat. (转mouseLee回帖Q测试正)
Q?Q、如何配|servlet?
以(6Q徏立的虚拟目录Z。假如你有一个servletQMyFirstServlet。该servletW一行代码ؓQpackage com.myservlet;
MyFirstServlet.class复制到c:\myjsp\test\WEB-INF\classes\com\myservlet下面Q无目录的自己新建。然后打开c:\myjsp\test\WEB-INF\web.xmlQ该文g可以从tomcat的安装目录\webapps\ROOT\WEB-INF下面复制Q,?lt;!-- JSPC servlet mappings end -->前面加入<servlet>
<servlet-name>newServlet</servlet-name>
<servlet-class>com.myservlet.MyFirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>newServlet</servlet-name>
<url-pattern>/ceshi</url-pattern>
</servlet-mapping>
然后你就可以通过htpp://localhost:8080/my/ceshi来访问你的servlet了?