<feed xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CHS">
    <title>多士</title>
    <link rel="self" type="application/atom+xml" href="http://blog.rongzhiwang.com/owh/Atom.aspx" />
    <subtitle type="html">Powered by 融智网</subtitle>
    <id>http://blog.rongzhiwang.com/owh/Default.aspx</id>
    <author>
        <name>owh</name>
        <uri>http://blog.rongzhiwang.com/owh/Default.aspx</uri>
    </author>
    <generator uri="http://subtextproject.com" version="interwis.net Blog Version 3.0.0.0">Subtext</generator>
    <updated>2011-07-09T19:12:56Z</updated>
    <entry>
        <title>自定义Windows登录-GINA</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/owh/archive/2011/07/09/windows-gina.aspx" />
        <id>http://blog.rongzhiwang.com/owh/archive/2011/07/09/windows-gina.aspx</id>
        <published>2011-07-09T19:12:56Z</published>
        <updated>2011-07-09T19:12:56Z</updated>
        <content type="html">&lt;font size="3" face="Times New Roman"&gt;
&lt;p&gt;最近实现了银行柜员刷卡登录Windows功能，将技术要点摘录下。&lt;br /&gt;
1.     GINA原理&lt;br /&gt;
GINA是WinLogon的可插入部件。Windows操作系统中Winlogon进程负责管理与登录和身份认证相关的安全性工作，包括处理用户的登录与注销、启动用户shell、输入口令、更改口令、锁定与解锁工作站等。Winlogon进程在系统初始化时，启动用户程序之前运行起来，以保证相关操作对其它进程不可见，避免其它进程取得登录敏感数据。启动过程中winlogon.exe会调用GINA，GINA(Graphical Identification and Authentication )是微软windows操作系统提供的安全登录认证和交互登录服务的组件,可为Winlogin提供用户身份识别和验证以及用户帐号和密码的反馈功能。我们在Windows登录过程中看到的欢迎屏幕和登录对话框就是GINA显示的。在系统中GINA是一个可以被替换的动态连接库。该动态连接库默认文件名为 msgina.dll,位于系统system32目录下，主要用以实现操作系统登录进程的验证和身份验证。为了支持更多的交互登录验证方式，GINA是可替换的，我们可以自己开发GINA 动态连接库以实现其它类型的身份验证方法，而且微软官方也提供了相关文档和例程。 &lt;/p&gt;
&lt;p&gt;2.     接口      &lt;br /&gt;
    GINA作为一个图形化身份识别和验证的组件，充当系统交互式登录的入口．有些木马也利用GINA进行密码盗取。它们往往编写和系统GINA界面相同的 GINA，然后替换MSGINA.dll。最简单的GINA木马只需写一个接口和原始GINA一样的MSGINA.dll，需要实现的功能就是登录时将密码记录下来，其它所有函数的实现都是去调用原始MSGINA.dll内的同名函数。原始的GINA动态链接库会输出下列函数以供winlogon进程调用，因此在我们的GINA里要么自己实现这些函数，要么直接调用原始GINA DLL里的同名函数：&lt;/p&gt;
