<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>cuishen</title>
    <description>大家好，我叫崔申，javaeye的新成员，本人学的专业是数控，但是偏爱开发软件，天随人愿，三个月前竟然让我找到了开发软件的工作，而且做的是j2ee的开发，谢天谢地，我一定会珍惜这份工作，愿java伴我走过一段美好的人生，愿javaeye的朋友们能多多指教，谢谢！</description>
    <link>http://cuishen.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>女儿崔语欣2008-6-25诞生</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/211999" style="color:red;">http://cuishen.javaeye.com/blog/211999</a>&nbsp;
          发表时间: 2008年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          女儿崔语欣是公元二零零八年六月二十五号早上10:09在金桥浦东妇幼保健院诞生的，老婆9:10进的手术室，10:30出的手术室。<br /><br />女儿出生体重3470g，生出来眼睛就睁开的，两个黑黑的眸子不停转来转去打量着陌生的世界；头发又黑又长，和满月的孩子有的一拼，看见我女儿的人第一句话就是“这孩子头发长的真好”<img src="/images/smiles/icon_biggrin.gif"/>，刚生下来的时候，头发看上去还有点卷，她奶奶看见说：“恩，卷毛，像我”，可是后来洗过几次澡后，头发又黑又直，越来越像她妈妈了。女儿的手指，脚趾很长，将来肯定个子很高挑，像她老爸<img src="/images/smiles/icon_lol.gif"/>；当然有纤长的手指，也是学钢琴的先天优势，将来如果女儿你喜欢音乐，一定好好培养你。<br /><br />女儿，你知道吗，你来到这个世界不容易，你的降生给生你养你的父母带来了欢乐，也是我们生命的延续.你要珍惜这个生的机会，好好的，顽强的在这个竞争激烈的社会生存下去，问心无愧的，认认真真的对待每一天!<br /><br /><br />女儿出生半小时照片<br /><img src="http://cuishen.javaeye.com/upload/picture/pic/17435/45fe3ab6-b8c6-3338-a993-99146d362706.jpg" /><br /><br /><br />女儿出生11天照片<br /><img src="http://cuishen.javaeye.com/upload/picture/pic/17437/9bf585ec-3155-3f6e-bed5-bf8c5d5b0542.jpg" />
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/211999#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Jul 2008 10:54:46 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/211999</link>
        <guid>http://cuishen.javaeye.com/blog/211999</guid>
      </item>
      <item>
        <title>看陈道明的戏感觉很累！</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/179823" style="color:red;">http://cuishen.javaeye.com/blog/179823</a>&nbsp;
          发表时间: 2008年04月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          近日买了陈道明演的古装电视连续剧《卧薪尝胆》，陈道明在里面饰越王勾践一角，看了几集后，感觉看陈道明的戏很累。<br /><br />他在做决定，说话的时候，眼神飘来移去，说这件事，好像心里又在想别的，完全装出来的一副帝王气，反观吴王夫差的扮演者：胡军，演的不错，洒脱，看着舒服<br /><br />这使我又回忆起几年前电视台热播的电视剧：《康熙王朝》，陈道明 饰 成年康熙，李楠 饰 少年康熙，当时我挺喜欢这部戏的，但是看到陈道明演的地方，总有点怪怪的感觉，完全没有李楠演的康熙看着舒服，究其原因，两个字：做作
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/179823#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Apr 2008 13:18:31 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/179823</link>
        <guid>http://cuishen.javaeye.com/blog/179823</guid>
      </item>
      <item>
        <title>都别装了，难道不想比比谁家里的机器更牛，用到更爽？？</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/179602" style="color:red;">http://cuishen.javaeye.com/blog/179602</a>&nbsp;
          发表时间: 2008年04月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          单位的机器自己不能左右，要靠运气，运气好，投靠了有钱的老板，用的机器爽；反过来，运气不好，只能用垃圾机器，郁闷死～～～<br />家里的爱机就不同了，我的机器我做主！哈哈，我的爱机是05年毕业那会儿自己配的，在当时已经算很牛B了，3年后的今天用起来依然很爽，现在就将我的爱机配置公布如下：<br />-------------------<br />cpu： AMD Athlon64 3200+ 2.0G<br />内存：2G （DDR400 512M X 4）<br />硬盘：120G<br />主板北桥芯片：NV Nforce4 SLI（支持双显卡）<br />显卡：6600GT<br />光驱：一个DVD-Room + 一个DVD-RW<br />--------------------<br />3D Mark03 跑分：8k多<br />DoomIII， Half-Life2等等游戏不在话下，开了Eclipse，再开oracle、tomcat，聊天工具，上网，bt下载依然不卡，用的真爽，哈哈<br /><br />论坛的兄弟们，你们的爱机配置怎样的啊？
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/179602#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Apr 2008 08:09:56 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/179602</link>
        <guid>http://cuishen.javaeye.com/blog/179602</guid>
      </item>
      <item>
        <title>一个jaxb的例子看java object和xml之间的转换</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/179482" style="color:red;">http://cuishen.javaeye.com/blog/179482</a>&nbsp;
          发表时间: 2008年04月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这段时间在研究o/x mapping，即Java object和xml之间的转换以及xml文件验证的问题，自己也动手开发了一个小的演示例子，如下所示：<br /><br />--------开发环境-----<br />1.jdk1.5<br />2.jwsdp2.0（Java Web Services Developer Pack 2.0， sun的官网上有的下）<br />3.程序中需要用到的jar包：<br />%jwsdp2.0安装目录下%/jaxb/lib/jaxb-api.jar<br />%jwsdp2.0安装目录下%/jaxb/lib/jaxb-impl.jar<br />%jwsdp2.0安装目录下%/sjsxp/lib/jsr173_api.jar<br />%jwsdp2.0安装目录下%/jwsdp-shared/lib/activation.jar<br />4.开发工具：eclipse3.2<br />---------------------<br /><br />定义一个XML schema文件--library.xsd<br /><pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
&lt;xs:element name="librarys" type="librarys"/>
&lt;xs:complexType name="librarys">
	&lt;xs:sequence>
		&lt;xs:element name="library" minOccurs="1" maxOccurs="unbounded">
			&lt;xs:complexType>
				&lt;xs:sequence>
					&lt;xs:element name="name" type="xs:string"/>
					&lt;xs:element name="layer" type="xs:int"/>
					&lt;xs:element name="row" type="xs:int"/>
					&lt;xs:element name="book" type="book"/>
				&lt;/xs:sequence>
			&lt;/xs:complexType>
		&lt;/xs:element>
	&lt;/xs:sequence>
&lt;/xs:complexType>
&lt;xs:complexType name="book">
	&lt;xs:sequence>
		&lt;xs:element name="bookID" type="xs:string"/>
		&lt;xs:element name="bookName" type="xs:string"/>
		&lt;xs:element name="borrowDate" type="xs:date"/>
		&lt;xs:element name="user" type="user"/>
	&lt;/xs:sequence>
	&lt;xs:attribute name="description" type="xs:string"/>
&lt;/xs:complexType>
&lt;xs:complexType name="user">
	&lt;xs:sequence>
		&lt;xs:element name="userID" type="xs:string"/>
		&lt;xs:element name="userName" type="xs:string"/>
		&lt;xs:element name="userAge" type="xs:int"/>
	&lt;/xs:sequence>
&lt;/xs:complexType>
&lt;/xs:schema>
</pre><br /><br />再定义jwsdp的xjc工具的binding文件---binding.xjb<br /><pre name="code" class="xml">
&lt;jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  &lt;jxb:bindings schemaLocation="library.xsd" node="/xs:schema">&lt;!-- schemaLocation属性是xsd文件的相对路径 -->
    &lt;jxb:globalBindings 
	fixedAttributeAsConstantProperty="true" 
	collectionType="java.util.ArrayList" 
	typesafeEnumBase="xs:NCName" 
	choiceContentProperty="false" 
	typesafeEnumMemberName="generateError" 
	enableFailFastCheck="false" 
	generateIsSetMethod="false" 
	underscoreBinding="asCharInWord"/>
    &lt;jxb:schemaBindings>
        &lt;jxb:package name="com.cuishen.o_x_mapping.object"/>
        &lt;!-- 这里是生成的JAVA类文件存放包名 -->
        &lt;jxb:nameXmlTransform>
	    		 &lt;jxb:elementName suffix="Element"/>
				&lt;/jxb:nameXmlTransform>
    &lt;/jxb:schemaBindings>
    &lt;!-- 这里是定义xsd中一个复合类型与Java类的映射（如果要修改才定义，不修改则不需要） -->
    &lt;jxb:bindings node="//xs:complexType[@name='librarys']">
        &lt;jxb:class name="Librarys"/>
    &lt;/jxb:bindings>
    &lt;jxb:bindings node="//xs:complexType[@name='book']">
        &lt;jxb:class name="Book"/>
        &lt;!--　这里是定义复合类型的一个元素名称与Java类中属性的映射（如果要修改才定义，不修改则不需要） -->
        &lt;jxb:bindings node=".//xs:element[@name='bookID']">
            &lt;jxb:property name="id"/>
        &lt;/jxb:bindings>
    &lt;/jxb:bindings>
    &lt;jxb:bindings node="//xs:complexType[@name='user']">
        &lt;jxb:class name="User"/>
        &lt;!--　这里是定义复合类型的一个元素名称与Java类中属性的映射（如果要修改才定义，不修改则不需要） -->
        &lt;jxb:bindings node=".//xs:element[@name='userID']">
            &lt;jxb:property name="id"/>
        &lt;/jxb:bindings>
    &lt;/jxb:bindings>
  &lt;/jxb:bindings>
&lt;/jxb:bindings>
</pre><br /><br />注意！binding文件的编码格式要用UTF-8，如果直接把代码粘到eclipse里编码格式就不是UTF-8了，这时xjc工具就要报错了，解决办法就是把这个文件用UltraEdit工具转一下。<br />可以通过binding文件和xsd文件用jaxb自带的xjc工具自动生成java object，是不是很棒啊^_^<br /><br />现在写o/x mapping的测试主类----Main.java<br /><pre name="code" class="java">
package com.cuishen.o_x_mapping;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.GregorianCalendar;
import java.util.List;

import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;
import javax.xml.bind.ValidationEventLocator;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

