版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
6
企业快信(Swing+JavaDB实现随着互联网的迅速发展,和E-mail已经成为人与人之间沟通的桥梁,越来越多的人开始选择通过网络进行即时沟通。为此,越来越多的开始提供发绍的企业快信就是为企业提供的和E-mail的解决方案。通过学习本章,掌握使用猫收发的方在多数企业的办公自动化系统(即A)的信息传递仅限于计算机内部网络,如果用户不,将无法知道是否有新的工作或紧急通知,为了确认是否有待办工作,不得不经常去A,检索是否有新任务,而事实上这种检索的结果经常是徒劳。这样一来,不仅造成了机器资源的浪费,也造成了人 可行性研采用作为企业的移动通信,将给企业对内、对行信息传递与沟通带来性的变化,开发一个企业快信系统,涉及到的技术问题不会太多,主要用到的技术就是使用猫和JavaMail组件来实现收发和邮件等功能。由于采用开发的猫,并且该公司也提供了相应的应用程序开发包,所以为程序的开发提供了便利的条件。同时,JavaMail组件是Sun公司发布的一种用于、编写和发送电子邮件的包,利用它可以方便地实现邮件。 系统功能统设置6个部分,其中各个部分及其包括的具体功能模块如图6.1所示。收收 6.1系统功业务流程E-名设 接发发信如果是发送E-mail,还可以通过单击“添加附件”按加附件。图6.3(光盘图6.4E-mail(光盘图6.5添加名片(光盘 图6.6添加信息(光盘单击“设置”按钮,将打开如图6.7所示的“猫设置”框,该框用来设置发单击“E-mail设置”按钮,将打开如图6.8所示的“邮箱设置”框,该框用来设置图6.7猫设置(光盘\…\explorer\LetterSetDialog.java)图6.8邮箱设置(光盘说明:由于路径太长,因此省略了部分路径,省略的路径是“TM\06\ExpressLetter\src\com\mwq\构建开发 JavaMail开发包:JavaMail1.4 浏览器:IE6.0 由于本系统中需要使用猫及JavaMail组件,下面将详细介绍如何配置猫及JavaMail的信动态库BestMail.dll到JDK安装路径下的jre\bin文件夹下(例如C:\jdk1.6.0_03\jre\bin),最后将封装的Java类库BestMail.jar添加到工程的构建路径中。由于目前JavaMail还没有被加在标准的Java开发工具中,所以在使用前必须另外JavaMailAPI,以及Sun公司的JAF(JavaBeansActivationFramework),JavaMailJAF的 并构建JavaMailJavaMailAPI是发送和接收E-mail的API,可以到h javamail/downloads/index.html,目前版本的文件名为javamail-1_4.zip。后解压缩到硬盘上,并在系统的环境变量CLASSPATH中指定activation.jar文件的放置路径。例如,将mail.jar文件复制到“C:\JavaMail”文件夹中,可以在环境变量CLASSPATH中添加以下代码: JAF可以到 本的JAF文件名为jaf-1_1-fr.zip,后解压缩到硬盘上,并在系统的环境变量CLASSPATH中指定CLASSPATH中添加以下代码: 文件夹组织结6.9企业快信文件夹组织结数据库分由于本系统是一个小型实用的系统,提供了名片夹和信息库的功能,用户可以将常用的系统将采用JavaDB数据库作为底层数据库,以方便用户使用本系统。数据库概念设实体、常用短语实体、管理员实体。下面将给出几个关键实体的E-R图。 、、动R图如图6.10所示。、、动编编职 移E-
图6.10实体E-R编编类内常用短
类型实体包括编号、名称和使用者(即用于实体还是用于常用短语实体),类型实体的E-6.12类型E-R数据库逻辑结构设表 表6.1表tb_nel的表结 允许 1否是2否是3否4否5否6否7否8否9否否6.2表tb_info的表结 允许 1否是2否是3否6.3表tb_type 允许 1否是2否3否就要先查询该类型的主键,然后再根据主键查询或信息,而通过视图则可以直接根据类型查询档为表 表6.4视图 1 23 4 5 6 7 8 9 6.5v_info_type 所属表123为了增强企业快信系统的可操作性,系统将主窗体划分为了3个部分,即、区和资源管理区,如图6.13所示。6.13企业快信主窗体界中“设置”和“E-mail设置”按钮用来设置和E-mail必须设置的接口信息。实现工具例程01代码位置:光盘\mr\06\ExpressLetter\src\com\mwq\framefinalfinalJToolBartoolBar=newfinalJButtonuserButton=newJButton();userButton.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvent{UserManagerDialogdialog=newUserManagerDialog();}userButton.setMargin(newInsets(0,0,0,userButton.setIcon(newImageIcon(userUrl));URLuserOverUrl=//器 floatable):该方法用来设置是否可以移动,默认为true,即可以移动。 defaultIcon):该方法用来设置按钮在通常情况下显示的。 区的主要功能是发送信息,包括和E-mail。区的左侧为“收信人列E-mail,则既在资源管理区又分为名片夹和信息库,它们的左侧均为分类信息,通过其下方的按钮可以分为了适当减小主窗体类TipWizardFrame的大小,本系统的主窗体由3个类完成,主窗体类TipWizardFrame负责绘制和收信人列表,信息内容由InfoPanel类负责绘制,资源管理区由ExplorerPanel类负责绘制。为了增加区和资源管理区的操作空间,将这两个工作区放在了一个JSplitPane面板中,这样就可以通过单击图6.14中的和,调整当前使用工作区的大小。6.14由JSplitPane实现的垂直分割面例程02代码位置:光盘\mr\06\ExpressLetter\src\com\mwq\framefinalJSplitPaneworkaroundSplitPane=new
代码贴方法拥有一个重setDividerLocationdoubleproportionalLocation),用来以百分比的形式设置分割条的显示位置,proportionalLocation为0~1.0的双精度浮点值。,height)的第一个参数为宽度,第二个参数为高度。setOrientation(intorientation):该方法用于设置分割面板的分割方向,默认为在水平方向分割,即6.15由JSplitPane实现的水平分割面例程03代码位置:光盘\mr\06\ExpressLetter\src\com\mwq\framefinalfinalJSplitPanesendSplitPane=newJSplitPane(); 编写数据库连接且定义一个ThreadLocal类的对象,用来保存已经创建的数据库连接。具体代码如下:例程04代码位置:光盘\mr\06\ExpressLetter\src\com\mwq\dao\privatestaticfinalStringDRIVERCLASS="privatestaticfinalStringDRIVERCLASS="org.apache.derby.jdbc.EmbeddedDriver";//数据库驱动privatestaticfinalStringURL="jdbc:derby:db_ExpressLetter"; =privatestaticConnectionconn 例程05代码位置:光盘\mr\06\ExpressLetter\src\com\mwq\dao\staticstatic try FiledbExpressLetterFile=newFile("db_ExpressLetter"); if(!dbExpressLetterFile.exists()){ String[]sqls=newString[6]; //定义创建数据库的SQL语句conn=DriverManager.getConnection(URL+";create=true");for(inti=0;i<sqls.length;i++){}//SQL语句创建数据//SQL语}}catch(Exception{}publicpublicstaticConnection{conn=(Connection)threadLocal.get();if(conn==null){tryconn }catch(Exceptione)String[]infos={"未能成功连接数据库!","请确认本软件是否已经运行!"};JOptionPane.showMessageDialog(null,infos);//弹出连接数据库失败的提示 }}return}{booleanisClosed=conn=(Connection)threadLocal.get();if(conn!={try{isClosed=false;}}return}封装常用的操作数据库的方例程07代码位置:光盘\mr\06\ExpressLetter\src\com\mwq\dao\protectedVectorselectSomeNote(Stringsql)Vector<Vector<Object>>vector=newVector<Vector<Object>>();Connectionconn=JDBC.getConnection();try
ResultSetrs=stmt.executeQuery(sql);intcolumnCount=rs.getMetaData().getColumnCount();introw=1;while(rs.next())Vector<Object>rowV=newVector<Object>();rowV.add(newInteger(row++));for(intcolumn=1;column<=columnCount;column++)}}{}return}
//SQL语句获得查询结例程08代码位置:光盘\mr\06\ExpressLetter\src\com\mwq\dao\{booleanisLongHaul=try{
}catch(SQLExceptione){isLongHaul=false;try{
//SQL语{
}}returnreturn}资源管理模块分为名片夹管理和信息库管理两个功能,这两个功能的开发思路方法基本相名片夹管理功能概界面效果如图6.16所示。信人列表中,界面效果如图6.17所示。图6.16名片夹管 图6.17名片管名片夹,在这种情况下单击图6.17中的“添加”按钮,弹出框的“类别”选项则默认为选中“员工”选项,如图6.18所示。6.176.19所示的提示先图6.18添加名 图6.19提示先建立名片名片夹管理功能技术分一个单独的方法完成验证,该方法的第一个参数为添加或修改节点的父节点,第二个参数为新添加节点或修改后节点的名称,如果新的节点名称不存在,则返回false,否则返回true,并且弹出例程09代码位置:光盘privatebooleanisHad(DefaultMutableTreeNodetreeNode,StringnewChildName){ privatebooleanisHad(DefaultMutableTreeNodetreeNode,StringnewChildName){ booleanhad=false; intchildCount for(inti=0;i<childCount;i++){ DefaultMutableTreeNodechildTreeNode=(DefaultMutableTreeNode)treeNode if(childTreeNode.getUserObject().toString().equals(newChildName)){ JOptionPane.showMessageDialog(null,"该名称已经存在!","友情提示", had=true; }}return }从名片夹管理功能实现过 例程10代码位置:光盘finalJScrollPanecardTreeScrollPane=newJScrollPane();initTree(cardTreeRoot,"card");cardTree=newJTree(cardTreeModel);if(cardTreeRoot.getChildCount()>
ardTree.addTreeSelectionListener(newTreeSelectionListener(){//为名片夹树添加节点选中事件 publicvoidvalueChanged(TreeSelectionEvente) } setSelectionMode(intmode):该方法用来设置树的选择模式。静态常量SINGLE_TREE_SELECTION(常量值为1)表示只允许选中一个节点;静态常量CONTIGUOUS_TREE_SELECTION(常量值为2)表示允许选中多个节点,并且这些节点不必是相临的;默认的选择模式为DISCONTIGUOUS_TREE_SELECTION。setSelectionRow(introwIndex)0行。例如,A为树的根节点,a1和a2为A的子节点,s为a1a1节点处于合并状态,则a22a1节点处于展开状态,则a2为第3行。在上面的代码中用到了两个可重用的方法,一个是用来初始化树的initTree(DefaultMutableTreeNodetreeRoot,Stringused)方法,第一个参数为欲初始化树的根节点对象,第二个参数为树的例程11代码位置:光盘{VectortypeV=dao.sTypeByUsed(used);for(inti=0;i<typeV.size();i++){Vectortype=(Vector)treeRoot.add(new
}}例程12代码位置:光盘privateprivatevoid{; ifcardTreeNodenull StringcardName=cardTreeNode.getUserObject().toString(); } 例程13代码位置:光盘{publicvoidactionPerformed(ActionEvente)StringnameaddTreeNode(cardTreeRoot名片夹");if(name!=null){intchildCount=name),cardTreeRoot,childCount); ," }}addTeNd(fauuabTNodereod,Srngypa)方法用来弹出输入框令用户输入名名并用a(方判断入名否已存,方的第个数欲加节点的父节点,第二个参数为新添加节点的类型,即为“名片夹”还是“信息库”。具体代码如下:例程14代码位置:光盘privateStringaddTreeNode(DefaultMutableTreeNodetreeNode,String{StringnodeName while(nodeName.length()==0){ nodeName=JOptionPane.showInputDialog(null,"请输入"+typeName+"",""+,if(nodeName=={}elseif(nodeName.length()>0){if(isHad(treeNode,
nodeNamenodeName=}}}return }并弹出确认修改的提示框,如果确认修改则调用updateTreeNode()方法获得修改后的名片夹名称,如例程15代码位置:光盘{publicvoidactionPerformed(ActionEvente)if(selectionPath==null){ ,""," }else StringnowName= inti=JOptionPane.showConfirmDialog(null,"确定要修改名片夹""+nowName+""的名称?","友情提示",JOptionPane.YES_NO_OPTION); ifi0) StringnewName if(newName!=null){ dao.uTypeNameByName("card",nowName,newName); }}}}updateTreeNode(DefaultMutableTreeNodetreeNode)方法用来弹出输入框令用户输入修改后的名片例程16代码位置:光盘privateprivateStringupdateTreeNode(DefaultMutableTreeNode StringnewNodeName=""; while(newNodeName.length()==0){ =,""," if(newNodeName=={}elseif(newNodeName.length()>0){newNodeName="";}}}return }下面实现删除名片夹功能。首先判断是否存在被选中的名片夹,如果存在则弹出提示框确认是否真的要删除。在确认删除的情况下,进一步判断该名片夹是否包含名片,如果包含名片,则弹出如图620示提示,用选择包名处理式如单击取”钮,取删含移其夹时出图621所示的示,用选图6.20询问对包含名片的处理方 图6.21询问要移入的名片例程17代码位置:光盘{publicvoidactionPerformed(ActionEvente) if(treeNode==null) }Stringname intiJOptionPane.showConfirmDialog(null确定要删除名片夹?友情提示if(i!=ififnelVByTypeName(name).size()>0)=,""友情提示JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,null,options, if(optionIndex==0) inttypeIddao.sTypeIdByUsedAndName("card ifoptionIndex1 >=",StringcardsnewString[cardV.size1];cards[0]="请选择";for(intj=0;j<cardV.size();j++)cards[j+1]=}Objectcard请选择=,"","cards,cards[0]);if(card==null)}intnewTypeId=dao.sTypeIdByUsedAndName("card", nelTypeIdByTypeId(typeId,newTypeId); }if(optionIndex==2){}} dao.dTypeByName("card",name); }showMessageDialog():该静态方法用来弹出提示某些消息的框,消息的类型可以为错(ERROR_MESSAGE)(INFORMATION_MESSAGE)(WARNING_MESSAGE)类的selectAll()方法。提供该按钮的主要目的是为用户提供方便。具体代码如下:例程18代码位置:光盘{publicvoidactionPerformed(ActionEvente){ }例程19代码位置:光盘{publicvoidactionPerformed(ActionEvente)introwCount=sendListTableModel.getRowCount(); int[]selectedRows=cardListTable.getSelectedRows(); intindexrowCount1;//初始化收信人列表的序for(intselectedRow=0;selectedRow<selectedRows.length;selectedRow++){ intnewNum=(Integer)cardListTable.getValueAt(selectedRows[selectedRow],1);//获得名片编号booleanhad=false; forintrow0;rowrowCount;row intnowNum=(Integer)sendListTableModel.getValueAt(row,1); if(newNum==nowNum){ had }}if(!had)VectorrowV=newrowV.add(cardListTable.getValueAt(selectedRows[selectedRow2));//添 }} }例程20代码位置:光盘{publicvoidactionPerformed(ActionEvente)if(cardTreeRoot.getChildCount()==0),""," }else StringcardName= nelDialognew "添加名片",cardName,-1);}}例程21代码位置:光盘{publicvoidactionPerformed(ActionEvente)int[]selectedRows=cardListTable.getSelectedRows(); if(selectedRows.length==1){ intnum=(Integer)cardListTable.getValueAt(selectedRows[0],1); nelDialog=new"修改名片}elseif(selectedRows.length==0) "友情提示", else "友情提示", }}}图6.22删除名片提示例程22代码位置:光盘{publicvoidactionPerformed(ActionEvente)int[]selectedRows=cardListTable.getSelectedRows(); if(selectedRows.length==0){ }elseString[]infos=newString[selectedRows.length+1];//组织提示信息infos[0]="确定要删除以下人员:"; for(inti=0;i<selectedRows.length;i++){ infos[i1]=""+cardListTable.getValueAt(selectedRows[i1)//获得名片编cardListTable.getValueAt(selectedRows[i], }intiJOptionPane.showConfirmDialog(nullinfos友情提示 if(i==0){ forintj0jselectedRows.length;j intnum=(Integer)cardListTable.getValueAt(selectedRows[j],1);//获得名片编号 } }}}6.8模块设6.8.1模块功能概模块是企业快信系统的模块之一,操作员可以通过该模块对企业内部的所有或者部的运行效果如图6.23所示。图6.23企业快信的发送界6.8.2模块技术分模块必须创建smssend类的实例对象,该类包含在猫设备光盘中提供的JAR包中。在使用猫设备之前,必须调用smssend类的GSMModemInitNew()方法初始化设备,然后调用GSMModemSMSsend()方法实现的发送。 GSMModemInitNew(Stringdevice,Stringbaudrate,Stringinitstring,Stringcharset,booleanswHandshake,String 6.6GSMModemInitNew()方法的参数说参数 GSMModemSMSsend(StringserviceCenterAddress,intencodeval,byte[]text,Stringphonenumber,boolean 6.7GSMModemSMSsend()方法的参数说参数 6.8.3模块实现过(1)创建InfoPanel类,该类是模块和发送邮件模块的面板类,这里主要以介绍发送短例程23代码位置:光盘{this.sendListTable=sendListTable;setBorder(newTitledBorder("信息内容"));setLayout(newBorderLayout());tabbedPane=newJTabbedPane();add(tabbedPane,BorderLayout.CENTER);finalJPanelinfoPanel=newJPanel(); 内容nullinfoPanel finalJScrollPaneinfoScrollPane=newJScrollPane();infoTextArea=newJTextArea();finalJPanelinfoButtonPanel=new,finalJButtoninfoSendButton=newinfoSendButton.addActionListener(newInfoSendButtonActionListener( ▪▪infoSendButton.setMargin(newInsets(0,0,0,infoSendButton.setIcon(newImageIcon(sendUrl));URLsendOverUrl=finalJButtoninfoCancelButton=new▪ infoCancelButton.setMargin(newInsets(0,0,0,infoCancelButton.setIcon(newImageIcon(cancelUrl));URLcancelOverUrl=}(2)编写“清空”按钮的事件器InfoCancelButtonActionListener类,该类实现了ActionListener接口和接口中的actionPerformed()方法,拥有处理按钮事件的能力,在重写的例程24代码位置:光盘{publicvoidactionPerformed(ActionEvente){
}}(3)编写“发送”按钮的事件器InfoSendButtonActionListener类,该类也实现了按钮时,该类的actionPerformed()方法首先遍历sendListTable发送列表中的所有用户,并调用Dao数据库操作类的snelByNum()方法获取用户信息,然后将用户信息封装到SendLetterForm类中,例程25代码位置:光盘 privateclassInfoSendButtonActionListenerimplementsActionListener publicpublicvoidactionPerformed(ActionEvente)for(inti=0;i<sendCount;i++){Integerid=(Integer)sendListTable.getValueAt(i,1); =dao.s Stringphone //IDStringinfo=infoTextArea.getText();SendLetterFormform=newSendLetterForm();SendLetterDAOsendDao=newSendLetterDAO();Stringmessage=sendDao.sendLetter(form);}}}定义content和toMan属性,并提供这两个属性的方法。关键代码如下:例程26代码位置:光盘publicpublicSendLetterForm{privateStringcontent;privateStringtoMan;publicStringgetContent(){return}{this.content=}publicString{return}{this.toMan=} 的号的号的号例程27代码位置:光盘publicpublicclassSendLetterDAOprivatesmssendsmssender=privatefinalPreferences privateStringdevice privateStringbaud=}
编写SendLetterDAO类的getConnectionModem()方法,该方法用于初始化猫设备,它在例程28代码位置:光盘publicbooleangetConnectionModem(Stringdevice,Stringbaud,String{smssender=newsmssend();booleanconnection=true;if(!smssender.GSMModemInitNew(device,baud,null,"GSM",false,sn))
+connection }return }是SendLetterForm类的实例,并从该实例中获取发送信息和目标号码,然后调用mySend()方例程29代码位置:光盘{Stringret="";Stringinfo="";Stringsendnum="";Stringflag="";tryinfo=form.getContent();flag=mySend(device,baud,sn,info,sendnum);if(flag.equals("ok")){}elseret=}}catch(Exceptione)//mySend方产生的错误:ret }return}编写SendLetterDAO类的mySend()方法,它也实现到目标中,但是该方法是被sendLetter()方法调用的私有方法,方法的主体首先调用getConnectionModem()方法初始化猫设例程30代码位置:光盘▪▪privateStringmySend(Stringdevice,Stringbaud,Stringsn,Stringinfo,Stringsendnum){booleanflag=false;Stringrtn="";flag=this.getConnectionModem(device,baud,sn);if(flag){String[]arrSendnum=sendnum.split(",");for(inti=0;i<arrSendnum.length;i++)if(!smssender.GSMModemSMSsend(null,8,sendtest,arrSendnum[i],false)){//转化为▪ +smssender.GSMModemGetErrorMsg()); rtn=rtn+"向"+arrSendnum[i]+" }}}elsertn初始化GSMModem设备失败}if{rtn=} return}()编写SendLetterDAO类的closeConnection()方法,该方法用于关闭设备的连接。当例程31代码位置:光盘publicvoid{if(smssender!=null){
}}发送邮件模块功能概发送邮件模块也是企业快信系统的模块之一,操作员可以通过该模块对企业内部的所有或者部分员工,以E-mail电子邮件的资条外,由于E-mail有信息容量大、包含附件的两大优点,使它支持的信息内容,可以携带更丰富的资料,比较适合发送技术信息、会议主题、工作内容等信息,并且这个信息是群体发送的。该模块的运行效果如图6.24所示。6.24企业快信的邮件发送界发送邮件模块技术分发送邮件模块和模块的界面部分都定义在InfoPanel类中。这两个模块都需要发送信MTableTipWizardFrame类中,该类负责定义程序的主界面,为获得MTable类的实例sendListTable对象,必须为InfoPanel类的构造方法提供该对 publicInfoPanel(MTable 发送邮件模块实现过(1)在InfoPanel类的构造方法中初始化邮件界面中的控件,这些控件包括邮件标题文本框、例程32代码位置:光盘publicInfoPanel(MTablesendListTable)finalJPanel Panel=newJPanel(); Panel.setLayout(newBorderLayout()); tabbedPane.addTab("E-mail内容",null, Panel,null);finalJPanel InfoPanel=newJPanel(); finalJScrollPane ScrollPane=newJScrollPane(); TextAreanew panel.setLayout(newBorderLayout());panel.add(newJLabel("邮件标题:"),BorderLayout.WEST); finalJPanelannexPanel=newJPanel(); annexPanel.setLayout(newFlowLayout());annexLabel=newJLabel("附件:"); finalJPanel ButtonPanel=newJPanel(); ButtonPanel.setLayout(newBoxLayout( ButtonPanel,BoxLayout.Y_AXIS)); ButtonPanel,BorderLayout.EAST);finalJButton SendButton=newJButton(); SendButton.setMargin(newInsets(0,0,0, SendUrl=this.getClass().getResource("/img/send.png"); SendButton.setIcon(newImageIcon( SendOverUrl= SendButton.setRolloverIcon(newImageIcon( finalJButton CancelButton=newJButton(); CancelButton.setMargin(newInsets(0,0,0,0)); CancelUrl=this.getClass().getResource("/img/cancel.png"); =CancelButton.setRolloverIcon(newImageIcon( finalJButtonaddAnnexButton=newJButton();addAnnexButton.setMargin(newInsets(0,0,0,0));URLaddAnnexUrl=器URLaddAnnexOverUrl=this.getClass().getResource("/img/add_annex_over.png");addAnnexButton.setRolloverIcon(newImageIcon(addAnnexOverUrl)); finalJButtoncancelAnnexButton=new cancelAnnexButton.setMargin(newInsets(0, =CancelButton.setRolloverIcon(newImageIcon( finalJButtonaddAnnexButton=newJButton();addAnnexButton.setMargin(newInsets(0,0,0,0));URLaddAnnexUrl=器URLaddAnnexOverUrl=this.getClass().getResource("/img/add_annex_over.png");addAnnexButton.setRolloverIcon(newImageIcon(addAnnexOverUrl)); finalJButtoncancelAnnexButton=new cancelAnnexButton.setMargin(newInsets(0,0,0,cancelAnnexButton.setIcon(newImageIcon(delAnnexUrl));cancelAnnexButton.setRolloverIcon(newImageIcon(delAnnexOverUrl));}例程33代码位置:光盘privateprivate{publicvoidactionPerformed(ActionEvente)Stringtitle if(title.isEmpty()||content.isEmpty()){ JOptionPane.showMessageDialog(InfoPanel.this,"请填写邮件标题和内容");}for(inti=0;i<sendCount;i++){Integerid=(Integer)sendListTable.getValueAt(i,=dao.s Stringaddressee //获取用户//从数据库ID用//获取用户E-mail地//初始化mailForm实if(mailForm.getAddressee()==++}intres=mailDao.sendMail(mailForm);Stringmessage=null;if(res==+="message+="E-mail发送失败";mailForm=new//mailForm}}(3)创建“添加附件”按钮的事件器AddAnnexButtonActionListener类,该类实现了ActionListener接口和接口中的actionPerformed方法。当用户单击“添加附件”按钮时,将调用择了作为附件的文件,就把该文件的路径添加到mailForm对象中,该对象将被传送到邮件发送方法例程34代码位置:光盘{publicvoidactionPerformed(ActionEvente){JFileChooserfc=newJFileChooser();FilesFile=fc.getSelectedFile();}} 框创建“删除附件”按钮的事件监听器CancelAnnexButtonActionListener类,该类实现了ActionListener接口和接口中的actionPerformed()方法。当用户单击“删除附件”按钮时,将调用actionPerformed()方法去处理删除附件的业务逻辑,附件由“添加附件”按钮添加文件路径到mailForm对象中,actionPerformed()mailForm对象中删除,例程35代码位置:光盘publicvoidactionPerformed(ActionEvente)}}例程36代码位置:光盘publicpublicclass{privateStringcontent;privateStringtitle;privateStringaddressee;privateStringadjunct;publicStringgetContent(){return}{this.content=}publicString{return}{this.title=}publicString{return}{this.addressee=}publicString{return}{this.adjunct=}}例程37代码位置:光盘publicclassSendMailDAOpublicintsendMail(SendMailFormform){intret=Stringto=form.getAddressee();
Stringsubject Stringcontent Stringpassword try{
Stringmailserver=perf.get("SMTPserver","LZW");Propertiesprop=newProperties();prop.put("mail.smtp.host",mailserver);prop.put("mail.smtp.auth","true");Sessionsess=MimeMessagemessage=new
Stringfor(inti=0;i<toArr.length;i++){to_mail[i]=new
} Multipartmul=newMimeMultipart(); BodyPartmdp=newMimeBodyPart(); mdp.setContent(content,"text/html;charset=gb2312"); 到ifpathnull&&path.isEmpty mdp=newMimeBodyPart(); //新建存放附件的BodyPartStringadjunctnamenewString(path.getBytes("GBKISO-8859-1将路径转码FileDataSourcefds=newFileDataSource(path);DataHandlerhandler=newDataHandler(fds);}transport.connect(mailserver,from,password);
//mul作为消息对象内//smtp方式登录邮ret=}catch(Exceptione)ret=0;}return}}通常是系统设置模块功能本系统的发送模块需要使用猫设备,该设备必须设置相应的参数信息,包括设备的通信端口、波特率和猫设备的编码,它们将被SendLetterDAO类调用,以完成猫的初始化和发送功能。猫设置界面如图6.25所示。图6.25猫设置界本系统的发送模块也需要相应的参数设置才能实现的发送,这些参数包括SMTP服务器的名称或者IP地址、登录服务器的用户名、登录服务器的,它们将被SendMailDAO类调用,以完成邮件的功能。邮箱设置界面如图6.26所示。6.26邮箱设置界系统设置模块技术分Preferences类保存相应的参数信息。该类由JavaAPI提供,其常用方法如表6.8所示。6.8Preferences类的常 put(Stringkey,Stringget(Stringkey,String设置实现过创建LetterSetDialog类,该类需要继承JDialog类成为一个框窗体,在该窗体中创建设置猫参数的各个文本框控件和相应的以及按钮控件,另外还需要创建Preferences首选项类的例程38代码位置:光盘publicpublicclassLetterSetDialogextends{privatefinalDaodao=privatefinalJTextFielddeviceField=newJTextField();privatefinalJTextFieldbaudField=newJTextField();privatefinalJTextFieldsnField=newJTextField();privatefinalPreferencesperf=Preferences.userRoot();} 例程39代码位置:光盘publicLetterSetDialog() setBounds(100,100,347, finalJPanelsetPanel=newJPanel();setPanel.setBorder(newEmptyBorder(20,0,10,10));finalGridLayoutgridLayout=newGridLayout(0,2) JLabellabel=newJLabel("通讯端口 控JLabellabel_2=newJLabel("波特率:");JLabellabel_3=newJLabel(" Stringdevice Stringbaud Stringsn=perf.get("sn","YIWU-IJDD-****- finalJPanelbuttonPanel=new finalFlowLayoutflowLayout=new finalJButtonsubmitButton=newJButton("确定"); submitButton.addActionListener(newOKActionListener()); finalJButtonexitButton=newJButton("退出"); exitButton.addActionListener(newExitActionListener()); finalJLabelleftLabel=newJLabel();leftLabel.setPreferredSize(newDimension(10,0));getContentPane().add(leftLabel,BorderLayout.WEST);finalJLabelrightLabel=newJLabel();rightLabel.setPreferredSize(newDimension(10,0));}编写“确定”按钮的事件器OKActionListener类,它实现了ActionListener接口和接口例程40代码位置:光盘{publicvoidactionPerformed(ActionEvente){Stringdevice=deviceField.getText();Stringbaud=baudField.getText();Stringsn=snField.getText();}}邮箱设置实现过创建MailSetDialog类,它必须继承JDialog类成为一个框窗体,在该窗体中定义Preferences首选项和设置邮箱信息的各文本框,这些文本框分别对应SMTP服务器、登录服务器的用例程41代码位置:光盘publicpublicclassMailSetDialogextends{privatefinalDaodao=privatefinalJTextFieldmailAddress=newprivatefinalJPasswordFieldmailPassword=newJPasswordField();privatefinalPreferencesperf=Preferences.userRoot();privatefinalJLabellabel_2=newprivatefinalJTextFieldSMTPAddress=new}//dao实//SMTP的用户文本//SMTP服务器文本publicMailSetDialog()
{setTitle("邮箱设置");setBounds(100100347213);finalJPanelsetPanel=newsetPanel.setBorder(newEmptyBorder(30,0,20,10));finalGridLayoutgridLayout=newGridLayout(0,2);StringmailName=perf.get("mailName",
Stringpassword=perf.get("password",StringSMTPserver=perf.get("SMTPserver","LZW");JLabellabel=newJLabel();JLabellabel_3=newJLabel();Stringpassword=perf.get("password",StringSMTPserver=perf.get("SMTPserver","LZW");JLabellabel=newJLabel();JLabellabel_3=newJLabel(); finalJPanelbuttonPanel=newfinalFlowLayoutflowLayout=newFlowLayout();finalJButtonsubmitButton=newJButton("确定");submitButton.addActionListener(newOKActionListener());finalJButtonexitButton=newJButton("退出");finalJLabelleftLabel=newleftLabel.setPreferredSize(newDimension(10,0));getContentPane().add(leftLabel,BorderLayout.WEST);finalJLabelrightLabel=newJLabel();rightLabel.setPreferredSize(newDimension(10,0)); }例程43代码位置:光盘{publicvoidactionPerformed(ActionEvente)Stringmaild=Stringpassword=newString(mailPassword.getPassword());StringSMTPserver=SMTPAddress.getText();
perf.put("mailName",maild);perf.put("password",password);perf.put("mailName",maild);perf.put("password",password);}}JTabbedPanegetSelectedIndex()方法,该方法将返回当前被选中的选项卡的索选项卡的索引值为0,“E-mail内容”选项卡的索引值为1。6.27例程44代码位置:光盘\TM\06\ExpressLetter\src\com\mwq\frame{publicvoidactionPerformed(ActionEvente)if(selectedRow<0){,""," }elseStringinfo=infoListTable.getValueAt(selectedRow,2).toString();if(infoTabbedPane.getSelectedIndex()==0)}}使用猫和JavaMi组使用猫又名GSMModem,专门针对应用设计,内含工业级发送模块,简化了通口, 参数名称参数类型参数说明StringStringpublicpublicnativebooleanGSMModemInitNew(Stringdevice,Stringbaudrate,Stringinitstring,Stringcharset,booleanswHandshake,Stringsn)6.10GSMModemInitNew()方法参数与返回值说参数名称参数类型参数说明StringStringStringStringbooleanStringbooleanpublicpublicnativebooleanGSMModemSMSsend(StringserviceCenterAddress,intcodeval,byte[]text,StringbooleanString用于指定中心号intString用于指定中心号intbyteStringbooleanbooleantrue发送成功,false发送失publicnativeStringpublicnativeStringpublicpublicnativeStringpublicpublicnativebooleanpublicpublicnat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中药诊疗室工作制度
- hiv安全工作制度
- 专家查隐患工作制度
- 保安不定时工作制度
- 25换药室工作制度
- 两非b超室工作制度
- 办公室保安工作制度
- 加强代联络工作制度
- 劳动法3中工作制度
- 医保员管理工作制度
- 妇产科品管圈汇报提高产房医护人员感控执行率
- SY-T 5412-2023 下套管作业规程
- DL∕T 656-2016 火力发电厂汽轮机控制及保护系统验收测试规程
- JTG 3362-2018公路钢筋混凝土及预应力混凝土桥涵设计规范
- 胰腺癌的超声诊断
- (正式版)JTT 1497-2024 公路桥梁塔柱施工平台及通道安全技术要求
- ISO15614-1 2017 金属材料焊接工艺规程及评定(中文版)
- 安全文明施工的施工现场机械设备管理
- 公交驾驶员服务培训课件
- 第五章儿童消化系统的结构功能及发育
- 沃尔玛管理层绩效评估表
评论
0/150
提交评论