&lt;p&gt;   导出函数名                                       功能简介 &lt;br /&gt;
WlxActivateUserShell                         激活用户外壳程序 &lt;br /&gt;
WlxDisplayLockedNotice                         允许GINA DLL 显示锁定信息 &lt;br /&gt;
WlxDisplaySASNotice                         当没有用户登陆时，Winlogon调用此函数 &lt;br /&gt;
WlxDisplayStatusMessage                         Winlogon 用一个状态信息调用此函数进行显示 &lt;br /&gt;
WlxGetConsoleSwitchCredentials                Winlogon调用此函数读取当前登陆用户的信任信息，并透明地将它们传到目标会话 &lt;br /&gt;
WlxGetStatusMessage                         Winlogon 调用此函数获取当前状态信息 &lt;br /&gt;
WlxInitialize                                  针对指定的窗口位置进行GINA DLL初始化 &lt;br /&gt;
WlxIsLockOk        验证工作站正常锁定 &lt;br /&gt;
WlxIslogoffOk        验证注销正常 &lt;br /&gt;
WlxLoggedOnSAS        用户已登陆并且工作站没有被加锁，如果此时接收到SAS事件，则Winlogon 调用此函数 &lt;br /&gt;
WlxLoggedOutSAS        没有用户登陆，如果此时收到SAS事件，则Winlogon 调用此函数。(我们在这个函数中实现U盘开机锁的功能) &lt;br /&gt;
WlxLogoff        请求注销操作时通知GINA DLL &lt;br /&gt;
WlxNegotiate        表示当前的Winlogon版本是否能使用GINA DLL &lt;br /&gt;
WlxNetworkProviderLoad        在加载网络服务提供程序收集了身份和认证信息后，Winlogon 调用此函数 &lt;br /&gt;
WlxRemoveStatusMessage        Winlogon 调用此函数告诉GINA DLL 停止显示状态信息 &lt;br /&gt;
WlxScreensaverNotify        允许GINA与屏幕保护操作交互 &lt;br /&gt;
WlxShutdown        在关闭之前Winlogon 调用此函数，允许GINA实现任何关闭任务 &lt;br /&gt;
WlxStartApplication        当系统需要在用户的上下文中启动应用程序时调用此函数 &lt;br /&gt;
WlxWkstaLockedSAS        当工作站被锁定，如果接收到一个SAS，则Winlogon 调用此函数&lt;br /&gt;
参考资料：&lt;br /&gt;
关于GINA的介绍：http://msdn.microsoft.com/en-us/library/aa375457(v=VS.85).aspx&lt;br /&gt;
自定义winlogon的技术文档：http://msdn.microsoft.com/en-us/library/aa375198(v=vs.85).aspx&lt;br /&gt;
GINA开发的文章：http://msdn.microsoft.com/en-us/magazine/cc163803.aspx，其中也包含了示例代码。&lt;br /&gt;
在Platform SDK中也有相应的示例。&lt;/p&gt;&lt;/font&gt;
&lt;p&gt; &lt;/p&gt;
&lt;img src="http://blog.rongzhiwang.com/owh/aggbug/188.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/owh/comments/188.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/owh/comments/commentRss/188.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/owh/services/trackbacks/188.aspx</trackback:ping>
    </entry>
    <entry>
        <title>（服务端技术）Apache Click 技术简介</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/owh/archive/2011/06/29/apache-click.aspx" />
        <id>http://blog.rongzhiwang.com/owh/archive/2011/06/29/apache-click.aspx</id>
        <published>2011-06-29T23:45:08Z</published>
        <updated>2011-06-29T23:45:08Z</updated>
        <content type="html"> 
