posts - 32,  comments - 3,  trackbacks - 0
  2010年4月9日

发现现在几乎所有的网站都对url中的汉字和特殊的字符,进行了urlencode操作,也就是:

http://hi.baidu.com/%BE%B2%D0%C4%C0%CF%C8%CB/creat/blog/

这个样子,中间%形式的,肯定就是我的登录用户名称了吧。

为什么对这些字符进行了u的编码形式,是为了字符编码(gbk、utf8)还是为了不出现特殊的字符在url中?都知道要转,但是转了的真正好处呢。查看了网上的很多资料,也没有找到更加准确的说法。

url转义其实也只是为了符合url的规范而已。因为在标准的url规范中中文和很多的字符是不允许出现在url中的。

看一下php的urlencode的说明了。

urlencode — 编码 URL 字符串

string urlencode ( string $str )

返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode())不同。此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。

标准的英文说明是:

"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."

那哪些字符是需要转化的呢?

1. ASCII 的控制字符

这些字符都是不可打印的,自然需要进行转化。

2. 一些非ASCII字符

这些字符自然是非法的字符范围。转化也是理所当然的了。

3. 一些保留字符

很明显最常见的就是“&”了,这个如果出现在url中了,那你认为是url中的一个字符呢,还是特殊的参数分割用的呢?

4. 就是一些不安全的字符了。

例如:空格。为了防止引起歧义,需要被转化为“+”。

明白了这些,也就知道了为什么需要转化了,而转化的规则也是很简单的。

按照每个字符对应的字符编码,不是符合我们范围的,统统的转化为%的形式也就是了。自然也是16进制的形式。

和字符编码无关

通过urlencode的转化规则和目的,我们也很容易的看出,urleocode是基于字符编码的。同样的一个汉字,不同的编码类型,肯定对应不同的urleocode的串。gbk编码的有gbk的encode结果。

apache等服务器,接受到字符串后,可以进行decode,但是还是无法解决编码的问题。编码问题,还是需要靠约定或者字符编码的判断解决。

因此,urleocode只是为了url中一些非ascii字符,可以正确无误的被传输,至于使用哪种编码,就不是eocode所关心和解决的问题了。

编码问题,不是urlencode所要解决的。
转自:http://apps.hi.baidu.com/share/detail/32230450

参考资料:

http://www.blooberry.com/indexdot/html/topics/urlencoding.htm

http://cn.php.net/manual/zh/function.urlencode.php

 

 

 

posted @ 2011-08-10 13:16 donghang73 阅读(10406) | 评论 (0)编辑 收藏

在文件夹选项里改了驱动器或文件夹的图标,发现双击打开硬盘变成了搜索

解决方法:

运行
regsvr32 /i shell32.dll

解决!

posted @ 2011-08-05 10:27 donghang73 阅读(232) | 评论 (0)编辑 收藏
//首先在HEAD区加入要引用的JS
<head>
<script type="text/javascript" src="FCKEditor/fckeditor.js"></script> 
<script type="text/javascript" language="javascript">
function check()
{
   // 取得FCKEditor的值,GetInstance(arg),这里的参数arg是FCKeditor实例名;
   //如声明FCKeditor用var oFCKeditor = new FCKeditor('FCKEditor1',500,200,'Board'),则此时arg就是FCKEditor1;
        var checkContent1 =FCKeditorAPI.GetInstance("FCKEditor1").GetXHTML();
        if (checkContent1 == "")
        {
           strErr += '评论内容不能为空!\n\n';
    alert(strErr);
        }
}
</script>
</head>
<%-- 把这段写在需要显示FCKEditor编辑框的地方 --%>
<div class="FCKeditor">
<script type="text/javascript">
    var sBasePath = "FCKEditor/";
    var oFCKeditor = new FCKeditor('FCKEditor1',500,200,'Board'); //实例名为FCKEditor1
    oFCKeditor.BasePath = sBasePath ;
    oFCKeditor.Create() ;
</script>
</div>
<%-- 用于提交内容的按钮,响应点击事件为 check() --%>
<input id="Button1" value="button" type="button" onclick="check()" />
转自:http://hi.baidu.com/myaspdotnet/blog/item/0b73cd3f0ab9f3c77c1e714a.html
posted @ 2011-05-27 22:21 donghang73 阅读(221) | 评论 (0)编辑 收藏

Google code 获取密码页打不开的解决办法

# Project members authenticate over HTTPS to allow committing changes. 
svn checkout https://yourprj.googlecode.com/svn/trunk/ yourprj --username youraccount

When prompted, enter your generated googlecode.com password.

 

在文件 C:\Windows\System32\drivers\etc\hosts 中加入 66.249.89.99 code.google.com

posted @ 2011-04-17 17:25 donghang73 阅读(1405) | 评论 (0)编辑 收藏

1. 进入http://code.google.com/ 用Google帐户登录(推荐使用gmail邮箱)。然后点击>Project Hosting
2. 进入>> http://code.google.com/hosting/ 然后点击>Create a new project
3. 填入信息:
      写入项目名,描述,两个选择项(不太明白啥意思)选第一个就好使,写入标签,点击确定。就可以了
4. 提交成功后,选择菜单的Source(其中有https上传协议路径需要拷贝一份,还有一个上传密码)。
5. 打开MyEclipse,打开需要上传的项目,点鼠标右键->team->share Project->svn,写入https路径,下一步,输入Google账号和上传密码,起个名,finish。
6.如果一切顺利,会自动生成一个项目目录,可以查看所有项目文件。然后进入搭建项目界面,点鼠标右键->team->commit。然后开始上传项目。
7.哦了,搭建完成。
8.如果想查看自己的项目,可以用浏览器登陆https的路径,输入Google账号和上传密码,如果成功就可以看到含有项目名称的目录。

PS:
需要注意的是,Google的SVN是强制开源的哦,如果不想开源又没服务器的朋友开源选择svnhost
再PS:
http地址是自读权限的,供游客下载代码,https是我们更新代码的时候使用的

转自:http://hi.baidu.com/%C0%AF%B1%CA%B9%A4%D7%F7%CA%D2/blog/item/d6f6c6d7707d81d0a044df5f.html

posted @ 2011-04-17 17:12 donghang73 阅读(14566) | 评论 (2)编辑 收藏

<property name="hibernate.hbm2ddl.auto" value="update" />

Hibernate Reference Documentation解释如下:
hibernate.hbm2ddl.auto Automatically validate or export schema DDL to the database when the SessionFactory is created. With create-drop, the database schema will be dropped when the SessionFactory is closed explicitly.  eg. validate | update | create | create-drop

这个参数的作用主要用于:自动创建|更新|验证数据库表结构。
如果没有此方面的需求建议不设置此属性,默认是不对数据库结构作任何改变

其它几个参数的意思:
validate     
每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

create
每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。

create-drop
每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。

update
最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。

posted @ 2011-04-17 16:53 donghang73 阅读(550) | 评论 (0)编辑 收藏
     摘要: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> 1 <?xml version="1.0" encoding="ISO-8859-1"?>    2&nb...  阅读全文
posted @ 2011-04-16 17:18 donghang73 阅读(2739) | 评论 (0)编辑 收藏

Java中使用的路径,分为两种:绝对路径和相对路径。归根结底,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过是一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的!

在开发Web方面的应用时, 经常需要获取 服务器中当前WebRoot的物理路径。

如果是Servlet , Action , Controller, 或则Filter , Listener , 拦截器等相关类时, 我们只需要获得ServletContext, 然后通过ServletContext.getRealPath("/")来获取当前应用在服务器上的物理地址。

如果在类中取不到ServletContext时, 有两种方式可以做到:

1. 利用Java的类加载机制 调用 XXX.class.getClassLoader().getResource(""); 方法来获取到ClassPath , 然后处理获得WebRoot目录,这种方式只能是该class在WebRoot/WEB-INF/classes下才能生效, 如果该class被打包到一个jar文件中, 则该方法失效。这时就应该用下面一种方式。

2. spring框架的思路, 在WEB-INF/web.xml中 , 创建一个webAppRootKey的param, 指定一个值(默认为webapp.root)作为键值, 然后通过Listener , 或者Filter , 或者Servlet 执行String webAppRootKey = getServletContext().getRealPath("/"); 并将webAppRootKey对应的webapp.root 分别作为Key , Value写到System Properties系统属性中。之后在程序中通过System.getProperty("webapp.root")来获得WebRoot的物理路 径。

根据第二种的思路,我们还可以再扩展一下。不过对于在部署在一台服务器中的应用来说,若还不是你所需请再往下看。

下面是一些得到classpath和当前类的绝对路径的一些方法。你可使用其中的一些方法来得到你需要的资源的绝对路径:

1. DebitNoteAction.class.getResource("")

得到的是当前类FileTest.class文件的URI目录。不包括自己!

如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

atacarnet/src/com/evi/modules/atacarnet/action/

2. DebitNoteAction.class.getResource("/")

得到的是当前的classpath的绝对URI路径。

如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

3. Thread.currentThread().getContextClassLoader().getResource("")

得到的也是当前ClassPath的绝对URI路径

如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

4. DebitNoteAction.class.getClassLoader().getResource("") 或ClassLoader.getSystemResource("")

得到的也是当前ClassPath的绝对URI路径。

如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

5. 取得服务器相对路径

System.getProperty("user.dir")

例如:E:\apache-tomcat-5.5.16\apache-tomcat-5.5.16\bin

我推荐使用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法

6. 取得项目中的绝对路径

一般用request.getRealPath("/")或request.getRealPath("/config/")

但现在不提倡使用request.getRealPath("/")了,大家可试用ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径

要取得src的文件非常容易,因为src是默认的相对目录,比如你说要取得src下com目录的test.java文件,你只需要这样就够了

File f = new File(com/test.java);

但如果我要取得不在src目录或者WebRoot目录下的文件呢,而是要从src或者WebRoot同级的目录中取呢,比如说doc吧

我的硬方法是这样实现的:

String path = this.getServletContext().getRealPath("/");

Properties p = new Properties();

p.load(new FileInputStream(new File(path.substring(0,(path.lastIndexOf("\\WebRoot ") + 1)) + "doc/db.properties")));

System.out.println(p.getProperty("driverName"));

转自:http://blog.csdn.net/c5153000/archive/2011/03/23/6272195.aspx

posted @ 2011-04-15 17:25 donghang73 阅读(814) | 评论 (0)编辑 收藏
啥也不说了,看图吧
posted @ 2011-03-02 16:12 donghang73 阅读(378) | 评论 (0)编辑 收藏
 

    有很多时候,我们删除文件,系统会提示找不到指定的文件。但是你可以看到文件在硬盘里面,这个问题需要怎么解决呢?一般情况下,我们可以使用软件解决。不过推荐使用DOS命令,找不到指定文件通常使用一下方法解决。
  1、新建一个文本文档,写入(直接复制粘贴)下列命令:
  DEL /F /A /Q \\?\%1  
      RD /S /Q \\?\%1
  
   
