<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>dananhai</title>
    <description></description>
    <link>http://dananhai.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>怎么使用SSL</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/151654" style="color:red;">http://dananhai.javaeye.com/blog/151654</a>&nbsp;
          发表时间: 2007年12月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          HTTPS实际是SSL over HTTP, 该协议通过SSL在发送方把原始数据进行加密，在接收方解密，因此，所传送的数据不容易被网络黑客截获和破解。本文介绍HTTPS的三种实现方法。  <br /><br />    方法一 静态超链接  <br /><br /><br />    这是目前网站中使用得较多的方法，也最简单。在要求使用SSL进行传输的Web网页链接中直接标明使用HTTPS协议，以下是指向需要使用SSL的网页的超链接：  <br /><br /><br />SSL例子  <br /><br /><br />需要说明的是，在网页里的超链接如果使用相对路径的话，其默认启用协议与引用该超链接的网页或资源的传输协议相同，例如在某超链接“HTTPS://192.168.100.100/ok/login.jps”的网页中包含如下两个超链接：  <br /><br /><br />SSL链接  <br /><br /><br />非SSL链接  <br /><br /><br />    那么，第一个链接使用与“HTTPS://192.168.100.100/ok/login.jsp”相同的传输协议HTTPS，第二个链接使用本身所标识的协议HTTP。  <br /><br /><br />    使用静态超链接的好处是容易实现，不需要额外开发。然而，它却不容易维护管理; 因为在一个完全使用HTTP协议访问的Web应用里，每个资源都存放在该应用特定根目录下的各个子目录里，资源的链接路径都使用相对路径，这样做是为了方便应用的迁移并且易于管理。但假如该应用的某些资源要用到HTTPS协议，引用的链接就必须使用完整的路径，所以当应用迁移或需要更改URL中所涉及的任何部分如：域名、目录、文件名等，维护者都需要对每个超链接修改，工作量之大可想而知。再者，如果客户在浏览器地址栏里手工输入HTTPS协议的资源，那么所有敏感机密数据在传输中就得不到保护，很容易被黑客截获和篡改！  <br /><br /><br />    方法二 资源访问限制  <br /><br /><br />    为了保护Web应用中的敏感数据，防止资源的非法访问和保证传输的安全性，Java Servlet 2.2规范定义了安全约束（Security-Constraint）元件，它用于指定一个或多个Web资源集的安全约束条件；用户数据约束（User-Data-Constraint）元件是安全约束元件的子类，它用于指定在客户端和容器之间传输的数据是如何被保护的。用户数据约束元件还包括了传输保证（Transport-Guarantee）元件，它规定了客户机和服务器之间的通信必须是以下三种模式之一：None、Integral、Confidential。None表示被指定的Web资源不需要任何传输保证；Integral表示客户机与服务器之间传送的数据在传送过程中不会被篡改; Confidential表示数据在传送过程中被加密。大多数情况下，Integral或Confidential是使用SSL实现。  <br /><br /><br />    这里以BEA的WebLogic Server 6.1为例介绍其实现方法，WebLogic是一个性能卓越的J2EE服务器，它可以对所管理的Web资源，包括EJB、JSP、Servlet应用程序设置访问控制条款。假设某个应用建立在Weblogic Server里的/mywebAPP目录下，其中一部分Servlets、JSPs要求使用SSL传输，那么可将它们都放在/mywebAPP/sslsource/目录里，然后编辑/secureAPP/Web-INF/web.xml文件，通过对web.xml的设置可达到对Web用户实现访问控制。  <br /><br /><br />    当Web用户试图通过HTTP访问/sslsource目录下的资源时，Weblogic Server就会查找web.xml里的访问约束定义，返回提示信息：Need SSL connection to access this resource。资源访问限制与静态超链接结合使用，不仅继承了静态超链接方法的简单易用性，而且有效保护了敏感资源数据。然而，这样就会存在一个问题： 假如Web客户使用HTTP协议访问需要使用SSL的网络资源时看到弹出的提示信息: Need SSL connection to access this resource，大部分人可能都不知道应该用HTTPS去访问该网页，造成的后果是用户会放弃访问该网页，这是Web应用服务提供商不愿意看到的事情。  <br /><br /><br />    方法三 链接重定向  <br /><br /><br />    综观目前商业网站资源数据的交互访问，要求严格加密传输的数据只占其中一小部分，也就是说在一个具体Web应用中需要使用SSL的服务程序只占整体的一小部分。那么，我们可以从应用开发方面考虑解决方法，对需要使用HTTPS协议的那部分JSPs、Servlets或EJBs进行处理，使程序本身在接收到访问请求时首先判断该请求使用的协议是否符合本程序的要求，即来访请求是否使用HTTPS协议，如果不是就将其访问协议重定向为HTTPS，这样就避免了客户使用HTTP协议访问要求使用HTTPS协议的Web资源时，看到错误提示信息无所适从的情况，这些处理对Web客户来说是透明的。  <br /><br /><br />    实现思想是：首先创建一个类，该类方法可以实现自动引导Web客户的访问请求使用HTTPS协议，每个要求使用SSL进行传输的Servlets或JSPs在程序开始时调用它进行协议重定向，最后才进行数据应用处理。  <br /><br /><br />    J2EE提供了两种链接重定向机制。第一种机制是RequestDispatcher接口里的forward()方法。使用MVC(Model-View-Controller)机制的Web应用通常都使用这个方法从Servlet转移请求到JSP。但这种转向只能是同种协议间的转向，并不能重定向到不同的协议。第二种机制是使用HTTPServletReponse接口里的sendRedirect()方法，它能使用任何协议重定向到任何URL，例如：  <br /><br /><br />BeSslResponse.sendRedirect(“HTTPS://192.168.100.100/order”);  <br /><br /><br />    此外，我们还需使用到Java Servlet API中的两个方法：ServletRequest接口中的getScheme()，它用于获取访问请求使用的传输协议；HTTPUtils类中的getRequestUrl()，它用于获取访问请求的URL，要注意的是该方法在Servlet 2.3中已被移到HTTPServletRequest接口。  <br /><br /><br />    以下是实现协议重定向的基本步骤：  <br /><br /><br />    1. 获取访问的请求所使用的协议；  <br /><br /><br />    2. 如果请求协议符合被访问的Servlet所要求的协议，就说明已经使用HTTPS协议了，不需做任何处理；  <br /><br /><br />    3. 如果不符合，使用Servlet所要求的协议(HTTPS)重定向到相同的URL。  <br /><br /><br />    例如，某Web用户使用HTTP协议访问要求使用HTTPS协议的资源BeSslServlet，敲入“URL：HTTP://192.168.100.100/BeSslServlet”，在执行BeSslServlet时首先使用ProcessSslServlet．processSsl（）重定向到HTTPS://192.168.100.100/BeSslServlet，然后 BeSslServlet与客户浏览器之间就通过HTTPS协议进行数据传输。  <br /><br /><br />    以上介绍的仅是最简单的例子，是为了对这种重定向的方法有个初步的认识。假如想真正在Web应用中实现，还必须考虑如下几个问题：  <br /><br /><br />    ● 在Web应用中常常会用到GET或Post方法，访问请求的URL中就会带上一些查询字串，这些字串是使用getRequesUrl()时获取不到的，而且在重定向之后会丢失，所以必须在重定向之前将它们加入到新的URL里。我们可以使用request.getQueryString()来获取GET的查询字串，对于Post的Request参数，可以把它们转换成查询串再进行处理。  <br /><br /><br />    ● 某些Web应用请求中会使用对象作为其属性，必须在重定向之前将这些属性保存在该Session中，以便重定向后使用。  <br /><br /><br />    ● 大多数浏览器会把对同一个主机的不同端口的访问当作对不同的主机进行访问，分用不同的Session，为了使重定向后保留使用原来的Session，必须对应用服务器的Cookie 域名进行相应的设置。  <br /><br /><br />    以上问题均可在程序设计中解决。  <br /><br /><br />    通过程序自身实现协议重定向，就可以把要求严格保护的那部分资源与其他普通数据从逻辑上分开处理，使得要求使用SSL的资源和不需要使用SSL的资源各取所需，避免浪费网站的系统资源。 <br /><br /><br />读后感：<br />   如果我要在程序中对密码和用户名的传输进行加密，则应该使用第一种方法，处理完成后再使用sendRedirect()转换到http连接。就算在浏览器中直接输入http://同样的网址，但不可能获得request的相关变量，应该不会有什么危害。<br />    如果是要与servlet建立连接后，再传输敏感数据，则应使用第三种方法。<br />    第二种方法比较简单，程序不需要什么修改，应该测试一下是否会出现提示窗口。<br />    可以考虑是否与spring和struts的结合
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/151654#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, 29 Dec 2007 01:02:29 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/151654</link>
        <guid>http://dananhai.javaeye.com/blog/151654</guid>
      </item>
      <item>
        <title>Tomcat配置SSL</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/151637" style="color:red;">http://dananhai.javaeye.com/blog/151637</a>&nbsp;
          发表时间: 2007年12月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天做了个实验，在 Tomcat 5.5 中启用 HTTPS 的连接。以前都是通过 APACHE 来做的，这回图省事，直接用 TOMCAT 了，没想到还挺麻烦。<br /><br />一、生成 KeyStore<br /><br />这一步比较简单，利用 JDK 自带的 keytool 即可完成。命令如下：<br /><br />wakan@wakan:~/tomcat2/bin> keytool -genkey -alias tomcat -keyalg RSA<br />输入keystore密码：  ************<br />您的名字与姓氏是什么？<br />  [Unknown]：  Wakan.Jiang<br />您的组织单位名称是什么？<br />  [Unknown]：  ZZNode<br />您的组织名称是什么？<br />  [Unknown]：  ZZNode<br />您所在的城市或区域名称是什么？<br />  [Unknown]：  BeiJing<br />您所在的州或省份名称是什么？<br />  [Unknown]：  BeiJing<br />该单位的两字母国家代码是什么<br />  [Unknown]：  CN<br />CN=Wakan.Jiang, OU=ZZNode, O=ZZNode, L=BeiJing, ST=BeiJing, C=CN 正确吗？<br />  [否]：  是<br /><br />输入&lt;tomcat>的主密码<br />        （如果和 keystore 密码相同，按回车）：<br /><br />特别说明：上边输入的“&lt;tomcat>的主密码”，与keystore密码一定要相同，否则TOMCAT起不来。至少我试了几次都不行。报错如下：<br />2007-3-26 17:07:01 org.apache.coyote.http11.Http11BaseProtocol init<br />严重: Error initializing endpoint<br />java.io.IOException: Cannot recover key<br />        at org.apache.tomcat.util.net.jsse.JSSE14SocketFactory.init(JSSE14Socket Factory.java:125)<br /><br />二、修改 server.xml<br /><br />在 TOMCAT/conf/server.xml 中，修改与 SSL 相关的那一段，我改成下面这样：<br />    &lt;!-- Define a SSL HTTP/1.1 Connector on port 8443 --><br />    &lt;Connector port="8443" maxHttpHeaderSize="8192"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" disableUploadTimeout="true"<br />               acceptCount="100" scheme="https" secure="true" keystorePass="******"<br />               clientAuth="false" sslProtocol="TLS" /><br /><br />这里要指定keystorePass，如果写错了，会出现下边的错误：<br />严重: Error initializing endpoint<br />java.io.IOException: Keystore was tampered with, or password was incorrect<br />        at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:768)<br /><br />三、启动 Tomcat<br /><br />这一步比较简单，就不多说了。启动完成后，在浏览器中输入：https://localhost:8443，即可看到TOMCAT的主页面。<br /><br />wakan@wakan:~/tomcat2/bin> ./startup.sh<br />Using CATALINA_BASE:   /home/wakan/tomcat2<br />Using CATALINA_HOME:   /home/wakan/tomcat2<br />Using CATALINA_TMPDIR: /home/wakan/tomcat2/temp<br />Using JRE_HOME:       /home/jdk150/jre<br />2007-3-26 17:09:39 org.apache.catalina.core.AprLifecycleListener lifecycleEvent<br /><br /><br />本文出自 “豪客城” 博客，转载请与作者联系！<br /><br />本文出自 51CTO.COM技术博客
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/151637#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, 28 Dec 2007 22:48:57 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/151637</link>
        <guid>http://dananhai.javaeye.com/blog/151637</guid>
      </item>
      <item>
        <title>jakarta common简介（转）</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/148491" style="color:red;">http://dananhai.javaeye.com/blog/148491</a>&nbsp;
          发表时间: 2007年12月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          打算写文章介绍其中几个我认为比较通用的东西：<br /><br />Codec 包含 Hex, Base64, URL 的编码和反解码。对于 web 应用很有用处。<br /><br />Commons-Collections 增强 jdk 的 Collection Framework 功能。<br /><br />Commons-Configuration 读写配置参数。大多数程序都有运行参数放在某个地方，这个工具可以读写各种参数格式：数据库，xml ，Properties 文件，系统变量，等等。强吧？<br /><br />Commons-DBCP 数据库连接池，呵呵，现在连接池很多服务器都自带。但也有很多直接用这个。如果写 java application 要用到数据库，用这个吧。<br /><br />DbUtils 可以减少写 JDBC 程序的 try catch, 减少代码量。一个我想写一直没有时间写的东西。但没有想象中那么好。<br /><br />Email 发电子邮件。JDK 标准库对于发电子邮件支持不强，很让人看不懂。<br /><br />FileUpload 文件上传。J2EE 标准库对于文件上传支持不强，也让人看不懂。这两个功能对于现在的 j2ee 应用来说，是基本功能了。稍微大一点的系统都会有。<br /><br />IO 虽然 jdk 号称 IO 重写了，并且还用了 nio(new IO) 的 package 名，但是还是不够好。这个可以看作是增强版了。<br /><br />Commons-Lang 好东西。 lang 包是 java 最基本的包，默认自动 import ，功能还是不够强，补补！这个包在其他系统，包括 weblogic, websphere 中都大量用它。基本上凡是有点名气的 java 系统都会用它。<br /><br />Commons-Logging 好东西。大多数 EJB server 和 tomcat 都用到它。开源的 java project 也大部分用它。log 的抽象层。Java 中的 log 以前有很多种，如果你选了一种开发程序，以后想换另一种，比较麻烦。通过这个工具抽象一把，就很容易换了。不过最近 log4j 一支独大，JDK 自带的 log 没有几个人用，似乎不会有人换其他的 log, 让人搞不懂。<br /><br />Math 呵呵。Java 中的 Math 包只能勉强够用，如果稍微偏们一点的数学函数，都要自己写了。用它吧，节省时间。<br /><br />Net 增强 Java 网络功能。Java 的网络类库比起专业一点的 C++ 网络类库，差别还是很大。这里还是增强一点为好。<br /><br />Commons-Pool 普通的对象池。不是 EJB 的对象池。池这个东西，很难写好。弄不好特耗内存，速度反而慢（比如 EJB）。无论如何，是个好的思路，可以借鉴。<br /><br />Validator 这是好东西。不管是写 web 应用程序还是普通 java 应用程序，只要有用户输入界面，都用得上。比自己写省事阿。不赞成写在 xml 中，多一个字母少一个字母很难查。<br /><br />Commons project 下面还有 Sandbox,包含Cache ，Clazz ，Compress， Convert ，I18n，Id ，Mapper， SQL ，ThreadPool 等等，很多都用得上。哎，好东西真多，怎么介绍得完呢？
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/148491#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, 15 Dec 2007 01:19:45 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/148491</link>
        <guid>http://dananhai.javaeye.com/blog/148491</guid>
      </item>
      <item>
        <title>Velocity的介绍及与struts的结合</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/148490" style="color:red;">http://dananhai.javaeye.com/blog/148490</a>&nbsp;
          发表时间: 2007年12月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Velocity 是一个基于 Java 的模板引擎，它提供了简单的基于模板的语言，可以用类似脚本的方式引用对象。Velocity 促进了分离团队成员之间的责任：允许 Web 设计人员专注于视图（即页面的观感），而 Java 程序员专注于后端代码。把 Java 代码从页面布局中分离出来，会让 Web 应用程序未来更易维护。当 Velocity 与 Sruts 这样的 MVC 框架结合时，就成了 JSP 或 PHP 可行的替代。<br />特点：<br />    　模板引擎中最强大、使用最频繁的功能之一是它通过内建的映像（Reflection）引擎查找对象信息的能力。这个映像引擎允许用一种方便的Java“.”类似的操作符，提取任意加入到VelocityContext的对象的任何公用方法的值，或对象的任意数据成员。<br /><br />作用：<br />    1.允许我们在模版中设定变量，然后在运行时，动态的将数据插入到模版中，替换这些变量。<br />    2.有用来比较和迭代的内建指令，通过这些指令我们可以完成程序语言中的条件判断语句和循环语句等<br />    3.模板引擎最常见的用途是处理HTMLWeb内容。但我还用模板引擎生成过SQL、email、XML甚至Java源代码。<br /><br /><br />    Java模板引擎最常见的用途是替代JSP也就不足为奇了。<br /><br /><br />把 Struts 与 Velocity 模板引擎组合起来很简单，也很直接；实际上，只要用五步就可以实现：<br />　　<br />　　1.　　把 Velocity JAR 放在类路径中。<br />　　<br />　　2.　　修改 web.xml 文件让它识别 Velocity servlet。<br />　　<br />　　3.　　把 Velocity toolbox.xml 放在应用程序的 WEB-INF 目录下。<br />　　<br />　　4.　　修改 struts-config，把它的视图指向 Velocity 模板而不是 JSP。<br />　　<br />　　5.　　为每个需要显示的页面创建 Velocity 模板。<br />　　<br />　　我将用一个熟悉的搜索用例来演示 Struts 与 Velocity 的集成。在这个示例中，一个简单的应用程序允许用户按照图书的 ISBN 编号搜索图书。应用程序的结果页面显示与 ISBN 编号匹配的图书。<br />　　<br />　　第 1 步：把 Velocity JAR 放在 WEB-INF/lib 下<br />　　<br />　　Velocity 的 Struts 工具提供了所有您熟悉的 Struts 方便特性，但是添加了 Velocity 的灵活性。Velocity 本身是很棒的，但是它的工具包可以帮助您把工作做得更好更快。特别是 Struts 工具模拟了您以前熟悉的 Struts 标记。请参阅下载 一节下载 Velocity 模板引擎和 Velocity 工具。<br />　　　<br />　　第 2 步：修改 web.xml，让它识别 Velocity 的 servlet<br />　　<br />　　下一步是修改 Struts 的 web.xml 文件，让它识别 Velocity 的 servlet 并把所有以 .vm 结尾的资源请求定向到 Velocity servlet，如清单 1 所示。<br />　　<br />　　清单 1. 修改 web.xml，声明 Velocity servlet<br />　　<br />　　&lt;servlet><br />　　&lt;servlet-name>velocity&lt;/servlet-name> |(1)<br />　　&lt;servlet-class> |(2)<br />　　org.apache.velocity.tools.view.servlet.VelocityViewServlet<br />　　&lt;/servlet-class><br />　　<br />　　&lt;init-param> |(3)<br />　　&lt;param-name>org.apache.velocity.toolbox&lt;/param-name><br />　　&lt;param-value>/WEB-INFtoolbox.xml&lt;/param-value><br />　　&lt;/init-param><br />　　<br />　　&lt;load-on-startup>10&lt;/load-on-startup> |(4)<br />　　&lt;/servlet><br />　　<br />　　&lt;!-- Map *.vm files to Velocity --><br />　　&lt;servlet-mapping> |(5)<br />　　&lt;servlet-name>velocity&lt;/servlet-name><br />　　&lt;url-pattern>*.vm&lt;/url-pattern><br />　　&lt;/servlet-mapping><br />　　<br />　　让我们来看看清单 1 中发生了什么：<br />　　<br />　　（1）声明了 Velocity servlet 并给了它一个 velocity 句柄。<br />　　<br />　　（2）声明了 Velocity servlet 的类名。<br />　　<br />　　Velocity servlet 接受“toolbox”参数。toolbox 是声明应用程序的可用工具的位置。因此，在清单 1 中，我还做了以下工作：<br />　　<br />　　（3）告诉 VelocityServlet 在哪里可以找到 toolbox 的配置。<br />　　<br />　　（4）设置了 load-on-startup 标记，确保在正确的时间装入 Velocity servlet。任何大于或等于 0 的值都会迫使容器通过调用 servlet 的 init() 方法来装入它。放在 load-on-startup 标记体中的值决定了不同的 servlet 的 init 方法调用的次序。例如，0 在 1 之前调用，而 1 在 2 之前调用。缺少的标记或负值允许 servlet 容器根据自己的选择装入 servlet。<br />　　<br />　　（5）声明了 servlet 映射，强迫所有用 .vm 结尾的资源请求定向到 Velocity servlet。请注意（5）中的&lt;servlet-name> 必须与（1）中的&lt;servlet-name> 匹配。交错的声明和映射会在日志中生成错误。<br />　　<br />　　第 3 步：把 toolbox.xml 放在 WEB-INF 下<br />　　<br />　　利用 Velocity，可以使用（或创建）包含许多工具的工具箱。用来登记类的工具箱中包含有用的函数，常常会用到。幸运的是，Velocity 提供了许多预先构建好的工具。还创建了许多 Struts 工具来模拟原始的 Struts 标记。如果发现需要构建自己的工具，也可以自由地构建。在清单 2 中显示的 toolbox.xml 可以在 Velocity 工具下载中找到。这个文件应当随 Velocity JAR 一起放在 WEB-INF 下。<br />　　<br />　　清单 2. toolbox.xml<br />　　<br />　　&lt;?xml version="1.0"?><br />　　&lt;toolbox><br />　　&lt;tool><br />　　&lt;key>link&lt;/key><br />　　&lt;scope>request&lt;/scope><br />　　&lt;class><br />　　org.apache.velocity.tools.struts.StrutsLinkTool<br />　　&lt;/class><br />　　&lt;/tool><br />　　&lt;tool><br />　　&lt;key>msg&lt;/key><br />　　&lt;scope>request&lt;/scope><br />　　&lt;class><br />　　org.apache.velocity.tools.struts.MessageTool<br />　　&lt;/class><br />　　&lt;/tool><br />　　&lt;tool><br />　　&lt;key>errors&lt;/key><br />　　&lt;scope>request&lt;/scope><br />　　&lt;class><br />　　org.apache.velocity.tools.struts.ErrorsTool<br />　　&lt;/class><br />　　&lt;/tool><br />　　&lt;tool><br />　　&lt;key>form&lt;/key><br />　　&lt;scope>request&lt;/scope><br />　　&lt;class><br />　　org.apache.velocity.tools.struts.FormTool<br />　　&lt;/class><br />　　&lt;/tool><br />　　&lt;tool><br />　　&lt;key>tiles&lt;/key><br />　　&lt;scope>request&lt;/scope><br />　　&lt;class><br />　　org.apache.velocity.tools.struts.TilesTool<br />　　&lt;/class><br />　　&lt;/tool><br />　　&lt;tool><br />　　&lt;key>validator&lt;/key><br />　　&lt;scope>request&lt;/scope><br />　　&lt;class><br />　　org.apache.velocity.tools.struts.ValidatorTool<br />　　&lt;/class><br />　　&lt;/tool><br />　　&lt;/toolbox><br />　　<br />　　第 4 步：修改 struts-config<br />　　<br />　　下一步是修改 struts-config.xml，指向 Velocity 视图而不是 JSP。新的配置文件如清单 3 所示。<br />　　<br />　　清单 3. 针对 Velocity 视图修改后的 struts-config.xml<br />　　<br />　　&lt;?xml version="1.0" encoding="ISO-8859-1" ?><br />　　<br />　　&lt;!DOCTYPE struts-config PUBLIC<br />　　"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"<br />　　"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd"><br />　　<br />　　&lt;struts-config><br />　　&lt;form-beans><br />　　&lt;form-bean name="searchForm" type="app.SearchForm"/><br />　　&lt;/form-beans><br />　　<br />　　&lt;global-forwards><br />　　&lt;forward name="welcome" path="/welcome.do"/><br />　　&lt;/global-forwards><br />　　<br />　　&lt;action-mappings><br />　　&lt;action<br />　　path="/welcome"<br />　　type="org.apache.struts.actions.ForwardAction"<br />　　parameter="/pages/search.vm"/> |(1)<br />　　<br />　　&lt;action<br />　　path="/search"<br />　　type="app.SearchAction"<br />　　name="searchForm"<br />　　scope="request"<br />　　input="/pages/search.vm"> |(2)<br />　　&lt;forward name="success"<br />　　path="/pages/results.vm"/> |(3)<br />　　&lt;/action><br />　　&lt;/action-mappings><br />　　&lt;/struts-config><br />　　<br />　　清单 3 看起来就像一个非常典型的 Struts 应用程序，只有一个小小的不同。响应没有把客户转向到 JSP，而直接转向到 .vm 文件（请参阅清单 3 中的引用 1、2 和 3）。在大多数情况下，<span style="color: red">把 Struts 应用程序从 JSP 迁移到 Velocity 视图，需要做的仅仅是全局搜索，把 .jsp 替换成 .vm。</span>其他所有东西都可以保持不变！模板可以同样保存在以前保存 JSP 的位置；所需要做的只是用 Velocity 命令代替 JSP 标记。<br />　　<br />　　第 5 步：创建 Velocity 模板<br />　　<br />　　在清单 4 中，可以看到示例应用程序搜索页面的 Velocity 模板。<br />　　<br />　　清单 4. 搜索页面的 Velocity 模板<br />　　<br />　　&lt;HTML><br />　　&lt;HEAD><br />　　&lt;TITLE>Search&lt;/TITLE><br />　　&lt;/HEAD><br />　　&lt;BODY><br />　　$!errors.msgs()||(1)<br />　　&lt;FORM method="POST"<br />　　action="$link.setAction('/search')"> |(2)<br />　　&lt;h2>Book Search&lt;/h2><br />　　ISBN:&lt;INPUT type="text" name="isbn"><br />　　&lt;INPUT type="submit" value="Submit" name="submit"><br />　　&lt;/FORM><br />　　&lt;/BODY><br />　　&lt;/HTML><br />　　<br />　　清单 4 是一个没有 JSP 或 Struts 标记的典型的 HTML 页面。但是，以下元素看起来可能不是那么熟悉：<br />　　<br />　　（1）用 $!errors.msgs() 得到错误消息队列中的错误消息。<br />　　<br />　　（2）用 $link.setAction('/search') 获得搜索转发的 URL。<br />　　<br />　　这就成功了 ?? 模板剩下的部分看起来几乎与以前熟悉的 HTML 文件相同。清单 5 显示了应用程序结果页面的模板。<br />　　<br />　　清单 5. 结果页面的 Velocity 模板<br />　　<br />　　&lt;html><br />　　&lt;body><br />　　<br />　　&lt;h1>Book Details&lt;/h1><br />　　&lt;a href="$link.setForward("searchEntry")">Search again&lt;/a> |(1)<br />　　<br />　　&lt;h3>$book.title&lt;/h3> |(2)<br />　　<br />　　&lt;b>ISBN:&lt;/b>$book.isbn&lt;br>|(3)<br />　　&lt;b>Title:&lt;/b>$book.title&lt;br>|(4)<br />　　&lt;b>Author:&lt;/b>$book.author&lt;br>|(5)<br />　　&lt;b>Price:&lt;/b>$book.price&lt;br>|(6)<br />　　&lt;b>No Pages:&lt;/b>$book.pages&lt;br>|(7)<br />　　&lt;b>Description:&lt;/b>$book.description&lt;br>|(8)<br />　　&lt;b>Publisher:&lt;/b>$book.publisher&lt;br>|(9)<br />　　&lt;/body><br />　　&lt;html><br />　　<br />　　可以注意到，清单 5 中不包含 JSP 标记或 Struts 标记。我们来详细看看它：<br />　　<br />　　（1）用 Struts 的链接工具把 &lt;a> 标记的 href 设置为 Struts 转发。<br />　　<br />　　（2）访问 $book title 属性。<br />　　<br />　　（3）访问 $book isbn 属性。<br />　　<br />　　（4）再次访问 $book title 属性。<br />　　<br />　　（5）访问 $book author 属性。<br />　　<br />　　（6）访问 $book price 属性。<br />　　<br />　　（7）访问 $book pages 属性。<br />　　<br />　　（8）访问 $book description 属性。<br />　　<br />　　（9）访问 $book publisher 属性。<br />　　<br />　　讨论<br />　　<br />　　这就是把 Struts 与 Velocity 模板引擎集成的全部工作。表面看起来非常简单（实际上也很简单），但是请想想是什么让这个集成能够工作的呢？<br />　　<br />　　Struts 动作映射可以定义任何视图，不仅限于 JSP。在这篇文章中，我只是把动作映射修改为以 vm 结尾而不是以 jsp 结尾的返回文件。然后，我声明了 Velocity servlet，并告诉 Servlet 容器把以 vm 结尾的文件发送给 VelocityViewServlet。<br />　　<br />　　VelocityViewServlet 把 Velocity 命令表示成 HTML 响应。通过这种方式，VelocityViewServlet 充当了视图响应的拦截器。Struts 控制器把视图转发给 VelocityViewServlet，后者在向客户端发送响应之前处理 vm 文件。请参阅参考资料 获得关于将 Velocity 视图集成进 Struts 应用程序的更多内容。<br />　　<br />　　结束语<br />　　<br />　　正如在本文中看到的，Struts 与 Velocity 的集成很简单。只需五个步骤就可以把所有东西连在一起。针对不同的引擎和场景，采用模板引擎而不是 JSP 的优势各有不同。在 Velocity 的情况下，优势就是简单性、容易学习以及更好的性能。
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/148490#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, 15 Dec 2007 01:15:26 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/148490</link>
        <guid>http://dananhai.javaeye.com/blog/148490</guid>
      </item>
      <item>
        <title>log4j 按时间、大小产生新的日志文件</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/148484" style="color:red;">http://dananhai.javaeye.com/blog/148484</a>&nbsp;
          发表时间: 2007年12月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我们开发的B/S结构系统，在服务端一般要有日常运行的日志记录。保存成日志文件形式的时候，大家经常会遇到一个问题：日志文件过大。上百兆的日志文件对 查阅日志信息来说也是一个问题。所以我希望能够每天或每个月产生一个日志文件，这样文件不至于过大。 或者根据日志文件大小来判断，超过规定大小，日志自动增加新文件。<br />　　在log4j中这两种方式的实现都很简单，只要在配置文件中设置即可。<br />　　<br />　　一、按照一定时间产生日志文件,配置文件如下：<br />　　　　# Set root logger level to ERROR and its only appender to A1.<br />　　　　log4j.rootLogger=ERROR,R<br />　　<br />　　　　# R is set to be a DailyRollingFileAppender.<br />　　　　log4j.appender.R=org.apache.log4j.DailyRollingFileAppender<br />　　<br />　　　　log4j.appender.R.File=backup.log<br />　　　　log4j.appender.R.DatePattern = '.'yyyy-MM-dd<br />　　　　log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />　　　　log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n<br />　　　　<br />　　　　以上配置是每天产生一个备份文件。其中备份文件的名字叫backup.log。 www_bitscn_com <br />　　　　具体的效果是这样：当天的日志信息记录在backup.log文件中，前一天的记录在名称为　 backup.log.yyyy-mm-dd 的文件中。<br />　　　　类似的，如果需要每月产生一个文件可以修改上面的配置：<br />　　　　将<br />　　　　　log4j.appender.R.DatePattern = '.'yyyy-MM-dd<br />　　　　改为<br />　　　　　　log4j.appender.R.DatePattern = '.'yyyy-MM<br />　　<br />　　二、根据日志文件大小自动产生新日志文件<br />　　　　配置文件内容如下：<br />　　<br />　　# Set root logger level to ERROR and its only appender to A1.<br />　　log4j.rootLogger=ERROR,R<br />　　<br />　　# R is set to be a RollingFileAppender.<br />　　log4j.appender.R=org.apache.log4j.RollingFileAppender<br />　　<br />　　log4j.appender.R.File=backup.log<br />　　#log4j.appender.R.MaxFileSize=100KB<br />　　<br />　　# Keep one backup file<br />　　log4j.appender.R.MaxBackupIndex=1<br />　　log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />　　log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n<br />　　<br />　　<br />　　其中：<br />　　#日志文件的大小<br />　　log4j.appender.R.MaxFileSize=100KB 中国网管论坛 <br />　　# 保存一个备份文件<br />　　log4j.appender.R.MaxBackupIndex=1
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/148484#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, 15 Dec 2007 00:42:03 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/148484</link>
        <guid>http://dananhai.javaeye.com/blog/148484</guid>
      </item>
      <item>
        <title>java的集合</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/148483" style="color:red;">http://dananhai.javaeye.com/blog/148483</a>&nbsp;
          发表时间: 2007年12月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          java 的集合类包含两部分,一部分是实现了接口Collection的类,另一部分是实现了接口Map的类.注意虽然后者没有实现Collection接口,但是它们都是Collections(不是Collection)的一部分.<br />   List&lt;T>的主要特点是它可以存放重复的元素<br />       ArrayList&lt;T>的特点是元素在里面是按添加的顺序存放的，随机获得元素较快<br />       LinkedList&lt;T>元素在里面是按添加的顺序存放的.在随机获得元素方面相对慢一点,而在添加删除元素方面,它比ArrayList&lt;T>要快 <br /><br />    Set&lt;T>的特点和数学上的集合一样,不可以存放重复的元素   <br />       HashSet&lt;E>它按元素的hashCode()来对元素进行降排序之后进行有序存放<br />          LinkedHashSet&lt;E>如果要按添加顺序存放元素,就可以用这个类.LinkedHashSet&lt;E>是HashSet&lt;E>的子类<br />       SortedSet&lt;E>这是一个接口,不是一个类.它的功能是,可以通过Comparator&lt;E>类或Comparable&lt;E>接口自定义元素的存放顺序.<br />         TreeSet&lt;E>是SortedSet&lt;E>的实现类<br />       EnumSet&lt;E>这是一个和枚举类型一起使用的专用的Set&lt;E>的实现类它没有构造函数,而且它的所有方法都是static的.
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/148483#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, 15 Dec 2007 00:36:54 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/148483</link>
        <guid>http://dananhai.javaeye.com/blog/148483</guid>
      </item>
      <item>
        <title>装 用JDring包设置特定时间日程提醒</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/148456" style="color:red;">http://dananhai.javaeye.com/blog/148456</a>&nbsp;
          发表时间: 2007年12月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          　  UNIX操作系统用cron守护进程来在特定的时间和日期运行脚本。Java Development Kit （JDK） 1.3的java.util.Timer类允许开发者设置每隔N毫秒执行一些任务，但没有类似cron的结构来指明一天或一周中的特定时间。<br /><br />　　这个缺口现在被JDring包堵上了，它是Olivier Dedieu编写的一个Java的类似cron的日程安排提醒程序。JDring.zip文件中包含这些部分：<br /><br />　　源代码：这不是必需的，可以不管它。<br /><br />　　Javadoc文档：把这个放到你的docs目录中去。<br /><br />　　Jar文件：这个文件包含编译好的类，要把它放到你的classpath中去。<br /><br />　　使用JDring有两步。第一步要创建一个AlarmListener，这是一个包含一个方法的接口：<br /><br />import com.jalios.jdring.AlarmEntry;<br />import com.jalios.jdring.AlarmListener;<br />public class Buzzing implements AlarmListener {<br />private String buzz;<br />public Buzzing(String buzz) {<br />this.buzz = buzz;<br />}<br />public void handleAlarm(AlarmEntry entry) {<br />System.err.println("滴零零……");<br />System.err.println(buzz);<br />}<br />} <br /> <br /><br /><br />　　使用JDring的第二步是通知一个中央管理者AlarmListener应该在什么时候响铃。这个管理者是AlarmManager的一个实例，它有一个空的构造器。在特定时刻调用日程提醒和cron类似，像下面这样：<br /><br />AlarmManager.addAlarm(minute, hour, day of month, month, day of week, year,<br />AlarmListener)  <br /><br /><br />　　下面的示例代码示范了一个设置成在每个小时的第20分钟开始响铃的日程提醒：<br /><br />import com.jalios.jdring.AlarmManager;<br />import com.jalios.jdring.PastDateException;<br />public class SetAlarm {<br />static public void main(String[ ] args) {<br />AlarmManager mgr = new AlarmManager( );<br />mgr.addAlarm(20, -1, -1, -1, -1, -1, new Buzzing( ));<br />}<br />}  <br /><br /><br />　　这个例子示范了如何设置在每个星期五的下午五点提醒：<br /><br />manager.addAlarm(00, 17, -1, -1, Calendar.FRIDAY, -1, new Buzzing());<br />// java.util.Calendar  <br /><br /><br />　　JDring还可以用来记住一个周年纪念日，像下面这样：<br /><br />manager.addAlarm(00, 12, 20, Calendar.MARCH, -1, -1,<br />new Buzzing("记住明天是周年纪念！") );
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/148456#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>Fri, 14 Dec 2007 22:51:26 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/148456</link>
        <guid>http://dananhai.javaeye.com/blog/148456</guid>
      </item>
      <item>
        <title>常用网站代码</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/147529" style="color:red;">http://dananhai.javaeye.com/blog/147529</a>&nbsp;
          发表时间: 2007年12月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          做网站常用的一些代码<br />http://www.webkey.cn/ 2007-5-25 0:58:41 IT人家整理 <br /> <br /> <br />控制横向和纵向滚动条的显隐？<br />&lt;body style="overflow-y:hidden"> 去掉x轴<br />&lt;body style="overflow-x:hidden"> 去掉y轴<br />&lt;body scroll="no">不显<br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />表格变色<br />&lt;TD onmouseover="this.style.backgroundColor='#FFFFFF'" <br />onmouseout="this.style.backgroundColor=''"<br />style="CURSOR: hand"><br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />禁止复制，鼠标拖动选取<br />&lt;body ondragstart=window.event.returnValue=false oncontextmenu=window.event.returnValue=false onselectstart=event.returnValue=false><br /><br />&lt;body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" oncontextmenu="return false" ondragstart="return false" onselectstart ="return false" onselect="document.selection.empty()" oncopy="document.selection.empty()" onbeforecopy="return false" onmouseup="document.selection.empty()"><br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />普通iframe页面<br />&lt;iframe name="name" src="main.htm" width="450" height="287" scrolling="Auto" frameborder="0">&lt;/iframe><br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />iframe自适应高度<br />&lt;iframe name="pindex" src="index.asp" frameborder=false scrolling="auto" width="100%" height="100%" frameborder=no onload="document.all['pindex'].style.height=pindex.document.body.scrollHeight" >&lt;/iframe><br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />IE地址栏前换成自己的图标&可以在收藏夹中显示出你的图标<br />&lt;link rel="Shortcut Icon" href="favicon.ico"><br />&lt;link rel="Bookmark" href="favicon.ico"><br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />字号缩放<br />越来越多的人长时间的泡网，眼镜的普及率也越来越高，让文字大点，让更多的用户看的更清楚。<br />&lt;script type="text/javascript"><br />function doZoom(size)<br />{document.getElementById('zoom').style.fontSize=size+'px';}<br />&lt;/script><br />&lt;span id="zoom">需要指定大小的文字&lt;/span><br />&lt;a href="javascript:doZoom(16)">大&lt;/a> &lt;a href="javascript:doZoom(14)">中&lt;/a> &lt;a href="javascript:doZoom(12)">小&lt;/a><br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />select挡住div的解决方法 <br />在div里加入下面的代码，根据需要调整就可以了。<br />&lt;iframe src="javascript:false" scrolling="no" frameborder="0" style="z-index:-1;position:absolute; top:5px; left:2px;width:168;height:100px;"><br />&lt;/iframe><br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />iframe(嵌入式帧)自适应高度<br />填写的嵌入地址一定要和本页面在同一个站点上，否则会提示“拒绝访问！”。对跨域引用有权限问题，请查阅其他资料。<br />&lt;iframe name="guestbook" src="gbook/index.asp" scrolling=no width="100%" height="100%" frameborder=no onload="document.all['guestbook'].style.height=guestbook.document.body.scrollHeight">&lt;/iframe><br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />跳转菜单新窗口<br />&lt;select name="select" onchange="window.open(this.options[this.selectedIndex].value)"><br />&lt;option value="http://www.microsoft.com/ie"> Internet Explorer&lt;/option><br />&lt;option value="http://www.microsoft.com"> Microsoft Home&lt;/option><br />&lt;option value="http://msdn.microsoft.com"> Developer Network&lt;/option><br />&lt;/select><br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />flash透明选项<br />&lt;param name="wmode" value="transparent"><br /><br /> <br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /><br />添加到收藏夹和设为首页<br />&lt;a href=# onclick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.webkey.cn/lanren/');">设为首页&lt;/a><br /><br />&lt;a href="javascript:window.external.AddFavorite('http://www.webkey.cn/lanren/','懒人图库')">收藏本站&lt;/a><br /><br /><br />--------------------------------------------------------------------------------<br />记录并显示网页的最后修改时间 <br />&lt;script language=JavaScript> <br />document.write("最后更新时间: " + document.lastModified + "") <br />&lt;/script> <br />--------------------------------------------------------------------------------<br />节日倒计时<br />&lt;Script Language="JavaScript"> <br />　　 var timedate= new Date("October 1,2002"); <br />　　 var times= "国庆节"; <br />　　 var now = new Date(); <br />　　 var date = timedate.getTime() - now.getTime(); <br />　　 var time = Math.floor(date / (1000 * 60 * 60 * 24)); <br />　　 if (time >= 0) <br />　　 document.write( "现在离"+times+"还有: "+time +"天")<br />&lt;/Script> <br />--------------------------------------------------------------------------------<br />加在HEAD里 <br />禁止缓存<br />&lt;meta http-equiv="Expires" CONTENT="0"> <br />&lt;meta http-equiv="Cache-Control" CONTENT="no-cache"> <br />&lt;meta http-equiv="Pragma" CONTENT="no-cache"> <br /><br />--------------------------------------------------------------------------------<br />让IFRAME框架内的文档的背景透明<br />&lt;iframe src="about:&lt;body style='background:transparent'>" allowtransparency>&lt;/iframe> <br />--------------------------------------------------------------------------------<br />打开窗口即最大化<br />&lt;script language="JavaScript"> <br />&lt;!-- Begin <br />self.moveTo(0,0) <br />self.resizeTo(screen.availWidth,screen.availHeight) <br />// End --> <br />&lt;/script> <br />--------------------------------------------------------------------------------<br />加入背景音乐<br />&lt;bgsound src="mid/windblue[1].mid" loop="-1"> 只适用于IE<br />&lt;embed src="music.mid" autostart="true" loop="true" hidden="true"> 对Netscape ,IE 都适用 <br />--------------------------------------------------------------------------------<br />滚动<br />&lt;marquee direction=up height=146 onmouseout=start() onmouseover=stop() scrollAmount=2>滚动信息<br />&lt;/marquee> <br />--------------------------------------------------------------------------------<br />防止点击空链接时，页面往往重置到页首端<br />代码“javascript:void(null)”代替原来的“#”标记 <br />--------------------------------------------------------------------------------<br /><br />文字或图片弹出指定大小的窗口<br />在body中加入<br />&lt;script language="JavaScript" type="text/JavaScript"><br />function MM_openBrWindow(theURL,winName,features) {window.open(theURL,winName,features);}<br />&lt;/script><br />弹出代码<br />&lt;a href="#" target="_self" onClick="MM_openBrWindow('windows01.htm','','width=550,height=380')" width="550" height="380" border="0">图片或文字&lt;/a><br /><br /><br />--------------------------------------------------------------------------------<br />flash按钮加链接 <br />on (press) {<br />getURL("http://www.webkey.cn","_blank");<br />} <br />--------------------------------------------------------------------------------<br />跳转页面代码<br />&lt;meta http-equiv="refresh" content="5;url=http://www.webkey.cn"> <br />--------------------------------------------------------------------------------<br />细线分隔线<br />&lt;hr noshade size=0 color=#C0C0C0> <br />--------------------------------------------------------------------------------<br />网页中的自动换行<br />&lt;td style="word-break:break-all">就搞定了。<br />完整的是 <br />style="table-layout: fixed;WORD-BREAK: break-all; WORD-WRAP: break-word" <br />--------------------------------------------------------------------------------<br />消除ie6自动出现的图像工具栏，设置 GALLERYIMG属性为false或no . <br />&lt;IMG SRC="mypicture.jpg" HEIGHT="100px" WIDTH="100px" GALLERYIMG="no"> <br />--------------------------------------------------------------------------------<br />禁止页面正文内容被选取 <br />&lt;body oncontextmenu="return false" ondragstart="return false" onselectstart ="return false" onselect="document.selection.empty()" oncopy="document.selection.empty()" onbeforecopy="return <br />false"onmouseup="document.selection.empty()"> <br /><br />--------------------------------------------------------------------------------<br />不能点右键，不用CTRL+A，不能复制作!<br />&lt;body oncontextmenu="window.event.returnValue=false" <br />onkeypress="window.event.returnValue=false" <br />onkeydown="window.event.returnValue=false" <br />onkeyup="window.event.returnValue=false" <br />ondragstart="window.event.returnValue=false" <br />onselectstart="event.returnValue=false"> <br />&lt;/body> <br />--------------------------------------------------------------------------------<br />IE浏览器支持一个 Body 属性 bgproperties，它可以让背景不滚动: <br />&lt;Body Background="图片文件" bgproperties="fixed"> <br />--------------------------------------------------------------------------------<br />随机变换背景图象（一个可以刷新心情的特效） <br />&lt;Script Language="JavaScript"> <br />　　 image = new Array(4); //定义image为图片数量的数组 <br />　　 image [0] = 'tu0.gif' //背景图象的路径 <br />　　 image [1] = 'tu1.gif' <br />　　 image [2] = 'tu2.gif' <br />　　 image [3] = 'tu3.gif' <br />　　 image [4] = 'tu4.gif' <br />　　 number = Math.floor(Math.random() * image.length); <br />　　 document.write("&lt;BODY BACKGROUND="+image[number]+">"); <br />&lt;/Script> <br /><br />--------------------------------------------------------------------------------<br />flash载入影片 <br />on (release)<br />{<br />loadMovie("1-01.swf", "_root.loaderclip");<br />} <br />--------------------------------------------------------------------------------<br />图片表单按钮<br />&lt;form id="form1" name="form1" method="post" action=""><br />&lt;img src="login.gif" width="62" height="22" onclick="document.form1.submit()" /><br />&lt;/form> <br />--------------------------------------------------------------------------------<br />左右阴影背景的CSS定义方法<br />body {<br />text-align:center;<br />background-repeat: repeat-y;<br />background-position: center;<br />background-image: url(../images/bg.jpg);<br />} <br />--------------------------------------------------------------------------------<br />划过链接 手型鼠标<br />style="cursor:hand" <br />--------------------------------------------------------------------------------<br />如何关闭层<br />&lt;div id="Layer1">&lt;/div><br />&lt;a href="#" onClick="Layer1.style.display='none'">关闭层&lt;/a> <br />--------------------------------------------------------------------------------<br />关闭窗口的脚本<br />&lt;a href=javascript:close()>[关闭窗口]&lt;/a> <br />--------------------------------------------------------------------------------<br />如果文字过长,则将过长的部分变成省略号显示 <br />&lt;DIV STYLE="width: 120px; height: 50px; border: 1px solid blue;overflow: hidden; text-overflow:ellipsis"> <br />&lt;NOBR>就是比如有一行文字，很长，表格内一行显示不下.&lt;/NOBR> <br />&lt;/DIV> <br />--------------------------------------------------------------------------------<br />进入主页后自动最大化<br />&lt;script> <br />self.moveTo(0,0) <br />self.resizeTo(screen.availWidth,screen.availHeight) <br />&lt;/script> <br /><br />--------------------------------------------------------------------------------<br />凹陷文字 <br />&lt;div style="width:300px;padding:20px;overflow:hidden;word-wrap:break-word;word-break:break:all; font-size:12px; line-height:18px; background-color:#eeeeee;"><br />&lt;font disabled><br />怎么样，我凹下去了吧？&lt;br><br />你不想试试吗？&lt;br><br />&lt;a href="http://www.lenvo.cn/">www.lenvo.cn&lt;/a>&lt;/font><br />&lt;/div> <br />--------------------------------------------------------------------------------<br />运行代码框<br />&lt;script><br />function Preview()<br />{var TestWin=open('');<br />TestWin.document.write(code.value);}<br />&lt;/script><br />&lt;textarea id=code cols=60 rows=15>
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/147529#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, 11 Dec 2007 12:49:27 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/147529</link>
        <guid>http://dananhai.javaeye.com/blog/147529</guid>
      </item>
      <item>
        <title>active x 服务器的设置</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/147307" style="color:red;">http://dananhai.javaeye.com/blog/147307</a>&nbsp;
          发表时间: 2007年12月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          6.2.ActiveX控制在WEB上的应用 <br /><br />　　考虑到WEB的安全性，为了在服务器与客户端建立良好的信任关系，必须为每个在WEB上使用ActiveX控制设置一个“代码签名”（CodeSigning）。VC5.0提供了生成供测试用的“代码签名”的工具。如果要正式发布，则必须向有关机构申请。<br />　　（参见http：//www.microsoft.com/intdev/signcode/） <br /><br />　　在WEB页面中使用ActiveX控制，还要对之进行包装，将有关的动态连接库及信息文件压缩到一个扩展名为CAB（Cabinet）文件中。可以使用VC5.0提供的工具包装ActiveX控制。在HTML文件中，使用OBJECT标签插入ActiveX控制，并利用VBScript或者JScript访问该ActiveX控制。客户端用InternetExplorer浏览此页面时，可以自动解包该文件。出于安全性的考虑，InternetExplorer为ActiveX部件的下载、初始化、是否拥有合法的代码签名以及是否允许Scripting等设置了不同的 <br />　　安全级别，用户可根据需要进行设置。下面这个例子中，使用了ActiveX控制“MSChart.OCX"，当用鼠标单击此控制时，控制的标题将改变。<br /><br /><br />&lt;OBJECT <br /><br />CLASSID="clsid：31291E80-728C-11CF-93D5-0020AF99504A" <br /><br />CODEBASE="MSCHART.CAB#version=1，0，0，0" <br /><br />ID=chart1 <br /><br />WIDTH=400 <br /><br />HEIGHT=200 <br /><br />ALIGN=center <br /><br />> <br /><br />&lt;/OBJECT> <br /><br /><br />&lt;SCRIPTlanguage="VBScript"> <br /><br />Subchart1_Click（） <br /><br />Document.chart1.TitleText="MyTitle" <br /><br />EndSub <br /><br /><br />　　这里，必须提供该OCX的ClassID和文件路径或URL。客户端浏览此页面时，先在本地的注册表中查找该ClassID，如果存在，则不必下载。否则，必须按照CODEBASE指定的路径搜索该控制并下载。标签Object中的ID是该OCX的对象的名称，用来 <br />　　访问和设置对象属性，调用对象方法等。
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/147307#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>Mon, 10 Dec 2007 16:41:18 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/147307</link>
        <guid>http://dananhai.javaeye.com/blog/147307</guid>
      </item>
      <item>
        <title>数据库操作语句</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/147017" style="color:red;">http://dananhai.javaeye.com/blog/147017</a>&nbsp;
          发表时间: 2007年12月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、查看当前数据库版本信息 <br /><br />select * from product_component_version;<br />select * from v$version;<br /><br /><br /><br />  2、授权与取消<br /><br />grant 权限(如sysdba) to 用户名;<br />revoke 权限(如sysdba) from 用户名;<br /><br /><br /><br />  3、查看数据库中哪些用户被授予了sysdba和/或sysoper权限<br /><br />select * from v$pwfile_users;<br /><br /><br />  4、更改用户密码<br /><br /><br />alter user 用户名 identified by 新密码;<br /><br /><br />   5、启动实例，装载并打开数据库<br /><br /><br />startup<br /><br /><br />   6、启动实例，不装载数据库<br /><br /><br />startup nomount<br /><br /><br />   7、启动并装载数据库<br /><br />startup mount<br /><br /><br />   8、迫使实例启动<br /><br /><br /><br />startup force<br /><br /><br />   9、打开一个关闭的数据库<br /><br /><br />alter database open<br /><br /><br />  10、以只读模式打开数据库<br /><br />alter database open read only<br /><br /><br />  11、用读写模式打开数据库<br /><br />alter database open read write<br /><br /><br />  12、查看所有表<br /><br /><br />select * from user_all_tables;<br /><br /><br />  13、查看实例名<br /><br /><br /><br />select instance_name from v$instance;<br /><br /><br />  14、查看数据库全名<br /><br /><br />select * from global_name;<br /><br /><br />  15、查看表空间<br /><br />select * from user_tablespaces;<br /><br /><br />  16、查看某表创建的时间<br /><br />select object_name,created from user_objects;<br /><br /><br />  17、查看同义词<br /><br /><br />select * from user_synonyms<br /><br /><br />  18、查看当前数据库状态<br /><br /><br />select open_mode from v$database;<br /><br /><br />  19、更改为只读<br /><br /><br />alter database open read only;<br /><br /><br />  20、查看所有用户信息<br /><br /><br />select username,profile,account_status from dba_users;<br /><br /><br /><br />21、查看当前用户的角色<br /><br />select * from user_role_privs;<br /><br /><br />  22、查看当前用户的系统权限<br /><br />select * from user_sys_privs;<br /><br /><br />  23、查看当前用户的表权限<br /><br />select * from user_tab_privs;<br /><br /><br />  24、设为禁止<br /><br /><br />alter system quiesce restricted
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/147017#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, 09 Dec 2007 12:19:20 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/147017</link>
        <guid>http://dananhai.javaeye.com/blog/147017</guid>
      </item>
      <item>
        <title>转 常用SQL语句</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/147014" style="color:red;">http://dananhai.javaeye.com/blog/147014</a>&nbsp;
          发表时间: 2007年12月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          SQL分类： <br /><br />　　DDL—数据定义语言(CREATE，ALTER，DROP，DECLARE) <br />　　DML—数据操纵语言(SELECT，DELETE，UPDATE，INSERT) <br />　　DCL—数据控制语言(GRANT，REVOKE，COMMIT，ROLLBACK)<br /><br />　　首先,简要介绍基础语句：<br /><br />　　1、说明：创建数据库<br /><br />CREATE DATABASE database-name <br /><br />　　2、说明：删除数据库<br /><br />drop database dbname<br /><br />　　3、说明：备份sql server<br /><br />　　--- 创建 备份数据的 device<br /><br />USE master<br />EXEC sp_addumpdevice ’disk’, ’testBack’, ’c:mssql7backupMyNwind_1.dat’<br /><br />　　--- 开始 备份<br /><br />BACKUP DATABASE pubs TO testBack <br /><br />　　4、说明：创建新表<br /><br />create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)<br /><br />　　根据已有的表创建新表： <br /><br />A：create table tab_new like tab_old (使用旧表创建新表)<br />B：create table tab_new as select col1,col2… from tab_old definition only<br /><br />　　5、说明：<br /><br />　　删除新表：drop table tabname <br /><br />　　6、说明：<br /><br />　　增加一个列：Alter table tabname add column col type<br /><br />　　注：列增加后将不能删除。DB2中列加上后数据类型也不能改变，唯一能改变的是增加varchar类型的长度。<br /><br />　　7、说明：<br /><br />　　添加主键：Alter table tabname add primary key(col) <br /><br />　　说明：<br /><br />　　删除主键：Alter table tabname drop primary key(col)<br /><br />　　8、说明：<br /><br />　　创建索引：create [unique] index idxname on tabname(col….) <br /><br />　　删除索引：drop index idxname<br /><br />　　注：索引是不可更改的，想更改必须删除重新建。<br /><br />　　9、说明：<br /><br />　　创建视图：create view viewname as select statement<br /><br />　　删除视图：drop view viewname<br /><br />        10、说明：几个简单的基本的sql语句<br /><br />　　选择：select * from table1 where 范围<br /><br />　　插入：insert into table1(field1,field2) values(value1,value2)<br /><br />　　删除：delete from table1 where 范围<br /><br />　　更新：update table1 set field1=value1 where 范围<br /><br />　　查找：select * from table1 where field1 like ’%value1%’ ---like的语法很精妙，查资料!<br /><br />　　排序：select * from table1 order by field1,field2 [desc]<br /><br />　　总数：select count * as totalcount from table1<br /><br />　　求和：select sum(field1) as sumvalue from table1<br /><br />　　平均：select avg(field1) as avgvalue from table1<br /><br />　　最大：select max(field1) as maxvalue from table1<br /><br />　　最小：select min(field1) as minvalue from table1<br /><br />　　11、说明：几个高级查询运算词<br /><br />　　A： UNION 运算符 <br /><br />　　UNION 运算符通过组合其他两个结果表（例如 TABLE1 和 TABLE2）并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时（即 UNION ALL），不消除重复行。两种情况下，派生表的每一行不是来自 TABLE1 就是来自 TABLE2。<br /><br />　　B： EXCEPT 运算符 <br /><br />　　EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL)，不消除重复行。 <br /><br />　　C： INTERSECT 运算符<br /><br />　　INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL)，不消除重复行。<br /><br />　　注：使用运算词的几个查询结果行必须是一致的。<br /><br />　　12、说明：使用外连接 <br /><br />　　A、left outer join： <br /><br />　　左外连接（左连接）：结果集几包括连接表的匹配行，也包括左连接表的所有行。 <br /><br />SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c<br /><br />　　B：right outer join: <br /><br />　　右外连接(右连接)：结果集既包括连接表的匹配连接行，也包括右连接表的所有行。<br /><br />　　C：full outer join： <br /><br />　　全外连接：不仅包括符号连接表的匹配行，还包括两个连接表中的所有记录。<br /><br />　　其次，大家来看一些不错的sql语句<br /><br />　　1、说明：复制表(只复制结构,源表名：a 新表名：b) (Access可用)<br /><br />　　法一：select * into b from a where 1&lt;>1<br /><br />　　法二：select top 0 * into b from a<br /><br />　　2、说明：拷贝表(拷贝数据,源表名：a 目标表名：b) (Access可用)<br /><br />insert into b(a, b, c) select d,e,f from b;<br /><br />　　3、说明：跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)<br /><br />insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件<br /><br />　　例子：..from b in ’"&Server.MapPath(".")&"data.mdb" &"’ where..<br /><br />　　4、说明：子查询(表名1：a 表名2：b)<br /><br />select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)<br /><br />　　5、说明：显示文章、提交人和最后回复时间<br /><br />select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b<br /><br />        6、说明：外连接查询(表名1：a 表名2：b)<br /><br />select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c<br /><br />　　7、说明：在线视图查询(表名1：a )<br /><br />select * from (SELECT a,b,c FROM a) T where t.a > 1;<br /><br />　　8、说明：between的用法,between限制查询数据范围时包括了边界值,not between不包括<br /><br />select * from table1 where time between time1 and time2<br /><br />select a,b,c, from table1 where a not between 数值1 and 数值2<br /><br />　　9、说明：in 的使用方法<br /><br />select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)<br /><br />　　10、说明：两张关联表，删除主表中已经在副表中没有的信息 <br /><br />delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )<br /><br />　　11、说明：四表联查问题：<br /><br />select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....<br /><br />　　12、说明：日程安排提前五分钟提醒<br /><br />SQL: select * from 日程安排 where datediff(’minute’,f开始时间,getdate())>5<br /><br />　　13、说明：一条sql 语句搞定数据库分页<br /><br />select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段<br /><br />　　14、说明：前10条记录<br /><br />select top 10 * form table1 where 范围<br /><br />　　15、说明：选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)<br /><br />select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)<br /><br />　　16、说明：包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表<br /><br />(select a from tableA ) except (select a from tableB) except (select a from tableC)<br /><br />　　17、说明：随机取出10条数据<br /><br />select top 10 * from tablename order by newid()<br /><br />　　18、说明：随机选择记录<br /><br />select newid()<br /><br />　　19、说明：删除重复记录<br /><br />Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)<br /><br />　　20、说明：列出数据库里所有的表名<br /><br />select name from sysobjects where type=’U’<br /><br />        21、说明：列出表里的所有的<br /><br />select name from syscolumns where id=object_id(’TableName’)<br /><br />　　22、说明：列示type、vender、pcs字段，以type字段排列，case可以方便地实现多重选择，类似select 中的case。<br /><br />select type,sum(case vender when ’A’ then pcs else 0 end),sum(case vender when ’C’ then pcs else 0 end),sum(case vender when ’B’ then pcs else 0 end) FROM tablename group by type<br /><br />　　显示结果：<br /><br />type    vender pcs<br />电脑 A 1<br />电脑 A 1<br />光盘 B 2<br />光盘 A 2<br />手机 B 3<br />手机 C 3<br /><br />　　23、说明：初始化表table1<br /><br />TRUNCATE TABLE table1<br /><br />　　24、说明：选择从10到15的记录<br /><br />select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc<br /><br />　　随机选择数据库记录的方法（使用Randomize函数，通过SQL语句实现）<br /><br />　　对存储在数据库中的数据来说，随机数特性能给出上面的效果，但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环：<br /><br />Randomize <br />RNumber = Int(Rnd*499) +1 <br />　<br />While Not objRec.EOF <br />If objRec("ID") = RNumber THEN <br />... 这里是执行脚本 ... <br />end if <br />objRec.MoveNext <br />Wend <br /><br />　　这很容易理解。首先，你取出1到500范围之内的一个随机数（假设500就是数据库内记录的总数）。然后，你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495，那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些，但相比更为稳固的企业解决方案这还是个小型数据库了，后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了？ <br /><br />　　采用SQL，你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset，如下所示：<br /><br />Randomize <br />RNumber = Int(Rnd*499) + 1 <br />　<br />SQL = "SELECT * FROM Customers WHERE ID = " & RNumber <br />　<br />set objRec = ObjConn.Execute(SQL) <br />Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")<br /><br />　　不必写出RNumber 和ID，你只需要检查匹配情况即可。只要你对以上代码的工作满意，你自可按需操作“随机”记录。Recordset没有包含其他内容，因此你很快就能找到你需要的记录这样就大大降低了处理时间。<br /><br />        再谈随机数<br /><br />　　现在你下定决心要榨干Random 函数的最后一滴油，那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。<br /><br />　　为了取出几条随机选择的记录并存放在同一recordset内，你可以存储三个随机数，然后查询数据库获得匹配这些数字的记录： <br /><br />　　SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3 <br /><br />　　假如你想选出10条记录（也许是每次页面装载时的10条链接的列表），你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成，但是 SELECT 语句只显示一种可能（这里的ID 是自动生成的号码）： <br />SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9" <br /><br />　　注意：以上代码的执行目的不是检查数据库内是否有9条并发记录。<br /><br />　　随机读取若干条记录，测试过<br /><br />Access语法：SELECT top 10 * From 表名 ORDER BY Rnd(id)<br />Sql server:select top n * from 表名 order by newid()<br />mysql select * From 表名 Order By rand() Limit n<br /><br />　　Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)<br /><br />　　语法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...<br /><br />　　使用SQL语句 用...代替过长的字符串显示<br /><br />　　语法：<br /><br />　　SQL数据库：select case when len(field)>10 then left(field,10)+’...’ else field end as news_name,news_id from tablename<br />　　Access数据库：SELECT iif(len(field)>2,left(field,2)+’...’,field) FROM tablename; <br /><br />　　Conn.Execute说明<br /><br />　　Execute方法<br /><br />　　该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集，该方法的使用格式分为以下两种：<br /><br />　　1．执行SQL查询语句时，将返回查询得到的记录集。用法为：<br /><br />　　Set 对象变量名=连接对象.Execute("SQL 查询语言")<br /><br />　　Execute方法调用后，会自动创建记录集对象，并将查询结果存储在该记录对象中，通过Set方法，将记录集赋给指定的对象保存，以后对象变量就代表了该记录集对象。<br /><br />　　2．执行SQL的操作性语言时，没有记录集的返回。此时用法为：<br /><br />　　连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]<br /><br />　　·RecordAffected 为可选项，此出可放置一个变量，SQL语句执行后，所生效的记录数会自动保存到该变量中。通过访问该变量，就可知道SQL语句队多少条记录进行了操作。<br /><br />　　·Option 可选项，该参数的取值通常为adCMDText，它用于告诉ADO，应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数，可使执行更高效。<br /><br />　　·BeginTrans、RollbackTrans、CommitTrans方法<br /><br />　　这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物；RollbackTrans用于回滚事务；CommitTrans用于提交所有的事务处理结果，即确认事务的处理。<br /><br />　　事务处理可以将一组操作视为一个整体，只有全部语句都成功执行后，事务处理才算成功；若其中有一个语句执行失败，则整个处理就算失败，并恢复到处里前的状态。<br /><br />　　BeginTrans和CommitTrans用于标记事务的开始和结束，在这两个之间的语句，就是作为事务处理的语句。判断事务处理是否成功，可通过连接对象的Error集合来实现，若Error集合的成员个数不为0，则说明有错误发生，事务处理失败。Error集合中的每一个Error对象，代表一个错误信息。
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/147014#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, 09 Dec 2007 11:48:03 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/147014</link>
        <guid>http://dananhai.javaeye.com/blog/147014</guid>
      </item>
      <item>
        <title>VBA的感觉</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/146478" style="color:red;">http://dananhai.javaeye.com/blog/146478</a>&nbsp;
          发表时间: 2007年12月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近搞了一段时间VBA编程，是基于JAVA下的OLE实现，这个东西还是比较贱的，特点如下：<br /><br />     1.函数调用如果有返回值，可以得到返回值判断之。<br />     2.如果是属性（变量）类型是Variant,如果是null说明执行函数和获得属性的方法不存在，如果是Variant$$null是函数和属性执行结果的返回值，如果是Variant(一串数字)则该变量值存在。<br />     3.如果变量是基本类型，可以调用Variant相应函数得到它的值。<br />     4.在VBA下运行没问题的，可能JAVA下就会有错（郁闷<img src="/images/smiles/icon_sad.gif"/>）<br />     5.OLE方式中，对WORD的操作可以在程序中直接看到<br /><br />     针对性的方法：<br />     <br />     1.在一个功能中和完成后，使用System.out输出调试信息，争取只看调试信息就可以知道程序运行的情况<br />     2.对于VBA中不能实现的方法，可以使用另一种思路来实现，比如：页眉是seekview没法实现，可使用section其中实现；当以某文件为模板进行大量复制时，会出现错误，应该设定文件数，保存到多个文件，再进行文件合并<br />     3.要实现一个功能，先在WORD使用宏运行一下，删除无用的代码，得到最精简的部分。如果正常的话，可以在JAVA中编程实现，有问题则再GOOGLE上找去喽<img src="/images/smiles/icon_surprised.gif"/><br />     <br />     有用的程序：<br />     1. 单个文件打印  批量打印<br />     2. 保存文件 批量保存文件<br />     3. 设置页眉、页脚<br />     4. 查找和替换<br />     5. 建立表格和向表格中写入数据<br /><br />     用这几天的时间把程序总结一下
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/146478#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, 06 Dec 2007 18:39:15 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/146478</link>
        <guid>http://dananhai.javaeye.com/blog/146478</guid>
      </item>
      <item>
        <title>swt中使用ole对象</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/143718" style="color:red;">http://dananhai.javaeye.com/blog/143718</a>&nbsp;
          发表时间: 2007年11月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在一个视图中包含一个Active X控件需要两个对象的支持，即一个OleFrame和一个OleClientSite对象。如果需要创建一个OLE应用，需要先后创建他们。创建OleFrame对象比较简单，OleFrame类定义在org.eclipse.swt.ole.win32中，创建OleFrame对象只需要简单的new就可以，如下：<br />    OleFrame frame = new OleFrame(parent, SWT.NONE);<br />在这个构造函数中，第一个参数指的是该OleFrame的母窗口部件，即Active X控件将要被嵌入的窗口部件。<br />    在OleFrame的基础上就可以创建OleClientSite对象，创建该对象需要知道控件的programID.<br />    OleClientSite client = new OleClientSite(frame,SWT.NONE,"Shell.Explorer.2");<br />    创建对象后，还需要激活，才能够在RCP程序中对这些OLE对象进行操作。如下：<br />client.doVerb(OLE.OLEIVERB_SHOW);<br />然后，我们需要操作这个Active X控件，调用它的方法，或者设置它的属性。比如在此例中，我们需要调用浏览器控件的navigate方法，以便我们的浏览器控件显示www.blogjava.net的主页。对Active X控件的操作通过OleAutomation对象来实现，创建OleAutomation对象的方法如下：<br />       OleAutomation automation = new OleAutomation(client);<br />    再通过automation.invoke()来调用Active X控件的方法，其中invoke方法有几种重载形式，有只带一个int参数的，也有带int和Variant[]两个参数的，其中的int参数表示要调用的Active X控件的方法的ID，Variant[]参数就是要传递给Active X控件的方法的参数。<br /><br />这里我们要说一说Variant类，这个类提供了多个构造函数，可以方便的将int,float,long,double,string等等基本数据类型封装为Variant，比如我们要传递给浏览器控件的navigate方法的地址参数：<br />   Variant url = new Variant("http://www.blogjava.net");<br />   automation.invoke(104, new Variant[]{url});<br /><br />代码示例：<br />    <pre name="code" class="java">
   OleFrame frame = new OleFrame(parent, SWT.NONE);
   OleClientSite client = new OleClientSite(((OleView)vw).frame,SWT.NONE,"Shell.Explorer.2");
   client.doVerb(OLE.OLEIVERB_SHOW);
   OleAutomation oa = new OleAutomation(client);
   Variant str = new Variant("http://www.blogjava.net/");
   oa.invoke(104, new Variant[]{str});</pre>
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/143718#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>Mon, 26 Nov 2007 15:49:06 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/143718</link>
        <guid>http://dananhai.javaeye.com/blog/143718</guid>
      </item>
      <item>
        <title>背单词 具体方法</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/141887" style="color:red;">http://dananhai.javaeye.com/blog/141887</a>&nbsp;
          发表时间: 2007年11月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1，象形法记忆英语单词 <br /><br />汉字中的象形字是指把字画成象所代表的东西的样子，如“木”字，其原形就象是一棵树。在英语单词我们也可以通过对单词中的一些字母的形状进行“象形化”的联想来帮助记忆或者区分易混淆的单词。试看以下几例： <br /><br />（1）omelet n. 煎蛋卷 <br /><br />o +me +let 把字母“o”想像成一个鸡蛋，然后从右往左看：让（let）我（me）吃一个鸡蛋（ “o” ）——“煎蛋卷”也不错。 <br /><br />（2）rifle n. 步枪 rife a. 流行的，普遍的 <br /><br />rifle中的字母“l”象不象一杆长枪，rifle和rife就不容易混淆了吧。 <br /><br />（3）eclipse n. (日、月)蚀 ellipse n. 椭圆(形) <br /><br />eclipse中的“c”像一个圆缺了一块儿，正如日蚀、月蚀中被遮住了一部分，从而与ellipse区分开。 <br /><br />（4）bank n. 银行 lank a. 瘦的，细长的 <br /><br />与大腹便便的“b”相比，又细又长的“l”是不是显得很瘦(lank)。 <br /><br />（5）pretty a. 漂亮的，可爱的 petty a. 琐碎的，小的 <br /><br />把字母“r”想像成一朵花儿，花不就是美丽漂亮(pretty)的象征吗。 <br /><br />（6）loop n. 圈，金属线圈 <br /><br />LOOP LINE 即指“地铁环线”，在北京地铁列车每节车厢里的每道门上都有该词的倩影和形象的图形。把loop用连笔写，是不是很象中学物理课本上常见的线圈。 <br /><br />（7）avoid v. 避免 ovoid adj./n. 卵形的，卵形体 <br /><br />字母“o”不就是卵形的（ovoid）吗。 <br /><br />（8）friend n. 朋友 <br /><br />friend – r → fiend n. 恶魔，魔鬼 <br /><br />字母“r”象是一朵花，朋友（friend）来了有鲜花，魔鬼（fiend）来了有猎枪。 <br /><br />2，指事法记忆英语单词 <br /><br />汉字中的指事字是指在象形符号上加指示符号，或者用抽象的符号组成的方法来表示字义。如上面的象形字“木”，在木字下面加一抽象符号“－”，变成“本”字，原意即指树的根部。英语单词中也有一些字母有“指示”意义，可以帮助我们记忆或者区分易混淆的单词。 <br /><br />（1）bridge n. 桥 bridge – g → bride n. 新娘 <br /><br />字母“g” 代表女孩(girl)，新娘（bride）出嫁，告别女孩时代，也标志着跨过了人生一座桥（bridge）。 <br /><br />（2）agate n. 玛瑙 <br /><br />a + gate 一扇（“a”表示“一”）用玛瑙(agate)做的门（gate），这扇门岂不成了财富之门，是不是 “阿里巴巴，芝麻开门！”中的那一扇？ <br /><br />（3）ingenious adj. 聪明的，有发明天才的 ingenuous adj. 单纯的，天真的 <br /><br />“我”（i）是聪明的（ingenious），“你”（u → you）是天真的（ingenuous），咱俩儿不是一清二楚吗。 <br /><br />（4）soldier n. 战士 soldier – i → solder v. 焊接，焊合 <br /><br />字母“i”即“I”（我），表示“人”，所以soldier指人——战士，从而与solder区分开。 <br /><br />（5）oration n. 正式演讲，演说 ovation n. 鼓掌，热烈欢迎 <br /><br />ovation中的字母“v”即是常用的表示胜利、成功的手势，这里听众的掌声（ovation）即可表示演说（oration）的成功。 <br /><br />（6）care v. 关心，关怀 care + ss → caress v. 爱抚，抚摩 <br /><br />两个“s”表示双重复数，代表加倍的关心（care）——爱抚（caress）。 <br /><br />（7）supper n. 晚餐 supper + c → scupper v. 伏击，使处于危难之中 <br /><br />将字母“c”联想为cup → 酒杯，这是不是鸿门宴，亦或是最后的晚餐。 <br /><br />（8）horse n. 马 horse + a → hoarse adj. 嘶哑的，粗哑的 <br /><br />字母“a”即表示 “一个”，联想记忆：一匹（a）声音嘶哑的（hoarse）马（horse），也许你太累了，也该歇歇了。 <br /><br />3，会意法记忆英语单词 <br /><br />汉字中的会意字和象形字类似，也是一种形象符号，只不过是会合两个或者更多个字或符号的意义来表示一个新字的意义。如“木”字加单人旁“亻”合起来为“休”，表示人在树旁休息。英语中有大量的复合词即可视为“会意词”， 一些不是复合词的英语单词从会意字的角度进行拆分往往也能有利于我们的记忆。 <br /><br />（1）middleman n. 经纪人 <br /><br />middle + man 在中间（middle）进行斡旋的人（man）——经纪人。 <br /><br />（2）greenhouse n. 温室 <br /><br />green + house 温室(greenhouse)不就是充满绿色(green)的大屋子(house)嘛。 <br /><br />（3）landmark n. 陆标，界标 <br /><br />land + mark 土地(land)上的标记(mark)，可不就是陆标(landmark)吗。 <br /><br />（4）Oxford 牛津大学 <br /><br />ox（牛） + ford（渡口，浅滩） 牛过渡口，可以想见，当年的牛津大学也是一派水草丰盛、赶牛过河的田园风光，“牛津”二字的翻译亦传神也。 <br /><br />（5）bulletin n. 布告，公告 <br /><br />bullet + in 象子弹（bullet）一样打入到（in）公众身上，在传播学理论中恰巧有一种理论就叫作“子弹论”。 <br /><br />（6）island n. 岛屿，小岛 <br /><br />is + land 岛屿（island）可以说是（is）海上的一小片“陆地”(land)。 <br /><br />（7）anthem n. 赞美歌，圣歌 <br /><br />an + them 一首（an）大家（them）一起唱的歌，national anthem即指人人皆唱的国歌。 <br /><br />（8）killjoy n. 令人扫兴的人 <br /><br />kill + joy 在别人的兴头上（joy）泼冷水（kill）的人可不就是个killjoy嘛。 <br /><br />4，形声法记忆英语单词 <br /><br />汉字中的形声字一般由两个偏旁组成，一个形旁表示大而模糊的义类，一个声旁表示字的读音。如“木”与“勾”组成“构”字，“木”与“风”组成“枫”字等。汉字中的绝大多数都是形声字，但现在大多数形声字的声旁已经丧失了表音功能，而形声字的形旁相对稳定些。 <br /><br />英语单词中带有词根的单词都可以视为“形声词”，集中在一起记常常会提高我们记忆的效率。例如，英语字根test 表示“测试”、“试验”的意思，把下面均含有该词根的几个易混淆的单词放在一起记就容易多了。” <br /><br />testy adj. 暴躁的，性急的 <br />detest v. 憎恶，深恶 <br />protest n./v. 抗议，反对 <br />contest v. 竞争 <br />attest v. 证明 <br /><br />联想记忆：考试（test）常常让人着急上火（testy），引人反感（detest），甚至抗议（protest），但是，迄今为止还没有找到比考试更好的办法来进行公平的竞争（contest），从而公平地证明（attest）你我他的实力。因此，我们不得不继续将考试进行到底。 <br /><br />此外，仔细观察英语单词中的一些生词，可以看出有些生词往往是平时很熟悉的单词在词形上稍稍发生了一点变化而已，如替换字母、加减字母、字母顺序改变等。把这类词形相近的单词放在一起记忆并在词意上进行联想，往往既有趣又容易记住。这也是我们记忆学习易混淆的汉字时常用的办法。看下面几个例子： <br /><br />（1）brain n. 大脑 drain v. 排水 <br /><br />brain drain “大脑流失”，即指常常令发展中国家头疼不已的“人才外流”。 <br /><br />（2）local adj. 地方的 vocal adj. 声音的，使用嗓音的 <br /><br />这不是一方水土，一方乡音吗？在朗朗的背词声中，你是否听到了熟悉的乡音？他乡遇故人，趁着高兴劲儿，大伙一块儿背单词吧。 <br /><br />（3）year n. 年 year + n → yearn v. 盼望，渴望 <br /><br />盼望（yearn）着，盼望着，新年（year）的脚步近了，终于可以过年了。 <br /><br />（4）smile n/v. 微笑，笑容 smile + i → simile n. 明喻，直喻 <br /><br />课堂上，老师这个生动贴切的比喻（simile）引得大家会心一笑(smile)。 <br /><br />（5）kind adj. 和蔼的，亲切的 n. 种类 kind – d → kin n. 家属 <br /><br />家庭成员（kin）和睦（kind），工作事业发达，这不正是“家和万事兴” ！ <br /><br />（6）ear n. 耳朵 ear + l → earl n. 伯爵 p + earl → pearl n. 珍珠 <br /><br />在过去，贵人(如earl等)的相貌身世常常被描绘为“方面阔耳(ear)” 、“衔珠(pearl)而生”。 <br /><br />（7）ample adj. 富足的，充足的 maple n. 枫树 <br /><br />想像一下，“枫叶之国”加拿大满山遍野的枫树的样子。 <br /><br />（8）martial adj. 尚武的，军事的 marital adj. 婚姻的 <br /><br />不打不相识，古今中外多少缘份都是这么得来的。背单词时，别忘了互相多考考。
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/141887#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>Mon, 19 Nov 2007 22:59:59 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/141887</link>
        <guid>http://dananhai.javaeye.com/blog/141887</guid>
      </item>
      <item>
        <title>背单词的方法</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/141882" style="color:red;">http://dananhai.javaeye.com/blog/141882</a>&nbsp;
          发表时间: 2007年11月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          背单词捷径的第一条，就是：一定要每次都大量地背。因为自己不比别人聪明，所以背完单词，别人忘掉五分之一，自己决不会比别人忘得少。然而，别人每天背十个单词，自己却可以背一百个，忘掉五分之一，还剩八十个，是别人最聪明状态下的十倍。每天一百个是最低限。其实背到后来您会发现这个要求并不高，一个月后，您可能自然而然地就背到三百或者五百。<br /><br />　　这一百个要分成四组来背，上午三十,中午十个，下午三十，晚上三十。第二天早晨复习以前没背下来的词。背的时候，要一目十词(注意，是十个而不是更多或更少)，不要认认真真背，因为没有认认真真的时间。一边看一边读每个词的读音，默读也成。看完后回忆一遍，回忆不起来的再看。这次背的目的在于留下个大概印象，下次看见能知道这个词，所以背到大部分都能回忆得起来就成了，把剩下的词单独抄出来。 <br />    背单词捷径的第三条，就是：和单词多见面。一个单词能不能记住，取决于和它在不同场合见面的频率，不在于每次看着它的时间长短(同样规律也适合于泡MM;))。一般想记住一个单词，每星期要和它在*不同场合*见三到四次面。俺在上文中提到大量背的时候，不要抠某一个字记住与否就是这个意思。因为是否一见钟情都是无所谓的，关键在于有更多不同类型的见面机会。不过，根据要背的单词的等级不同，增加见面机会的方式也有所不同。<br />    第一个分支：瞎听！三千到四千这个等级，是非常常用的单词，而且几乎囊括了表达最基本思想所需要的一切词汇。每篇文章中百分之八十都是这些词汇，而且这些词都是最基本的语素(或称"词根")，就是分割到最小无法再分割，互相之间也没什么类似之处的东西。对付这些词的最好方法，就是进行大量的，不间断的，简单的初级听力练习。因为阅读材料中，还有百分之二十其他词汇，所以光凭这个等级的词还看不懂那些阅读材料。但是听力练习都是最基本的对话，而且发音一般很标准，多听能够增加单词的重复率，而且可以为以后背八千到一万那个等级的词打下语音基础。听的时候，要分精听和泛听两部分。精听当然是指每个词都要弄懂，俺着重讲一下泛听(饭厅?;P)。泛听是最重要的，因为掌握语速和语调，以及总体印象都要靠泛听。而这些都是背八千到一万等级单词的基础?泛听能够让经常用到的词(也就是那些最必要掌握的词)把您的耳朵磨出茧子来，让您模模糊糊听到个音就能反应出它是什么意思。泛听中您听到的词，才是您真正应该记住的词，所以别害怕精听的时候什么都听不懂。到底什么是泛听呢？泛听，就是说您听的时候，精神要分散，要一边干着其他事(比如撮饭或和别人大声讨论撮饭;)~)，一边有一搭没一搭地听着。泛听一定要见缝插针，一有机会就听着，最好耳机不离耳朵。;)而精听的意义就在于找出您没听清的那些词。啊哈，那就是您背过但还不熟悉的词了。:)把这些词单独记在另外一个地方，别跟没背下来的词混了。泛听要听精听已经听过的内容。比如精听听到了第二盘磁带，那么泛听就听第一盘磁带，正好。提醒您一句，千万别拿英语广播当自己的听力教材!!! <br /><br />第二个分支：狂看！八千到一万这个等级，基本包含了剩下的百分之二十。这些单词在听力教材里很难找到。但是，可不要停止听的练习呦，因为听能巩固您的语调感觉，而这是背这个等级单词的一个关键。不过，背这个等级的词，需要在听以外增加看的内容。看，同样要分精读和泛读两种。就象听一样，也是泛读更重要一些。泛读要挑不太长，能有耐心看完的文章，而且看不懂的词不要太多，一篇文章有两三个不认识的就足够了。千万不要一上来就看英语报刊杂志小说，那些东西不但很难看懂，而且看懂了也对背单词没什么促进作用。泛读也需要大量练习，只要您有耐心，又有足够时间，就一直看下去吧！看的时候不要仔细阅读，扫一眼明白个大概意思就成了，然后把这一眼没看懂的词画上记号，别琢磨它是什么意思，继续扫描吧！全部看完之后，回头再看这些单词，有的可能已经想起来了，有的....还没想起来？那就查查字典，要是自己还没背过，就扔掉它，要是已经背过了，就单独抄下来吧，和听力练习中没听出来的词放在一起。
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/141882#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>Mon, 19 Nov 2007 22:49:29 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/141882</link>
        <guid>http://dananhai.javaeye.com/blog/141882</guid>
      </item>
      <item>
        <title>C++常用类库</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/141868" style="color:red;">http://dananhai.javaeye.com/blog/141868</a>&nbsp;
          发表时间: 2007年11月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          GUI：WxWindows 、 Qt、Gtk+，<br />xml解析      ：xerces-c++，Xml4C<br />网络编程     ：ACE，<br />数据库编程   ：OTL<br />其它功能类库 ：boost<br />算法库       : stl<br />日志库       : log4Cxx
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/141868#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>Mon, 19 Nov 2007 21:34:16 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/141868</link>
        <guid>http://dananhai.javaeye.com/blog/141868</guid>
      </item>
      <item>
        <title>C++ Boost库简介[转载]</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/141867" style="color:red;">http://dananhai.javaeye.com/blog/141867</a>&nbsp;
          发表时间: 2007年11月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ++ Boost库简介 <br />     boost是一个准标准库，相当于STL的延续和扩充，它的设计理念和STL比较接近，都是利用泛型让复用达到最大化。不过对比STL，boost更加实用。STL集中在算法部分，而boost包含了不少工具类，可以完成比较具体的工作。 <br />     boost主要包含一下几个大类：字符串及文本处理、容器、迭代子(Iterator)、算法、函数对象和高阶编程、泛型编程、模板元编程、预处理元编程、并发编程、数学相关、纠错和测试、数据结构、输入/输出、跨语言支持、内存相关、语法分析、杂项。 有一些库是跨类别包含的，就是既属于这个类别又属于那个类别。 <br />     在文本处理部分，conversion/lexcial_cast类用于“用C++”的方法实现数字类型和字符串之间的转换。 主要是替代C标准库中的 atoi、 itoa之类的函数。当然其中一个最大的好处就是支持泛型了。 <br />     format库提供了对流的“printf-like”功能。printf里使用%d、%s等等的参数做替换的方法在很多情况下还是非常方便的，STL的iostream则缺乏这样的功能。format为stream增加了这个功能，并且功能比原始的printf更强。 <br />     regex，这个不多说了，正则表达式库。如果需要做字符串分析的人就会理解正则表达式有多么有用了。 <br />     spirit，这个是做LL分析的框架，可以根据EBNF规则对文件进行分析。（不要告诉我不知道什么是EBNF）。做编译器的可能会用到。一般人不太用的到。 <br />     tokenizer库。我以前经常在CSDN上看到有人问怎么把一个字符串按逗号分割成字符串数组。也许有些人很羡慕VB的split函数。现在，boost的tokenizer也有相同的功能了，如果我没记错的话，这个tokenizer还支持正则表达式，是不是很爽？ <br />     array: 提供了常量大小的数组的一个包装，喜欢用数组但是苦恼数组定位、确定数组大小等功能的人这下开心了。 <br />     dynamic_bitset，动态分配大小的bitset，我们知道STL里有个bitset，为位运算提供了不少方便。可惜它的大小需要在编译期指定。现在好了，运行期动态分配大小的bitset来了。 <br />     graph。提供了图的容器和相关算法。我还没有在程序中用到过图，需要用的人可以看看。 <br />     multi_array提供了对多维数组的封装，应该还是比较有用的。 <br />     并发编程里只有一个库，thread，提供了一个可移植的线程库，不过在Windows平台上我感觉用处不大。因为它是基于Posix线程的，在Windows里对Posix的支持不是很好。 <br />     接下来的 数学和数值 类里，包含了很多数值处理方面的类库，数学类我也不太熟，不过这里有几个类还是很有用的，比如rational分数类，random随机数类，等等。 <br />     static_assert，提供了编译器的assert功能。 <br />     test库，一个单元测试框架，非常不错。 <br />     concept_check提供了泛型编程时，对泛型量的一点检查，不是很完善，不过比没有好。 <br />     数据类型类any，一个安全的可以包含不同对象的类。把它作为容器的元素类型，那么这个容器就可以包含不同类型的元素。比用void *要安全。 <br />     compressed_pair，跟STL里的pair差不多。不过对空元素做了优化。 <br />     tuple，呵呵，也许是某些人梦寐以求的东西。可以让函数返回多个值。 <br />     跨语言支持：python，呵呵，好东东啊，可以将C++的类和函数映射给python使用。以下为几个CSDN上的关于boost.python的中文资料：http://dev.csdn.net/article/19/19828.shtm，http://dev.csdn.net/article/19/19829.shtm，http://dev.csdn.net/article/19/19830.shtm，http://dev.csdn.net/article/19/19831.shtm <br />     pool:内存池，呵呵，不用害怕频繁分配释放内存导致内存碎片，也不用自己辛辛苦苦自己实现了。 <br />     smart_ptr:智能指针，这下不用担心内存泄漏的问题了吧。不过，C++里的智能指针都还不是十全十美的，用的时候小心点了，不要做太技巧性的操作了。 <br />     date_time，这个是平台、类库无关的实现，如果程序需要跨平台，可以考虑用这个。 <br />     timer，提供了一个计时器，虽然不是Windows里那种基于消息的计时器，不过据说可以用来测量语句执行时间。 <br />     uitlity里提供了一个noncopyable类，可以实现“无法复制”的类。很多情况下，我们需要避免一个类被复制，比如代表文件句柄的类，文件句柄如果被两个实例共享，操作上会有很多问题，而且语义上也说不过去。一般的避免实例复制的方法是把拷贝构造和operator=私有化，现在只要继承一下这个类就可以了，清晰了很多。 <br />     value_initialized：数值初始化，可以保证声明的对象都被明确的初始化，不过这个真的实用吗？似乎写这个比直接写初始化还累。呵呵，仁者见仁了。 <br />     这里面除了regex、python和test需要编译出库才能用，其他的大部分都可以直接源代码应用，比较方便。其实这些库使用都不难。最主要的原因是有些库的使用需要有相关的背景知识，比如元编程、STL、泛型编程等等。
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/141867#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>Mon, 19 Nov 2007 21:29:03 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/141867</link>
        <guid>http://dananhai.javaeye.com/blog/141867</guid>
      </item>
      <item>
        <title>openssl介绍和原理</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/141495" style="color:red;">http://dananhai.javaeye.com/blog/141495</a>&nbsp;
          发表时间: 2007年11月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          SSL是Secure Socket Layer（安全套接层协议）的缩写,目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。改协议能使用户/服务器应用之间的通信不被攻击者窃听，并且始终对服务器进行认证，还可选择对用户进行认证。<br />    OpenSSL整个软件包大概可以分成三个主要的功能部分：密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。 <br />    加密算法：对称加密 非对称加密 信息摘要算法 密钥和协议管理 SSL和TSL协议<br />      对称算法使用一个密钥。给定一个明文和一个密钥，加密产生密文，其长度和明文大致相同。解密时，使用密钥与加密密钥相同。<br /><br />      对称算法主要有四种加密模式：<br /><br />(1) 电子密码本模式  Electronic Code Book(ECB)<br /><br />这种模式是最早采用和最简单的模式，它将加密的数据分成若干组，每组的大小跟加密密钥长度相同，然后每组都用相同的密钥进行加密。<br /><br />其缺点是：电子编码薄模式用一个密钥加密消息的所有块，如果原消息中重复明文块，则加密消息中的相应密文块也会重复，因此，电子编码薄模式适于加密小消息。<br /><br />（2）加密块链模式 Cipher Block Chaining(CBC)<br /><br />CBC模式的加密首先也是将明文分成固定长度的块，然后将前面一个加密块输出的密文与下一个要加密的明文块进行异或操作，将计算结果再用密钥进行加密得到密文。第一明文块加密的时候，因为前面没有加密的密文，所以需要一个初始化向量。跟ECB方式不一样，通过连接关系，使得密文跟明文不再是一一对应的关系，破解起来更困难，而且克服了只要简单调换密文块可能达到目的的攻击。<br /><br />（3）加密反馈模式          Cipher Feedback Mode(CFB)<br /><br />面向字符的应用程序的加密要使用流加密法，可以使用加密反馈模式。在此模式下，数据用更小的单元加密，如可以是8位，这个长度小于定义的块长（通常是64位）。其加密步骤是：<br /><br />a） 使用64位的初始化向量。初始化向量放在移位寄存器中，在第一步加密，产生相应的64位初始化密文； b) 始化向量最左边的8位与明文前8位进行异或运算，产生密文第一部分（假设为c），然后将c传输到接收方；<br /><br />c) 向量的位（即初始化向量所在的移位寄存器内容）左移8位，使移位寄存器最右边的8位为不可预测的数据，在其中填入c的内容； d) 第1-3步，直到加密所有的明文单元。<br /><br />解密过程相反<br /><br />4）输出反馈模式          Output Feedback Mode(OFB)<br /><br />输出反馈模式与CFB相似，惟一差别是，CFB中密文填入加密过程下一阶段，而在OFB中，初始化向量加密过程的输入填入加密过程下一阶段。<br /><br />      摘要算法是一种能产生特殊输出格式的算法，这种算法的特点是：无论用户输入什么长度的原始数据，经过计算后输出的密文都是固定长度的，这种算法的原理是根据一定的运算规则对原数据进行某种形式的提取，这种提取就是摘要，被摘要的数据内容与原数据有密切联系，只要原数据稍有改变，输出的“摘要”便完全不同，因此，基于这种原理的算法便能对数据完整性提供较为健全的保障。但是，由于输出的密文是提取原数据经过处理的定长值，所以它已经不能还原为原数据，即消息摘要算法是不可逆的，理论上无法通过反向运算取得原数据内容，因此它通常只能被用来做数据完整性验证。<br /><br />如今常用的“消息摘要”算法经历了多年验证发展而保留下来的算法已经不多，这其中包括MD2、MD4、MD5、SHA、SHA-1/256/383/512等。<br /><br /> 常用的摘要算法主要有MD5和SHA1。D5的输出结果为16字节，sha1的输出结果为20字节。<br /><br />       在公钥密码系统中，加密和解密使用的是不同的密钥，这两个密钥之间存在着相互依存关系：即用其中任一个密钥加密的信息只能用另一个密钥进行解密。这使得通信双方无需事先交换密钥就可进行保密通信。其中加密密钥和算法是对外公开的，人人都可以通过这个密钥加密文件然后发给收信者，这个加密密钥又称为公钥；而收信者收到加密文件后,它可以使用他的解密密钥解密，这个密钥是由他自己私人掌管的，并不需要分发，因此又成称为私钥<br /><br />    应用程序：主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。<br />    Engine机制目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。<br />    BIO机制是OpenSSL提供的一种高层IO接口，该接口封装了几乎所有类型的IO接口，如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高，<br />    OpenSSL对于随机数的生成和管理也提供了一整套的解决方法和支持API函数。随机数的好坏是决定一个密钥是否安全的重要前提
          <br/>
          <span style="color:red;">
            <a href="http://dananhai.javaeye.com/blog/141495#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, 18 Nov 2007 13:42:26 +0800</pubDate>
        <link>http://dananhai.javaeye.com/blog/141495</link>
        <guid>http://dananhai.javaeye.com/blog/141495</guid>
      </item>
      <item>
        <title>Log的使用</title>
        <author>dananhai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dananhai.javaeye.com">dananhai</a>&nbsp;
          链接：<a href="http://dananhai.javaeye.com/blog/141307" style="color:red;">http://dananhai.javaeye.com/blog/141307</a>&nbsp;
          发表时间: 2007年11月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong><span style="font-size: 18pt">log4j的基本概念</span></strong><br />使用log4j大概涉及3个主要概念: <br /><br />公共类 Logger Logger 负责处理日志记录的大部分操作。 <br />公共接口 Appender Appender 负责控制日志记录操作的输出。 <br />公共抽象类Layout Layout 负责格式化Appender的输出。 <br /><strong>3.1.Logger</strong><br />日志记录器(Logger)是日志处理的核心组件。log4j具有5种正常级别(Level)。 日志记录器(Logger)的可用级别Level (不包括自定义级别 Level)， 以下内容就是摘自log4j API (http://jakarta.apache.org/log4j/docs/api/index.html): <br /><br />static Level DEBUG DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的。 <br />static Level INFO INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程。 <br />static Level WARN WARN level表明会出现潜在错误的情形。 <br />static Level ERROR ERROR level指出虽然发生错误事件，但仍然不影响系统的继续运行。 <br />static Level FATAL FATAL level指出每个严重的错误事件将会导致应用程序的退出。<br />另外，还有两个可用的特别的日志记录级别: (以下描述来自log4j API http://jakarta.apache.org/log4j/docs/api/index.html): <br />static Level ALL ALL Level是最低等级的，用于打开所有日志记录。 <br />static Level OFF OFF Level是最高等级的，用于关闭所有日志记录。 日志记录器（Logger）的行为是分等级的。如下表所示： <br />图.日志输出等级 Logger Output Hierarchy <br /><br />日志记录器（Logger）将只输出那些级别高于或等于它的级别的信息。如果没有设置日志记录器（Logger）的级别，那么它将会继承最近的祖先的级别。因此，如果在包com.foo.bar中创建一个日志记录器（Logger）并且没有设置级别，那它将会继承在包com.foo中创建的日志记录器（Logger）的级别。如果在com.foo中没有创建日志记录器（Logger）的话,那么在com.foo.bar中创建的日志记录器（Logger）将继承root 日志记录器（Logger）的级别，root日志记录器（Logger）经常被实例化而可用，它的级别为DEBUG。 <br /><br />有很多方法可以创建一个日志记录器（Logger），下面方法可以取回root日志记录器: <br /><br />Logger logger = Logger.getRootLogger();<br /><br />还可以这样创建一个新的日志记录器: Logger logger = Logger.getLogger("MyLogger");<br /><br />比较常用的用法，就是根据类名实例化一个静态的全局日志记录器: <br /><br />static Logger logger = Logger.getLogger(test.class);<br /><br />所有这些创建的叫"logger"的日志记录器都可以用下面方法设置级别: <br /><br />logger.setLevel((Level)Level.WARN);<br /><br />可以使用7个级别中的任何一个; Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR, Level.FATAL, Level.ALL and Level.OFF. <br /><strong>3.2.Appender </strong><br /><br />Appender 控制日志怎样输出。下面列出一些可用的Appender(log4j API中所描述的 http://jakarta.apache.org/log4j/docs/api/index.html): <br /><br />   1. ConsoleAppender:使用用户指定的布局(layout) 输出日志事件到System.out或者 System.err。默认的目标是System.out。<br />   2. DailyRollingFileAppender 扩展FileAppender，因此多个日志文件可以以一个用户选定的频率进行循环日志记录。<br />   3. FileAppender 把日志事件写入一个文件<br />   4. RollingFileAppender 扩展FileAppender备份容量达到一定大小的日志文件。<br />   5. WriterAppender根据用户的选择把日志事件写入到Writer或者OutputStream。<br />   6. SMTPAppender 当特定的日志事件发生时，一般是指发生错误或者重大错误时，发送一封邮件。<br />   7. SocketAppender 给远程日志服务器（通常是网络套接字节点）发送日志事件（LoggingEvent）对象。<br />   8. SocketHubAppender 给远程日志服务器群组（通常是网络套接字节点）发送日志事件（LoggingEvent）对象。<br />   9. SyslogA