import com.cuishen.o_x_mapping.object.Book;
import com.cuishen.o_x_mapping.object.Librarys;
import com.cuishen.o_x_mapping.object.User;
import com.cuishen.o_x_mapping.object.ObjectFactory;

import com.cuishen.o_x_mapping.utils.FileUtils;;

/**
 * o/x mapping测试主类
 * @author cuishen
 * @date 2008-4-2
 * @version 1.0
 */
public class Main {
	public static void object2xml() {
		try {
			JAXBContext context = JAXBContext.newInstance("com.cuishen.o_x_mapping.object");
			
			Librarys libs = new Librarys();
			List&lt;Librarys.Library> libList = libs.getLibrary();
			
			User usr = createUser("1011", 28, "cuishen");
			Book book = createBook("成长比成功更重要", getDate(), "成功励志书", "88-91-211", usr);			
			libList.add(createLibrary("上海图书馆", 2, 4, book));
			
			usr = createUser("1017", 22, "sanmao");
			book = createBook("七龙珠", getDate(), "漫画", "34-16-310", usr);			
			libList.add(createLibrary("徐汇图书馆", 3, 11, book));
			
			// create an element for marshalling
			JAXBElement&lt;Librarys> element = (new ObjectFactory()).createLibrarys(libs);
			
			Marshaller m = context.createMarshaller();
			m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
			m.setProperty("jaxb.encoding", "gbk");
			m.marshal(element, System.out);
			File xmlFile = FileUtils.makeFile(getXmPath());
			OutputStream ot = new FileOutputStream(xmlFile);
			m.marshal(element, ot);
		} catch (JAXBException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void xml2object(Unmarshaller u) {
		try {
			//JAXBContext jc = JAXBContext.newInstance( "com.cuishen.o_x_mapping.object" );
			
			//Unmarshaller u = jc.createUnmarshaller();
			
			// unmarshal a po instance document into a tree of Java content
			// objects composed of classes from the com.cuishen.o_x_mapping.object package.
			JAXBElement poe = (JAXBElement)u.unmarshal(new FileInputStream(getXmPath()));
			Librarys librarys = (Librarys)poe.getValue();
			
			List libList = librarys.getLibrary();
			for(int i = 0; i &lt; libList.size(); i++) {
				Librarys.Library lib = (Librarys.Library)libList.get(i);
				System.out.println("librarys ==> ");
				System.out.println("===> library :");
				System.out.println("=========> layer " + lib.getLayer());
				System.out.println("=========> name " + lib.getName());
				System.out.println("=========> row " + lib.getRow());
				System.out.println("=========> book :");
				Book book = lib.getBook();
				System.out.println("=============> id " + book.getId());
				System.out.println("=============> borrowDate " + book.getBorrowDate());
				System.out.println("=============> name " + book.getBookName());
				System.out.println("=============> desc " + book.getDescription());
				System.out.println("=============> user :");
				User usr = book.getUser();
				System.out.println("==================> userID " + usr.getId());
				System.out.println("==================> userName " + usr.getUserName());
				System.out.println("==================> Age " + usr.getUserAge());            	
			}
			
		} catch( JAXBException je ) {
			je.printStackTrace();
		} catch( IOException ioe ) {
			ioe.printStackTrace();
		}
	}
	
	/**
	 * 对xml文件解组时的验证
	 * @return boolean
	 */
	public static Unmarshaller validate() {
		// create a JAXBContext capable of handling classes generated into
		// the com.cuishen.o_x_mapping.object package
		JAXBContext jc;
		Unmarshaller u = null;
		try {
			jc = JAXBContext.newInstance( "com.cuishen.o_x_mapping.object" );
			
			u = jc.createUnmarshaller();
			
			SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
			try {
				Schema schema = sf.newSchema(new File(getXSDPath()));
				u.setSchema(schema);
				u.setEventHandler(
						new ValidationEventHandler() {
							public boolean handleEvent(ValidationEvent ve) {
								if (ve.getSeverity() == ValidationEvent.WARNING || ve.getSeverity() != ValidationEvent.WARNING) {
									ValidationEventLocator vel = ve.getLocator();
									System.out.println("Line:Col[" + vel.getLineNumber() + ":" + vel.getColumnNumber() + "]:" + ve.getMessage());
									return false;
								}
								return true;
							}
						}
				);
			} catch (org.xml.sax.SAXException se) {
				System.out.println("Unable to validate due to following error.");
				se.printStackTrace();
			} catch (MalformedURLException e) {
				e.printStackTrace();
			}
		} catch (JAXBException e) {
			e.printStackTrace();
		}
		return u;
	}
	
	private static String getXmPath() throws MalformedURLException {
		String xmlPath = FileUtils.extractDirPath(FileUtils.extractDirPath(Main.class.getClassLoader().getResource(".").toString()));
		xmlPath = FileUtils.makeFilePath(xmlPath, "src/com/cuishen/o_x_mapping/xml/library.xml");
		URL url = new URL(xmlPath);
		return url.getPath();
	}
	
	private static String getXSDPath() throws MalformedURLException {
		String xsdPath = FileUtils.extractDirPath(FileUtils.extractDirPath(Main.class.getClassLoader().getResource(".").toString()));
		xsdPath = FileUtils.makeFilePath(xsdPath, "library.xsd");
		URL url = new URL(xsdPath);
		System.out.println("xsd path ==========> " + url.getPath());
		return url.getPath();		
	}
	
	public static void main(String args[]) {		
		System.out.println("======== object to xml ...");
		object2xml();
		System.out.println("======== xml to object ...");
		xml2object(validate());
	}
	public static Librarys.Library createLibrary(String name, int layer, int row, Book book) {
		Librarys.Library library = new Librarys.Library();
		library.setName(name);
		library.setLayer(layer);
		library.setRow(row);
		library.setBook(book);
		return library;
	}
	public static Book createBook(String name, XMLGregorianCalendar date, String desc, String id, User usr) {
		Book book = new Book();
		book.setBookName(name);
		book.setBorrowDate(date);
		book.setDescription(desc);
		book.setId(id);
		book.setUser(usr);
		return book;
	}
	public static User createUser(String id, int age, String name) {
		User usr = new User();
		usr.setId(id);
		usr.setUserAge(age);
		usr.setUserName(name);
		return usr;
	}
	private static XMLGregorianCalendar getDate() {
		try {
			return DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
		} catch (DatatypeConfigurationException e) {
			throw new Error(e);
		}
	}
}
</pre><br /><br />以上代码的核心是xml文件的编组和解组，用到了接口javax.xml.bind.Marshaller(Marshaller 类负责管理将 Java 内容树序列化回 XML 数据的过程,它提供了基本的编组方法marshal), 以及接口javax.xml.bind.Unmarshaller(Unmarshaller 类管理将 XML 数据反序列化为新创建的 Java 内容树的过程，并可在解组时有选择地验证 XML 数据。它针对各种不同的输入种类提供各种重载的 unmarshal 方法。), 至于xml文件的验证是在解组的时候，调用方法unmarshal会触发验证的机制，验证xml文件是否符合schema的规范。<br /><br />下面定义build.xml，用ant工具来完成整个项目的编译和运行，方便快捷，^_^<br /><pre name="code" class="xml">
&lt;project basedir="." default="run">
  &lt;!--这里是jwsdp的安装目录 -->
  &lt;property name="jwsdp.home" value="d:\Sun\jwsdp-2.0"/>
  &lt;!--这里是log4j的安装目录 -->
  &lt;property name="log4j.home" value="D:\conserv\o-x-mapping\implement\lib"/>
  &lt;path id="xjc.classpath">
    &lt;pathelement path="src"/>
    &lt;pathelement path="bin"/>
    &lt;pathelement path="lib"/>
    &lt;pathelement path="schemas"/>
    &lt;!--for use with bundled ant-->
    &lt;fileset dir="${jwsdp.home}" includes="jaxb/lib/*.jar"/>
    &lt;fileset dir="${jwsdp.home}" includes="sjsxp/lib/*.jar"/>
    &lt;fileset dir="${jwsdp.home}" includes="jwsdp-shared/lib/activation.jar"/>
    &lt;fileset dir="${jwsdp.home}" includes="jwsdp-shared/lib/resolver.jar"/>
    &lt;fileset dir="${log4j.home}" includes="log4j-1.2.5.jar"/>
  &lt;/path>
  &lt;taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
	&lt;classpath refid="xjc.classpath" />
  &lt;/taskdef>
  
    &lt;!--compile Java source files-->
  &lt;target name="compile" description="Compile all Java source files">
    &lt;echo message="Compiling the schema..." />
    &lt;!-- mkdir dir="src" /-->
    &lt;xjc schema="library.xsd" binding="binding.xjb" destdir="src"/>
    &lt;echo message="Compiling the java source files..." />
    &lt;mkdir dir="bin" />
    &lt;javac destdir="bin" debug="on">
      &lt;src path="src" />
      &lt;classpath refid="xjc.classpath" />
    &lt;/javac>
  &lt;/target>

  &lt;target name="run" depends="compile" description="Run the sample app">
    &lt;echo message="Running the sample application..." />
    &lt;java classname="com.cuishen.o_x_mapping.Main" fork="true">
      &lt;classpath refid="xjc.classpath" />
    &lt;/java>
  &lt;/target>
  
&lt;/project>
</pre><br /><br />我已经将演示项目的完整代码打包上传到附件了，测试通过，方便网友们下载，有不足之处愿与大家切磋
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/179482#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Apr 2008 11:38:41 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/179482</link>
        <guid>http://cuishen.javaeye.com/blog/179482</guid>
      </item>
      <item>
        <title>成功婚姻的秘诀（转）</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/176341" style="color:red;">http://cuishen.javaeye.com/blog/176341</a>&nbsp;
          发表时间: 2008年03月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          婚姻成功最关键的是什么呢？其实很简单，每天和你的丈夫一起讨论一些能增加你们感情的事情。 <br /><br /><br />　　甜蜜秘决1：相互交流<br /><br />　　幸福的夫妻一般都觉得，两个人只是简单的坐下了，一起讨论些琐事，都可以增加他们的感情。那么，面对日益激烈的社会，我们何来那么多时间，一起去分享交流呢？<br /><br />　　那么你可以尝试这个办法。每个人晚上都需要睡觉，那你们可以在睡前一起分享一下今天的点滴。有尝试过此办法的人说："我原本以为，如果你和一个结婚了，一起生活了很多年，那么你一定会很了解这个人。其实事实并非如此。所以当我们没有每天都分享我们的快乐悲伤时，我们的生活好像开始变得凌乱了。" 每天能腾出点时间一起交流，真的可以促进你们的感情哦。<br /><br /><br />　　甜蜜秘诀2：适当调情<br /><br />　　也许当你还是很年轻的时候，你也觉得婚姻后，房事是每天必然发生的事情。但是当你真的结婚的时候，你会越来越发现 ，你们房事的频率其实很低。1994美国加州大学的一份调查显示：只有约1/3的夫妻每周房事，其余的房事频率更加低。<br /><br />　　可见，既然不可能每天都做爱，那么你们可以多点时间一起谈论有关这些话题的东西。比如你们可以调情，也可以一起去做很浪漫的事情。<br /><br /><br /><br />　　甜蜜秘诀3：一起去犯傻<br /><br />　　来自波士顿37岁的设计师告诉我们说："其实，我们要保持每天甜蜜，那么你们应该每天疯一下。我们两个都是很专注于工作的人，当然我们也都有很多的工作压力。但是，我们都很喜欢下班后，完全放松，一起做些很傻的事情。<br /><br />　　生活有时候真的很“严肃”，那么我们就应该做些很傻的事情，来丰富我们的生活哦。<br /><br /><br /><br />　　甜蜜秘诀4：宣布“你的独立”<br /><br />　　有句话说得好：“如果你在我的身边，我们怎么知道我会想你呢？”有时候，不要过于缠着对方，让彼此都有时间去做各自事情。这样，你也可以让对方感觉到，你不在身边，他们对你的思念和渴望。比如，你喜欢传统音乐，而对方可能比较喜欢体育运动。那么你们就分开去做就喜欢做的事情吧。记得，要和对方一起分享自己的快乐哦。<br /><br /><br /><br />　　甜蜜秘诀5：分享你们的思想<br /><br />　　美国加州大学的另一份调查研究发现，75%的在一起分享祷告的夫妻，都有很美好的婚姻。那些一起分享和祷告的夫妻，一般都会很懂得尊重对方，一起讨论婚姻的问题，并一起去解决。如果你们没有信仰，那么你们也可以学习和效仿，一起去分析自己的想法，一起去解决很多你觉得无法解决的问题。相信你一定会有很美好的婚姻！
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/176341#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 26 Mar 2008 15:18:09 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/176341</link>
        <guid>http://cuishen.javaeye.com/blog/176341</guid>
      </item>
      <item>
        <title>人到底能走多远，路在何方？</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/173923" style="color:red;">http://cuishen.javaeye.com/blog/173923</a>&nbsp;
          发表时间: 2008年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          晚饭后和以前的同事在qq上交流开发心得，提到了目前自己的战斗力的话题，其间饶有兴趣的讨论，过后却觉得心里不舒服：<br /><br />一方面可能是因为自己技术和他差一个档次，觉得压力大<br />另一方面过后又想想IT技术无止境，人到底能走多远？脚下的路又在何方呢？？<br /><br />不错，IT技术日新月异，新技术，新语言，新的设计理念层出不穷。是否应该不停的去学习，去追逐新技术，新理念，不停的修炼，一直朝新的境界修为迈进，不停止的达到更强的战斗力呢？<br /><br />IT行业是如此，别的行业亦是如此。现今社会赚钱多少已经是衡量一个人成功与否的重要标准。百万富翁有之，千万富翁有之，亿万、十亿万、百亿万富翁亦大有人在！达到什么层次才是个头呢？人才会满足呢？<br /><br />也许我们正在追求着自己想要的技术，金钱，地位，权力，生活... , 也许正为得不到它而心烦意乱，焦躁不安...， 幕然回首，最初的起点却在灯火阑珊处...<br /><br />也许我们该换个角度思考问题，新技术既然层出不穷，我们既然永远也学不完，又何必再去追逐呢，还不如聊聊天，打打网游潇洒，倒也轻松自在，呵呵，何乐而不为？ 爱因斯坦为何却称其为猪栏的理想？<br /><br />人生即是无法停止的进步，逆水行舟，不进则退！<br /><br />永远不要把自己搁在什么位置上或者要求达到什么位置，不管将来达到什么境界！<br /><br />只管朝前走吧，管它路在何方呢？不走，哪来的路？<br /><br />写到此处，心中豁然开朗。
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/173923#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 19 Mar 2008 23:02:26 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/173923</link>
        <guid>http://cuishen.javaeye.com/blog/173923</guid>
      </item>
      <item>
        <title>股市名词解释（转）</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/144548" style="color:red;">http://cuishen.javaeye.com/blog/144548</a>&nbsp;
          发表时间: 2007年11月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">&nbsp;国家股：是指有权代表国家投资的部门或机构以国有资产向公司投资形成的股份，包括公司现有国有资产折算成的股份。</font></p>
<p><font face="Arial">　反弹：在股市上，股价呈不断下跌趋势，终因股价下跌速度过快而逆向回升到某一价位的调整现象称为反弹。一般来说，<br />
股票的反弹幅度要比下跌幅度小，通常是反弹到前一次下跌幅度的1/3左右时，又恢复原来的下跌趋势。</font></p>
<p><font face="Arial">&nbsp; 反转：股价朝原来趋势的相反方向移动，分为向上反转和向下反转。</font></p>
<p><font face="Arial">&nbsp; 回挡：在股市上，股价呈不断上涨趋势，终因股价上涨速度过快而反转回跌到某一价位，这一调整现象称为回挡。一般来说，<br />
&nbsp; 股票的回挡幅度要比上涨幅度小，通常是反转回跌到前一次上涨幅度的1/3左右时又恢复原来上涨趋势。</font></p>
<p><font face="Arial">&nbsp; 割肉：指高价买进股票后，大势下跌，为避免继续损失，低价赔本卖出股票。止损是割肉的一种，提前设立好止损价位，<br />
&nbsp; 防止更大的损失，是短线投资者应灵活运用的方法，新股民使用可防止深度套牢。</font></p>
<p><font face="Arial">&nbsp; 关卡：一般将整数位或黄金分割位或股民习惯上的心理价位称之为关卡。</font></p>
<p><font face="Arial">&nbsp; 轨道线：又称通道线或管道线，是基于趋势线的一种方法。在已经得到了趋势线后，通过第一个峰和谷可以作出这条趋势线的<br />
&nbsp; 平行线，这条平行线就是轨道线。轨道的作用是限制股价的变动范围，让它不能变得太离谱。一个轨道一旦得到确认，<br />
&nbsp; 那么价格将在这个通道里变动。对上面或下面的趋势线突破将意味着有一个大的变化。</font></p>
<p><font face="Arial">&nbsp; 换手率：是指在一定时间内市场中股票转手买卖的频率，是反映股票流通性的指标之一。计算公式为：<br />
&nbsp; 换手率=(某一段时间内的成交量/流通股数)&times;100%。一般来说，当股价处于低位时，当日换手率达到 4%左右时<br />
&nbsp; 应引起投资者的关注，而上升途中换手率达到20%左右时则应引起警惕。<br />
&nbsp; <br />
&nbsp; 价位：指股票买卖价格的升降单位。价位的高低随股票每股市价的不同而异。</font></p>
<p><font face="Arial">&nbsp; 低开：今日开盘价在昨日收盘价之下。</font></p>
<p><font face="Arial">&nbsp; 高开：今日开盘价在昨日收盘价之上。</font></p>
<p><font face="Arial">&nbsp; 平开：今日开盘价与昨日收盘价持平。</font></p>
<p><font face="Arial">&nbsp; 蓝筹股：指资本雄厚、公司发展良好、信誉优良的上市公司股票。<br />
&nbsp; <br />
&nbsp; 冷门股：指交易量小、流通性差、价格变动小的股票。</font></p>
<p><font face="Arial">&nbsp; 利多：是刺激股价上涨，对多头有利的因素和消息。</font></p>
<p><font face="Arial">&nbsp; 利空：是促使股价下跌，对空头有利的因素和消息。</font></p>
<p><font face="Arial">&nbsp;利空出尽：在证券市场上，股票价格因各种不利消息的影响而下跌，这种趋势持续一段时间，<br />
&nbsp;跌到一定程度，空方的力量开始减弱，投资者不再被这些利空的因素所影响，股票价格开始反弹上升，<br />
&nbsp;这种现象就被称作利空出尽。<br />
&nbsp;<br />
&nbsp;K线：发明于日本米市故又称为日本线，起源于日本。K线是一条柱状的线条，由影线和实体组成。<br />
&nbsp;影线在实体上方的部分叫上影线，下方的部分叫下影线，如图1-1所示。实体分阳线和阴线两种，<br />
&nbsp;又称红阳线和黑阴线。一条K线记录的就是某一种股票一天的价格变动范围。</font></p>
<p><font face="Arial">&nbsp;K线类技术分析方法：K线图是进行各种技术分析最基础的图表，K线类的研究是侧重若干天的K线组合情况，<br />
&nbsp;如二根、三根或者更多的K线组合来推测证券市场多空双方力量的对比，进而判断证券市场多空力量谁占优势<br />
&nbsp;，是暂时的，还是阶段性的。</font></p>
<p><font face="Arial">&nbsp;上影线：在K线图中，从实体向上延伸的细线叫上影线。在阳线中，它是当日最高价与收盘价之差；<br />
&nbsp;在阴线中，它是当日最高价与开盘价之差。由此，带有上影线的K线形态，可分为带上影线的阳线、<br />
&nbsp;带上影线的阴线和十字星。形态不同，多空力量的判断就不同。</font></p>
<p><font face="Arial">&nbsp;下影线：在K线图中，从实体向下延伸的细线叫下影线。在阳线中，它是当日开盘价与最低价之差；<br />
&nbsp;在阴线中，它是当日收盘价与最低价之差。 光头光脚的阳线和阴线：既没有上影线也没有下影线的<br />
&nbsp;阳线和阴线，如图1-2所示。</font></p>
<p><font face="Arial">&nbsp;日K线图：将每天的K线按时间顺序排列在一起，反映该股票自上市以来每天价格变动情况的K线图，如图1-7所示。</font></p>
<p><font face="Arial">&nbsp;移动平均线(MA)：是以道?琼斯的&ldquo;平均成本概念&rdquo;为理论基础，采用统计学中&ldquo;移动平均&rdquo;的原理，<br />
&nbsp;将一段时期内的股票价格平均值连成曲线，用来显示股价的历史波动情况，进而反映股价指数未来<br />
&nbsp;发展趋势的技术分析方法，它是道氏理论的形象化表述。<br />
&nbsp;<br />
&nbsp;移动平均线定义：&ldquo;平均&rdquo;是指最近n天收市价格的算术平均线；&ldquo;移动&rdquo;是指在计算中，始终采用最近n<br />
&nbsp;天的价格数据。因此，被平均的数组(最近n天的收市价格)随着新的交易日的更迭，逐日向前推移。<br />
&nbsp;在计算移动平均值时，通常采用最近n天的收市价格。把新的收市价格逐日地加入数组，<br />
&nbsp;而往前倒数的第n+1个收市价则被剔去，然后，再把新的总和除以n，就得到了新的一天的平均值(n天平均值)。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 计算公式：</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; MA=(C1+C2+C3+...+Cn)/N</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 【注释】C：某日收盘价&nbsp;&nbsp;&nbsp;&nbsp; N：移动平均周期</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 移动平均线依计算周期分为短期(如5日、10日)、中期(如30日)和长期(如60日、120日)移动平均线，如图1-8所示。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 移动平均线依算法分为算术移动平均线、线型加权移动平均线、阶梯形移动平均线、平滑移动平均线等多种。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;移动平均线所表示的意义：上升行情初期，短期移动平均线从下向上突破中长期移动平均线，形成的交叉叫黄金交叉。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; (1)预示股价将上涨：5日均线上穿10日均线形成的交叉，10日均线再上穿30日均线形成的交叉，底部出现的<br />
&nbsp;&nbsp;&nbsp; 三角形称为黄金交叉，如图1- 9所示。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; (2)短期移动平均线向下跌破中长期移动平均线形成的交叉叫做死亡交叉，预示股价将下跌。5日均线下穿<br />
&nbsp;&nbsp;&nbsp; 10日均线形成的交叉、10日均线再下穿30日均线形成的交叉，均为死亡交叉，如图1-10所示。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; (3)在上升行情进入稳定期，5日、10日、30日移动平均线从下而上依次顺序排列，向右上方移动，<br />
&nbsp;&nbsp;&nbsp; 称为多头排列，如图1-11所示。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; (4)在下跌行情中，5日、10日、30日移动平均线自上而下依次顺序排列，向右下方移动，称为空头排列，<br />
&nbsp;&nbsp;&nbsp; 预示股价将大幅下跌，如图1-12所示。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; (5)在上升行情中，股价位于移动平均线之上，走多头排列的均线可视为多方的防线。当股价回挡至移动<br />
&nbsp;&nbsp;&nbsp; 平均线附近，各条移动平均线依次产生支撑力量，买盘入场推动股价再度上升，这就是移动平均线的助涨作用。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; (6)在下跌行情中，股价在移动平均线的下方，呈空头排列的移动平均线可视为空方的防线。当股价<br />
&nbsp;&nbsp;&nbsp; 反弹到移动平均线附近时，便会遇到阻力，卖盘涌出，促使股价进一步下跌，这就是移动平均线的助跌作用。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; (7)移动平均线由上升转为下降出现最高点，和由下降转为上升出现最低点时，是移动平均线的转折点，<br />
&nbsp;&nbsp;&nbsp; 预示股价走势将发生反转。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 支撑线：又称为抵抗线。当股价跌到某个价位附近时，股价停止下跌，甚至有可能回升，这是由于多方<br />
&nbsp;&nbsp;&nbsp; 在此买入造成的。支撑线起阻止股价继续下跌的作用。这个起着阻止股价继续下跌的价位就是支撑线所在的位置。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; LOF：即上市型开放式基金，发行结束后，投资者既可以在指定网点申购与赎回基金份额，也可以在交易所买<br />
&nbsp; 卖该基金。LOF提供的是一个交易平台，基金公司可以基于这一平台进行封闭式基金转开放、开放式基金上市交易等，<br />
&nbsp; 但是不具备指数期货的特性。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; MBO：是英文Management Buy-out的缩写，意为管理层收购。主要是指公司的管理层利用借贷所融资本或股权交易<br />
&nbsp;&nbsp;&nbsp; 收购本公司的一种行为，通过收购使企业的经营者变成了企业的所有者。由于管理层收购在激励内部人员积极性、<br />
&nbsp;&nbsp;&nbsp; 降低代理成本、改善企业经营状况等方面起到了积极的作用，因而成为20世纪70～80年代流行于欧美国家的一种<br />
&nbsp;&nbsp;&nbsp; 企业收购方式。对中国企业而言，MBO最大的魅力在于能理清企业产权，实现所有者回归，建立企业的长期激励<br />
&nbsp;&nbsp;&nbsp; 机制，这也是中国MBO最鲜明的特色。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; QFII制度：即合格的外国机构投资者制度，是指允许经核准的合格外国机构投资者，在一定规定和限制下汇入<br />
&nbsp;&nbsp;&nbsp; 一定额度的外汇资金，并转换为当地货币，通过严格监管的专门账户投资当地证券市场，其资本利得、股息<br />
&nbsp;&nbsp;&nbsp; 等经批准后可转为外汇汇出的一种市场开放模式。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 崩盘：即证券市场上由于某种利空原因，出现了证券大量抛出的现象，导致证券市场价格无限度下跌，不知到<br />
&nbsp;&nbsp;&nbsp; 什么程度才停止。这种接连不断地大量抛出证券的现象，也称为卖盘大量涌现。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 超买：股价持续上升到一定高度，买方力量基本用尽，股价即将下跌。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 超卖：股价持续下跌到一定低点，卖方力量基本用尽，股价即将回升。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 成长股：指在有前途的产业中，利润增长率较高的企业股票。成长股的股价呈不断上涨趋势。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 成交笔数：指当天主动买入或卖出成交的次数。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 成交数量：指当天成交的股票数量。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 吃货：指庄家在低价时暗中买进股票。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 出货：指庄家在高价时，不动声色地卖出股票。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 大户：指大额投资人，例如拥有庞大资金的集团或个人。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 散户：就是买卖股票数量很少的小额投资者。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 跳空：指股市受到强烈利多或利空消息的刺激，股价开始大幅跳动。在上涨时，当天的开盘或最低价，<br />
&nbsp;&nbsp;&nbsp; 高于前一天的收盘价或最高价以上，称跳空而上；下跌时，当天的开盘或最高价，低于前一天的收盘价<br />
&nbsp;&nbsp;&nbsp; 或最低价，称跳空而下。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 骗线：大户利用股民们迷信技术分析数据、图表的心理，故意抬拉、打压股指，致使技术图表形成一定<br />
&nbsp;&nbsp;&nbsp; 线型，引诱股民大量买进或卖出，从而达到他们大发其财的目的，由于这种欺骗性造成的技术图表线型称为骗线。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 填权：除权后股价上升，将除权差价补回，称为填权。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 配股：公司增发新股时，按股东持有人份数，以增发价分配给股东认购。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 派息：股票前一日收盘价减去上市公司发放的股息称为派息。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 含权：凡是某只股票有权送配而未送配的均称含权。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 跌破：股价冲过关卡向下突破称为跌破。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 跌势：股价在一段时间内不断朝新低价方向移动。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 跌停板：证券交易当天股价的最低限度(如普通股票为10%限制，ST股票为5%限制)称为跌停板，<br />
&nbsp;&nbsp;&nbsp; 跌停板时的股价称跌停板价。一般说，开市即跌停的股票，于第二日仍有可能惯性下跌，<br />
&nbsp;&nbsp;&nbsp; 尾盘突然跌停的股票，庄家有骗线的可能，可关注。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 多翻空：原本看好行情的买方，看法改变，变为卖方。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 多杀多：买入股票后又立即卖出股票的做法称为多杀多。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 多头：指股票成交中的买方。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 多头市场：就是股票价格普遍上涨的市场。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 空翻多：原本打算卖出股票的一方，看法改变，变为买方。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 空头：指股票成交中的卖方。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 死多头：是看好股市前景，买进股票后，如果股价下跌，宁愿放上几年，不赚钱绝不脱手。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 空头市场：股价呈长期下降趋势的市场。空头市场中，股价的变动情况是大跌小涨，亦称熊市。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 抢短线：预期股价上涨，先低价买进后再在短期内以高价卖出。预期股价下跌，先高价卖出再伺机在短期内以低价再回购。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 股本：所有代表企业所有权的股票，包括普通股和优先股。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 社会公众股：是指在社会募集方式情况下，股份公司发行的股份，除了由发起人认购一部分外，<br />
&nbsp;&nbsp;&nbsp; 其余向社会公众公开发行，由个人认购的股份。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 法人股：是指企业法人或具有法人资格的事业单位和社会团体，以其依法可支配的资产投入公司形成的非上市流通的股份。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 公众股：是指社会公众依法以其拥有的财产投入公司时形成的可上市流通的股份。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; </font></p>
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/144548#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 28 Nov 2007 15:58:11 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/144548</link>
        <guid>http://cuishen.javaeye.com/blog/144548</guid>
      </item>
      <item>
        <title>股市十大定律（转）</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/142312" style="color:red;">http://cuishen.javaeye.com/blog/142312</a>&nbsp;
          发表时间: 2007年11月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">中国股市投资的十大必然定律</font></p>
<p><font face="Arial"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一定律：闻利好消息应坚决斩仓，此时态度之迅速决绝，非用壮士断臂一词不足以形容。 </font></p>
<p><font face="Arial">　　第二定律：闻利空消息可倾囊一搏，尤其要大力买进ST家族之宠儿，公司越发布股价异动警告，越宣布亏损严重，越不需理会，或者干脆视为利好消息可也。简言之，公司越亏损，股票越易涨，也即负利润率与股价成正比。 </font></p>
<p><font face="Arial">　　第三定律：专家意见与选股错误率呈正相关。越听专家意见，越容易选错股。这倒不是说专家都是骗子。一般情形是，若专家推荐两只潜力股，你斟酌再三，选中一只。未选中的偏偏大涨，你买的那只绝对不涨，而且必跌无疑。 </font></p>
<p><font face="Arial">　　第四定律：买入时机肯定错误。无论多好的股票，无论大盘涨势多么肯定，你一买入必下跌。 </font></p>
<p><font face="Arial">　　第五定律：卖出时机绝对错误。持股一年甚至两年，非但不涨而且大跌，于是忍痛斩仓。但今日出局，该股明日十有八九涨停矣；而且十有八九要连续涨停数日。其停止上涨的时间，一般在你追高后之一小时内，而且随即大幅回调，再度令你套牢。 </font></p>
<p><font face="Arial">　　第六定律：鼓吹做短线的股评家一般是券商的喉舌；鼓吹做长线的专家大多是庄家的哥们，或者就是庄家本人。故中国股民欲不受人摆布，以做中线为宜。何谓中线？定律曰：中线的时段长度，一般正好是你买入的那家公司从盛而衰直至破产，开始有谣传将被收购这样一个较长的周期。 </font></p>
<p><font face="Arial">　　第七定律：股市指数变化与绝大多数股民所持股票价格的变化没有关系。即，指数上升而很多个股价格下降。 </font></p>
<p><font face="Arial">　　第八定律：公司业绩与公司经营状况无关，一般是根据大市特别是该公司股票的表现而确定年报的赢利状况。在帐面上做业绩，可以避免被摘牌、被警告、被股民抛弃。 </font></p>
<p><font face="Arial">　　第九定律：决定股票价格的既非赢利水平，也非供求关系，而是题材。题材决定价格，犹如文学上的题材决定作品艺术水准。故从审美意义上，中国股市可以称为社会主义的革命浪漫主义的证券市场。 </font></p>
<p><font face="Arial">　　第十定律：由以上所有定律可以得出最后也是最重要的定律：对一切股市，基本上均应从相反方面理解并以此为投资决策之依据。此种决策之所以正确，乃在于可保证投资者不亏本。当然也不会赢利。因此，零收益率乃是中国股民的理想境界。</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/142312#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 Nov 2007 14:33:00 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/142312</link>
        <guid>http://cuishen.javaeye.com/blog/142312</guid>
      </item>
      <item>
        <title>Log4J使用完全手册(转)</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/142050" style="color:red;">http://cuishen.javaeye.com/blog/142050</a>&nbsp;
          发表时间: 2007年11月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Log4J是Apache的一个开放源代码项目(<a href="http://logging.apache.org/log4j/docs/"><font color="#73af1d">http://logging.apache.org/log4j/docs/</font></a>)，它是一个日志操作包。通过使用Log4J,可以指定日志信息输出的目的地，控制每一条日志的输出格式，定义日志信息的级别。所有这些功能通过一个配置文件灵活进行配置。
<p>一、LOG4J组成</p>
<p>&nbsp;&nbsp;&nbsp; LOG4J主要由三大组件组成：<br />
&nbsp;&nbsp;&nbsp; . Logger: 决定什么日志信息应该被输出、什么日志信息应该被忽略；<br />
&nbsp;&nbsp;&nbsp; . Appender: 指定日志信息应该输出到什么地方, 这些地方可以是控制台、文件、网络设备；<br />
&nbsp;&nbsp;&nbsp; . Layout: 指定日志信息的输出格式；</p>
<p>&nbsp;&nbsp;&nbsp; 一个Logger可以有多个Appender，也就是说日志信息可以同时输出到多个设备上，每个Appender对应<br />
&nbsp;&nbsp;&nbsp; 一种Layout(示例见下图)。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ↗&nbsp; Appender1&nbsp; &rarr;&nbsp; Layout<br />
&nbsp;&nbsp;&nbsp;&nbsp; ／&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; Logger<br />
&nbsp;&nbsp;&nbsp;&nbsp; ﹨ &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ↘&nbsp; Appender2&nbsp; &rarr;&nbsp; Layout</p>
<p><br />
二、Logger组件</p>
<p>&nbsp;&nbsp;&nbsp; 1. Logger组件提供的方法：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger组件是LOG4J的核心组件，它代表了Log4J的日志记录器，它能够对日志信息进行分类筛选。它由org.apache.log4j.Logger类实现，提供了如下方法：</p>
<p>&nbsp;</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;org.apache.log4j; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Logger&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Creation&nbsp;&amp;&nbsp;retrieval&nbsp;methods: </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Logger&nbsp;getRootLogger(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Logger&nbsp;getLogger(String&nbsp;name); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;printing&nbsp;methods: </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;debug(Object&nbsp;message); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;info(Object&nbsp;message); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;warn(Object&nbsp;message); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;error(Object&nbsp;message); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;fatal(Object&nbsp;message); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;generic&nbsp;printing&nbsp;method: </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;log(Priority&nbsp;p,&nbsp;Object&nbsp;message); &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;&nbsp;&nbsp; 2. 在配置文件中配置Logger组件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可在Log4J配置文件中配置自己的Logger组件，示例：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.logger.myLogger=WARN</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上代码定义了一个Logger组件，名称为myLogger，日志级别为WARN。<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; 3. 日志级别种类：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一共有五种，级别由高到低依次是：fatal、error、warn、info、debug。获得Logger实例后，我们可调用以下方法之一输出日志信息：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void debug(Object message);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出debug级别的日志信息；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void info(Object message);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出info级别的日志信息；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void warn(Object message);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出warn级别的日志信息；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void error(Object message);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出error级别的日志信息；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void fatal(Object message);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出fatal级别的日志信息；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void log(Priority p, Object message);//输出参数Priority指定级别的日志信息；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上方法只有当它的级别大于或等于Logger组件配置的日志级别时才调用。以前面我们配置的myLogger为例，它的日志级别为WARN, 那么在程序中，它的warn()、error()、fatal()方法会被执行。对于log()方法，只有当它的参数Priority指定的日志级别大于或等于WARN时，它才会被执行。</p>
<p>&nbsp;&nbsp;&nbsp; 4. 为什么需要对日志进行分级？<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在写程序的时候，为了调试程序，我们会在很多出错的地方输出大量的日志信息。当程序调试完，不需要这些信息时，将程序中这些输出日志信息代码删除吗？这样费时费力，对于大型程序几乎不可行。通过对日志分级，假如不想输出WARN级别的日志信息，则Logger组件的级别调高即可，省时省心。</p>
<p>&nbsp;&nbsp;&nbsp; 5. Logger组件的继承性</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log4J提供了一个root Logger，它是所有Logger组件的&ldquo;祖先&rdquo;,它永远存在，且不能通过名字检索或引用，通过Logger.getRootLogger()方法取得它。配置root Logger代码：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.rootLogger=INFO,console</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可在配置文件中方便地配置存在继承关系的Logger组件，凡是在符号&ldquo;.&rdquo;后面的组件都会成为在符号&ldquo;.&rdquo;前面的Logger组件的子类。例如：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.apache.myLogger=WARN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.apache.myLogger.mySonLogger=,file</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上代码中, mySonLogger是myLogger的子类Logger组件。Logger组件的继承关系：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 如果子类Logger组件没有定义日志级别，则将继承父类的日志级别;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 如果子类Logger组件定义了日志级别，就不会继承父类的日志级别;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 黙认情况下，子类Logger组件会继承父类所有的Appender，把它们加入到自己的Appener;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 如果把子类Logger组件的additivity标志设为false，那么它就不会继承父类Appender。additivity标志&nbsp;默认值为false；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上配置的三个Logger继承关系示例如图：<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root Logger: 日志级别=INFO&nbsp; appender清单=console<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &uarr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger: 日志级别=WARN appender清单=null<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &uarr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger: 日志级别=null appender清单=file </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这三个Logger组件实际日志级别和Appender如下表：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger组件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日志级别&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Appender清单<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root Logger&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console(继承)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN(继承)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file，console(继承)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
三、Appender组件</p>
<p>&nbsp;&nbsp;&nbsp; Appender组件决定将日志信息输出到什么地方。支持以下目的地：<br />
&nbsp;&nbsp;&nbsp; . 控制台(Console);<br />
&nbsp;&nbsp;&nbsp; . 文件(File);<br />
&nbsp;&nbsp;&nbsp; . GUI组件(GUI component);<br />
&nbsp;&nbsp;&nbsp; . 套接口服务器(Remote socket server);<br />
&nbsp;&nbsp;&nbsp; . NT的事件记录器(NT Event Logger);<br />
&nbsp;&nbsp;&nbsp; . UNIX Syslog守护进程(Remote UNIX Syslog daemon);</p>
<p>&nbsp;&nbsp;&nbsp; 一个Logger可同时对应多个Appender，示例：myLogger配置二个Appender: 一个file, 一个是console：</p>
<p>&nbsp;&nbsp;&nbsp; log4j.logger.myAppender=WARN,file,console</p>
<p>&nbsp;&nbsp;&nbsp; log4j.appender.file=org.apache.log4j.RollingFileAppender<br />
&nbsp;&nbsp;&nbsp; log4j.appender.file.File=log.txt</p>
<p>&nbsp;&nbsp;&nbsp; log4j.apender.console=org.apache.log4j.ConsoleAppender</p>
<p>四、Layout组件</p>
<p>&nbsp;&nbsp;&nbsp; Layout组件决定日志输出格式，有以下几种类型：<br />
&nbsp;&nbsp;&nbsp; . org.apache.log4j.HTMLLayout(以HTML表格形式布局);<br />
&nbsp;&nbsp;&nbsp; . org.apache.log4j.PatternLayout(可以灵活地指定布局模式);<br />
&nbsp;&nbsp;&nbsp; . org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串);<br />
&nbsp;&nbsp;&nbsp; . org.apache.log4j.TTCCLayout(包含日志产生的时间、线程和类别等信息);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 为名称为console的Appender配置SimpleLayout，代码如下：</p>
<p>&nbsp;&nbsp;&nbsp; log4j.appender.console.layout=org.apache.log4j.SimpleLayout</p>
<p>&nbsp;&nbsp;&nbsp; 输出日志格式如下：</p>
<p>&nbsp;&nbsp;&nbsp; WARN - This is a log message from the myLogger<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 为名称为file的Appender配置PatternLayout，代码如下：</p>
<p>&nbsp;&nbsp;&nbsp; log4j.appender.file.layout=org.apache.log4j.PatternLayout<br />
&nbsp;&nbsp;&nbsp; log4j.appender.file.layout.ConversionPattern=%t %p - %m%n</p>
<p>&nbsp;&nbsp;&nbsp; 输出日志格式如下：</p>
<p>&nbsp;&nbsp;&nbsp; THREAD-1 WARN - This is a log message from the myLogger</p>
<p>&nbsp;&nbsp;&nbsp; PatternLayout让开发者依照ConversionPattern定义输出格式。ConversionPattern中一些指定日志内容和格式的预定义符号说明如下：</p>
<p>&nbsp;&nbsp;&nbsp; 符号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述<br />
&nbsp;&nbsp;&nbsp; %r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 自程序开始后消耗的毫秒数<br />
&nbsp;&nbsp;&nbsp; %t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示日志记录请求生成的线程<br />
&nbsp;&nbsp;&nbsp; %p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示日专语句的优先级<br />
&nbsp;&nbsp;&nbsp; %r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与日志请求相关的类别名称<br />
&nbsp;&nbsp;&nbsp; %c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日志信息所在的类名<br />
&nbsp;&nbsp;&nbsp; %m%n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示日志信息的内容</p>
<p>五、Log4J的基本用法</p>
<p>&nbsp;&nbsp;&nbsp; 1. 定义配置文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log4J支持二种配置文件格式：XML和Java属性文件(采用&ldquo;键=值&rdquo;形式)。以下为Java属性文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 格式配置文件：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 配置Logger组件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置root Logger语法为：log4j.rootLogger=[priority],appenderName,appenderName,...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置自定义Logger组件语法为：log4j.logger.loggerName=[priority],appenderName,appenderName,...</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中：priority为日志级别，可选值包括FATAL、ERROR、WARN、INFO、DEBUG、ALL；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; appenderName指定Appender组件，可指定多个;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 配置Appender组件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置日志信息输出目的地Appender, 语法为：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName=fully.ualified.name.of.appender.class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.option1=value1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.optionN=valueN</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log4J提供的Appender有以下几种：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a. org.apache.log4j.ConsoleAppender(控制台);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b. org.apache.log4j.FileAppender(文件);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c. org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d. org.apache.log4j.RollingFileAppender(文件大小到指定尺寸产生一个新的文件);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e. org.apache.log4j.WriteAppender(将日志信息以流格式发送到任意指定地方);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 配置Layout组件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置Layout组件语法为：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.layout=fully.ualified.name.of.appender.class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.layout.option1=value1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.layout.optionN=valueN</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面为一配置文件示例，文件名为log4j.properties：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ## LOGGERS ##</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #configure root logger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.rootLogger=INFO,console<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define a logger named myLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.logger.myLogger=WARN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define a second logger that is a child to myLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.logger.myLogger.mySonLogger=,file</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ## APPENDERS ##</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define an appender named console, which is set to be a ConsoleAppender<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.console=org.apache.log4j.ConsoleAppender</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # define an appender named file, which is set to be a RollingFileAppender<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.file=org.apache.log4j.FileAppender<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.file.File=log.txt</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ## LAYOUTS ##<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # assian a SimpleLayout to console appender<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.console.layout=org.apache.log4j.SimpleLayout</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # assian a PatternLayout to file appender<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.file.layout=org.apache.log4j.PatternLayout<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.file.layout.ConversionPattern=%t%p-%m%n<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 2. 程序中使用Log4j</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 获得日志记录器：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获得rootLogger：Logger rootLogger=Logger.getRootLogger();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获得自定义Logger：Logger myLogger = Logger.getLogger(&quot;log4j.logger.myLogger&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 读取日志记录器，配置Log4J环境;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a. BasicConfigurator.configure(): 自动快速地使用默认Log4J环境;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b. Property.configurator.configure(String configFilename): 读取使用Java属性格式的配置文件并配置Log4J环境；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c. DOMConfigurator.configure(String filename): 读取XML形式的配置文件并配置LOG4J环境;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 输出日志信息;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在程序代码中需要生成日志的地方，调用Logger的各种输出日志方法输出不同级别的日志，例如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.debug(&quot;Thie is a log message from the &quot; + myLogger.getName());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面为一使用Log4J的程序，程序名为Test.java：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>&nbsp;</span><span class="keyword">import</span><span>&nbsp;org.apache.log4j.Logger; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">import</span><span>&nbsp;org.apache.log4j.PropertyConfigurator; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Test&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Get&nbsp;an&nbsp;instance&nbsp;of&nbsp;the&nbsp;myLogger </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger&nbsp;myLogger&nbsp;=&nbsp;Logger.getLogger(</span><span class="string">&quot;myLogger&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Get&nbsp;an&nbsp;instance&nbsp;of&nbsp;the&nbsp;childLogger </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger&nbsp;mySonLogger&nbsp;=&nbsp;Logger.getLogger(</span><span class="string">&quot;myLogger.mySonLogger&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Load&nbsp;the&nbsp;proerties&nbsp;using&nbsp;the&nbsp;PropertyConfigurator </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyConfigurator.configure(</span><span class="string">&quot;log4j.properties&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Log&nbsp;Messages&nbsp;using&nbsp;the&nbsp;Parent&nbsp;Logger </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myLogger.debug(</span><span class="string">&quot;Thie&nbsp;is&nbsp;a&nbsp;log&nbsp;message&nbsp;from&nbsp;the&nbsp;&quot;</span><span>&nbsp;+&nbsp;myLogger.getName()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myLogger.info(</span><span class="string">&quot;Thie&nbsp;is&nbsp;a&nbsp;log&nbsp;message&nbsp;from&nbsp;the&nbsp;&quot;</span><span>&nbsp;+&nbsp;myLogger.getName()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myLogger.warn(</span><span class="string">&quot;Thie&nbsp;is&nbsp;a&nbsp;log&nbsp;message&nbsp;from&nbsp;the&nbsp;&quot;</span><span>&nbsp;+&nbsp;&nbsp;myLogger.getName()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myLogger.error(</span><span class="string">&quot;Thie&nbsp;is&nbsp;a&nbsp;log&nbsp;message&nbsp;from&nbsp;the&nbsp;&quot;</span><span>&nbsp;+&nbsp;myLogger.getName()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myLogger.fatal(</span><span class="string">&quot;Thie&nbsp;is&nbsp;a&nbsp;log&nbsp;message&nbsp;from&nbsp;the&nbsp;&quot;</span><span>&nbsp;+&nbsp;myLogger.getName()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mySonLogger.debug(</span><span class="string">&quot;Thie&nbsp;is&nbsp;a&nbsp;log&nbsp;message&nbsp;from&nbsp;the&nbsp;&quot;</span><span>&nbsp;+&nbsp;mySonLogger.getName()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mySonLogger.info(</span><span class="string">&quot;Thie&nbsp;is&nbsp;a&nbsp;log&nbsp;message&nbsp;from&nbsp;the&nbsp;&quot;</span><span>&nbsp;+&nbsp;mySonLogger.getName()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mySonLogger.warn(</span><span class="string">&quot;Thie&nbsp;is&nbsp;a&nbsp;log&nbsp;message&nbsp;from&nbsp;the&nbsp;&quot;</span><span>&nbsp;+&nbsp;&nbsp;mySonLogger.getName()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mySonLogger.error(</span><span class="string">&quot;Thie&nbsp;is&nbsp;a&nbsp;log&nbsp;message&nbsp;from&nbsp;the&nbsp;&quot;</span><span>&nbsp;+&nbsp;mySonLogger.getName()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mySonLogger.fatal(</span><span class="string">&quot;Thie&nbsp;is&nbsp;a&nbsp;log&nbsp;message&nbsp;from&nbsp;the&nbsp;&quot;</span><span>&nbsp;+&nbsp;mySonLogger.getName()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序运行结果为:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger.mySonLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger.mySonLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger.mySonLogger</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另在Test.class所在的目录下看到一个log.txt文件，内容如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger.mySonLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger.mySonLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger.mySonLogger</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如将配置文件log4j.properties中语句</p>
<p>&nbsp;log4j.logger.myLogger.mySonLogger=,file</p>
<p>&nbsp;改为</p>
<p>&nbsp;log4j.logger.myLogger.mySonLogger=,file,console</p>
<p>&nbsp;再次运行程序，结果如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger.mySonLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger.mySonLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger.mySonLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger.mySonLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger.mySonLogger&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger.mySonLogger</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger的日志在控制台上输出了二次，这是因为mySonLogger继承了父类console Appender，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本身又定义了一个console Appender, 因而有二个console Appender。</p>
<p>六、在web应用中使用Log4J</p>
<p>&nbsp;&nbsp;&nbsp; 创建一个Servlet，在它初始化方法中读取Log4J配置文件并配置Log4J环境，这个Servlet在Web应用启<br />
&nbsp;&nbsp;&nbsp; 动时候被加载和初始化，然后就可在其它Web组件中获取Logger对象并输出日志。</p>
<p>&nbsp;&nbsp;&nbsp; 1. 创建用于配置Log4J环境的Servlet</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;javax.servlet.*; &nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.*; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.*; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.util.*; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.apache.log4j.PropertyConfigurator; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Log4JServlet&nbsp;</span><span class="keyword">extends</span><span>&nbsp;HttpServlet&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;init()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ServletException&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;path&nbsp;=&nbsp;getServletContext().getRealPath(</span><span class="string">&quot;/&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//getInitParameter(&quot;propfile&quot;)方法从web.xml文件中读取Log4J配置文件的名字&quot;profile&quot;。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;propfile&nbsp;=&nbsp;path&nbsp;+&nbsp;getInitParameter(</span><span class="string">&quot;propfile&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyConfigurator.configure(propfile); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该Servlet在web.xml中的配置如下：<br />
</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>log4jServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>Log4JServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>propfile</span><span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>/WEB-INF/log4j.properties</span><span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">load-on-startup</span><span class="tag">&gt;</span><span>1</span><span class="tag">&lt;/</span><span class="tag-name">load-on-startup</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>2. 在login.jsp中输出日志<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;<a href="mailto:%@page"><font color="#73af1d">%@page</font></a> import=&quot;org.apache.log4j.Logger&quot;%&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;login&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/head&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger myLogger = Logger.getLogger(&quot;myLogger&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger mySonLogger = Logger.getLogger(&quot;myLogger.mySonLogger&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.debug(&quot;Thie is a log message from the &quot; + myLogger.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.info(&quot;Thie is a log message from the &quot; + myLogger.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.warn(&quot;Thie is a log message from the &quot; +&nbsp; myLogger.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.error(&quot;Thie is a log message from the &quot; + myLogger.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.fatal(&quot;Thie is a log message from the &quot; + myLogger.getName());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.debug(&quot;Thie is a log message from the &quot; + mySonLogger.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.info(&quot;Thie is a log message from the &quot; + mySonLogger.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.warn(&quot;Thie is a log message from the &quot; +&nbsp; mySonLogger.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.error(&quot;Thie is a log message from the &quot; + mySonLogger.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.fatal(&quot;Thie is a log message from the &quot; + mySonLogger.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form name=&quot;loginForm&quot; method=&quot;post&quot; action=&quot;dispatcher&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username: &lt;input type=&quot;text&quot; name=&quot;username&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password: &lt;input type=&quot;text&quot; name=&quot;password&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;submit&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 3. 发布运行使用Log4J的web应用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1) 将Log4J的JAR文件拷贝至目录：&lt;WEB应用所在目录&gt;/WEB-INF/lib<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2) 创建Log4J的配置文件log4j.properties, 存放目录为：&lt;WEB应用所在目录&gt;/WEB-INF。内容同前面配置文件示例。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3) 编译Log4JServlet, 存放至目录： &lt;WEB应用所在目录&gt;/WEB-INF/classes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4) 修改web.xml文件，加入以下内容：<br />
</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>log4jServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>Log4JServlet</span><span class="tag">&lt;/</span><span class="tag-name">servlet-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>profile</span><span class="tag">&lt;/</span><span class="tag-name">param-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>/WEB-INF/log4j.properties</span><span class="tag">&lt;/</span><span class="tag-name">param-value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">init-param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">load-on-startup</span><span class="tag">&gt;</span><span>1</span><span class="tag">&lt;/</span><span class="tag-name">load-on-startup</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">servlet</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5) 启动服务器，访问login.jsp页面，在服务器控制台上看到如下日志：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger.mySonLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger.mySonLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger.mySonLogger</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另在&lt;WEB应用所在目录&gt;/WEB-INF目录下看到一个log.txt文件，内容如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger.mySonLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger.mySonLogger<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger.mySonLogger </p>
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/142050#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 20 Nov 2007 15:04:54 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/142050</link>
        <guid>http://cuishen.javaeye.com/blog/142050</guid>
      </item>
      <item>
        <title>神雕侠侣之虞山论剑（原创）</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/141019" style="color:red;">http://cuishen.javaeye.com/blog/141019</a>&nbsp;
          发表时间: 2007年11月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>继我们康时的恶搞天王推出真人版恶搞<a href="http://cuishen.javaeye.com/blog/138546">《新沙家浜故事》</a>后，由我们的小杨同学担当导演创作了姐妹片---《<font face="Arial">神雕侠侣之虞山论剑</font>》，不仅邀请了<a href="http://cuishen.javaeye.com/blog/138546">《新沙家浜故事》</a>的原班人马参加演出，而且在本剧中还有其他一些康时的员工客串演出哦，可谓阵容强大，情节感人，不容错过！小弟不仅在本剧中继续担任重要角色，而且仍旧由我为大家献上本剧的flash版本电影，供网友们观赏或下载，希望大家能够喜欢！</p>
<p>本剧观赏地址：</p>
<p><font face="Arial"><a href="http://www.flashempire.com/home/flash_view.php?userid=1585123&amp;id=241976">http://www.flashempire.com/home/flash_view.php?userid=1585123&amp;id=241976</a></font></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/141019#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Nov 2007 22:31:58 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/141019</link>
        <guid>http://cuishen.javaeye.com/blog/141019</guid>
      </item>
      <item>
        <title>爱你恨你沙家浜---新沙家浜故事（超搞笑）</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/138546" style="color:red;">http://cuishen.javaeye.com/blog/138546</a>&nbsp;
          发表时间: 2007年11月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>公元2007年11月3号，我们康时信息系统有限公司的同仁们坐着大巴，前往我们此行的目的地---〉太阳系---〉地球---〉中国（china）---〉上海（ShangHai）西北边的常熟（ChangShu）的近郊的沙家浜，在那里，由我们康时的恶搞天王何行强（何总）导演了一出----新沙家浜的故事----的闹剧，该剧已经由我为大家制作成了flash电影，供大家免费下载观赏，记住！！！千万别笑掉大牙啊，嘿嘿。。。</p>
<p>想一睹为快的朋友，请点击以下连接：</p>
<p><font face="Arial"><a href="http://www.flashempire.com/home/flash_view.php?userid=1585123&amp;id=238199">http://www.flashempire.com/home/flash_view.php?userid=1585123&amp;id=238199</a></font></p>
<p>&nbsp;</p>
<p>当然也提供该影片的下载：</p>
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/138546#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 Nov 2007 15:59:00 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/138546</link>
        <guid>http://cuishen.javaeye.com/blog/138546</guid>
      </item>
      <item>
        <title>Tomcat无法访问局域网的问题</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/107327" style="color:red;">http://cuishen.javaeye.com/blog/107327</a>&nbsp;
          发表时间: 2007年07月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          近日在做一个项目，用的是最流行的struts + spring + hibernate三层架构，服务器用的是Tomcat。在这个项目里需要在中间层写方法访问局域网，我在本地测试的时候，已经在命令行里用Dos命令net use把网络打通了，在用JUnit做单元测试的时候可以顺利访问局域网中的文件，但是开启tomcat服务器在IE中测试的时候就抛了null point异常，我觉的很奇怪，又仔仔细细的把代码检查了一遍，会不会是中间层传递参数的问题呢，我于是在报错的方法里打印传进来的参数，发现参数是正确的传进来了，看来不是这个问题，我又注意到本机装了金山网镖，会不会是它做了限制呢，我打开它的规则，发现关于tomcat访问网络，不管是internet还是局域网都是允许，看来也不是这个问题；于是上网查解决方案，可是网上关于这方面的主题找不到，就在我百思不得其解的时候，我的同学msn上告诉我他也遇到过类似的问题，只要用tomcat的安装目录下的bin目录下的<font face="Arial">startup.bat启动tomcat就能解决无法访问局域网中文件的问题，我试了一下，问题确实解决了，只可惜这样启动tomcat，日志打印在控制台里</font>
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/107327#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 31 Jul 2007 11:21:26 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/107327</link>
        <guid>http://cuishen.javaeye.com/blog/107327</guid>
      </item>
      <item>
        <title>变形金刚观后感</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/107307" style="color:red;">http://cuishen.javaeye.com/blog/107307</a>&nbsp;
          发表时间: 2007年07月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>2007-7-29 周日&nbsp; 骄阳似火</p>
<p>这段时间各大媒体纷纷报道，炒作；仅仅两周票房收入就超过几个亿的美国大片---变形金刚，早以让偶按捺不住。自己也是80后人，擎天柱带领的博派更是伴我渡过了美好的童年，现在真人版的放映了，偶怎能错过如此良机。自己早上网查过了，7月29号礼拜天早上8点三刻在第一八佰伴十楼的新世纪影城有半价场，票价只要30元，于是在前一天的晚上和同事约好次日一同去看。</p>
<p>礼拜天我起了个大早，八点半赶到八百伴，我的同事早已经等在那里了，没想到放映两周后依然碰到了排队买票的长龙，同事比我还早到半小时，排到他的时候只剩最后一张票了，没办法只好买了10点半那一场的票。。。</p>
<p>两个人好容易等到10点半，进场后是座无虚席，期待已久的大片终于开始放映了。</p>
<p>影片一开始就是狂派袭击美国某军事基地，那架直升机变形后蛮酷的，就是看不清它用的什么武器，接下来出场的是追杀生还的美国大兵的狂派的一只巨型蝎子，这只巨蝎后来在美军战斗机的轰炸下断了尾巴后钻入砂土消失了。高中生--萨姆在课堂上拍卖他曾祖父的遗物----一副眼镜，这幅眼镜里藏着能量块的秘密，而他父亲给他买了一辆破旧不堪的汽车，这辆汽车正是来保护他的博派大黄蜂的变形，影片到后面就是博派和狂派的街头巷战。。。</p>
<p>偶承认场面确实很震撼，很壮观，特效很逼真，影院里的音响效果也很震撼，但是看到后面就是单一的打斗，渐渐就成了视觉疲劳。长达两个半小时的电影我不知道自己是怎么撑下来的，很奇怪看到后面就盼着它快点结束。等出了放映厅，许久自己的脑袋和耳朵还嗡嗡作响，而影片到底讲了些什么好像都记不大清了。。。</p>
<p>两天后回想起这部大片，我觉得自己已经对它么有多少印象了，完全是只图赚钱的商业娱乐大片，全剧没有曲折动人的情节，可以这么说情节是乱七八糟，或者说根本没有情节，有的只是华丽的特效和贯穿始末的无休止的打斗。不知道为什么，可能是特效和打斗场景出现在太多的美国大片里，已经让观众看的厌倦了，或者观众的胃口也越来越大，像变形金刚这样的大片，虽然特效可能比以往任何大片都有过之而无不及，但是两个半小时的打斗，看到最后总归有些疲惫。再说说变形金刚里面的人物，可以说全剧没有什么给人留下深刻印象的人物性格，更糟的是擎天柱后来还被威震天踩在脚下无还手之力，还是人类救了它，这是什么该死的剧本阿，太有损擎天柱的形象了！唉，要是变形金刚能像T2或者异形这样的经典科幻影片那样兼具引人入胜的情节，华丽的特效，个性鲜明的人物，或许能给观众留下更深刻的印象。</p>
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/107307#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 31 Jul 2007 10:47:38 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/107307</link>
        <guid>http://cuishen.javaeye.com/blog/107307</guid>
      </item>
      <item>
        <title>神奇的java反射机制</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/106476" style="color:red;">http://cuishen.javaeye.com/blog/106476</a>&nbsp;
          发表时间: 2007年07月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近在开发一个小型的j2ee项目，沿用以前公司成熟的struts + spring + hibernate三层架构，只是做些修改，加一些新的业务规则进去（这也让我这个新手体验到了面向对象的可重用性的优点），在开发的过程中我无意中发现以前公司的项目中spring托管的中间层的类里面都用的是private的默认构造方法，我感到奇怪，难道具有私有的构造方法的类也能new一个对象出来？我立马在msn上请教了我的师傅--公司的前辈，回答说是用java的反射机制，于是我上网搜索了有关java反射的资料，对java的反射机制也有了些了解，但是这些毕竟都是别人说的，我自己还需亲自验证一下，于是有了下面的代码：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.ref; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;A&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;A()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;This&nbsp;is&nbsp;a&nbsp;private&nbsp;Constructor&quot;</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;A(String&nbsp;str,&nbsp;int&nbsp;i)&nbsp;{ </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;str&nbsp;=&nbsp;&quot;&nbsp;+&nbsp;str); </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;i&nbsp;=&nbsp;&quot;&nbsp;+&nbsp;i); </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;} </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.ref; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.lang.reflect.Method; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.lang.reflect.Constructor; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TestReflect&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String&nbsp;args[])&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//产生class </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;a&nbsp;=&nbsp;Class.forName(</span><span class="string">&quot;com.ref.A&quot;</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//返回&nbsp;Constructor&nbsp;对象的一个数组，这些对象反映此&nbsp;Class&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//对象表示的类声明的所有构造方法。它们是公共、保护、默认 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//（包）访问和私有构造方法。返回数组中的元素没有排序， </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//也没有任何特定的顺序。如果该类存在一个默认构造方法， </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//则它包含在返回的数组中。如果此&nbsp;Class&nbsp;对象表示一个接口、 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//一个基本类型、一个数组类或&nbsp;void，则此方法返回一个长度为&nbsp;0&nbsp;的数组。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructor&nbsp;[]&nbsp;constructs&nbsp;=&nbsp;a.getDeclaredConstructors(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;constructs.length;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(constructs[i].getName()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//将Constructor对象的&nbsp;accessible&nbsp;标志设置为true </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructs[i].setAccessible(</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructs[i].newInstance(</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>该程序运行后在控制台打印如下信息：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Arial"><strong>com.ref.A<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This is a private Constructor</strong></font></p>
<p>事实胜于雄辩，看来java的反射机制确实能new出一个带有private构造方法的对象来，类似的，像getDeclaredMethods() 和getDeclaredFields()都可以得到private的元素。这个也说明了单例模式在语法角度是不能保证的。完全可以调用private的构造方法生成一个对象。访问级别(access level)仅仅是编译期检查的项目，在运行期没有限制作用。</p>
<p>我没有看过spring框架的源码，但我估计spring就是靠java 的反射机制来得到对象的，现在我们不妨来玩一玩，我们来把上面第一段代码中关于A.java的另一个带有参数的私有构造方法前面的注释去掉，编译运行，这时候控制台抛出了异常：</p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>Exception in thread &quot;main&quot; java.lang.IllegalArgumentException: wrong number of arguments</strong></font></p>
<p>那我们再来看看spring在这个问题上是不是够健壮，考验下spring的动态反射到底有多强大，到底是不是&ldquo;nothing is impossible&rdquo;，我把正在做的那个项目的中间层的代码稍微做了修改，把spring托管的类的私有默认构造方法加了一个参数，然后保存，编译，并重起了tomcat服务器，察看后台日志<font face="Arial">stdout.log，发现抛了异常：</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>org.springframework.beans.FatalBeanException: Could not instantiate class [com.ss.watch.serv.SysService]: no default constructor found;</strong></font></p>
<p>看来spring虽然反射运用的出神入化，但是还是有其局限性的啊，有待后续版本进一步完善，呵呵<img src="/javascripts/fckeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /></p>
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/106476#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 28 Jul 2007 22:44:56 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/106476</link>
        <guid>http://cuishen.javaeye.com/blog/106476</guid>
      </item>
      <item>
        <title>车展图片</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/79131" style="color:red;">http://cuishen.javaeye.com/blog/79131</a>&nbsp;
          发表时间: 2007年05月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>2007.4.22 星期日 雨</p>
<p>几周前在报纸上看到上海要举办车展，自己虽然算不上名车的铁杆粉丝，但是禁不住同事的一再煽动，也跟风预定了车展的门票。</p>
<p>今天早上10点赶到了上海新国际博览中心，和同学一起从上午一直逛到下午5点。外面虽然淅淅沥沥下着雨，可是展馆里灯火通明，人头攒动，展台上娇美的车模和名贵的轿车交相辉映，下面是我在展厅里拍的一些照片，贴出来和大家分享！</p>
<p><img src="http://cuishen.javaeye.com/upload/picture/pic/3328/c2c2c1de-f843-4bd6-ad47-c8478f8c2159.jpg" alt="" /></p>
<p><img src="http://cuishen.javaeye.com/upload/picture/pic/3327/3fb6ddc3-5a7b-49e9-b5a3-73bd66e7b601.jpg" alt="" /></p>
<p><img src="http://cuishen.javaeye.com/upload/picture/pic/3326/dde2605b-d672-4697-9c6c-6a4d3db87565.jpg" alt="" /></p>
<p><img src="http://cuishen.javaeye.com/upload/picture/pic/3325/a08f2d40-5c68-4f55-b45d-de6758121311.jpg" alt="" /></p>
<p><img src="http://cuishen.javaeye.com/upload/picture/pic/3324/ecf284de-fe06-4864-ba08-5954f68d6f55.jpg " alt="" /></p>
<p><img src="http://cuishen.javaeye.com/upload/picture/pic/3323/7317eaab-9dcf-4d09-9f6f-c3f3d9d7338f.jpg " alt="" /></p>
<p><img src="http://cuishen.javaeye.com/upload/picture/pic/3322/2b5b675a-2043-49c9-8037-5f65d0b48bb8.jpg" alt="" /></p>
<p><img src="http://cuishen.javaeye.com/upload/picture/pic/3321/d3573363-6e42-4997-a76e-dfde60a0d2b8.jpg " alt="" /></p>
<p>&nbsp;</p>
<p><u></u></p>
          <br/>
          <span style="color:red;">
            <a href="http://cuishen.javaeye.com/blog/79131#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 13 May 2007 00:30:17 +0800</pubDate>
        <link>http://cuishen.javaeye.com/blog/79131</link>
        <guid>http://cuishen.javaeye.com/blog/79131</guid>
      </item>
      <item>
        <title>日志展示工具项目总结</title>
        <author>cuishen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cuishen.javaeye.com">cuishen</a>&nbsp;
          链接：<a href="http://cuishen.javaeye.com/blog/64754" style="color:red;">http://cuishen.javaeye.com/blog/64754</a>&nbsp;
          发表时间: 2007年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">好久没来论坛耕耘了，已经荒芜了~~~<br />
为期一周的小项目结束了，这两天主要是部署，测试以及写写文档，当然有了很多上网的时间，javaeye的homepage是进的去的，也可以顺利的登陆，但是就是无法进入博客，郁闷啊。。。<br />
</font></p>
<p><font face="Arial"><font face="Arial">这次的项目是一个j2se,swing的小项目,最后要部署在linux环境中,可能是第一次独立的完成项目,给我的时间也短,所以有点浮躁,可能也略微有些胆怯;每次给项目经理看的时候,他都不免提出一些要求,比如说显示日志的窗口要自动的滚到最底端,方便用户监控,又比如要加入声音报警等等功能,这对我来说都没接触过,项目又紧,我不免有些心慌,于是跟他讨价还价,说自动滚屏java里无法实现,声音报警需要音响,而正式环境是不可能放置音响的,能否省去云云... 但是在项目经理的一再坚持下,在其他一些工程师以及网络的帮助下,我最终还是将这些功能一一实现了...</font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial">昨天项目交上去了,基本还过的去. 中午项目组一起去吃饭的时候,项目经理语重心长的对我说:&quot;小崔,项目做的还行, 基本功能都实现了,但是你碰到问题,自己不懂就说无法实现,最后不还是一一实现了吗? 这样不好! 遇到问题不要去逃避...&quot; 我当时有些尴尬,但是细细回味项目经理说的话,我觉得很有道理,记得自己刚进康时的时候,黄总给我们培训,曾说过:&quot;一个合格的程序员,要具备三大素质:1.一切要从客户出发, 2.要在效率和产能上找到平衡点, 3.要力求完美&quot;. 现在想想自己真是惭愧, 自己是因为喜欢编程才转行的, 但是真正接手项目了却没有做到一个合格程序员的要求, 以后绝对不能这样了...</font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">通过这次项目的开发部署和测试, 当然我也从中也增长了不少经验. 开发中碰到的一些难题就不说了, 至少linux操作系统现在我是懂一些了, 以前从没摸过linux. 记得刚开始部署的时候, 我从网上找了linux下jdk的安装说明, 是通过ssh shell远程登陆linux服务器部署上去的, 一切按网上的说明都很正常, 但是到运行程序时就是不行, 后来请教了工程师才知道由于我的程序是swing的需要图形界面所以一定要远程登陆桌面或直接在服务器上运行. 后来在服务器上搞了半天总算主界面能正常运行了, 但是点击菜单其他窗口不跳出来, 控制台报错, 我感到莫名其妙, java是跨平台的语言, 在windows下能正常运行,但是在linux下就报错, 这是什么原因? 我当时估计是包找不到, 后来请教了工程师后才发现是因为我程序中参数控制面板要读取properties文件, 当时我给的是相对路径&quot;conf\\fileType.properties&quot;, linux和windows中路径的斜杠是不同的, windows下&quot;\&quot;和&quot;/&quot;都是可以的，但linux比较妖怪，一定得是&quot;/&quot;, 后来将路径改为&quot;./conf/fileType.properties&quot;后问题迎刃而解，并且还要注意File.separatorChar在widows下和linux下代表的意义是不同的。这个问题算是解决了，程序能正常的在linux下运行了，我觉得java移植还是很方便的，基本不需要改动代码。但是我们本来是用root帐户测试的，在正式环境下，不可能用root来运行程序，因为root的权限太大，不安全，所以在root下打开终端新建了帐户cs，从命令行转到cs帐户后运行程序发现又无法正常运行，后来发现只有注销root，用cs登陆图形界面才能正常运行程序。我觉得linux用惯了还是蛮好用的，自己通过实践，也懂得了一些命令，现贴出来与大家分享:</font></font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">创建用户：<br />
useradd 用户名<br />
passwd 用户名&nbsp; //需要修改密码的用户名<br />
-----------------------------------------<br />
ps -A&nbsp;&nbsp;&nbsp; //查看当前正在运行的程序<br />
kill 编号<br />
-----------------------------------