2、另存为:删除OK.bat
  3、建好后,把要删除的文件或者目录直接拖放到这个bat文件图标上就可以删除了,一切OK!
  ------------------------------------------------------------------------------------------------

  在说另种方法,提供删除方法(以删除c "xxxxxx..."文件夹为例),在执行删除动作时,提示文件夹无法删除,找不到指定路径
  解决方法:由于该文件夹真正的名称为"xxxxxx..."" 所以我们就必须写对文件名.
  操作:开始运行输入“cmd”回车——输入“C: ”回车输入 RMDIR    空格 C:"xxxxxx..."    空格 /S 空格 /Q    回车即可删除。
  注意:需要删除其他类似文件,把盘符和xxxxxx...改为你电脑里面的盘符和文件名即可!
  或新建记事本,在记事本写入:RMDIR 空格文件夹" /S /Q    保存(保存前把文件夹改为你要删除文件夹的名称)退出把记事本的后缀名改成“bat”(如:新建文本文档.txt   改成新文本文档 .bat)然后剪切到你要删除文件夹所在的目录,最后点击你粘贴过来的文件-->运行就OK
      ==================================================

posted @ 2011-03-02 15:57 donghang73 阅读(448) | 评论 (0)编辑 收藏
一、windows中虚拟Linux

1.Linux安装增强功能

2.VirtualBox 分配数据空间

3.Linux中建共享文件夹挂载的目录(如mkdir /mnt/share)

4.linux挂载共 享文件夹(sudo mount –t vboxsf [设置的共享文件夹名称]  /mnt/share)

二、Linux中虚拟windows

1.windows安装增强功能

2.VirtualBox分配数据空间

3.windows 中我的电脑右键-映射网络驱动器-浏览-选中分配的共享文件夹

posted @ 2010-08-09 23:12 donghang73 阅读(213) | 评论 (0)编辑 收藏
     摘要: 最近用到了JFreeChart,现将实例代码贴出来,大家可以参考一下,代码中如有错误或可以改进的地方,还请大家指正。 通过下面的代码,可以很清晰地看出JFreeChart的结构,核心即为chart, plot, XXXAxis, renderer,了解了它们的常用方法后, 会发现其实JFreeChart使用起来是很简单方便的。废话不多说了,还是直接看示例吧。   1.柱状图 ...  阅读全文
posted @ 2010-07-25 22:44 donghang73 阅读(4468) | 评论 (1)编辑 收藏
1,apache_2.0.63-win32-x86-no_ssl.msi
下载:http://apache.mirror.phpchina.com/httpd/binaries/win32/apache_2.0.63-win32-x86-no_ssl.msi
2,svn-1.4.5-setup.exe
下载地址:http://subversion.tigris.org/files/documents/15/39559/svn-1.4.5-setup.exe
当然,你也可以选择安装TortoiseSVN.但是我没有装,因为我的源码管理都是用netbeans完成的.

好了,准备的两个软件都下载下来以后,就可以开始安装了.
首先安装apache,一般来说直接点下一步就可以了,在设置domain以及host的时候,设置为localhost就可以了,Email你可以填你自己的Email,也可以随便填一个.安装apache要注意的是,你的电脑上80端口不能被占用, 否则你的http服务是启动不起来的,我就遇到过这事,因为我用了skype,它在本机上打开了80和443端口来监听,搞得我一开始装不好,总是启动不起来,后来才发现是skype占用了80端口,于是把skype的设置改了以后,重装apache才成功.装好apache以后,这个时候,它已经在运行了,你可以在浏览器的地址栏输入http://localhost看看,是否安装成功,如果安装成功的话,这个时候浏览器里面应该是可以看到一个页面的.
然后,再安装svn-1.4.5-setup.exe,也很简单,一步一步点下步就可以了, 在安装的过程中,它会默认选中一些选项,其中就有一个是是否对apache的HTTP服务器提供支持的选项,这个默认是勾上的,不要去反选它,其它的你可以反选掉.然后svn就宣布安装成功了.你可以到CMD下面去试一下svn这个命令,如果有输出,则说明安装成功了,如果提示svn 不是内部或外部命令,也不是可运行的程序或批处理文件。那就说明没有装好.或者没有把这个命令加入到path中,所以最好的办法是到svn的安装目录下的 bin里面去看一下.
两者都装好了以后,就开始配置,当然,配置也是最重要的.
首先要建立一个数据仓库,我们假设建在E盘,数据仓库最好不要建在C盘,因为C盘重装系统以后就格了.我们先在E盘下面建立一个目录叫svnroot,然后在svnroot下面再建立一个我们专门放我们工程的目录,比如叫MyProject.于是我们在E盘下面就有了这个一个文件夹:E:\svnroot\MyProject, 然后我们用svnadmin的命令,使这个文件夹变成我们的数据仓库,命令如下:
svnadmin create E:\svnroot\MyProject
如果运行成功的话,什么也没有输出,这个时候,我们再来到MyProject文件夹下面,我们会发现多了几个文件夹和文件,我们打开conf文件夹,然后再打开svnserve.conf文件,找到如下行# password-db = passwd,然后把它前面的#去掉,表示MyProject是需要密码验证的.但是我们密码设在哪里呢,这个时候我们再打开conf文件夹下面的 passwd文件,用文本编辑器打开,在[users]下面加上我们需要启动的人员的用户和密码,比如
[users]
hadeslee=hadeslee1234
tom=123456

这个的话,我们就启动了两个用户,一个叫hadeslee,密码是hadeslee1234,一个叫tom,密码是123456.然后我们保存passwd文件.然后,我们再建一个文件,叫access.auth,这个文件是设置访问权限的,里面内容如下:
[MyProject:/]
hadeslee = rw
[MyProject:/module1]
tom=rw
hadeslee=rw

这表示,MyProject下面的所有子目录hadeslee都是有权限读写的,但是tom只有权限读写此项目下面的module1目录,这个各自的访问权限就分的更细致了.有关于MyProject文件夹下面的设置,我们就告一段落了,我们现在开始设置apache,使它能和subvertion一起工作.

首先来到Subersion的安装目录,进入它的bin目录,我们会发现如下两个文件:
mod_authz_svn.so
mod_dav_svn.so

我们把这两个文件复制一下,粘帖到 apache的安装目录下的modules文件中,然后我们再打开apache安装目录下的conf文件夹,打开httpd.conf文件.增加如下两行:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

注意,由于dav_svn需要dav_module的支持,所以要确保下面这一行没有被注释,并且保证在dav_svn之前加载:
LoadModule dav_module modules/mod_dav.so
然后模块的设置就完成了,下面我们要设置SVN的目录,以使我们的apache能知道访问不同的URL的时候,它去哪里寻找这个URL所对应的SVN目录.
httpd.conf文件中,增加如下内容:
<Location /svn/MyProject>
DAV svn
SVNPath E:/svnroot/MyProject

AuthzSVNAccessFile E:/svnroot/MyProject/conf/access.auth
Satisfy Any
Require valid-user

AuthType Basic
AuthName "Subversion repositories"
AuthUserFile  E:/svnroot/MyProject/conf/users.auth
Require valid-user
</Location>


添加完上面这些,我们会发现access.auth是我们刚才新建的,可是users.auth我们并没有新建啊.怎么就把它加进去了.不要急,现在我们就来生成users.auth文件.

进入 apache的安装目录的bin文件夹,输入如下命令:

D:\Program Files\Apache Group\Apache2\bin>htpasswd -cb users.auth hadeslee hadeslee1234
Automatically using MD5 format.
Adding password for user hadeslee

D:\Program Files\Apache Group\Apache2\bin>

我们就会发现在bin目录生成了users.auth,我们可以看到,hadeslee用户名已经被添加进去了,密码是用MD5加密过的.然后我们还要增加用户呢,可以用如下方法:
D:\Program Files\Apache Group\Apache2\bin>htpasswd -b users.auth tom 123456
Automatically using MD5 format.
Adding password for user tom

D:\Program Files\Apache Group\Apache2\bin>


只是在生成密码的时候,小了一个c的参数,因为c表示重新生成一个这样的文件,我们第一次的时候是要加的,后面我们要添加用户的时候,就不用这个c了.然后打开users.auth,会发现两个用户都已经在里面了,这个时候,我们把users.auth移到E:/svnroot/MyProject/conf/里面去,使我们上面的设置生效.

这个时候,我们的设置就完成了.可以在浏览器里面输入http://localhost/svn/MyProject试试看.

如果以后我们还要加入其它的项目呢,可以有两点解决方式
1,把以后的项目也导入到我们的MyProject的仓库中,这个的话,就不用改什么配置了
2,新建一个数据仓库,然后只要按上面的步骤,把新的<Location...>设置放到 httpd.conf里面就可以了.
当然,验证文件,访问权限文件,还有访问SVN的密码都要自己按上面的方法再设一遍.

祝大家能够设置成功:)

转自:http://www.blogjava.net/hadeslee/archive/2008/03/12/185788.html
posted @ 2010-07-25 22:17 donghang73 阅读(217) | 评论 (0)编辑 收藏
1、下载jadclipse插件
注意:jadclipse_3.1.0.jar版本,该版本支持eclipse3.1M6~3.2M2
      jadclipse_3.2.0.jar版本,该版本支持eclipse3.2M3和eclipse3.2M4.
      jadclipse_3.2.4.jar版本,该版本支持eclipse3.2M5~3.3M5
      jadclipse_3.3.0.jar版本,该版本支持eclipse3.3M6及以上

2、下载jad.exe,并将下载好的jad.exe拷贝到jre的bin的目录下,或者把jad的执行文件的绝对路径加入到环境变量PATH中。

3、配置jadClipse,在在%ECLIPSE_HOME%\目录下建立myplugins\jadclipse\eclipse\plugins的目录结构,将jadclipse_3.3.0.jar(用于Eclipse3.5)放到plugins目录下面,再在%ECLIPSE_HOME%\links目录下面建立jadclipse.link的文件(名字可以随便取),jadclipse.link的内容为:path=..\\jadclipse(注意一定要双反斜杠"\\")

4、重新启动eclipse,查看 window->preferences->java->jadClipse,如果出现jadClipse则说明上述配置成功,否则检查上述配置。

5、Path to decomplier:指定反编译工具的jad文件所在的位置。(可以指定为jre的bin的目录下的jad.exe)

6、把*.class文件的associated editors设置为jadClipse Class File Viewer做为默认项


另:批量反编译
在cmd中,进入到class文件所在路径下,输入命令:jad -o -r -s java -d src *.class
       参数的含义:
       -o:覆盖旧文件,而且不用提示确认。
       -r:重新加载生成包结构。
       -s:定义输出文件的扩展名。jad为默认扩展名,我们反编译后当然是要.java源文件了。
       -d:输出文件的目录。src表示反编译后的所有文件都放在src目录下。
       *.class:指定解析该文件夹下的所有以.class结尾的文件,即解析class文件
posted @ 2010-07-22 22:05 donghang73 阅读(1016) | 评论 (0)编辑 收藏

myeclipseUTF-8设置

   如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码。然而,Eclipse工作空间(workspace)的缺省字符编码是操作系统缺省的编码,简体中文操作系统 (Windows XPWindows 2000简体中文)的缺省编码是GB18030,在此工作空间中建立的工程编码是GB18030,工程中建立的java文件也是GB18030。如果要使 新建立工程、java文件直接使UTF-8则需要做以下工作:

 