&lt;p align="center"&gt;&lt;strong /&gt;&lt;/p&gt;
&lt;div&gt;&lt;span&gt;直接从Word贴过来丢失了图片，有兴趣的童鞋请留email索取Word文档。&lt;br /&gt;
&lt;br /&gt;
一、简介&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;Apache Click &lt;/span&gt;是一个先进的&lt;span&gt;Java&lt;/span&gt;企业版的&lt;span&gt;Web&lt;/span&gt;应用程序框架，提供一个基于浏览器的富客户端编程模型。非常简单和易用，一般的开发人员在一天内就可以上手使用。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　主要的特点包括：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* &lt;/span&gt;易学&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* &lt;/span&gt;面向组件和页面的设计&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* &lt;/span&gt;基于事件的编程模型&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* &lt;/span&gt;性能非常好&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* &lt;/span&gt;自动的表单生成以及客户端、服务器端数据验证&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* &lt;/span&gt;支持&lt;span&gt; Velocity&lt;/span&gt;、&lt;span&gt;JSP&lt;/span&gt;、&lt;span&gt;FreeMarker &lt;/span&gt;等模板引擎&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* &lt;/span&gt;采用&lt;span&gt; Apache &lt;/span&gt;开源协议&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* &lt;/span&gt;支持&lt;span&gt; JDK 1.5 &lt;/span&gt;以及以后的版本&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;二、入门例子&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;　　&lt;span&gt;1.&lt;/span&gt;开发环境配置&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;　　&lt;span&gt;1.1&lt;/span&gt;常规配置&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;jdk&lt;/span&gt;&lt;span&gt;：&lt;span&gt;1.6&lt;/span&gt;；&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;IDE&lt;/span&gt;&lt;span&gt;：&lt;span&gt;eclipse3.5 JEE&lt;/span&gt;版本；&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;Tomcat&lt;/span&gt;&lt;span&gt;：&lt;span&gt;5.x&lt;/span&gt;或者&lt;span&gt;6.0&lt;/span&gt;； &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;click&lt;st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"&gt;2.2.0&lt;/st1:chsdate&gt;&lt;/span&gt;&lt;span&gt;包，下载网址：&lt;span&gt;http://click.apache.org/&lt;/span&gt;。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;　　&lt;span&gt;1.2 Apache Click IDE&lt;/span&gt;安装&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　下载&lt;span&gt;Click IDE clickide-&lt;st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"&gt;2.2.0&lt;/st1:chsdate&gt;.zip&lt;/span&gt;，解压后将&lt;span&gt;plugins&lt;/span&gt;和&lt;span&gt; features&lt;/span&gt;两个文件夹放置&lt;span&gt;Eclipse&lt;/span&gt;安装目录，然后开启&lt;span&gt;Eclipse&lt;/span&gt;程序。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;　　&lt;span&gt;2.&lt;/span&gt;例子程序开发&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1. &lt;/span&gt;&lt;span&gt;新建&lt;span&gt; Dynamic Web Project&lt;/span&gt;，其中的&lt;span&gt;configuration&lt;/span&gt;选择&lt;span&gt;click&lt;/span&gt;，无此配置则新建一个； &lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;2. Click IDE&lt;/span&gt;&lt;span&gt;提供了对&lt;span&gt;click.xml &lt;/span&gt;文件的可视化编辑器，可以更方便的进行编辑。 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;3. &lt;/span&gt;可以直接新建&lt;span&gt;click Page&lt;/span&gt;，如下图所示。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;4. &lt;/span&gt;提供了对&lt;span&gt;Velocity Template&lt;/span&gt;模版的编辑器，带有自动提示功能。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;　　&lt;span&gt;3.quickstart&lt;/span&gt;简易入门程序&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　如果从空白的&lt;span&gt;web&lt;/span&gt;应用开始创建&lt;span&gt;click&lt;/span&gt;程序，则涉及以下几方面：&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* web&lt;/span&gt;应用结构&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* Jar&lt;/span&gt;文件&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* Welcome File &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* Home Page &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;* &lt;/span&gt;框架模板&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;　　&lt;span&gt;3.1 web&lt;/span&gt;应用结构&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　首先&lt;span&gt;click&lt;/span&gt;程序在&lt;span&gt;WEB-INF &lt;/span&gt;目录下存在&lt;span&gt;click.xml &lt;/span&gt;和&lt;span&gt;web.xml &lt;/span&gt;配置文件。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;click.xml&lt;/span&gt;&lt;span&gt;： &lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;click-app&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;pages package="com.quickstart.page"/&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;/click-app&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;web.xml&lt;/span&gt;&lt;span&gt;： &lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;web-app&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;servlet&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;servlet-class&amp;gt;org.apache.click.ClickServlet&amp;lt;/servlet-class&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;load-on-startup&amp;gt;0&amp;lt;/load-on-startup&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;/servlet&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt; &lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;servlet-mapping&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;servlet-name&amp;gt;ClickServlet&amp;lt;/servlet-name&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;url-pattern&amp;gt;*.htm&amp;lt;/url-pattern&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;/servlet-mapping&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt; &lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&amp;lt;welcome-file-list&amp;gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&amp;lt;welcome-file&amp;gt;redirect.html&amp;lt;/welcome-file&amp;gt; &lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&amp;lt;/welcome-file-list&amp;gt; &lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&amp;lt;/web-app&amp;gt; &lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;3.2&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;添加&lt;span&gt;Jar&lt;/span&gt;包&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;把如下&lt;span&gt;jar&lt;/span&gt;文件添加到程序的&lt;span&gt;WEB-INF/lib&lt;/span&gt;目录下：&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;click-&lt;st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"&gt;2.2.0&lt;/st1:chsdate&gt;.jar&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;click-extras-&lt;st1:chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"&gt;2.2.0&lt;/st1:chsdate&gt;.jar&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;3.3 Welcome File &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;为确保默认的请求被转发到&lt;span&gt; home page&lt;/span&gt;， 我们将在&lt;span&gt;web&lt;/span&gt;程序根目录下新建&lt;span&gt;redirect.html&lt;/span&gt;。 文件内容：&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&amp;lt;meta http-equiv="Content-type" content="text/html; charset=utf-8"&amp;gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&amp;lt;meta http-equiv="Refresh" content="0;URL=home.htm"&amp;gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;在&lt;span&gt;web.xml&lt;/span&gt;中配置&lt;span&gt;redirect.html&lt;/span&gt;， 使默认的请求都由该文件来提供服务。当浏览器执行&lt;span&gt;redirect.html &lt;/span&gt;时， 它将被转发到&lt;span&gt;home.html&lt;/span&gt;页面。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;3.4 Home Page &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1. &lt;/span&gt;&lt;span&gt;现在开始创建页面类。创建包&lt;span&gt;com.quickstart.page,&lt;/span&gt;在该包下创建类&lt;span&gt;HomePage.&lt;/span&gt;代码如下：&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;Package com.quickstart.page; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;import java.util.Date; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;import org.apache.click.Page; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt; &lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;@SuppressWarnings("serial") &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;public class HomePage extends Page { &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;//&lt;/span&gt;声明一个私有的时间变量。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;private Date time = new Date(); &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt; &lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;public HomePage () { &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;addModel("time", time);//&lt;/span&gt;将该时间变量添加到页面模型&lt;span&gt;map&lt;/span&gt;里&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;} &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;} &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　&lt;span&gt;2. &lt;/span&gt;创建页面&lt;span&gt;home.htm&lt;/span&gt;，这里我们将&lt;span&gt;home.htm&lt;/span&gt;直接放在&lt;span&gt;webRoot&lt;/span&gt;下。代码如下：&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;html&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;head&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;title&amp;gt;Insert title here&amp;lt;/title&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;/head&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;body&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;h1&amp;gt;home--now time : $time&amp;lt;/h1&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;/body&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　　　&lt;span&gt;&amp;lt;/html&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span&gt;注：&lt;span&gt;$time &lt;/span&gt;对应&lt;span&gt;HomePage.java&lt;/span&gt;、&lt;span&gt;addModel("time", time)&lt;/span&gt;中的&lt;span&gt;time &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;3. &lt;/span&gt;&lt;span&gt;修改&lt;span&gt;click.xml&lt;/span&gt;文件，确保&lt;span&gt;home.htm&lt;/span&gt;能对应到类&lt;span&gt; HomePage.java&lt;/span&gt;。在&lt;span&gt;&amp;lt;click-app&amp;gt;&amp;lt;/click-app&amp;gt;&lt;/span&gt;中添加代码：&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;click-app charset="UTF-8"&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;pages package="com.quickstart.page" /&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;mode value="debug" /&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　　　&lt;span&gt;&amp;lt;/click-app&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span&gt;注： &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;(1)&lt;/span&gt;&lt;span&gt;．这里使用了&lt;span&gt;Click&lt;/span&gt;框架的一个重要功能，&lt;span&gt;Automapping&lt;/span&gt;即自动映射功能，在请求某页面时，&lt;span&gt;Click&lt;/span&gt;将请求自动映射到与页面命名对应的&lt;span&gt;Page&lt;/span&gt;类上进行处理，关于&lt;span&gt;Page&lt;/span&gt;类在后面有进一步的解释。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;(2)&lt;/span&gt;&lt;span&gt;．&lt;span&gt;&amp;lt;mode value="debug" /&amp;gt;&lt;/span&gt;声明后台日志的模式是什么，这里设置为&lt;span&gt;debug&lt;/span&gt;级别。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;除此之外还有&lt;span&gt;development (&lt;/span&gt;开发模式&lt;span&gt;info)&lt;/span&gt;、&lt;span&gt;profile (&lt;/span&gt;规范输出模式&lt;span&gt;info)&lt;/span&gt;、&lt;span&gt;production (&lt;/span&gt;生产模式&lt;span&gt;warn)&lt;/span&gt;、&lt;span&gt;trace (&lt;/span&gt;跟踪模式&lt;span&gt;) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;(3)&lt;/span&gt;&lt;span&gt;．&lt;span&gt;pages&lt;/span&gt;有属性&lt;span&gt;automapping&lt;/span&gt;默认为&lt;span&gt;true&lt;/span&gt;该属性将决定是否自动映射除&lt;span&gt;WEB-INF&lt;/span&gt;下所有&lt;span&gt;page&lt;/span&gt;到相应的类。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;(4)&lt;/span&gt;&lt;span&gt;．启动&lt;span&gt;tomcat&lt;/span&gt;，在浏览器地址中输入&lt;span&gt;http://localhost:8080/quickstart /home.htm&lt;/span&gt;即可看到效果。如果仅在&lt;span&gt;click.xml&lt;/span&gt;中声明包名让&lt;span&gt;Click&lt;/span&gt;自己去定位&lt;span&gt;( automapping ="true" ) &lt;/span&gt;页面对应类，则需要注意页面名称跟类名之间的关系。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;对应规则为：&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;change-password.htm =&amp;gt; ChangePassword &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;change_password.htm =&amp;gt; ChangePassword &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;changePassword.htm =&amp;gt; ChangePassword &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;ChangePassword.htm =&amp;gt; ChangePassword &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;customer.htm =&amp;gt; CustomerPage &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　　　&lt;span&gt;change-password.htm =&amp;gt; ChangePasswordPage &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span&gt;除自动映射外可以强制配置&lt;span&gt;: &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;pages package="com.quickstart.page"&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;page path="home.htm" classname="HomePage"/&amp;gt;&amp;lt;/pages&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span&gt;如果我们将页面&lt;span&gt;home.htm&lt;/span&gt;不直接放在&lt;span&gt;webRoot&lt;/span&gt;下，而是放在&lt;span&gt;page/home.htm&lt;/span&gt;下，那么要想让&lt;span&gt;Click&lt;/span&gt;自己知道对应的类，则我们需要将&lt;span&gt;click.xml &lt;/span&gt;文件修正为&lt;span&gt;&amp;lt;pages package="com.quickstart"/&amp;gt;&lt;/span&gt;。以此类推如果是放在&lt;span&gt;quickstart/page/home.htm&lt;/span&gt;下，则我们的&lt;span&gt;click.xml&lt;/span&gt;文件只需要配置成&lt;span&gt;&amp;lt;pages package="com"/&amp;gt;&lt;/span&gt;即可。如果不遵循该规则，则只能在&lt;span&gt;click.xml &lt;/span&gt;配置文件中显示声明出来。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;　　显示结果如下：&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;3.5&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span&gt;框架模板&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;现在我们打算建立一个页面框架模板，以便应用程序页面有一个统一的风格。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;首先在&lt;span&gt;web&lt;/span&gt;根目录下建立文件&lt;span&gt;border-template.htm&lt;/span&gt;。 此文件包含如下内容。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;html&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;head&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;title&amp;gt;Click Quickstart - $title&amp;lt;/title&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;link rel="stylesheet" type="text/css" href="$context/assets/style.css" title="Style"/&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;/head&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;body&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;div id="header"&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;span class="title"&amp;gt;$title&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;/div&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;div id="container"&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;#parse($path) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;/div&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;/body&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;/html&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span&gt;注：这里的&lt;span&gt;$context&lt;/span&gt;就是网站根目录&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;现在我们定义&lt;span&gt;BorderPage &lt;/span&gt;类， 并将&lt;span&gt;border-template.htm &lt;/span&gt;文件指定为他的模板。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;package com.quickstart.page; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;import net.sf.click.Page; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;public class BorderPage extends Page { &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;public String getTemplate() { &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;return "border-template.htm"; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;} &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;} &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;我们命名模板文件为&lt;span&gt;border-template.htm &lt;/span&gt;， 以便它不会自动地被&lt;span&gt;Click&lt;/span&gt;映射我们的&lt;span&gt;BorderPage &lt;/span&gt;类。我们修改&lt;span&gt;HomePage &lt;/span&gt;类， 使其继承自&lt;span&gt;BorderPage &lt;/span&gt;， 并定义一个&lt;span&gt;title&lt;/span&gt;字段。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;public class HomePage extends BorderPage { &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;public String title = "Home"; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;} &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;修改&lt;span&gt;home.htm&lt;/span&gt;， 将页面&lt;span&gt;borber&lt;/span&gt;去掉。&lt;span&gt; home.html&lt;/span&gt;内容如下：&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;　　&lt;span&gt;&amp;lt;b&amp;gt;Welcome&amp;lt;/b&amp;gt; to Home page your application starting point.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;span&gt;其他都加载模版&lt;span&gt;border-template.htm&lt;/span&gt;上的。&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;现在， 如果你将浏览器请求定位到更新后的页面，你应该能够看到和前面同样的页面。&lt;/span&gt;&lt;/p&gt;
&lt;img src="http://blog.rongzhiwang.com/owh/aggbug/186.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/owh/comments/186.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/owh/comments/commentRss/186.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/owh/services/trackbacks/186.aspx</trackback:ping>
    </entry>
    <entry>
        <title>JNI之Java调本地代码</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/owh/archive/2011/06/29/jnijava.aspx" />
        <id>http://blog.rongzhiwang.com/owh/archive/2011/06/29/jnijava.aspx</id>
        <published>2011-06-29T23:35:01Z</published>
        <updated>2011-06-29T23:35:01Z</updated>
        <content type="html">几天没灌水了，灌一下： 
&lt;div&gt;&lt;span&gt;&lt;br /&gt;
1&lt;/span&gt;&lt;span&gt;、先建立&lt;/span&gt;&lt;span&gt;Java&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;&lt;span&gt;例如：&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p align="left"&gt;&lt;strong&gt;&lt;span&gt;package&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; com.icbc;&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt; &lt;/p&gt;
            &lt;p align="left"&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt;&lt;span&gt; * &lt;u&gt;Dll&lt;/u&gt;&lt;/span&gt;&lt;span&gt;调用例子&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt;&lt;span&gt; *&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt;&lt;span&gt; */&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt;&lt;strong&gt;&lt;span&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;&lt;strong&gt;&lt;span&gt;class&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; TestDll {&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;&lt;strong&gt;&lt;span&gt;native&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;&lt;strong&gt;&lt;span&gt;int&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; add(&lt;/span&gt;&lt;strong&gt;&lt;span&gt;int&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; x, &lt;/span&gt;&lt;strong&gt;&lt;span&gt;int&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; y);&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt; &lt;/p&gt;
            &lt;p align="left"&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;&lt;strong&gt;&lt;span&gt;static&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; &lt;/span&gt;&lt;strong&gt;&lt;span&gt;void&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; main(String[] args) {&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;System.&lt;em&gt;loadLibrary&lt;/em&gt;(&lt;/span&gt;&lt;span&gt;"add"&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;TestDll test = &lt;/span&gt;&lt;strong&gt;&lt;span&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; TestDll();&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;strong&gt;&lt;span&gt;int&lt;/span&gt;&lt;/strong&gt;&lt;span&gt; result = test.add(1, 2);&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;System.&lt;/span&gt;&lt;em&gt;&lt;span&gt;out&lt;/span&gt;&lt;/em&gt;&lt;span&gt;.println(result);&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
            &lt;p align="left"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt; &lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;、编译该&lt;/span&gt;&lt;span&gt;Java&lt;/span&gt;&lt;span&gt;文件（前提是本机安装了&lt;/span&gt;&lt;span&gt;JDK&lt;/span&gt;&lt;span&gt;，&lt;/span&gt;&lt;span&gt;javac&lt;/span&gt;&lt;span&gt;在&lt;/span&gt;&lt;span&gt;PATH&lt;/span&gt;&lt;span&gt;环境变量中）&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Windows&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;javac com\icbc\TestDll.java&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Linux/Unix&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;javac com/icbc/TestDll.java&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;、使用&lt;/span&gt;&lt;span&gt;javah&lt;/span&gt;&lt;span&gt;生成&lt;/span&gt;&lt;span&gt;C&lt;/span&gt;&lt;span&gt;程序头文件（前提是本机安装了&lt;/span&gt;&lt;span&gt;JDK&lt;/span&gt;&lt;span&gt;，&lt;/span&gt;&lt;span&gt;javah&lt;/span&gt;&lt;span&gt;在&lt;/span&gt;&lt;span&gt;PATH&lt;/span&gt;&lt;span&gt;环境变量中）&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;javah com.icbc.TestDll&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;会在当前路径下生成《&lt;/span&gt;&lt;span&gt;com_icbc_TestDll.h&lt;/span&gt;&lt;span&gt;》文件。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;、下面以&lt;/span&gt;&lt;span&gt;Windows&lt;/span&gt;&lt;span&gt;下的&lt;/span&gt;&lt;span&gt;VC&lt;/span&gt;&lt;span&gt;为例，编写&lt;/span&gt;&lt;span&gt;dll&lt;/span&gt;&lt;span&gt;动态链接库&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;首先在&lt;/span&gt;&lt;span&gt;VC&lt;/span&gt;&lt;span&gt;中建立动态链接库工程，名称为《&lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt;》（这与&lt;/span&gt;&lt;span&gt;TestDll.java&lt;/span&gt;&lt;span&gt;中的&lt;/span&gt;&lt;span&gt;System.loadLibrary(“add”)&lt;/span&gt;&lt;span&gt;中的参数&lt;/span&gt;&lt;span&gt;”add”&lt;/span&gt;&lt;span&gt;一致），两个步骤按顺序截图如下&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; （偷懒了，从Word中贴过来没有截图，Win32 DLL工程，选Empty DLL）&lt;/p&gt;
&lt;p&gt;&lt;span&gt;建立好工程后，将《&lt;/span&gt;&lt;span&gt;com_icbc_TestDll.h&lt;/span&gt;&lt;span&gt;》拷贝到该工程目录下。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;然后在该工程中添加&lt;/span&gt;&lt;span&gt;Main.cpp&lt;/span&gt;&lt;span&gt;（也可命名为其他的文件名）。内容如下：&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;#include "com_icbc_TestDll.h"&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt; &lt;/p&gt;
            &lt;p&gt;&lt;span&gt;JNIEXPORT jint JNICALL Java_com_icbc_TestDll_add&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;(JNIEnv * env, jobject obj, jint x, jint y) {&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;jint result = x + y;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;return result;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;}&lt;/span&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;然后在&lt;/span&gt;&lt;span&gt;VC&lt;/span&gt;&lt;span&gt;中以&lt;/span&gt;&lt;span&gt;Release&lt;/span&gt;&lt;span&gt;配置编译成&lt;/span&gt;&lt;span&gt;add.dll&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;Linux/Unix&lt;/span&gt;&lt;span&gt;下的动态链接库类似的在其环境下编写，并编译成&lt;/span&gt;&lt;span&gt;add.so&lt;/span&gt;&lt;span&gt;动态链接库。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;、将&lt;/span&gt;&lt;span&gt;add.dll&lt;/span&gt;&lt;span&gt;（&lt;/span&gt;&lt;span&gt;Linux/Unix&lt;/span&gt;&lt;span&gt;是&lt;/span&gt;&lt;span&gt;add.so&lt;/span&gt;&lt;span&gt;）放到操作系统环境变量&lt;/span&gt;&lt;span&gt;PATH&lt;/span&gt;&lt;span&gt;所包含的路径中，&lt;/span&gt;&lt;span&gt;Linux/Unix&lt;/span&gt;&lt;span&gt;还需设置&lt;/span&gt;&lt;span&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span&gt;LIBPATH&lt;/span&gt;&lt;span&gt;包含该路径。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;、运行测试&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;java com.icbc.TestDll&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;3&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;、如果需要在&lt;/span&gt;&lt;span&gt;Java&lt;/span&gt;&lt;span&gt;中调用不能直接被&lt;/span&gt;&lt;span&gt;Java&lt;/span&gt;&lt;span&gt;调用的&lt;/span&gt;&lt;span&gt;dll&lt;/span&gt;&lt;span&gt;，需要编写一个中介&lt;/span&gt;&lt;span&gt;dll&lt;/span&gt;&lt;span&gt;，然后由&lt;/span&gt;&lt;span&gt;Java&lt;/span&gt;&lt;span&gt;调中介&lt;/span&gt;&lt;span&gt;dll&lt;/span&gt;&lt;span&gt;，中介&lt;/span&gt;&lt;span&gt;dll&lt;/span&gt;&lt;span&gt;调目标&lt;/span&gt;&lt;span&gt;dll&lt;/span&gt;&lt;span&gt;，实现需求。&lt;/span&gt;&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign="top" width="568"&gt;
            &lt;p&gt;&lt;span&gt;// &lt;/span&gt;&lt;span&gt;此为中介&lt;/span&gt;&lt;span&gt;dll&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;#include "com_icbc_TestDll.h"&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt; &lt;/p&gt;
            &lt;p&gt;&lt;span&gt;JNIEXPORT jint JNICALL Java_com_icbc_TestDll_add&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;(JNIEnv * env, jobject obj, jint x, jint y) {&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;// &lt;/span&gt;&lt;span&gt;在此调用目标&lt;/span&gt;&lt;span&gt;dll&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;return result;&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt;&lt;span&gt;}&lt;/span&gt;&lt;/p&gt;
            &lt;p&gt; &lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;img src="http://blog.rongzhiwang.com/owh/aggbug/185.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/owh/comments/185.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/owh/comments/commentRss/185.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/owh/services/trackbacks/185.aspx</trackback:ping>
    </entry>
    <entry>
        <title>关于日志与应用程序性能</title>
        <link rel="alternate" type="text/html" href="http://blog.rongzhiwang.com/owh/archive/2011/06/24/logandperf.aspx" />
        <id>http://blog.rongzhiwang.com/owh/archive/2011/06/24/logandperf.aspx</id>
        <published>2011-06-24T20:19:16Z</published>
        <updated>2011-06-24T20:19:16Z</updated>
        <summary type="html">日志 性能 并发</summary>
        <content type="html">&lt;div&gt;今天遇到一个应用性能的问题，发现原来是日志的问题。&lt;/div&gt;
&lt;div&gt;主要是这个应用设计得比较烂，每个用户记录一个日志文件，而且是并发记录。&lt;/div&gt;
&lt;div&gt;当用户并发数达到30-40个时，性能问题就出来了。&lt;/div&gt;
&lt;div&gt;通过添加日志和时间统计发现，每记一行日志需消耗500毫秒时间。&lt;/div&gt;
&lt;div&gt;优化后，将写日志的动作用lock同步起来（.NET应用），效果马上就显现出来了。&lt;/div&gt;
&lt;div&gt;其实，本次优化只是治本，如果要治标，则需另行设计日志的记录方式。&lt;/div&gt;
&lt;div&gt;由于没有用过Log4Net，所以暂时还不太敢用，&lt;/div&gt;
&lt;div&gt;毕竟如果程序出了问题影响很大，对公司造成的损失较大，所以还是谨慎为妥。&lt;/div&gt;
&lt;img src="http://blog.rongzhiwang.com/owh/aggbug/184.aspx" width="1" height="1" /&gt;</content>
        <wfw:comment>http://blog.rongzhiwang.com/owh/comments/184.aspx</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.rongzhiwang.com/owh/comments/commentRss/184.aspx</wfw:commentRss>
        <trackback:ping>http://blog.rongzhiwang.com/owh/services/trackbacks/184.aspx</trackback:ping>
    </entry>
</feed>
