SendMail程序解析1

Tuesday, January 08, 2008:

为了界面跟处理逻辑的分离,用到的两个类,SendTools 和SendMail

1:SendTools 工具类的分析:在这个类中引入的包。



 Java.util.StringTokenizer:用来解析字符串 用在抄送附件这个方法中,用户可能输入多个抄送地址,我们要根据一定的符号来分解这一长串的字符串 让每一个抄送地址都分隔开。

Org.apache.commens.mail.HtmlEmail;是Apache下面的一个可以发送HTML格式的包,在进行非简单邮件发送的时候 用到这个包中的类。

Org.apache.commons.mail.SimpleEmail:如上,进行简单邮件发送的时候用到这个包中的类库。

为了方便 可以引入全类库 org.apache.commons.mail.*.

Javax.swing.ProgressMonitor:在设置进度条的时候,引入这个包。


2:工具类是一个不变类,不变类是没有状态的,而单实例是有状态的,而且是有很重要的状态,一般是一些需要共享的资源,比如系统的配置在。Java中,一个类有100个实例,会导致状态有100个拷贝,但方法在内存中只存储一次。一个不变类无论有多少个实例,它所含有的方法代码只会出现在内存中一次而已。  单例类非常容易被滥用,把不变类设计成单例类就是最常见的滥用。我这里就是一个滥用的例子,而且写的失败了,构造函数没有被初始化 导致在主类中调用工具类中的方法的时候 还要new 一个SendTools的对象,这里是非常非常失败的。




  private static SendTools st;//在方法的最后 把SendTools的一个实例对象声明为private static。(问题在与 ,做了这异步 那么 把此类写成一个单实例类 就完全没有必要了,代码不简洁!)


3:在本程序中,为了在测试的时候节省时间,也能保证用户在一定时间内不会重复输入不变参数,我们需要写一个配置文件,读取到需要保存的录入参数,那么 即可以想到,需要用到三个方法,一个是创建配置文件,然后是把参数保存到配置文件中,最后是把参数从配置文件中读取出来 显示在界面上,能够保证在下一次开启程序的时候 之前输入的参数还能保存。

怎么样在生成一个配置文件?在哪里生成?配置文件的创建或者删除跟界面操作无关,自然会联想到在工具类中写一个方法来创建 。。接下来就开始创建。



写这个方法的思路:一个方法的产生只需要方法的类型 方法名 参数。这里声明了方法

Public File Config(),接下来就开始创建一个File类型的对象,给File起名,接下来判断,如果我们需要创建的文件是不存在的 那么就执行file.createNewFile(),这里netbeans会报告会抛出异常,那么只需要try catch一把,if 语句之外就按照既定的流程返回一个文件的对象,这个对象就是我们所创建的配置文件。



接下来再思考,这个文件对象我们是用来保存输入信息的,那么我们必须要把这个信息保存在配置文件之中,怎么去保存?我们设置一个事件监听器,当这个时间监听器被触发的时候 我们所需要保存的信息都会保存下来,那么可以用一个button按钮来作为监听器,也就是说在点击按钮的时候,就会得到我们想要的结果。


需要保存的参数是这些:smtp服务器,发件人地址,用户名,密码。









这个方法的思路是:在点击“保存参数”时,需要取得需要保存的参数,那么我们的方法声明就应该是public void saveParameterButton(String host,String,senderAddress,String username,String password),要把参数写入文件 ,需要实例化一个文件流对象,既然是写进去,那么就是OutputStream, java.io.OutputStream ops=new java.util.Properties();Propertis类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串.( 接下来,把所需要保存的值put进去,但是API是不建议这样用的,因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用 put 和 putAll方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String的项。相反,应该使用 setProperty 方法。如果在“不安全”的 Properties对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。类似地,如果在“不安全”的 Properties对象(即包含非 String 的键)上调用 propertyNames 或 list 方法,则该调用将失败)


这个方法完成之后,当我们点击“保存参数”的时候 ,这些参数都会被保存下来,但是,我们在运行的时候 会发现,并没有得到我们想要的结果,在第二次启动程序的时候仍然得不到上一次输入的这些参数,这是怎么回事呢?想想就应该知道,我们只是把东东写进去了,并没有在界面上读取出来,那么 我们就来完成这个部分的第三个方法,读取配置文件了。