1windows->Preferences...打开"首选项"对话框,左侧导航树,导航到general->Workspace,右 Text file encoding,选择Other,改变为UTF-8,以后新建立工程其属性对话框中的Text file encoding即为UTF-8


2windows->Preferences...打开"首选项"对话框,左侧导航树,导航到general->Content Types,右侧Context Types树,点开Text,选择Java Source File,在下面的Default encoding输入框中输入UTF-8,点Update,则设置Java文件编码为UTF-8。其他java应用开发相关的文件 如:propertiesXML等已经由Eclipse缺省指定,分别为ISO8859-1UTF-8,如开发中确需改变编码格式则可以在此指定。


3经过上述两步,新建java文件即为UTF-8编码,Eclipse编译、运行、调试都没问题,但是做RCP应用的Product输出时、或者插件 输出时,则总是出错,要么不能编译通过(输出时要重新compile)、要么输出的插件运行时中文显示乱码。此时需要再RCP应用、或插件Plugin 程的build.properties中增加一行,javacDefaultEncoding.. = UTF-8。让输出时编译知道java源文件时UTF-8编码。这个设置需要保证所有的java源文件时UTF-8编码格式,如果不全是,可以参考 Eclipse帮中(Plug-in Development Environment Guide > Reference > Feature and Plug-in Build configuration),建议全部java源文件是UTF-8编码。

   如果插件开发、RCP应用开发原来基于其他编码,如GB18030,想转换为UTF-8,则首先,做以上工作;然后通过查找编码转换工具,如基于 iconv的批量转换工具,将原编码转换为UTF-8编码,注意只转换java源文件,其他类型文件可能已经是比较合适的编码了;将原工程属性中的 Text file encoding,从原编码改为UTF-8即可。

posted @ 2010-07-20 22:03 donghang73 阅读(7954) | 评论 (0)编辑 收藏

JFreeChart类:
void setAntiAlias(boolean flag)    字体模糊边界
void setBackgroundImage(Image image)   背景图片
void setBackgroundImageAlignment(int alignment) 背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义)
void setBackgroundImageAlpha(float alpha) 背景图片透明度(0.0~1.0)
void setBackgroundPaint(Paint paint)   背景色
void setBorderPaint(Paint paint)   边界线条颜色
void setBorderStroke(Stroke stroke)   边界线条笔触
void setBorderVisible(boolean visible)   边界线条是否可见

-----------------------------------------------------------------------------------------------------------

TextTitle类:
void setFont(Font font)     标题字体
void setPaint(Paint paint)    标题字体颜色
void setText(String text)    标题内容

-----------------------------------------------------------------------------------------------------------

StandardLegend(Legend)类:
void setBackgroundPaint(Paint paint)   图示背景色
void setTitle(String title)    图示标题内容
void setTitleFont(Font font)    图示标题字体
void setBoundingBoxArcWidth(int arcWidth) 图示边界圆角宽
void setBoundingBoxArcHeight(int arcHeight) 图示边界圆角高
void setOutlinePaint(Paint paint)   图示边界线条颜色
void setOutlineStroke(Stroke stroke)   图示边界线条笔触
void setDisplaySeriesLines(boolean flag) 图示项是否显示横线(折线图有效)
void setDisplaySeriesShapes(boolean flag) 图示项是否显示形状(折线图有效)
void setItemFont(Font font)    图示项字体
void setItemPaint(Paint paint)    图示项字体颜色
void setAnchor(int anchor)    图示在图表中的显示位置(参数常量在Legend类中定义)

-----------------------------------------------------------------------------------------------------------

