分类: 系统运维
2012-03-08 12:31:54
第5章JavaBean组件模型
5.1JavaBean概述
Sun公司的定义是:一个javabean是一个能再可视化IDE编程工具中使用的、可重用的软件组件。
5.1.1代码重用与组件规范
Javabean是一种简单易用的组件模型。Bean是一种特殊的java类,是可执行的代码组件,可以在由应用程序构造工具所提供的应用程序设计环境中运行。Javabean可以增加代码的重用。
5.1.2JavaBean的分类及特点
Javabean可以分为两大类:不可视的和可视化的。
5.1.3JavaBean的代码结构
一般有一个默认的无参构造方法。为属性定义set/getXXX()函数。
5.2JavaBean的编程
大致是两个过程:1).编译javabean类2).Jsp或者servlet中导入使用javabean
5.2.1JSP动作与JavaBean生命周期
与javabean相关的jsp动作如下:
1).
2).
3).
5.2.2封装业务逻辑的JavaBean
5.3 一些有用的JavaBean
5.3.1 数据封装与表单JavaBean
org.servlet.ServletRequest.getParameterMap()这个函数可以将客户端传来的参数封装在一个Map对象中,这些参数可以用GET或者POST方式提交给服务器。例如:
Map map=request.getParameterMap()
Org.apache.commons.beanutils BeanUtils.populate()是将存储在一个Map中的参数填入给定的一个javabean对象中。此函数需要commons-beanutils.jar包支持。例如将map填入一个名为form的javabean中:
BeanUtils.populate(form,map)
5.3.2 文件上传和下载的JavaBean组件
JspSmartUpload是一个免费的上传和下载文件的javabean,比较适合小文件的上传与下载。SmartUpload中常用的类如下:
1). com.jspsmart.upload.SmartUpload类
SmartUpload():生成SmartUpload对象。
initialize(PageContext):是SmartUpload中第一个被执行的方法。
upload():上传文件。
getFiles():获得文件。
getSize():文件大小。
getMaxFileSize:文件大小最大值。
setTotalMaxFileSize:设置最大值。
save(descPath):所有上传文件保存在指定的目录descPath。
downloadFile(Filename):下载一个指定文件。
2). com.jspsmart.upload.Files类
File是上传文件的集合。关键方法:
getCount()本次上传文件的数量。
getSize()文件上传总量。
getFile(index)返回索引号为index的文件对象。
3). com.jspsmart.upload.File类
此处的File表示一个上传文件,和java.io.File不同。关键方法有:
fileToField():把文件对象储存至数据库的指定字段中。
isMissing():判断文件是否可用。
saveAs():把文件保存至指定的目标路径中。
getFileName():返回文件的名称。
getFileExt():返回文件扩展名。
getSize():返回上传文件的大小。
FileUpload组件是为了大文件的上传与下载,1.2版本有以下类:
1). com.apache.commons.fileupload.ServletFileUpload类
用于处理客户端表单类,有以下方法:
ServletFileUpload():构造方法。
isMultipartContent():判断是否MIME类型是“multipart/form-data”
parseRequest():取得存储有各FileItem对象的List集合。
2). com.apache.commons.fileupload.FileItem类
一个FileItem代表一个表单元素,可以是文本域、单选按钮等普通表单元素,也可以是文件域。
3). com.apache.commons.fileupload.FileUploadBase类
管理上传的文件,是ServletFileUpload的父类,需要commons-fileupload-1.2.jar。
5.3.3 邮件发送的JavaBean组件
JavaMail是J2ee的组成部分之一,它定义了一些接口和类,为java提供邮件系统支持。它的API由两部分组成:一部分是独立于邮件协议,主要用于邮件操作;另一部分与协议相关,用于封装SMTP、POP、IMAP、NNTP等协议。
JAF(javabean Activation Framework)是开发邮件程序必不可少的组件,主要用于处理邮件附件,与javamail使用,可以实现构造、传输及管理邮件的应用程序。
JavaMail组件写邮件收发程序常用的七个类:
1).java.util.Properties持久属性类:
Properties 继承了 Hashtable,但是不建议使用put 和 putAll 方法。应该使用 setProperty 方法。在创建javax.mail.Session 对象时,需要用 Properties 对象为之提供邮件发送时需要的关键信息。关键的方法有:
public Properties()创建一个无默认值的空属性列表。
public Object setProperty(String key,String value)将一个“key-value”对写入Hashtable中。
public String getProperty(String key) 在属性列表中搜索指定key的属性值,如果未找到此属性值,则接着递归检查默认属性值列表及其默认值,如果仍未找到属性值,则此方法返回 null。
2).javax.mail.Session定义了一个基本邮件session通信,是Java Mail API最高层入口类。所有其它类都是经由这个Session 才得以生效,类中关键的方法有:
public static Session getInstance(java.util.Properties props)获得一个Session对象。形参是一个Properties对象。发信时,Properties对象中至少要求提供发信主机域名及主机是否要求验证public Transport getTransport(java.lang.String protocol) throws NoSuchProviderException获得指定协议的发送器对象。如果是发信,则协议写为“smtp”。
public void setDebug(boolean debug)形参为真假值。当设定调试状态为true时,操作过程中的有关调试信息会显示在Tomcat命令行窗口中。利用此方法可跟踪发信过程各步操作的情况。
3).javax.mail.internet.MimeMessage早期的只能发送普通文本,现在的MIME邮件格式多样,一个MimeMessage对象代表一个MIME类型的邮件信息。客户端要发送邮件时,一般首先创建一个MimeMessage对象,再在其中添加其它信息类中常用的方法有:
public MimeMessage(Session session)默认的构造方法,用于创建一个空的消息对象。
public void setFrom(Address address) throws MessagingException将发信人地址写入“From”报头中,地址要求用Address或其子类封装。如果“From”报头信息已经存在,则调用此方法会重新设定报头的值,如果地址信息为空,则表示删除“From”报头。
public void setSender(Address address) throws MessagingException设定发信人,发信人地址要求用Address或其子类封装。
public void setReplyTo(Address[] addresses) throws MessagingException将回复地址写入“Reply-To”报头中,回复地址事先存储在Address或其子类的数组中。
public void setSender(Address address) throws MessagingException将发信人地址写入“Sender”报头中,地址要求用Address类封装。
public void setRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException 将信件以抄送、密送或转发等方式发送给指定地址的用户,用户地址写在Address数组中。
public void setSentDate(java.util.Date d) throws MessagingException定义发信日期。
public void setSubject(java.lang.String subject) throws MessagingException定义邮件主题。
public void setText(java.lang.String text) throws MessagingException设定邮件正文,这时正文是以普通文本方式发送。如果要发送HTML格式的邮件,要用其它方法。
public void saveChanges() throws MessagingException保存报头信息。在发送邮件前要求执行此方法。
public Address[] getAllRecipients()throws MessagingException获得CC、TO、BCC、NEWSGROUPS等各种发送方式的收信人地址。
4). javax.mail.internet.MimeMultiPart不仅可以发文本,还可以图片等其他格式的附件常用的方法有:
public MimeMultipart()默认的构造方法,对象的MIME类型为“multipart/mixed”。
public void addBodyPart(BodyPart part) throws MessagingException将一个BodyPart对象添加到邮件内容对象中。邮件内容的一个组成部分要封装成一个BodyPart对象。例如一个邮件附件要求封装成一个BodyPart对象后再添加到MimeMultipart对象中。
public boolean removeBodyPart(BodyPart part) throws MessagingException从邮件内容对象中删除指定的组成部分。
public void setText(java.lang.String text) throws MessagingException定义MIME邮件的正文,这些正文只能以普通文本形式发送。
5). javax.mail.internet.MimeBodyPart一条邮件可以由多个部分组成,每一个部分是一个MimeBodyPart。把不同的报文部分组合到一个MimeMultiPart对象中。类中常用的方法有:
public MimeBodyPart()默认的构造方法,生成一个MimeBodyPart对象。
public MimeBodyPart(java.io.InputStream is) throws MessagingException构造方法,形参是一个输入流对象,表示从输入流对象中读取数据构造一个MimeBodyPart对象。
public void setText(java.lang.String text) throws MessagingException将文本信息填写到MimeBodyPart对象中,这些文本被当作“text/plain”普通文本发送出去。
public void setContent(java.lang.Object o,java.lang.String type) throws MessagingException将一个对象o写入MimeBodyPart对象中,并指明它的MIME类型。
public void setDataHandler(javax.activation.DataHandler dh) throws MessagingException setDataHandler()把一个已经用DataHandler封装的数据块当作邮件内容的组成部分写入MimeBodyPart对象中
public void setFileName(java.lang.String filename) throws MessagingException 为body part中的数据块定义一个文件名,表示此数据块最终可存储为一个文件。
public void setHeader(java.lang.String name , java.lang.String value) throws MessagingException
定义报头参数。
6).javax.mail.Transport主要是将邮件传送出去。常用的方法有:
public void connect(java.lang.String host,java.lang.String user,java.lang.String password) throws MessagingException这个方法建立与发信主机间的连接。三个形参依次为主机名、用户名和口令。
public void close() throws MessagingException关闭与发信服务器间的通信连接。
public void addTransportListener(TransportListener l)添加传送侦听器。
public abstract void sendMessage(Message msg, Address[] addresses) throws MessagingException发送邮件。第一个形参是消息,第二个形参是收信人地址列表。
7). javax.mail.internet.InternetAddress用于封装一个邮件地址,典型的邮件地址如“aa@bb.com”形式。常用的方法有:
public InternetAddress(java.lang.String address) throws Addres***ception构造方法,用于将一个邮件地址封装成一个InternetAddress对象。
public void validate() throws Addres***ception校检邮件地址是否符合RFC 822规范。
总的例子:
package javamailtest;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.Properties;
public class sendMailServlet extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GBK";
//Initialize global variables
public void init() throws ServletException {
}
//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
String smtpServer = request.getParameter("mailserver");
String mailTo = request.getParameter("mailto");
String mailFrom = request.getParameter("mailfrom");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
System.out.println(smtpServer+mailTo+mailFrom+subject+content);
System.out.println(request.getParameter("file1"));
try {
Properties props = new Properties();
//Properties prop = System.getProperties();取得Properties的另一种方法
//props.put("mail.transport.protocol","smtp");
props.put("mail.smtp.host","smtp.163.com");
//props.put("mail.smtp.port","25");
props.put("mail.smtp.auth","true");
Session mailSession = Session.getInstance(props);
mailSession.setDebug(true);
/*
Properties props=new Properties();//也可用Properties props = System.getProperties();
props.put("mail.smtp.host","smtp.163.com");//存储发送邮件服务器的信息
props.put("mail.smtp.auth","true");//同时通过验证
Session s=Session.getInstance(props);//根据属性新建一个邮件会话
s.setDebug(true);
MimeMessage message=new MimeMessage(s);//由邮件会话新建一个消息对象
//设置邮件
InternetAddress from=new InternetAddress("");
message.setFrom(from);//设置发件人
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);//设置收件人,并设置其接收类型为TO
message.setSubject(ttitle);//设置主题
message.setText(tcontent);//设置信件内容
message.setSentDate(new Date());//设置发信时间
//发送邮件
message.saveChanges();//存储邮件信息
Transport transport=s.getTransport("smtp");
transport.connect("smtp.163.com","liboofsc","642364");//以smtp方式登录邮箱
transport.sendMessage(message,message.getAllRecipients());//发送邮件,其中第二个参数是所有
//已设好的收件人地址
transport.close();
*/
//MimeMessage的对象用来装整个邮件的对象
MimeMessage msg = new MimeMessage(mailSession);
//Multipart mp = new MimeMultipart();
//BodyPart的对象用来装附件型式内容和脚本型式邮件内容
//MimeBodyPart bp = new MimeBodyPart();
FileDataSource fileds = new FileDataSource("c://csb.log");
//在BodyPart对象中添加一个附件
//bp.setDataHandler(new DataHandler(fileds));
//bp.setFileName(fileds.getName());
//bp.setText(content);
//在BodyPart对象中添加一个html脚本
/*
bp.setContent(
"" +
"" +
"", "text/html;charset=GB2312");*/
//mp.addBodyPart(bp);
//msg.setContent(mp);
InternetAddress address = new InternetAddress("");
address.setPersonal("lyws");
msg.setFrom(address);
msg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(""));
//msg.setSentDate(new Date());
//加入邮件标题
msg.setSubject(subject);
/**
* 邮件的正文内容通常可以分几个部分,包括文本正文,脚本正文及附件。
* 每一部分通常都用一个MimeBodyPart对象来装
* 接一下把几部分都加入Multipart对象,Multipart对象包含邮件正文的全部内容
* 最后把Multipart对象放入MimeMessage对象中,正文内容就设定完成
*/
//定义一个Multipart对象用来装整个邮件的正文部分
Multipart multipart = new MimeMultipart();
//定义一个MimeBodyPart对象,用来装邮件的文本内容然后加入Multipart对象中
MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(content);
multipart.addBodyPart(messageBodyPart);
//定义一个MimeBodyPart对象,用来装邮件的附件内容然后加入Multipart对象中
MimeBodyPart fileBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource("c://aa.jpg");
fileBodyPart.setDataHandler(new DataHandler(source));
fileBodyPart.setFileName(source.getName());
multipart.addBodyPart(fileBodyPart);
//定义一个MimeBodyPart对象,用来装邮件的脚本内容然后加入Multipart对象中
MimeBodyPart htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent("" +
"" +
"", "text/html;charset=GB2312");
multipart.addBodyPart(htmlBodyPart);
//把Multipart对象加入到MimeMessage对象中
msg.setContent(multipart);
//msg.setText(content);
msg.saveChanges();
Transport trans = mailSession.getTransport("smtp");
//System.out.println("1111111111111111");
trans.connect("smtp.163.com", "lyws", "800518");
//System.out.println("1111111111111111");
//trans.connect( (String) props.get("mail.smtp.host"), "liboofsc", "642364");
trans.sendMessage(msg,msg.getRecipients(Message.RecipientType.TO));
//msg.writeTo(System.out);
out.println("邮件发送成功"+mailTo);
trans.close();
}
catch (MessagingException ex) {
System.out.println(ex);
}
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
//Clean up resources
public void destroy() {
}
}
5.3.4 用POI组件生成Excel报表
POI是Apache软件基金会管理下的一个开源Java项目,主要提供对微软文件(Word、Excel和PPT演示文稿等)进行读写的Java API类。 在POI项目中,要读写Excel文档,要用到其中的HSSF组件。在HSSF组件中,常用到org.apache.poi.hssf.usermodel包中的各个类,常用的类如下:
1).HSSFWorkbook类
这个类是Excel工作薄的高层表示,一般用来代表一个Excel文件,在对工作薄操作前,一般首先生成一个HSSFWorkbook对象。HSSFWorkbook类中的主要方法有:
HSSFWorkbook()构造方法,用于新建一个工作薄对象
createSheet(java.lang.String sheetname) 在工作薄对象中创建一个工作表,形参是工作表名,如果没有形参则自动生成工作表名;如果指定表名的工作表已经存在,则抛出异常
HSSFSheet getSheet(java.lang.String name| int index) 从工作薄对象中获得指定名字的工作表,形参可以是工作表名,也可以是工作表的序号。如果指定的工作表不存在,则返回一个空对象。
public HSSFSheet cloneSheet(int sheetNum) 克隆工作薄中的某个工作表。形参是待克隆工作表的编号。
2).HSSFSheet类
用来代表一个工作表,其中常用的方法有:
public HSSFRow getRow(int rownum) 用于获得工作表中指定的某一行,形参为行号,从0开始取值,方法返回一个HSSFRow对象;如果不存在指定的行,则返回null。
public int getLastRowNum() 获得最后一行的行号,常用于判断工作表中有多少行。
3).HSSFRow类
用来代表工作表中的一行。常用的方法为:
HSSFCell getCell(short cellnum) 用于返回一行中指定的单元格,形参cellnum实际上是单元格的列号,从0开始取值。
4).HSSFCell类
用来代表某行中的一个单元格,通过这个类的构造方法可直接获得工作薄某个工作表中的指定单元格,常用的方法有:
HSSFCell(Workbook book, Sheet sheet, int row, short col, int type) 构造方法。
setCellStyle(HSSFCellStyle style)定义单元格中的数据样式,如对齐方式、加粗等
setCellValue(boolean|double|String|Calendar|Date value) 将数据value写入单元格中
getDateCellValue() 读取单元格中数据
getNumericCellValue() 读取数值型数据
getStringCellValue()读取字符串型数据。