这个方法的思路:我们把需要保存的参数 用一个list来装载,把数据都包装的好好的,然后取出来就一个不漏的取。所以在这个方法中 我们也要实例化一个list对象,

java.util.List  readlist =new java.util.ArrayList();//因为List是一个抽象类 所以不能直接进行实例化,就实例化一个ArrayList().读取文件,那么就要创建一个输入流,把文件对象装进这个输入流,java.io.InputStream ips=new java.io.FileInPutStream(config()),记得要把这个输入流toString()一下,props.load(ips)  这个方法是从输入流中读取属性列表(键和元素对)。

Readlist.add(props.getProperty(“”));把取道的key加到readlist中,这样就over了


所有的方法都实现了 只需要在sendMail中来调用这些方法 就可以了


ButtonListener中调用按钮的事件监听方法,把配置文件以Text的形式读取出来







我们的邮件发送程序不仅仅是只能发送简单的文本邮件,还需要发送一些html的,.jar的 那么这些附件我们也要进行发送要怎么来实现呢?JavaMail中给我们提供了方法(这个程序中没有使用),我们使用的Apache下面的一个开源的项目,需要下载它下面的几个包

commons-email-1.0.zip,jaf-1_1-fr.zip。




程序思路:想到要用一个List来装入加入的附件类,把附件装入List的方法在sendTools类中已经实现 。这里 我们只需要用st去调用这个方法就可以

Java.util.List list=st.btnaddAccessoriesActionPerformed();//此时已经把加入的附件都装入了数组中,一个抽象的容器

Veoctor v=new Vector();//new 一个Vector对象,用来装入所有的文件,其作用类似于List 只不过 后者是异步的,至于为什么,线程中去找答案。


(到这里,既然附件已经都加入了数组,那么只需要遍历数组,就能够得到所有的附件,每一个附件都是一个文件,实际上,一次取出了

所有的文件,接下来用程序来实现遍历附件)


For(int i=0;i<list.size;i++)

{

String FileName=(String)List.get(i);//i是一个文件对象,需要强制转换成一个String才能够输出

v.add(FileName);

}

(到这里,我们已经加入了一个附件或者是说一系列附件,还要考虑到一个问题,新加的附件不能覆盖掉先前已经加入了的附件,那么,这个时候 还需要写一段代码 来实现从先前加入的附件后面再来添加新的附件,不至于覆盖掉前者,这是用到一个非常有用的ListModel)

ListModel API说明:此接口定义方法组件(如 JList),这些组件用于获取列表中每个单元格的值以及列表的长度。在逻辑上,模型是一个向量,索引范围从 0 到 ListDataModel.getSize() - 1。对数据模型的内容和长度的任何更改必须报告给所有 ListDataListener。

ListModel lm=accessorieslist.getModel(); //获取到列表中的值和长度了

For(int i=0;i<lm.getSize();i++)

{

  v.add(lm.getElementAt(i));//得到附件的值和长度,加入到一个向量中去,脑袋抽象点。

}

Accessorieslist.setListData(v); //ListData的作用,每次在数据模型发生更改时都得到通知的列表,这里,列表为Accessorieslist。



程序中还有一个功能是能够抄送邮件,在界面的设计时,我把加入抄送文件的空间设置成了一个textfeild,但是,在抄送邮件的时候 我们必须以一个完整合格的邮件地址为单位来进行抄送,所以,在加入多个抄送地址的时候 我们必须要用一个方法来解析这个长的字符串



程序思路:参数String copy,String flagStr,是表示需要解析的字符串和解析的符号,我们可以实例化一个list对象,用来装载解析过了的字符串,解析过了的字符串是没一个完整的抄送地址。这个解析长字符需要用到java.util.StringTokenizer ,java.util,StringTokenizer(copy,“,”),意思是用“,”来分解字符串copy,while中把分解之后的单个抄送地址字符串添加到mackcopylist中,最后返回一个mackcopylist对象。


你可能感兴趣的:(apache,应用服务器,swing,单元测试,Netbeans)