log4j是一款很強大的日志記錄工具,使用起來十分靈活,功能也十分強大.本人在開發中喜歡將日志以HTML的形式輸出,該種形式輸出的日志比較清晰,在閱讀的時候可以達到事半功倍的效果
貼出log4j的配置文件
log4j.properties









(1)org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class
'com.microsoft.sqlserver.jdbc.SQLServerDriver'
答:sqljdbc.jar
(2)java.lang.ClassNotFoundException: org.springframework.ejb.config.JeeNamespaceHandler
答:spring-remoting.jar
(3)java.lang.ClassNotFoundException: org.springframework.scripting.config.LangNamespaceHandler
答:spring-support.jar
(4)java.lang.ClassNotFoundException: org.springframework.transaction.config.TxNamespaceHandler
答:spring-dao.jar
(5)java.lang.ClassNotFoundException: org.springframework.aop.config.AopNamespaceHandler
答:spring-aop.jar
this.setUndecorated(true);
首先解釋兩個概念,何為序列化?何為反序列化?
序列化:將對象轉化成流的過程稱為序列化
反序列化:將流轉化成對象的過程稱之為反序列化
序列化與反序列化必須遵守的原則
a) Java對象
在java中要想使一個java對象可以實現序列化與反序列化,必須讓該類實現java.io.Serializable接口
java.io.Serializable接口定義如下:
publicinterface Serializable { } |
從上述定義中可以看到該接口中未定義任何方法,這大大的簡化了開發者
b) 序列化主要依賴java.io.ObjectOutputStream類,該類對java.io.FileOutputStream進一步做了封裝,這里主要使用ObjectOutputStream類的writeObject()方法實現序列化功能
Demo:
/** *將對象序列化到磁盤文件中 *@paramo *@throwsException */ publicstaticvoid writeObject(Object o) throws Exception{ File f=new File("d:""user.tmp"); if(f.exists()){ f.delete(); } FileOutputStream os=new FileOutputStream(f); //ObjectOutputStream 核心類 ObjectOutputStream oos=new ObjectOutputStream(os); oos.writeObject(o); oos.close(); os.close(); } |
c) 反序列化主要依賴java.io.ObjectInputStream類,該類對java.io.InputStream進一步做了封裝,這里主要使用ObjectInputStream類的readObject()方法實現序列化功能
Demo:
/** *反序列化,將磁盤文件轉化為對象 *@paramf *@return *@throwsException */ publicstatic User readObject(File f) throws Exception{ InputStream is=new FileInputStream(f); //ObjectOutputStream 核心類 ObjectInputStream ois=new ObjectInputStream(is); return (User)ois.readObject(); } |
貼出完整的demo
Java對象:
package com.io.bean; import java.io.Serializable; publicclass User implements Serializable {
privateintuserId; private String userName; private String userSex; privateintuserAge; publicint getUserAge() { returnuserAge; } publicvoid setUserAge(int userAge) { this.userAge = userAge; } publicint getUserId() { returnuserId; } publicvoid setUserId(int userId) { this.userId = userId; } public String getUserName() { returnuserName; } publicvoid setUserName(String userName) { this.userName = userName; } public String getUserSex() { returnuserSex; } publicvoid setUserSex(String userSex) { this.userSex = userSex; } @Override public String toString() { returnthis.getUserId() + " " + this.getUserName() + " " + this.getUserSex() + " " + this.getUserAge(); } } |
序列化與反序列化
package com.io.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import com.io.bean.User; publicclass TestSerializable { /** *將對象序列化到磁盤文件中 *@paramo *@throwsException */ publicstaticvoid writeObject(Object o) throws Exception{ File f=new File("d:""user.tmp"); if(f.exists()){ f.delete(); } FileOutputStream os=new FileOutputStream(f); //ObjectOutputStream 核心類 ObjectOutputStream oos=new ObjectOutputStream(os); oos.writeObject(o); oos.close(); os.close(); }
/** *反序列化,將磁盤文件轉化為對象 *@paramf *@return *@throwsException */ publicstatic User readObject(File f) throws Exception{ InputStream is=new FileInputStream(f); //ObjectOutputStream 核心類 ObjectInputStream ois=new ObjectInputStream(is); return (User)ois.readObject(); }
publicstaticvoid main(String[] args) throws Exception{
/*****************將對象序列化***************/
/* User user=new User(); user.setUserId(1); user.setUserName("張藝謀"); user.setUserSex("男"); user.setUserAge(50); TestSerializable.writeObject(user); */
/*****************將對象序反列化***************/
User user=TestSerializable.readObject(new File("d:""user.tmp")); System.out.println(user); } } |
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import sun.misc.BASE64Encoder;
public class SendMail {
public static void main(String[] args) throws Exception{
Properties props=new Properties();
//設置采用郵箱認證
props.setProperty("mail.smtp.auth", "true");
//獲得session
Session session=Session.getInstance(props);
//設置調試信息
session.setDebug(true);
//創建message
Message message=new MimeMessage(session);
//對message做些配置
//郵件主題
message.setSubject("這是用javamail寫得帶附件的郵件");
//郵件發送人
message.setFrom(new InternetAddress("*****@163.com"));
//發送時間
message.setSentDate(new Date());
//設置收件人
/**
* RecipientType.TO 指定郵件發送類型
* RecipientType.TO 直接發送
* RecipientType.CC 抄送
* RecipientType.BCC 暗送
* new Address[]{} 郵件接收人列表
*/
message.addRecipients(RecipientType.TO, new Address[]{
new InternetAddress("*******@sohu.com")
});
//使用message中的setText()方法發送文本文件
//message.setText("郵件正文");
/**
* "<span style='color:red'>這是用javamail發送的郵件正文</span>" 郵件內容
* "text/html;charset=utf-8" 指定編碼
*/
//message.setContent("<span style='color:red'>這是用javamail發送的郵件正文</span>", "text/html;charset=utf-8");
/**********創建帶附件的郵件********************/
//創建Multipart對象,最后將Multipart對象添加到message中
Multipart multipart=new MimeMultipart();
//創建MimeBodyPart對象
MimeBodyPart mimeBodyPart=new MimeBodyPart();
//設置附件內容
FileDataSource fds=new FileDataSource("d:\\5.jpg");
//設置附件的名字
/********************處理附件中文名亂碼***************************/
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
//System.out.println(enc.encode("徐熙媛.jpg".getBytes()));
mimeBodyPart.setFileName("=?GB2312?B?"+enc.encode("徐熙媛.jpg".getBytes())+"?=");
//處理附件
mimeBodyPart.setDataHandler(new DataHandler(fds));
multipart.addBodyPart(mimeBodyPart);
/********設置郵件正文內容********/
//新創建MimeBodyPart對象,否則正文將會覆蓋掉附件內容
mimeBodyPart=new MimeBodyPart();
//設置郵件正文內容
mimeBodyPart.setContent("<span style='color:red'>這是用javamail發送的郵件正文</span>", "text/html;charset=utf-8");
//將MimeBodyPart添加到Multipart中
multipart.addBodyPart(mimeBodyPart);
//將multipart添加到message中
message.setContent(multipart);
//創建傳輸對象
Transport transport=session.getTransport("smtp");
//配置連接信息
/**
* smtp.sohu.com 指定主機
* 25 端口號
* sxyx 用戶名
* ******** 密碼
*/
transport.connect("smtp.sohu.com", 25, "sxyx", "*******");
//發送消息
/**
* message 消息內容
* message.getAllRecipients() 收件人地址
* 返回
* message.addRecipients()方法中指定的郵件接收人列表
*/
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
}
鑒于此文圖片丟失,影響閱讀質量,特上傳此博文word文檔,廣大網友可點此下載word文檔
呵呵,最近一直在看struts2方面的資料。大家都知道web開發過程中,我們經常要處理客戶端(用戶)提交過來的數據(增加記錄)及后臺數據庫查詢出來的數據(修改記錄),這里難免會出現一些不符合要求的數據,我們稱為“臟數據”。這里就借助于struts2提供的驗證框架來做數據的驗證(其實它依賴的還是webwork)
在使用struts2或者說webwork的驗證框架時必須遵守以下幾點:
在這里不要管為什么,人家就是這么約定的,我們只要照做就是了。除非你是科研人員,如果僅僅是項目需要,建議大家還是不要在這上面花過多的時間,不值得。
在對應的Action的包下(必須跟該Action在同一個目錄)創建驗證框架規則(.xml文件)
該xml文件的命名必須遵守如下規則:
1) 該文件必須跟該對應的Action在同一個目錄
2) Action的名字---對應Action中的方法名(execute方法除外)-validation.xml
如:
如圖所示該文件名由三部分組成:
第一部分:Action的類名
第二部分:Action中的方法名
第三部分:validation.xml(固定)
這三部分之間用橫線連接-
驗證規則(EmployeeAction-updateEmployee-validation.xml)內容
因為Action是基于模型驅動的即在Action引用了對象模型,所以在寫驗證規則的時候字段屬性為Action中對象模型名.具體的屬性()
Action中的引用關系
EmployeeAction-updateEmployee-validation.xml中的配置內容
詳細參看EmployeeAction-updateEmployee-validation.xml中的配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <field name="employee.empName"> <field-validator type="requiredstring"> <message>雇員姓名不能為空</message> </field-validator> </field> <field name="employee.age"> <field-validator type="required"> <message>雇員年齡不能為空</message> </field-validator> </field> <field name="employee.sex"> <field-validator type="requiredstring"> <message>雇員性別不能為空</message> </field-validator> </field> <field name="employee.context"> <field-validator type="requiredstring"> <message>雇員備注信息不能為空</message> </field-validator> </field> </validators> |
<field name="驗證字段(Action中對象模型名字.具體的屬性)">
<field-validator type="requiredstring"> 驗證規則
<message>驗證出錯信息</message>
</field-validator>
</field>
最后千萬別忘了在struts.xml文件中一定要配置一個結果為input的轉向
否則驗證失敗時會出現如下錯誤:
鑒于此文圖片丟失,影響閱讀質量,特上傳此博文word文檔,廣大網友可點此下載word文檔