Axis类:
void setVisible(boolean flag)    坐标轴是否可见
void setAxisLinePaint(Paint paint)   坐标轴线条颜色(3D轴无效)
void setAxisLineStroke(Stroke stroke)   坐标轴线条笔触(3D轴无效)
void setAxisLineVisible(boolean visible) 坐标轴线条是否可见(3D轴无效)
void setFixedDimension(double dimension) (用于复合表中对多坐标轴的设置)
void setLabel(String label)    坐标轴标题
void setLabelFont(Font font)    坐标轴标题字体
void setLabelPaint(Paint paint)    坐标轴标题颜色
void setLabelAngle(double angle)`   坐标轴标题旋转角度(纵坐标可以旋转)
void setTickLabelFont(Font font)   坐标轴标尺值字体
void setTickLabelPaint(Paint paint)   坐标轴标尺值颜色
void setTickLabelsVisible(boolean flag)   坐标轴标尺值是否显示
void setTickMarkPaint(Paint paint)   坐标轴标尺颜色
void setTickMarkStroke(Stroke stroke)   坐标轴标尺笔触
void setTickMarksVisible(boolean flag)   坐标轴标尺是否显示

ValueAxis(Axis)类:
void setAutoRange(boolean auto)    自动设置数据轴数据范围
void setAutoRangeMinimumSize(double size) 自动设置数据轴数据范围时数据范围的最小跨度
void setAutoTickUnitSelection(boolean flag) 数据轴的数据标签是否自动确定(默认为true)
void setFixedAutoRange(double length)   数据轴固定数据范围(设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围)
void setInverted(boolean flag)    数据轴是否反向(默认为false)
void setLowerMargin(double margin)   数据轴下(左)边距
void setUpperMargin(double margin)   数据轴上(右)边距
void setLowerBound(double min)    数据轴上的显示最小值
void setUpperBound(double max)    数据轴上的显示最大值
void setPositiveArrowVisible(boolean visible) 是否显示正向箭头(3D轴无效)
void setNegativeArrowVisible(boolean visible) 是否显示反向箭头(3D轴无效)
void setVerticalTickLabels(boolean flag) 数据轴数据标签是否旋转到垂直
void setStandardTickUnits(TickUnitSource source) 数据轴的数据标签(可以只显示整数标签,需要将AutoTickUnitSelection设false)

NumberAxis(ValueAxis)类:
void setAutoRangeIncludesZero(boolean flag) 是否强制在自动选择的数据范围中包含0
void setAutoRangeStickyZero(boolean flag) 是否强制在整个数据轴中包含0,即使0不在数据范围中
void setNumberFormatOverride(NumberFormat formatter) 数据轴数据标签的显示格式
void setTickUnit(NumberTickUnit unit)   数据轴的数据标签(需要将AutoTickUnitSelection设false)

DateAxis(ValueAxis)类:
void setMaximumDate(Date maximumDate)   日期轴上的最小日期
void setMinimumDate(Date minimumDate)   日期轴上的最大日期
void setRange(Date lower,Date upper)   日期轴范围
void setDateFormatOverride(DateFormat formatter) 日期轴日期标签的显示格式
void setTickUnit(DateTickUnit unit)   日期轴的日期标签(需要将AutoTickUnitSelection设false)
void setTickMarkPosition(DateTickMarkPosition position) 日期标签位置(参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义)

CategoryAxis(Axis)类:
void setCategoryMargin(double margin)   分类轴边距
void setLowerMargin(double margin)   分类轴下(左)边距
void setUpperMargin(double margin)   分类轴上(右)边距
void setVerticalCategoryLabels(boolean flag) 分类轴标题是否旋转到垂直
void setMaxCategoryLabelWidthRatio(float ratio) 分类轴分类标签的最大宽度

-----------------------------------------------------------------------------------------------------------

Plot类:
void setBackgroundImage(Image image)   数据区的背景图片
void setBackgroundImageAlignment(int alignment) 数据区的背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义)
void setBackgroundPaint(Paint paint)   数据区的背景图片背景色
void setBackgroundAlpha(float alpha)   数据区的背景透明度(0.0~1.0)
void setForegroundAlpha(float alpha)   数据区的前景透明度(0.0~1.0)
void setDataAreaRatio(double ratio)   数据区占整个图表区的百分比
void setOutLinePaint(Paint paint)   数据区的边界线条颜色
void setOutLineStroke(Stroke stroke)   数据区的边界线条笔触
void setNoDataMessage(String message)   没有数据时显示的消息
void setNoDataMessageFont(Font font)   没有数据时显示的消息字体
void setNoDataMessagePaint(Paint paint)   没有数据时显示的消息颜色

CategoryPlot(Plot)类:
void setDataset(CategoryDataset dataset) 数据区的2维数据表
void setColumnRenderingOrder(SortOrder order) 数据分类的排序方式
void setAxisOffset(Spacer offset)   坐标轴到数据区的间距
void setOrientation(PlotOrientation orientation) 数据区的方向(PlotOrientation.HORIZONTAL或PlotOrientation.VERTICAL)
void setDomainAxis(CategoryAxis axis)   数据区的分类轴
void setDomainAxisLocation(AxisLocation location) 分类轴的位置(参数常量在org.jfree.chart.axis.AxisLocation类中定义)
void setDomainGridlinesVisible(boolean visible) 分类轴网格是否可见
void setDomainGridlinePaint(Paint paint) 分类轴网格线条颜色
void setDomainGridlineStroke(Stroke stroke) 分类轴网格线条笔触
void setRangeAxis(ValueAxis axis)   数据区的数据轴
void setRangeAxisLocation(AxisLocation location) 数据轴的位置(参数常量在org.jfree.chart.axis.AxisLocation类中定义)
void setRangeGridlinesVisible(boolean visible) 数据轴网格是否可见
void setRangeGridlinePaint(Paint paint)   数据轴网格线条颜色
void setRangeGridlineStroke(Stroke stroke) 数据轴网格线条笔触
void setRenderer(CategoryItemRenderer renderer) 数据区的表示者(详见Renderer组)
void addAnnotation(CategoryAnnotation annotation) 给数据区加一个注释
void addRangeMarker(Marker marker,Layer layer) 给数据区加一个数值范围区域

PiePlot(Plot)类:
void setDataset(PieDataset dataset)   数据区的1维数据表
void setIgnoreNullValues(boolean flag)   忽略无值的分类
void setCircular(boolean flag)    饼图是否一定是正圆
void setStartAngle(double angle)   饼图的初始角度
void setDirection(Rotation direction)   饼图的旋转方向
void setExplodePercent(int section,double percent) 抽取的那块(1维数据表的分类下标)以及抽取出来的距离(0.0~1.0),3D饼图无效
void setLabelBackgroundPaint(Paint paint) 分类标签的底色
void setLabelFont(Font font)    分类标签的字体
void setLabelPaint(Paint paint)    分类标签的字体颜色
void setLabelLinkMargin(double margin)   分类标签与图的连接线边距
void setLabelLinkPaint(Paint paint)   分类标签与图的连接线颜色
void setLabelLinkStroke(Stroke stroke)   分类标签与图的连接线笔触
void setLabelOutlinePaint(Paint paint)   分类标签边框颜色
void setLabelOutlineStroke(Paint paint)   分类标签边框笔触
void setLabelShadowPaint(Paint paint)   分类标签阴影颜色
void setMaximumLabelWidth(double width)   分类标签的最大长度(0.0~1.0)
void setPieIndex(int index)    饼图的索引(复合饼图中用到)
void setSectionOutlinePaint(int section,Paint paint) 指定分类饼的边框颜色
void setSectionOutlineStroke(int section,Stroke stroke) 指定分类饼的边框笔触
void setSectionPaint(int section,Paint paint) 指定分类饼的颜色
void setShadowPaint(Paint paint)   饼图的阴影颜色
void setShadowXOffset(double offset)   饼图的阴影相对图的水平偏移
void setShadowYOffset(double offset)   饼图的阴影相对图的垂直偏移
void setLabelGenerator(PieSectionLabelGenerator generator) 分类标签的格式,设置成null则整个标签包括连接线都不显示
void setToolTipGenerator(PieToolTipGenerator generator) MAP中鼠标移上的显示格式
void setURLGenerator(PieURLGenerator generator)   MAP中钻取链接格式

PiePlot3D(PiePlot)类:
void setDepthFactor(double factor)   3D饼图的Z轴高度(0.0~1.0)

MultiplePiePlot(Plot)类:
void setLimit(double limit)    每个饼图之间的数据关联(详细比较复杂)  
void setPieChart(JFreeChart pieChart)   每个饼图的显示方式(见JFreeChart类个PiePlot类)

-----------------------------------------------------------------------------------------------------------

AbstractRenderer类:
void setItemLabelAnchorOffset(double offset)     数据标签的与数据点的偏移
void setItemLabelsVisible(boolean visible)     数据标签是否可见
void setItemLabelFont(Font font)      数据标签的字体
void setItemLabelPaint(Paint paint)      数据标签的字体颜色
void setItemLabelPosition(ItemLabelPosition position)    数据标签位置
void setPositiveItemLabelPosition(ItemLabelPosition position)   正数标签位置
void setNegativeItemLabelPosition(ItemLabelPosition position)   负数标签位置
void setOutLinePaint(Paint paint)      图形边框的线条颜色
void setOutLineStroke(Stroke stroke)      图形边框的线条笔触
void setPaint(Paint paint)       所有分类图形的颜色
void setShape(Shape shape)       所有分类图形的形状(如折线图的点)
void setStroke(Stroke stroke)       所有分类图形的笔触(如折线图的线)
void setSeriesItemLabelsVisible(int series,boolean visible)   指定分类的数据标签是否可见
void setSeriesItemLabelFont(int series,Font font)    指定分类的数据标签的字体
void setSeriesItemLabelPaint(int series,Paint paint)    指定分类的数据标签的字体颜色
void setSeriesItemLabelPosition(int series,ItemLabelPosition position) 数据标签位置
void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正数标签位置
void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 负数标签位置
void setSeriesOutLinePaint(int series,Paint paint)    指定分类的图形边框的线条颜色
void setSeriesOutLineStroke(int series,Stroke stroke)    指定分类的图形边框的线条笔触
void setSeriesPaint(int series,Paint paint)     指定分类图形的颜色
void setSeriesShape(int series,Shape shape)     指定分类图形的形状(如折线图的点)
void setSeriesStroke(int series,Stroke stroke)     指定分类图形的笔触(如折线图的线)

AbstractCategoryItemRenderer(AbstractRenderer)类:
void setLabelGenerator(CategoryLabelGenerator generator)   数据标签的格式
void setToolTipGenerator(CategoryToolTipGenerator generator)   MAP中鼠标移上的显示格式
void setItemURLGenerator(CategoryURLGenerator generator)   MAP中钻取链接格式
void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分类的数据标签的格式
void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分类的MAP中鼠标移上的显示格式
void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分类的MAP中钻取链接格式

BarRenderer(AbstractCategoryItemRenderer)类:
void setDrawBarOutline(boolean draw)      是否画图形边框
void setItemMargin(double percent)      每个BAR之间的间隔
void setMaxBarWidth(double percent)      每个BAR的最大宽度
void setMinimumBarLength(double min)      最短的BAR长度,避免数值太小而显示不出
void setPositiveItemLabelPositionFallback(ItemLabelPosition position) 无法在BAR中显示的正数标签位置
void setNegativeItemLabelPositionFallback(ItemLabelPosition position) 无法在BAR中显示的负数标签位置

BarRenderer3D(BarRenderer)类:
void setWallPaint(Paint paint)    3D坐标轴的墙体颜色

StackedBarRenderer(BarRenderer)类:
没有特殊的设置

StackedBarRenderer3D(BarRenderer3D)类:
没有特殊的设置

GroupedStackedBarRenderer(StackedBarRenderer)类:
void setSeriesToGroupMap(KeyToGroupMap map)将分类自由的映射成若干个组(KeyToGroupMap.mapKeyToGroup(series,group))

LayeredBarRenderer(BarRenderer)类:
void setSeriesBarWidth(int series,double width) 设定每个分类的宽度(注意设置不要使某分类被覆盖)

WaterfallBarRenderer(BarRenderer)类:
void setFirstBarPaint(Paint paint)   第一个柱图的颜色
void setLastBarPaint(Paint paint)   最后一个柱图的颜色
void setPositiveBarPaint(Paint paint)   正值柱图的颜色
void setNegativeBarPaint(Paint paint)   负值柱图的颜色

IntervalBarRenderer(BarRenderer)类:
需要传IntervalCategoryDataset作为数据源

GanttBarRenderer(IntervalBarRenderer)类:
void setCompletePaint(Paint paint)   完成进度颜色
void setIncompletePaint(Paint paint)   未完成进度颜色
void setStartPercent(double percent)   设置进度条在整条中的起始位置(0.0~1.0)
void setEndPercent(double percent)   设置进度条在整条中的结束位置(0.0~1.0)

StatisticBarRenderer(BarRenderer)类:
需要传StatisticCategoryDataset作为数据源

LineAndShapeRenderer(AbstractCategoryItemRenderer)类:
void setDrawLines(boolean draw)    是否折线的数据点之间用线连
void setDrawShapes(boolean draw)   是否折线的数据点根据分类使用不同的形状
void setShapesFilled(boolean filled)   所有分类是否填充数据点图形
void setSeriesShapesFilled(int series,boolean filled) 指定分类是否填充数据点图形
void setUseFillPaintForShapeOutline(boolean use) 指定是否填充数据点的Paint也被用于画数据点形状的边框

LevelRenderer(AbstractCategoryItemRenderer)类:
void setItemMargin(double percent)   每个分类之间的间隔
void setMaxItemWidth(double percent)   每个分类的最大宽度

CategoryStepRenderer(AbstractCategoryItemRenderer)类:
void setStagger(boolean shouldStagger)   不同分类的图是否交错

MinMaxCategoryRenderer(AbstractCategoryItemRenderer)类:
void setDrawLines(boolean drawLines)   是否在每个分类线间画连接线
void setGroupPaint(Paint groupPaint)   一组图形连接线的颜色
void setGroupStroke(Stroke groupStroke)   一组图形连接线的笔触
void setMaxIcon(Icon maxIcon)    最大值的ICON
void setMinIcon(Icon minIcon)    最小值的ICON
void setObjectIcon(Icon objectIcon)   所有值的ICON

AreaRender(AbstractCategoryItemRenderer)类:
没有特殊的设置

StackedAreaRender(AreaRender)类:
没有特殊的设置

posted @ 2010-07-20 20:35 donghang73 阅读(2735) | 评论 (0)编辑 收藏
         JFreeChart并不存在多个不同的类来生成不同的图形。所有的图形都是具体类JFreeChart的实例化对象,初始化JFreeChart对象的时候通过指定不同的Plot实现类就可以显示出不同的图形。不同的Plot实现类具有不同的Renderer对象、Axis对象、Dataset对象。

       JFreeChart提供工厂类ChartFactory方便使用者生成各种不同的图形。ChartFactory类的各个工厂方法中实现对具体Plot的指定以及对类JFreeChart构造函数的调用。

    下面以常用图形说一下常用的使用流程(大部分的操作讲的并不全面,比如JFreeChart可能提供了很多增加、修改数据的方式,下文中可能只列举一种)。

1柱状图

1)平面柱状图

    生成柱状图操作:

JFreeChartchart=ChartFactory.createBarChart(String title,//图标题

String categoryAxisLabel,//x轴标题

String valueAxisLabel,//y轴标题

CategoryDataset dataset,//数据源

PlotOrientation orientation,//显示方向

Boolean legend,//是否显示图例

Boolean tooltips,//是否显示tooltip

Boolean urls)//是否指定url

平面柱状图的Plot对象是CategoryPlot类型。CategoryPlot对象的x轴是CategoryAxis对象,y轴是NumberAxis对象,绘制单元是BarRenderer对象,数据源是CategoryDataset对象。

获取CategoryPlot对象操作为:

CategoryPlot plot = (CategoryPlot)chart.getPlot();或者

CategoryPlot plot = chart.getCategoryPlot();

获取绘制单元操作:

       BarRenderer renderer = (BarRenderer)plot.getRenderer();

获取x轴的操作:

CategoryAxis xAxis = (CategoryAxis)plot.getDomainAxis();

获取y轴操作:

NumberAxis yAxis = (NumberAxis)plot.getRangeAxis();

获取数据源:

CategoryDataset dataset = plot.getDataset();

    柱状图可以接受一切CategoryDataset类型的数据源,下面讲解一下常用的CategoryDataset类型DefaultCategoryDataset的使用方式

实例化:

DefaultCategoryDataset dataset = new DefaultCategoryDataset();

增加数据

dataset.addValue(doublevalue,ComparablerowKey,ComparablecolumnKey);

删除数据:

       dataset.removeValue(ComparablerowKey,ComparablecolumnKey);

    或者

       dataset.removeColumn(intcolumnIndex);

    或者

       dataset.removeColumn(ComparablecolumnKey);

    对行同样有上述两种删除方式,不在列举。

修改数据:

       dataset.setValue(doublevalue,ComparablerowKey,ComparablecolumnKey);

查询数据:

plot对象、绘制单元、x轴、y轴的显示特性修改不再一一介绍。

23D柱状图

    对应的工厂方法为createBarChart3D,该方法的参数与平面柱状图相同。3D柱状图的Plot对象是CategoryPlot类型。CategoryPlot对象的x轴是CategoryAxis3D对象,y轴是NumberAxis3D对象,绘制单元是BarRenderer3D对象,数据源是CategoryDataset对象。

    具体使用以及操作与平面柱状图雷同,不在详述。

2饼状图

(1)平面饼状图

生成平面饼状图:

JFreeChartchart=ChartFactory.createPieChart(String title,//图标题

PieDataset dataset,//数据源

Boolean legend,//是否显示图例

Boolean tooltips,//是否显示tooltip

Boolean urls)//是否指定url

平面饼状图的Plot对象是PiePlot类型。PiePlot对象没有x轴对象、y轴对象、绘制单元对象,数据源是PieDataset对象。

获取PiePlot对象操作为:

PiePlot plot = (PiePlot)chart.getPlot();

获取数据源:

PieDataset dataset = plot.getDataset();

饼状图可以接受一切PieDataset类型的数据源,下面讲解一下常用的PieDataset类型DefaultPieDataset的使用方式

实例化:

    DefaultPieDatasetdataset=newDefaultPieDataset();

增加修改操作:

    dataset.setValue(Comparablekey,doublevalue);

删除操作:

    dataset.remove(Comparablekey);

查询操作:

    dataset.getKey(intitem);

或者

dataset.getValue(intitem);

(1)3D饼状图

    对应的工厂方法为createPieChart3D,参数与平面饼状图相同。与平面饼状图的差别在于Plot对象是PiePlot3D类型,不再详述。

3多重饼状图

1)多重平面饼状图

生成多重平面饼状图:

JFreeChartchart=ChartFactory.createMultiplePieChart (String title,//图标题

CategoryDataset dataset,//数据源

TableOrder order,//指定提取数据的方式(按行或者按列)

Boolean legend,//是否显示图例

boolean tooltips,//是否显示tooltip

boolean urls)   //是否指定url

多重平面饼状图的Plot对象是MultiplePiePlot类型。MultiplePiePlot对象没有x轴对象、y轴对象、绘制单元对象,数据源是CategoryDataset对象。MultiplePiePlot对象中可以含有多个子JFreeChart对象,子JFreeChart对象是上面讲过的饼状图对象。

获取MultiplePiePlot对象操作为:

MultiplePiePlot plotMain = (MultiplePiePlot)chart.getPlot();

获取子JFreeChart的操作为:

       JfreeChart childChart = plotMain.getPieChart();

获取数据源:

CategoryDataset dataset = plotMain.getDataset();

2)多重3D饼状图

    对应的工厂方法为createMultiplePieChart3D,该方法的参数与多重平面饼状图相同。多重3D饼状图的Plot对象是MultiplePiePlot类型。MultiplePiePlot对象中可以含有多个子JFreeChart对象,子JFreeChart对象是上面讲过的3D饼状图对象。

4线图

1)平面线图

    生成平面线图:

JFreeChartchart=ChartFactory.createLineChart(String title,//图标题

String categoryAxisLabel,//x轴标题

String valueAxisLabel,//y轴标题

CategoryDataset dataset,//数据源

PlotOrientation orientation,//显示方向

Boolean legend,//是否显示图例

Boolean tooltips,//是否显示tooltip

Boolean urls);//是否指定url

平面线图除了的Plot对象中绘制单元对象是LineAndShapeRenderer对象,其他一切组成对象与平面柱状图相同。

获取Renderer操作:

LineAndShapeRenderer renderer = (LineAndShapeRenderer)plot.getRenderer();

其他参考平面柱状图。

23D线图

对应工厂方法为createLineChart3D,参数与createLineChart相同。3D线图的组成对象除了绘制单元对象是LineAndShapeRenderer3D对象,其他一切组成对象与3D柱状图相同。

5时序图

生成时序图:

JfreeChartchart = ChartFactory.createTimeSeriesChart(String title,//图标题

String timeAxisLabel,//x轴标题

String valueAxisLabel,//y轴标题

XYDataset dataset,//数据源

Boolean legend,//是否显示图例

Boolean tooltips,//是否显示tooltip

Boolean urls);//是否指定url

时序图的Plot对象是XYPlot类型。XYPlot对象的x轴是DateAxis对象,y轴是NumberAxis对象,绘制单元是XYLineAndShapeRenderer对象,数据源是XYDataset对象。

Plot对象的获取操作:

       XYPlot plot = (XYPlot)chart.getPlot();

X轴对象的获取操作:

       DateAxis xAxis = (DateAxis)plot.getDomainAxis();

Y轴对象的获取操作:

       NumberAxis yAxis = (NumberAxis)plot.getRangeAxis();

Renderer对象的获取操作:

       XYItemRenderer renderer = plot.getRenderer();

时序图可以接受一切XYDataset类型的数据源,下面讲解一下常用的XYDataset类型TimeSeriesCollection的使用方式。

实例化:

       TimeSeriesCollection dataset = newTimeSeriesCollection();

添加数据操作:

       dataset.addSeries(TimeSeries);//后面讲解TimeSeries对象

删除数据操作:

       dataset.removeSeries(intindex);

查询数据操作:

       dataset.getSeries(intseries);

TimeSeries对象操作

实例化:

       TimeSeries ts = TimeSeries(Stringname,ClasstimePeriodClass);

增加数据操作:

       ts.add(RegularTimePeriod period,double value);

删除数据操作:

       ts.delete(RegularTimePeriod period);

修改数据操作:

       ts.update(RegularTimePeriod period,Number value);

查询数据操作:

    ts.getValue(RegularTimePeriodperiod);

RegularTimePeriodJFreeChart提供的时间模板类,它有很多具体的时间类,比如:MinuteSecondHourDay……等,不再详述。

posted @ 2010-07-20 20:33 donghang73 阅读(1220) | 评论 (0)编辑 收藏

 

1简介

JFreeChartSourceForge.net上的一个开源项目,它的源码和API都可以免费获得。JFreeChart的功能非常强大,可以实现饼图(二维和三维),柱状图(水平,垂直),线图,点图,时序图,甘特图,股票行情图,混和图,温度计图,刻度图等常用商用图表,图形可以导出成PNGJPEG格式,同时还可以与PDFEXCEL关联,支持对图形的放大、缩小,支持常见图形的3D显示。

2图形对象的处理

2.1 JFreeChart对象

JFreeChart可以生成很多图形对象,它的工厂类提供了33个工厂方法用于生成不同的图形对象(具体的工厂方法可以参见JFreeChartAPI手册或者源码中的ChartFactory)。JFreechart对图形对象的抽象具体化。图形对象(JFreeChart),由Title(主标题)SubTitle(子标题)Plot(图形的绘制结构)等几个主要对象组成。各个组成部分如下图所示:
   
    
这是一个JFreeChart对象,上面的“chart标题”是Title对象,中间区域是Plot对象(包括绘图区域和坐标轴区域),下面的区域是LegendTitle对象,LegendTitle是一种SubTitle对象。

每个JFreeChart对象只能有1Title对象,1Plot对象,可以有多个SubTitle对象。JFreeChart对象可以进行的操作有:背景的设置(背景颜色、背景图片、透明度等)、边框的设置(是否可见、笔画、Paint等)、渲染方式的设置、标题对象的设置、子标题对象的增删查操作。(本文中的所有操作都不提供代码级的介绍,可参见API手册或者源码)

2.2 主标题对象

主标题对象是TextTitle类型,可以进行的操作有:背景设置、字体设置(字体类型、颜色、内容、对齐方式等操作)、tooltip设置、URL设置。

2.3 Plot对象

Plot对象是图形的绘制结构对象。JFreeChart中含有很多不同的Plot对象,每一种图形对象中的Plot对象都在实例化的时候创建。所有的Plot共有的操作有:背景设置(背景颜色、背景图片、透明度等)、前景透明度设置、无数据存在情况的设置(显示的字符内容、显示的字体、显示的Paint)、放大缩小比例的设置,大部分Plot对象还有设置Datset、设置Renderer对象操作。

JFreeChart中有18Plot抽象类的具体实现类。Plot的具体实现类主要由以下重要对象组成:Renderer对象(图形的绘制单元——绘图域),Datset(图形的数据源),DomainAxis(区域轴,相当于x轴),RangeAxis(范围轴,相当于y轴)。

不同的Plot对象组成方式不尽相同,有的不含有Renderer对象,比如CompassPlotContourPlotMultiplePiePlotPiePlot等,有的不含有DomainAxisRangeAxis对象,另外除了FastScatterPlot类都含有Datset对象,FastScatterPlot使用float的二维数组充当数据源。尤其说明一点,饼状图相关的Plot对象(MultiplePiePlotPiePlotPiePlot3DRingPlot)中都不含有Renderer对象、DomainAxis对象、RangeAxis对象。

一般来说,Datset对象存储数据模型,Renderer对象存储显示模型,Plot对象根据Datset对象、Renderer对象完成画图操作。


    仍以上面的图形讲解
Plot对象的组成。
上图的中间区域是是一个XYPlot对象。其中的折线部分即是图形的绘制单元Renderer对象。X轴是DomainAxisy轴是RangeAxis,其中Datset对象属于数据模型范畴,是UI不可见对象。该图中的plot背景色、网格线的各种设置可以通过XYPlot对象本身完成。

    下面讲解Renderer对象、Axis对象(X轴、y轴都属于Axis对象),Datset对象在后续章节中专门讲解。

2.3.1 Renderer对象

Renderer对象是图形的绘制单元。JFreeChart提供了两个接口CategoryItemRendererXYItemRenderer、以及1个抽象类AbstractRenderer供具体的Renderer类实现,给出了将近50种具体实现类。

一般来说Renderer对象可进行的操作有:对itemlabel(下图中的柱状图上的红色数字即为itemlabel的示例)的默认设置(itemlabel的产生方式、是否可见、字体、Paint、正反向itemlabel的位置设置等)、绘制图形的边框默认设置(Paint、笔画、是否可见等)、绘制图形的默认设置(形状、笔画、是否可见、对应的图例中是否可见等,折线图还有线条是否可见、折点图形是否可见、折点图形是否填充、折点图形的形状、对应的图例中线条是否可见、图形是否可见、整体是否可见等)、以及对指定itemlabel的设置、指定绘制图形的设置。可以说和具体绘制的图形相关的属性都可以通过Renderer对象设置。

不同的Renderer的实现类实现了不同的显示方式,在含有Renderer对象的JFreeChart对象中,Renderer对象决定了JFreeChart对象的显示方式。例如:柱状图的Plot对象中默认的Renderer对象是CategoryItemRenderer对象,通过设置Plot对象的Renderer对象LineAndShapeRenderer,则柱状图变为线图。使用中一般不需要显式的实例化一个Renderer对象,一般通过JFreeChart对象的Plot对象调用现有的Renderer对象进行重新设置等操作。

2.3.2 Axis对象

JFreeChart提供了两种类型的坐标轴:CategoryAxis(等级轴)和ValueAxis(值轴),ValueAxis又有3个子类:DateAxis(时间轴)、NumberAxis(数字轴)、PeriodAxis(时期轴)。这些坐标轴还有更详细的子类,不再一一列举

Axis对象可进行的操作有:标题的设置(内容、字体、Paint、显示角度等)、坐标线的设置(笔画、Paint、是否可见等)、刻度线的设置(是否可见、笔画、Paint、位于绘图区域的长度、位于绘图区域外的长度等)、刻度标示的设置(笔画、Paint、字体、与轴的距离等)、坐标轴范围设置等。

CategoryAxis对象还可以进行的操作有:刻度标示间距设置(最小间距、最大间距、指定间距)等。

ValueAxis对象可进行的操作有:轴端设置(显示的图形形状)、范围设置(是否自动产生范围、自动产生的最小范围、最大范围、指定确定范围、指定范围大小等)、间隔设置(是否自动产生间隔、指定间隔)等。

DateAxis对象还有对时间刻度显示格式的设置操作。

2.4 子标题对象

    子标题对象是Title类型的对象,一个JFreeChart可以有多个子标题对象。JFreeChart提供了5种Title的实现,可以是图片、文本、图例等的形式。

2.5数据源处理

JFreeChart中的数据源是DataSet接口类型。该接口有三个主要的子类接口:CategoryDataset、PieDataset、SeriesDataset

CategoryDataset接口的实现类基本上都维护了一个三元组<value,row,col>的列表结构。不同的实现类中value的类型不相同。<row,col>唯一确定一个三元组。CategoryDataset的实现类提供对这个三元组的增删改查操作。

PieDataset接口有两个主要的实现类:CategoryToPieDataset、DefaultPieDataset。

SeriesDataset接口的实现类基本上都维护了一种特定数据结构的列表。以TimeSeriesCollection为例。它维护一个TimeSeries对象列表,提供对该列表的增删查操作。每个TimeSeries对象维护一个<time,value>列表,提供对该列表的增删改查操作。

posted @ 2010-07-20 20:29 donghang73 阅读(1509) | 评论 (0)编辑 收藏

public class SimpleDateFormat extends DateFormat
SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的具体类。 它允许格式化 (date -> text)、语法分析 (text -> date)和标准化。

SimpleDateFormat 允许以为日期-时间格式化选择任何用户指定的方式启动。 但是,希望用 DateFormat 中的 getTimeInstance、 getDateInstance 或 getDateTimeInstance 创建一个日期-时间格式化程序。 每个类方法返回一个以缺省格式化方式初始化的日期/时间格式化程序。 可以根据需要用 applyPattern 方法修改格式化方式。

SimpleDateFormat函数的继承关系:
java.lang.Object
   |
   +----java.text.Format
           |
           +----java.text.DateFormat
                   |
                   +----java.text.SimpleDateFormat
字母 日期或时间元素 表示 示例
G Era 标志符 Text AD
y Year 1996; 96
M 年中的月份 Month July; Jul; 07
w 年中的周数 Number 27
W 月份中的周数 Number 2
D 年中的天数 Number 189
d 月份中的天数 Number 10
F 月份中的星期 Number 2
E 星期中的天数 Text Tuesday; Tue
a Am/pm 标记 Text PM
H 一天中的小时数(0-23) Number 0
k 一天中的小时数(1-24) Number 24
K am/pm 中的小时数(0-11) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数 Number 978
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
Z 时区 RFC 822 time zone -0800

一个小例子,帮助更好的理解SimpleDataFormat

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TestSimpleDataFormat {
    
public static void main(String[] args) 
        SimpleDateFormat myFmt 
= new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒"); 
        SimpleDateFormat myFmt1 
= new SimpleDateFormat("yy/MM/dd HH:mm"); 
        SimpleDateFormat myFmt2 
= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//等价于now.toLocaleString() [depreciated]
        SimpleDateFormat myFmt3 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E "); 
        SimpleDateFormat myFmt4 
= new SimpleDateFormat("一年中的第 D 天|一年中第w个星期 |一月中第W个星期|在一天中k时 z时区");
        
        
//格式化示例
        Date now=new Date(); 
        System.out.println(myFmt.format(now)); 
        System.out.println(myFmt1.format(now)); 
        System.out.println(myFmt2.format(now)); 
        System.out.println(myFmt3.format(now)); 
        System.out.println(myFmt4.format(now)); 
        System.out.println(now.toString()); 
        
        
//解析示例
        SimpleDateFormat myFmt5 = new SimpleDateFormat("yyyy/MM/dd HH"); 
        String time 
= "2010/08/02 00";
        
try {
            Date datatime 
= myFmt5.parse(time);
            System.out.println(datatime);
        }
 catch (ParseException e) {
            e.printStackTrace();
        }

        
    }

}

posted @ 2010-07-13 21:39 donghang73 阅读(1234) | 评论 (0)编辑 收藏
网上很多人都说J2EE5兼容性不好,例如典型的javamail1.4中包与J2EE5中包接口包引起冲突,导致单元测试经常报如下错误:

    java.lang.NoClassDefFoundError: com/sun/mail/util/BEncoderStream

    当然这个错误是没有将javamail的实现者引进工程(没有导包),但导包后,就会出现另外一个错误:

    java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

    此时甚至web容器都无法启动,经常会有网友们为这两个异常搞得焦头烂额,如此更换J2EE1.4,会对工程造成影响。但是一定要把概念弄清楚,问题就好 解决。J2EE5中mail.jar包定义的只是接口,没有实现,是不能真正发送邮件的,但开发编译肯定是可以过去的,因为我们是针对J2EE规范编的程 序。而运行期用Sun公司的JavaMail1.4的实现才可以开始发送邮件,但老大为什么把这两个弄冲突了?

    笔者的解决办法是:

    开发期不要导包,运行期将javamail1.4压缩文件中的mail.jar包放入到tomcat"lib目录下,这样完全可以通过开发和运行。若要做 单元测试则新开一个Java Project,注意,不是web工程,此时可以将javamail1.4压缩包中的mail.jar放入到工程的classpath下。

posted @ 2010-06-03 13:36 donghang73 阅读(6831) | 评论 (0)编辑 收藏
JavaMail API详解(from http://www.blogjava.net/jxhkwhy/archive/2007/10/26/156118.html)
摘要:
JavaMail API是读取、撰写、发送电子信息的可选包。我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序(Mail User Agent,简称MUA)。让我们看看JavaMail API是如何提供信息访问功能的吧!JavaMail API被设计用于以不依赖协议的方式去发送和接收电子信息,文中着重:如何以不依赖于协议的方式发送接收电子信息,这也是本文所要描述的.

版权声明:本文可以自由转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig)
原文:http://www.matrix.org.cn/resource/article/44/44101_JavaMail.html
关键字:java,mail,pop,smtp

一、JavaMail API简介
JavaMail API是读取、撰写、发送电子信息的可选包。我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序(Mail User Agent,简称MUA)。而不是像sendmail或者其它的邮件传输代理(Mail Transfer Agent,简称MTA)程序那样可以传送、递送、转发邮件。从另外一个角度来看,我们这些电子邮件用户日常用MUA程序来读写邮件,而MUA依赖着 MTA处理邮件的递送。
在清楚了到MUA与MTA之间的关系后,让我们看看JavaMail API是如何提供信息访问功能的吧!JavaMail API被设计用于以不依赖协议的方式去发送和接收电子信息,这个API被分为两大部分:

基本功能:如何以不依赖于协议的方式发送接收电子信息,这也是本文所要描述的,不过在下文中,大家将看到这只是一厢情愿而已。
第二个部分则是依赖特定协议的,比如SMTP、POP、IMAP、NNTP协议。在这部分的JavaMail API是为了和服务器通讯,并不在本文的内容中。

二、相关协议一览
在我们步入JavaMail API之前,先看一下API所涉及的协议。以下便是大家日常所知、所乐于使用的4大信息传输协议:
SMTP
POP
IMAP
MIME
当然,上面的4个协议,并不是全部,还有NNTP和其它一些协议可用于传输信息,但是由于不常用到,所以本文便不提及了。理解这4个基本的协议有助于我们 更好的使用JavaMail API。然而JavaMail API是被设计为与协议无关的,目前我们并不能克服这些协议的束缚。确切的说,如果我们使用的功能并不被我们选择的协议支持,那么JavaMail API并不可能如魔术师一样神奇的赋予我们这种能力。

1.SMTP
简单邮件传输协议定义了递送邮件的机制。在下文中,我们将使用基于Java-Mail的程序与公司或者ISP的SMTP服务器进行通讯。这个 SMTP服务器将邮件转发到接收者的SMTP服务器,直至最后被接收者通过POP或者IMAP协议获取。这并不需要SMTP服务器使用支持授权的邮件转 发,但是却的确要注意SMTP服务器的正确设置(SMTP服务器的设置与JavaMail API无关)。

2.POP
POP是一种邮局协议,目前为第3个版本,即众所周知的POP3。POP定义了一种用户如何获得邮件的机制。它规定了每个用户使用一个单独的邮箱。大多数 人在使用POP时所熟悉的功能并非都被支持,例如查看邮箱中的新邮件数量。而这个功能是微软的Outlook内建的,那么就说明微软 Outlook之类的邮件客户端软件是通过查询最近收到的邮件来计算新邮件的数量来实现前面所说的功能。因此在我们使用JavaMail API时需要注意,当需要获得如前面所讲的新邮件数量之类的信息时,我们不得不自己进行计算。

3.IMAP
IMAP使用在接收信息的高级协议,目前版本为第4版,所以也被称为IMAP4。需要注意的是在使用IMAP时,邮件服务器必须支持该协议。从这个方面 讲,我们并不能完全使用IMAP来替代POP,不能期待IMAP在任何地方都被支持。假如邮件服务器支持IMAP,那么我们的邮件程序将能够具有以下被 IMAP所支持的特性:每个用户在服务器上可具有多个目录,这些目录能在多个用户之间共享。
其与POP相比高级之处显而易见,但是在尝试采取IMAP时,我们认识到它并不是十分完美的:由于IMAP需要从其它服务器上接收新信息,将这些信息递送 给用户,维护每个用户的多个目录,这都为邮件服务器带来了高负载。并且IMAP与POP的一个不同之处是POP用户在接收邮件时将从邮件服务器上下载邮 件,而IMAP允许用户直接访问邮件目录,所以在邮件服务器进行备份作业时,由于每个长期使用此邮件系统的用户所用的邮件目录会占有很大的空间,这将直接 导致邮件服务器上磁盘空间暴涨。

4.MIME
MIME并不是用于传送邮件的协议,它作为多用途邮件的扩展定义了邮件内容的格式:信息格式、附件格式等等。一些RFC标准都涉及了MIME: RFC 822, RFC 2045, RFC 2046, RFC 2047,有兴趣的Matrixer可以阅读一下。而作为JavaMail API的开发者,我们并不需关心这些格式定义,但是这些格式被用在了程序中。

5.NNTP和其它的第三方协议
正因为JavaMail API在设计时考虑到与第三方协议实现提供商之间的分离,故我们可以很容易的添加一些第三方协议。SUN维护着一个第三方协议实现提供商的列表:http://java.sun.com/products/javamail/Third_Party.html, 通过此列表我们可以找到所需要的而又不被SUN提供支持的第三方协议:比如NNTP这个新闻组协议和S/MIME这个安全的MIME协议。

三、安装
1.安装JavaMail
为了使用JavaMail API,需要从http://java.sun.com/products/javamail/downloads/index.html下 载文件名格式为javamail-[version].zip的文件(这个文件中包括了JavaMail实现),并将其中的mail.jar文件添加到 CLASSPATH中。这个实现提供了对SMTP、IMAP4、POP3的支持。
注意:在安装JavaMail实现之后,我们将在demo目录中发现许多有趣的简单实例程序。
在安装了JavaMail之后,我们还需要安装JavaBeans Activation Framework,因为这个框架是JavaMail API所需要的。如果我们使用J2EE的话,那么我们并无需单独下载JavaMail,因为它存在于J2EE.jar中,只需将J2EE.jar加入到 CLASSPATH即可。

2.安装JavaBeans Activation Framework
http://java.sun.com/products/javabeans/glasgow/jaf.html下 载JavaBeans Activation Framework,并将其添加到CLASSPATH中。此框架增加了对任何数据块的分类、以及对它们的处理的特性。这些特性是JavaMail API需要的。虽然听起来这些特性非常模糊,但是它对于我们的JavaMail API来说只是提供了基本的MIME类型支持。
到此为止,我们应当把mail.jar和activation.jar都添加到了CLASSPATH中。
当然如果从方便的角度讲,直接把这两个Jar文件复制到JRE目录的lib/ext目录中也可以。

四、初次认识JavaMail API
1.了解我们的JavaMail环境
A.纵览JavaMail核心类结构
打开JavaMail.jar文件,我们将发现在javax.mail的包下面存在着一些核心类:Session、Message、 Address、Authenticator、Transport、Store、Folder。而且在javax.mail.internet包中还有一 些常用的子类。
B.Session
Session类定义了基本的邮件会话。就像Http会话那样,我们进行收发邮件的工作都是基于这个会话的。Session对象利用了 java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息。
Session类的构造方法是私有的,所以我们可以使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的 Session对象:

Properties props = new Properties();
// fill props with any information
Session session = Session.getDefaultInstance(props, null);

或者使用getInstance()这个静态工厂方法获得自定义的Session:

Properties props = new Properties();
// fill props with any information
Session session = Session.getInstance(props, null);

从上面的两个例子中不难发现,getDefaultInstance()和getInstance()方法的第二个参数都是null,这是因为在上面的例 子中并没有使用到邮件授权,下文中将对授权进行详细介绍。
从很多的实例看,在对mail server进行访问的过程中使用共享的Session是足够的,即使是工作在多个用户邮箱的模式下也不例外。

C.Message
当我们建立了Session对象后,便可以被发送的构造信息体了。在这里SUN提供了Message类型来帮助开发者完成这项工作。由于 Message是一个抽象类,大多数情况下,我们使用javax.mail.internet.MimeMessage这个子类,该类是使用MIME类 型、MIME信息头的邮箱信息。信息头只能使用US-ASCII字符,而非ASCII字符将通过编码转换为ASCII的方式使用。
为了建立一个MimeMessage对象,我们必须将Session对象作为MimeMessage构造方法的参数传入:

MimeMessage message = new MimeMessage(session);

注意:对于MimeMessage类来讲存在着多种构造方法,比如使用输入流作为参数的构造方法。

在建立了MimeMessage对象后,我们需要设置它的各个part,对于MimeMessage类来说,这些part就是MimePart接口。最基 本的设置信息内容的方法就是通过表示信息内容和米么类型的参数调用setContent()方法:

message.setContent("Hello", "text/plain");

然而,如果我们所使用的MimeMessage中信息内容是文本的话,我们便可以直接使用setText()方法来方便的设置文本内容。

message.setText("Hello");

前面所讲的两种方法,对于文本信息,后者更为合适。而对于其它的一些信息类型,比如HTML信息,则要使用前者。
别忘记了,使用setSubject()方法对邮件设置邮件主题:

message.setSubject("First");


D.Address
到这里,我们已经建立了Session和Message,下面将介绍如何使用邮件地址类:Address。像Message一样,Address类也是一 个抽象类,所以我们将使用javax.mail.internet.InternetAddress这个子类。
通过传入代表邮件地址的字符串,我们可以建立一个邮件地址类:

Address address = new InternetAddress("president@whitehouse.gov");

如果要在邮件地址后面增加名字的话,可以通过传递两个参数:代表邮件地址和名字的字符串来建立一个具有邮件地址和名字的邮件地址类:

Address address = new InternetAddress("president@whitehouse.gov", "George Bush");

本文在这里所讲的邮件地址类是为了设置邮件信息的发信人和收信人而准备的,在建立了邮件地址类后,我们通过message的setFrom()和 setReplyTo()两种方法设置邮件的发信人:

message.setFrom(address);
message.setReplyTo(address);

若在邮件中存在多个发信人地址,我们可用addForm()方法增加发信人:

Address address[] = ...;
message.addFrom(address);

为了设置收信人,我们使用addRecipient()方法增加收信人,此方法需要使用Message.RecipientType的常量来区分收信人的 类型:

message.addRecipient(type, address)

下面是Message.RecipientType的三个常量:
Message.RecipientType.TO
Message.RecipientType.CC
Message.RecipientType.BCC
因此,如果我们要发送邮件给总统,并发用一个副本给第一夫人的话,下面的方法将被用到:

Address toAddress = new InternetAddress("vice.president@whitehouse.gov");
Address ccAddress = new InternetAddress("first.lady@whitehouse.gov");
message.addRecipient(Message.RecipientType.TO, toAddress);
message.addRecipient(Message.RecipientType.CC, ccAddress);

JavaMail API并没有提供检查邮件地址有效性的机制。当然我们可以自己完成这个功能:验证邮件地址的字符是否按照RFC822规定的格式书写或者通过DNS服务器 上的MX记录验证等。

E.Authenticator
像java.net类那样,JavaMail API通过使用授权者类(Authenticator)以用户名、密码的方式访问那些受到保护的资源,在这里“资源”就是指邮件服务器。在 javax.mail包中可以找到这个JavaMail的授权者类(Authenticator)。
在使用Authenticator这个抽象类时,我们必须采用继承该抽象类的方式,并且该继承类必须具有返回 PasswordAuthentication对象(用于存储认证时要用到的用户名、密码)getPasswordAuthentication()方 法。并且要在Session中进行注册,使Session能够了解在认证时该使用哪个类。
下面代码片断中的MyAuthenticator就是一个Authenticator的子类。

Properties props = new Properties();
// fill props with any information
Authenticator auth = new MyAuthenticator();
Session session = Session.getDefaultInstance(props, auth);


F.Transport
在发送信息时,Transport类将被用到。这个类实现了发送信息的协议(通称为SMTP),此类是一个抽象类,我们可以使用这个类的静态方法 send()来发送消息:

Transport.send(message);

当然,方法是多样的。我们也可由Session获得相应协议对应的Transport实例。并通过传递用户名、密码、邮件服务器主机名等参数建立与邮件服 务器的连接,并使用sendMessage()方法将信息发送,最后关闭连接:

message.saveChanges(); // implicit with send()
Transport transport = session.getTransport("smtp");
transport.connect(host, username, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();

评论:上面的方法是一个很好的方法,尤其是在我们在同一个邮件服务器上发送多个邮件时。因为这时我们将在连接邮件服务器后连续发送邮件,然后再关闭掉连 接。send()这个基本的方法是在每次调用时进行与邮件服务器的连接的,对于在同一个邮件服务器上发送多个邮件来讲可谓低效的方式。
注意:如果需要在发送邮件过程中监控mail命令的话,可以在发送前设置debug标志:

session.setDebug(true)。


G.Store和Folder
接收邮件和发送邮件很类似都要用到Session。但是在获得Session后,我们需要从Session中获取特定类型的Store,然后连接到 Store,这里的Store代表了存储邮件的邮件服务器。在连接Store的过程中,极有可能需要用到用户名、密码或者Authenticator。

// Store store = session.getStore("imap");
Store store = session.getStore("pop3");
store.connect(host, username, password);

在连接到Store后,一个Folder对象即目录对象将通过Store的getFolder()方法被返回,我们可从这个Folder中读取邮件信息:

Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[] = folder.getMessages();

上面的例子首先从Store中获得INBOX这个Folder(对于POP3协议只有一个名为INBOX的Folder有效),然后以只读 (Folder.READ_ONLY)的方式打开Folder,最后调用Folder的getMessages()方法得到目录中所有Message的数 组。

注意:对于POP3协议只有一个名为INBOX的Folder有效,而对于IMAP协议,我们可以访问多个Folder(想想前面讲的IMAP协议)。而 且SUN在设计Folder的getMessages()方法时采取了很智能的方式:首先接收新邮件列表,然后再需要的时候(比如读取邮件内容)才从邮件 服务器读取邮件内容。
在读取邮件时,我们可以用Message类的getContent()方法接收邮件或是writeTo()方法将邮件保存,getContent()方法 只接收邮件内容(不包含邮件头),而writeTo()方法将包括邮件头。

System.out.println(((MimeMessage)message).getContent());

在读取邮件内容后,别忘记了关闭Folder和Store。

folder.close(aBoolean);
store.close();

传递给Folder.close()方法的boolean 类型参数表示是否在删除操作邮件后更新Folder。

H.继续向前进!
在讲解了以上的七个Java Mail核心类定义和理解了简单的代码片断后,下文将详细讲解怎样使用这些类实现JavaMail API所要完成的高级功能。

五、使用JavaMail API
在明确了JavaMail API的核心部分如何工作后,本人将带领大家学习一些使用Java Mail API任务案例。
1.发送邮件
在获得了Session后,建立并填入邮件信息,然后发送它到邮件服务器。这便是使用Java Mail API发送邮件的过程,在发送邮件之前,我们需要设置SMTP服务器:通过设置Properties的mail.smtp.host属性。

String host = ...;
String from = ...;
String to = ...;

// Get system properties
Properties props = System.getProperties();

// Setup mail server
props.put("mail.smtp.host", host);

// Get session
Session session = Session.getDefaultInstance(props, null);

// Define message
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
message.setSubject("Hello JavaMail");
message.setText("Welcome to JavaMail");
// Send message
Transport.send(message);

由于建立邮件信息和发送邮件的过程中可能会抛出异常,所以我们需要将上面的代码放入到try-catch结构块中。

2.接收邮件
为了在读取邮件,我们获得了session,并且连接到了邮箱的相应store,打开相应的Folder,然后得到我们想要的邮件,当然别忘记了在结束时 关闭连接。

String host = ...;
String username = ...;
String password = ...;

// Create empty properties
Properties props = new Properties();

// Get session
Session session = Session.getDefaultInstance(props, null);

// Get the store
Store store = session.getStore("pop3");
store.connect(host, username, password);

// Get folder
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);

// Get directory
Message message[] = folder.getMessages();

for (int i=0, n=message.length; i<n; i++) {
System.out.println(i + ": " + message[i].getFrom()[0]
+ ""t" + message[i].getSubject());
}

// Close connection
folder.close(false);
store.close();

上面的代码所作的是从邮箱中读取每个邮件,并且显示邮件的发信人地址和主题。从技术角度讲,这里存在着一个异常的可能:当发信人地址为空 时,getFrom()[0]将抛出异常。

下面的代码片断有效的说明了如何读取邮件内容,在显示每个邮件发信人和主题后,将出现用户提示从而得到用户是否读取该邮件的确认,如果输入YES 的话,我们可用Message.writeTo(java.io.OutputStream os)方法将邮件内容输出到控制台上,关于Message.writeTo()的具体用法请看JavaMail API。

BufferedReader reader = new BufferedReader (
new InputStreamReader(System.in));

// Get directory
Message message[] = folder.getMessages();
for (int i=0, n=message.length; i<n; i++) {
System.out.println(i + ": " + message[i].getFrom()[0]
+ ""t" + message[i].getSubject());

System.out.println("Do you want to read message? " +
"[YES to read/QUIT to end]");
String line = reader.readLine();
if ("YES".equals(line)) {
message[i].writeTo(System.out);
} else if ("QUIT".equals(line)) {
break;
}
}


3.删除邮件和标志
设置与message相关的Flags是删除邮件的常用方法。这些Flags表示了一些系统定义和用户定义的不同状态。在Flags类的内部类Flag中 预定义了一些标志:
Flags.Flag.ANSWERED
Flags.Flag.DELETED
Flags.Flag.DRAFT
Flags.Flag.FLAGGED
Flags.Flag.RECENT
Flags.Flag.SEEN
Flags.Flag.USER
但需要在使用时注意的:标志存在并非意味着这个标志被所有的邮件服务器所支持。例如,对于删除邮件的操作,POP协议不支持上面的任何一个。所以要确定哪 些标志是被支持的——通过访问一个已经打开的Folder对象的getPermanetFlags()方法,它将返回当前被支持的Flags类对象。
删除邮件时,我们可以设置邮件的DELETED标志:

message.setFlag(Flags.Flag.DELETED, true);

但是首先要采用READ_WRITE的方式打开Folder:

folder.open(Folder.READ_WRITE);

在对邮件进行删除操作后关闭Folder时,需要传递一个true作为对删除邮件的擦除确认。

folder.close(true);

Folder类中另一种用于删除邮件的方法expunge()也同样可删除邮件,但是它并不为sun提供的POP3实现支持,而其它第三方提供的POP3 实现支持或者并不支持这种方法。
另外,介绍一种检查某个标志是否被设置的方法:Message.isSet(Flags.Flag flag)方法,其中参数为被检查的标志。

4.邮件认证
我们在前面已经学会了如何使用Authenticator类来代替直接使用用户名和密码这两字符串作为 Session.getDefaultInstance()或者Session.getInstance()方法的参数。在前面的小试牛刀后,现在我们将 了解到全面认识一下邮件认证。
我们在此取代了直接使用邮件服务器主机名、用户名、密码这三个字符串作为连接到POP3 Store的方式,使用存储了邮件服务器主机名信息的属性文件,并在获得Session时传入自定义的Authenticator实例:

// Setup properties
Properties props = System.getProperties();
props.put("mail.pop3.host", host);

// Setup authentication, get session
Authenticator auth = new PopupAuthenticator();
Session session = Session.getDefaultInstance(props, auth);

// Get the store
Store store = session.getStore("pop3");
store.connect();


PopupAuthenticator类继承了抽象类Authenticator,并且通过重载Authenticator类的 getPasswordAuthentication()方法返回PasswordAuthentication类对象。而 getPasswordAuthentication()方法的参数param是以逗号分割的用户名、密码组成的字符串。

import javax.mail.*;
import java.util.*;

public class PopupAuthenticator extends Authenticator {

public PasswordAuthentication getPasswordAuthentication(String param) {
String username, password;

StringTokenizer st = new StringTokenizer(param, ",");
username = st.nextToken();
password = st.nextToken();

return new PasswordAuthentication(username, password);
}

}


5.回复邮件
回复邮件的方法很简单:使用Message类的reply()方法,通过配置回复邮件的收件人地址和主题(如果没有提供主题的话,系统将默认将 “Re:”作为邮件的主体),这里不需要设置任何的邮件内容,只要复制发信人或者reply-to到新的收件人。而reply()方法中的boolean 参数表示是否将邮件回复给发送者(参数值为false),或是恢复给所有人(参数值为true)。
补充一下,reply-to地址需要在发信时使用setReplyTo()方法设置。

MimeMessage reply = (MimeMessage)message.reply(false);
reply.setFrom(new InternetAddress("president@whitehouse.gov"));
reply.setText("Thanks");
Transport.send(reply);


6.转发邮件
转发邮件的过程不如前面的回复邮件那样简单,它将建立一个转发邮件,这并非一个方法就能做到。
每个邮件是由多个部分组成,每个部分称为一个邮件体部分,是一个BodyPart类对象,对于MIME类型邮件来讲就是MimeBodyPart 类对象。这些邮件体包含在成为Multipart的容器中对于MIME类型邮件来讲就是MimeMultiPart类对象。在转发邮件时,我们建立一个文 字邮件体部分和一个被转发的文字邮件体部分,然后将这两个邮件体放到一个Multipart中。说明一下,复制一个邮件内容到另一个邮件的方法是仅复制它 的DataHandler(数据处理者)即可。这是由JavaBeans Activation Framework定义的一个类,它提供了对邮件内容的操作命令的访问、管理了邮件内容操作,是不同的数据源和数据格式之间的一致性接口。

// Create the message to forward
Message forward = new MimeMessage(session);

// Fill in header
forward.setSubject("Fwd: " + message.getSubject());
forward.setFrom(new InternetAddress(from));
forward.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));

// Create your new message part
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(
"Here you go with the original message:"n"n");

// Create a multi-part to combine the parts
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);

// Create and fill part for the forwarded content
messageBodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(message.getDataHandler());

// Add part to multi part
multipart.addBodyPart(messageBodyPart);

// Associate multi-part with message
forward.setContent(multipart);

// Send message
Tran
posted @ 2010-06-03 12:18 donghang73 阅读(298) | 评论 (0)编辑 收藏
1、将用户名(Grape)加入sudoers
$su
(input password,不带回显)
$echo 'Grape ALL=(ALL) ALL' >> /etc/sudoers

2、文本编辑(突然忘记了,写下来,以免再忘,呵呵)
gedit

3、Windows无法启动 / 调整Windows和Linux的启动顺序
位 置:/boot/grub/menu.lst
$sudo gedit /boot/grub/menu.lst
添加或者修改:
title Windows XP Professional
rootnoverify (hd0,0)
chainloader +1

4、安装yum
$sudo rpm -ivh http://rpv.livna.org/livna-release-9.rpm
(另 外:
$sudo yum update
可以执行系统的全面升级,不过网上有资料说不推荐使用...)

5、中文输入法
$sudo yum install scim-pinyin
(可以看到yum的作用了嘿)
这个安装完似乎 要重启下XWindow

6、重启XWindow
Ctrl+Alt+Backspace
简单!~

7、tar.bz2的安装(具体参数就省略了)
解压:
$tar -xjf FILENAME.tar.bz2
进入目录安 装:
#./configure
#make
#make install

8、进入root
$su root
(input password)^_^
#

9、MPlayer
更改配置文件:
$gedit ~/.mplayer/config
全屏:
写入:
zoom=yes
由 于我有两块声卡,这下吃了大苦头了,要么用MPlayer播放avi没声音,要么用RealPlayer播放rm/rmvb没声音....
要解决 问题(前提是在Linux下的硬件配置要一致,驱动正确),要么在BIOS里面屏蔽一块声卡,要么可以选择在MPlayer的配置文件里写入音频输出的设 备配置:
ao=oss:/dev/dsp2,oss:/dev/dsp1,(最后这个,不能少)
或者ao=alsa或者pcm之类 的...
嗯,我要好好夸奖这个播放器,界面简洁,画质也还不错吧,启动非常快,快得刚开始让我有点惊讶...

10、MP3的标签问题
很要命的问题,全 是乱码...
可以安装一个叫python-mutagen的小东东,它可以将MP3标签里面的ID3v1、ID3v2等 标签统统转换成APEv2填充,这样在Linux和Windows下面都可以显示正常了。
千千静听默认读取的就是APEv2格式的标 签,foobar也读取APEv2的标签,但是在Windows下面会出现一个新问题,所有的歌曲在以详细信息查看的时候就会显示乱码—— ???????,怎么办呢?干脆删掉ID3v1的标签吧。
$mid3iconv -e GBK --remove v1 *.MP3
这个小东东效果很好的! 赞!~

11、访问局域网共享
不知道为什么,我的Fedora 9用不成smbmount,但是可以找到smbclient,也可以了
列出共享:
#smbclient -L //192.168.1.200 -U 用户名
#smbclient //192.168.1.200 -U 用户名
这个执行完就可以进 入
smb: ">
呵呵,ls、cd等命令统统可以用,还可以用get和put下载和上传文件
当然,那样有些麻烦,当然可以 把共享目录像挂载硬盘一样挂载到/mnt下面的目录
Fedora 9下面得找到/sbin/mount.cifs
mount.cifs //192.168.1.200/Music /mnt/netshare -o user=用户名
呵呵,如果那个“Music”也就是挂载的目录名中间有空格怎么办?简单~~
mount.cifs //192.168.1.200/'Music Pop' /mnt/netshare -o user=用户名
搞定!~

12、挂载硬盘、移动硬盘等
哎,用得太多了,都忘不了了,也写写吧
比如要挂载原来的系统盘(假设为Windows下的C盘,位置 /dev/sda0),NTFS格式
$sudo mount -t ntfs /dev/sda0 /mnt/winsys
卸载:
$sudo umount /dev/sda0
或者:
$sudo umount /mnt/winsys
或者能卸载的全卸载:
$sudo umount -a
有时候移动硬盘在Windows下非正常拔出可能导致在Linux下无法挂载,使用上述命令也无法挂载,这种情况可以使用 force开关
$sudo mount -t ntfs /dev/sdc1 /mnt/usbhdd -o force
这样,它会重写 NTFS的日志文件,将磁盘挂载,Linux是很严谨的哦!~
先写这么多吧,以后碰到什么再写^_^
Linux很强大,慢慢学习 ing~~
喜欢Linux (*^__^*)


转自:http://www.linuxidc.com/Linux/2008-10/17050.htm

 

 


posted @ 2010-04-09 01:17 donghang73 阅读(171) | 评论 (0)编辑 收藏

1. 安装依赖包
su -'yum install compat-libstdc++-33 compat-libstdc++-296'

su -c '/sbin/ldconfig/'

2. Oracle的网站上下载linux版的JDK安装文件,jdk-6u19-linux-i586-rpm.bin(目前的最新版)
 
并将安装文件移动到/opt目录下

3.
切换到root用户,并进入/opt目录

su --login
输入密码
cd 
/opt


4.
直接运行安装文件即可完成安装

sh ./jdk-6u19-linux-i586-rpm.bin

一路按space,选择接受协议,然后就等待它完成吧。

5.
安装完成后就需要设定环境变量了

# nano /etc/profile.d/java.sh
在编辑器中输入如下内容:
export JAVA_HOME
=(具体的JDK的安装目录,例如/usr/java/jdk1.6.0_19/
export PATH
=$JAVA_HOME/bin:$PATH 
然后保存退出即可


6. 因为Fedora 9自带了OpenJDK,所以还需要将刚刚安装的JDK设为默认

/usr/sbin/alternatives --install /usr/bin/java java /(JDK的安装目录)/bin/java 3
/usr/sbin/alternatives --config java

然后会出现:

共有 3 个程序提供“java”。

  选择    命令
-----------------------------------------------
*  1           /usr/lib/jvm/jre-1.6.0-openjdk/bin/java
   
2           /usr/lib/jvm/jre-1.5.0-gcj/bin/java
 
+ 3           /usr/java/jdk1.6.0_19/bin/java

按 Enter 来保存当前选择[
+],或键入选择号码:

输入:3 回车后即ok!


7. 测试是否安装成功

java -version

如果显示

java version "1.6.0_19"
Java(TM) SE Runtime Environment (build 
1.6.0_19-b04)
Java HotSpot(TM) Client VM (build 
16.2-b04, mixed mode, sharing)

则表示已成功安装


posted @ 2010-04-09 00:12 donghang73 阅读(381) | 评论 (0)编辑 收藏