My studying notes for Java,Ruby,Ajax and other any interesting things.

星期三, 五月 28, 2008

修改Emacs的文件存储编码



C-x c 输入编码名称,如utf-8 可以改变文件的存储编码.
或C-x f 输入编码名称
M-x revert-buffer 重新加载缓冲区
也可以用M-x set-buffer-file-coding-system 来设置。然后一样的用 revert-buffer 来重读文件即可

星期六, 五月 24, 2008

ls指令说明



ls

ls 命令可以说是linux下最常用的命令之一。它有众多的选项,其中有很多是很有用的,你是否熟悉呢?下面列出了 ls 命令的绝大多数选项。


-a 列出目录下的所有文件,包括以 . 开头的隐含文件。
-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。
-c 输出文件的 i 节点的修改时间,并以此排序。
-d 将目录象文件一样显示,而不是显示其下的文件。
-e 输出时间的全部信息,而不是输出简略信息。
-f -U 对输出的文件不排序。
-g 无用。
-i 输出文件的 i 节点的索引信息。
-k 以 k 字节的形式表示文件的大小。
-l 列出文件的详细信息。
-m 横向输出文件名,并以“,”作分格符。
-n 用数字的 UID,GID 代替名称。
-o 显示文件的除组信息外的详细信息。
-p -F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通
文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套
接字(sockets)。
-q 用?代替不可输出的字符。
-r 对目录反向排序。
-s 在每个文件名后输出该文件的大小。
-t 以时间排序。
-u 以文件上次被访问的时间排序。
-x 按列输出,横向排序。
-A 显示除 “.”和“..”外的所有文件。
-B 不输出以 “~”结尾的备份文件。
-C 按列输出,纵向排序。
-G 输出文件的组的信息。
-L 列出链接文件名而不是链接到的文件。
-N 不限制文件长度。
-Q 把输出的文件名用双引号括起来。
-R 列出所有子目录下的文件。
-S 以文件大小排序。
-X 以文件的扩展名(最后一个 . 后的字符)排序。
-1 一行只输出一个文件。
--color=no 不显示彩色文件名
--help 在标准输出上显示帮助信息。
--version 在标准输出上输出版本信息并退出。

  只列出子目录
1. ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)
2. ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)

  计算当前目录下的文件数和目录数
下面命令可以分别计算当前目录下的文件和目录个数:
# ls -l * |grep "^-"|wc -l ---- to count files
# ls -l * |grep "^d"|wc -l ----- to count dir

  显示彩色目录列表
打开/etc/bashrc, 加入如下一行:
alias ls="ls --color"
下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:
1. 蓝色-->目录
2. 绿色-->可执行文件
3. 红色-->压缩文件
4. 浅蓝色-->链接文件
5. 灰色-->其他文件

ls -tl --time-style=full-iso sshd
ls -ctl --time-style=long-iso

How to enable mouse wheel in Ubuntu on VMware



Steps to Enable Mouse Wheel Scrolling in Ubuntu Hardy under VMware Fusion

Launch a Terminal (Applications menu -> Accessories -> Terminal).

Type:

sudo gedit /etc/X11/xorg.conf

Scroll down (it’s not far, perhaps 20 - 30 lines) till you see a block that looks like this:

Section "InputDevice"
Identifier "Configured Mouse"
Driver "vmmouse"
[.. blah blah blah ..]
EndSection

Replace that whole section with this:

Section "InputDevice"
Identifier "Configured Mouse"
Driver "vmmouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "ImPS/2"
Option "Buttons" "5"
Option "ZAxisMapping" "4 5"
EndSection

Save the file, then close all your apps and hit Ctrl+Alt+Backspace. X restarts within a few seconds, and you’re back up and running. Scrolling should now be possible!

I haven’t gotten to the bottom of horizontal scrolling yet. I thought a ZAxisMapping of “4 5 11 12″ would do it, but I suspect either VMware Fusion’s mouse driver does things a different way, or maybe it’s mouse specific (not likely). I’ll update this post if I work it out.

星期三, 五月 21, 2008

[fwd]Freemarker和Velocity的分析

1,需求
最近要开发新闻发布系统,新闻信息量比较大,访问也相对比较频繁,对服务器造成的压力也很大。考虑到新闻内容更新频率小,内容相对比较简单,我们决定将新闻版块生成静态页面,这样可以加快访问速度,同时也减轻服务器的负担。 

2,备选技术分析、对比:Velocity和Freemarker
这两个模板技术我们都做了尝试,Velocity和Freemarker非常相似,它们都是可以在Servlet容器外使用的模版语言。Velocity相对来说比较简单,轻便一点,语法要求也没Freemarker那么严格,而Freemarker相对功能也比较强大一些。
VelocityStruts是VelocityTools提供的,它与Struts实现了很好的衔接。当然,除了语法上简洁以外,还因为它对struts的form的处理,如下所示:
<form action='$link.setAction("/login")' method="post">
  <td>账户:</td>
  <td><input type="text" name="login" value="$!loginForm.login" size="50" maxlength="100"/></td>
  <td>密码:</td>
  <td><input type="text" name="password" value="$!loginForm.password" size="50" maxlength="100"/></td>
  <td colspan="2" align="center"><input type="submit" value="test"/></td>
  </form> 

注意这点:<input type="text" name="login" value="$!loginForm.login" size="50" maxlength="100"/>,这样的优点不言而遇,就是不影响页面的表达,自然是能得到Dreamweaver等工具的良好支持。这也是我比较看中的。
以下是Freemarker的例子:
<#global html=JspTaglibs["/WEB-INF/tld/struts-html.tld"]>
<#global bean=JspTaglibs["/WEB-INF/tld/struts-bean.tld"]>
<title>新闻发布</title>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<link href="style/style.css" rel="stylesheet" type="text/css">
<@bean.page id="request" property="request"/>
<#assign contextPath = request.contextPath/>
  <@html.form method="post" action="/newsList.do?method=insertNews"> <tr>
  <td width="36%" height="25">&nbsp;</td>
  <td width="64%" height="25"><@html.errors/></td>
  </tr>
  <tr>
  <td height="25" align="right">新闻标题:</td>
  <td height="25"><@html.text property="newsTitle" styleClass="input1"/></td>
  </tr>
  <tr>
  <td height="25" align="right">新闻内容:</td>
  <td height="25">
  <@html.textarea property="newsContent" cols="80" rows="10"/>
  </td>
  </tr>
  <tr>
  <td height="25" align="right">&nbsp;</td>
  <td height="25"><@html.submit value="确 定" styleClass="button1"/>&nbsp;&nbsp;<@html.button value="重 置" styleClass="button1"/></td>
  </tr>
  </@html.form> 

FreeMarker的表单域是这样声名的
<@html.form method="post" action="/newsList.do?method=insertNews">
<@html.text property="newsDate" styleClass="input1"/>
显然从这方面来说,我觉得Freemarker页面不如Velocity那么清爽。另外可从网上获取Velocity的Dreamweaver的插件,这样在Dreamweaver中设计和调整页面都很爽,而Freemarker找了半天也没找到其相应的插件。当然,这并不代表Freemarker不如Velocity,Freemarker功能显然比Velocity强一些,也就是说,Velocity能做到的,Freemarker基本也能做到,Velocity在某些方面不能做到的,Freemarker也能做到。
以下是我从网上摘自同仁的分析:
  Velocity是一个简单而且更加轻量级的工具,但是它没有达到FreeMarker能够做的许多任务,而且它的模板语言不是很强大 
 我们认为对于大多数应用程序,FreeMarker比Velocity工作更简单,因为: 
 使用Velocity,你需要寻找特定工具或各种工作环境来一次次的解决典型的模板创作任务,结果会浪费更多时间 
 工作环境经常意味着在Velocity模板中直接使用Java对象的方法,这违反了简单、无编程HTML设计的观念 
 或者将表示任务移到控制器代码中,这违反了MVC模式 
 使用FreeMarker,可以以out-of-the-box(如何翻译确切?)的方式实现Velocity所能做的 

2、特性比较清单 
下面是一个使用FreeMarker能够实现,而Velocity不能实现的不太全面的特性清单: 
(1)数字和日期支持 
 可以对任何数字类型进行算术运算和比较,包括精度类型 
 可以比较和显示(格式化)日期/时间值 
(2)国际化 
 根据各种内建和定制的数字格式,格式化本地敏感的数字 
 根据各种内建和定制的日期格式,格式化本地敏感和时区敏感的日期 
 标识(变量名)可以包含非英语字符,如重音字符、阿拉伯字符、中文字符等 
(3)循环处理 
 可以跳出循环 
 可以在循环外访问循环体内的控制变量 
 可以测试是否达到最后一次循环 
(4)模板级别的数组处理 
 可以使用类似[i]语法的索引方式访问数组元素 
 可以查询数组长度 
(5)宏 
 宏可以有局部变量 
 可以递归调用宏,同样可以在模板的后面定义要调用的宏 
 调用宏时,可以按位置或名字的方式传递参数 
 宏参数可以有缺省值,使得在调用时忽略参数也有效 
 调用的宏可以有嵌套的体内容(<@myMacro>body</@myMacro>),能够在宏被调用时进行处理 
 宏是纯变量的,可以基于表达式来执行宏,或者作为参数传递给另一个宏 
(6)命名空间 
 可以对变量使用多命名空间,这对创建宏库很重要,因为这可以避免应用程序中指定的变量和宏库中变量的名字冲突 
(7)使用内建的函数/操作符维护Java无关的string、list和map 
 可以将字符串转换成大/小写、首字符大/小写,对HTML、XML或RTF进行转义处理,substring、split、查询字符串长度、find/replace子串等等 
 通过索引访问list元素,获得子list,合并list,查询list长度,对list排序 
 通过key变量访问map元素,检查map是否为空,获得key或值的list 
(8)揭示模板中的错误 
 当访问一个未定义的变量,FreeMarker不会沉默;你可以配置FreeMarker来停止render模板显示错误信息,或者跳过错误部分;无论哪种,FreeMarker会记录问题(日志) 
 在写错指令名时,FreeMarker会抛出异常 
(9)高级render控制 
 可以使用一组标记来封装模板的一块区域,以便在块区中所有要修改的地方应用HTML或XML转义(或其它使用FreeMarker表达式表示的转换) 
 FreeMarker有转换器,它们是模板的一块区域,在render时,通过转换过滤;内建的转换器包括空白字符压缩、HTML和XML转义;你可以实现自己的转换器;当然转换器可以嵌套 
 可以使用flush指令显式的flush输出 
 可以使用stop指令停止render 
(10)文字 
 除了通常的字符串、数字和布尔值文字,也可以在模板中定义list和map文字 
 支持所有的Java转义文字:\b、\t、\n、\f、\r、\"、\'、\\,也支持\xXXXX使用UNICODE指定字符 
(11)高级空白字符移除 
 FreeMarker坚持移除各行只包含不输出FreeMarker标记的空白字符 
 对于明显要整修掉不需要的空白字符的指令来说,空白字符是个大问题 
(12)集成其它技术 
 可以在模板中使用JSP标记库 
 可以直接在Python工程中使用 
(13)强大的XML转换能力 

 在2.3版本中,FreeMarker具有强大的新XML转换能力,使得替代XSLT成为可能 

 Velocity在这方面是无法真正竞争的,除非改进核心引擎,如支持宏库映射到名字空间,宏中支持局部变量 

(14)高级模板元程序 
 可以捕获输出的任何部分到context变量中 
 可以解释任何context变量,如果它是一个模板定义 
 上述两者的结合使用 
由于我们项目是基于Struts的,而两种模板在数据输出上基本上都大同小异,所以我把重点放到了form处理的对比上了,由于是刚学了不久,仅仅参考了一些网上资料和个人的看法。所以以上的并不是很全面,至于项目组中要使用哪个,还是要看其它成员的意见。 

3,放弃JSP而选模板技术。
我们用JSP也蛮长时间了,JSP有时要在页面嵌入代码,使页面看起来很混乱,而模板可以让页面很整洁,也便于我们调试,不仅如此,模板的语法更简明、更好用,也比JSP功能强大,据说性能也比JSP好,据说也很接近静态页面输出速度.

trackback:

http://weishuwei.spaces.live.com/blog/cns!C55C1C27B8EE0730!204.entry

[fwd]Struts2 Freemarker Jmesa(表格、分页) 使用的一点心得


最近做一个应用的时候用到了Jmesa(至于Jmesa的详细介绍,请Google),但是关于Struts2和Jmesa的资料特别少,费尽周折总算让他们两个正常运行了,现在把使用他们的一些心得写下来与大家分享。
    版本:
    Struts2          : 2.0.11
    Spring           : 2.5.1
    Freemarker  : 2.3.12
    Jmesa           : 2.2.9
 
    Eclipse 3.3
    对应Eclipse3.3的插件(没用MyEclipse,我依然活得不错,哈哈~)
    
    Tomcat 6.0.*
 
    Struts2与Freemarker的配置非常简单――根本不用配置,呵呵,关键点就在:怎么在Struts2环境下使用Jmesa?当然我只用到了Jmesa提供的Taglib,没用使用到其他高级功能。
    (1)、Jmesa实现的Taglib只需要在页面给它一个 List等集合类型的变量就可以正常显示。使用分页功能需要加入下面这段脚本: <script type="text/javascript">
    function onInvokeAction(id) ...{
        setExportToLimit(id, '');
        createHiddenInputFieldsForLimitAndSubmit(id);
    }
</script>
    (2)、使用导出功能,此处以Excel为例。需要加入以下脚本:     <script type="text/javascript">

        function onInvokeExportAction(id) ...{
            var parameterString = createParameterStringForLimit(id);
            alert(parameterString);
            location.href = '${request.getContextPath()}/(此处为Action的Url)?' + parameterString;
        }
    </script>
    还有关键的一点就是:Action要实现ServletRequestAware,ServletResponseAware这两个接口,并且加入以下代码:     private HttpServletRequest request;
    private HttpServletResponse response;
    
    
    public void setServletRequest(HttpServletRequest request) ......{
        this.request = request;
    }
    
    public void setServletResponse(HttpServletResponse response) ......{
        this.response = response;
    }
    以上变量定义了实例变量request 和 response,为什么要这样做呢?看一下Jmesa的Tag example就知道了,如下:         
        TableFacade tableFacade = new TableFacadeImpl(id, request);
        tableFacade.setItems(items);
        tableFacade.setColumnProperties("password", "nickname");
        tableFacade.setExportTypes(response, CSV, EXCEL); // Tell the tableFacade what exports to use.    
        Limit limit = tableFacade.getLimit();
        if (limit.isExported()) ...{
            tableFacade.getTable().setCaption("user");
            tableFacade.getTable().getRow().getColumn("password").setTitle("password");
            tableFacade.getTable().getRow().getColumn("nickname").setTitle("nickname");
            tableFacade.render();
            return null;
        }
    最关键的就是这两句了: TableFacade tableFacade = new TableFacadeImpl(id, request);
tableFacade.setExportTypes(response, CSV, EXCEL); // Tell the tableFacade what exports to use.
    第一句中如果没有request对象的话,不能实例化TableFacade类型的对象。
    第二句中如果没有response对象的话,就没有数据。
    除此之外还有一点要注意的就是页面中定义的tableFacade的id一定要与Action中的id的值相同,此id起标识导出文件的文件名的作用,也唯一标识一个table。
    好了只要注意以上这些Jmesa的这个Taglib就可以使用了。
    至于在Freemarker中使用Jmesa的这个Taglib,有以下注意事项:
    (1)、items的值(即数据集合)直接写变量名就可以
    (2)、maxRows属性写为maxRows=8 不用加引号
    以上两处注意事项不知道是不是Freemarker版本的问题,呵呵,有待检验。
    注:Jmesa的功能非常强大,可以实现复杂的表格 。。。。。。 好东西 思想先进

track:

http://blog.csdn.net/jockCreate/archive/2008/02/20/2110310.aspx


Freemarker简介

FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 


FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 


虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据 

FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件 


FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境 

FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库 

FreeMarker是免费的 


1、通用目标 


能够生成各种文本:HTML、XML、RTF、Java源代码等等 


易于嵌入到你的产品中:轻量级;不需要Servlet环境 


插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等 


你可以按你所需生成文本:保存到本地文件;作为Email发送;从Web应用程序发送它返回给Web浏览器 




2、强大的模板语言 


所有常用的指令:include、if/elseif/else、循环结构 


在模板中创建和改变变量 


几乎在任何地方都可以使用复杂表达式来指定值 


命名的宏,可以具有位置参数和嵌套内容 


名字空间有助于建立和维护可重用的宏库,或者将一个大工程分成模块,而不必担心名字冲突 


输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等;你可以定义自己的转换 



3、通用数据模型 


FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量方式在模板中显示 


你可以使用抽象(接口)方式表示对象(JavaBean、XML文档、SQL查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰 




4、为Web准备 


在模板语言中内建处理典型Web相关任务(如HTML转义)的结构 


能够集成到Model2 Web应用框架中作为JSP的替代 


支持JSP标记库 


为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员 




5、智能的国际化和本地化 


字符集智能化(内部使用UNICODE) 


数字格式本地化敏感 


日期和时间格式本地化敏感 


非US字符集可以用作标识(如变量名) 


多种不同语言的相同模板 




6、强大的XML处理能力 


<#recurse> 和<#visit>指令(2.3版本)用于递归遍历XML树 


在模板中清楚和直觉的访问XML对象模型




Freemarker的模板文件内容

FreeMarker模版文件主要由如下几个部分组成: 
1.文本:直接输出的部分。 
2.注释:即<#-- ... -->格式部分,不会输出。 
3.插值(Interpolation:即${...},或#{...}格式的部分,将使用数据模型中的部分替代输出。 
4.FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。 

一. 模版结构 
上面四个部分,文本部分和注释部分都比较简单,此处不再赘述,这里主要介绍插值(Interpolation)和FTL指令。 
下面就是FreeMarker模版的例子: 
<html><br> 
<head><br> 
<title>Welcome!</title><br> 
</head><br> 
<body><br> 
<#-- 注释部分 --><br> 
<#-- 下面使用插值 --> 
<h1>Welcome ${user}!</h1><br> 
<p>We have these animals:<br> 
<ul><br> 
<#-- 使用FTL指令 --> 
<#list animals as being><br> 
<li>${being.name} for ${being.price} Euros<br> 
</#list><br> 
</ul><br> 
</body><br> 
</html> 
上面的FTL模版是一个典型的HTML模版,该模版中包含了注释、FTL指令、插值和基本文本四个组成部分。 

二. FTL指令规则 
在FreeMarker中,使用FTL标签来使用指令,FreeMarker有三种FTL标记,这和HTML标签是完全类似的: 
1.开始标签:<#directivename parameters> 
2.结束标签:</#directivename> 
3.空标签:<#directivename parameters/> 
实际上,使用标签时前面的#符号也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改为@符号。 
使用FTL标签时,应该有正确的嵌套,而不是交叉使用,这与XML标签的用法完全一样。因此,下面的代码是错误: 
<ul> 
<#list animals as being> 
<li>${being.name} for ${being.price} Euros 
<#if use = "Big Joe"> 
(except for you) 
</#list> 
</#if> 
<#-- 上面的list指令和if指令没有形成正确嵌套 --> 
</ul> 
如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息。 
FreeMarker会忽略FTL标记中的空白字符,如下面的例子: 
<#list[BR] 
animals as[BR] 
being[BR] 
>[BR] 
${being.name} for ${being.price} Euros[BR] 
</#list > 
值得注意的是:<、</和指令之间不允许有空白字符。 

三. 插值规则 
FreeMarker的插值有如下两种类型: 
1.通用插值:${expr} 
2.数字格式化插值:#{expr}或#{expr; format} 
通用插值 
对用通用插值,又可分为如下三种情况: 
1.插值结果为字符串值:直接输出表达式结果 
2.插值结果为数字值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建的字符串函数格式化单个插值,看下面的模版页面。 
<#setting number_format="currency"/> 
<#assign answer=42/> 
${answer} 
${answer?string} <#-- the same as ${answer} --> 
${answer?string.number} 
${answer?string.currency} 
${answer?string.percent} 
输出结果是: 
$42.00 
$42.00 
42 
$42.00 
4,200% 
q 插值结果为日期值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建的字符串函数格式化单个插值,下面是一个使用格式模式的例子: 
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")} 
${lastUpdated?string("EEE, MMM d, ''yy")} 
${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")} 
输出的结果如下: 
2003-04-08 21:24:44 Pacific Daylight Time 
Tue, Apr 8, '03 
Tuesday, April 08, 2003, 09:24:44 PM (PDT) 
插值结果为布尔值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建的字符串函数格式化单个插值,下面是一个例子: 
<#assign foo=true/> 
${foo?string("yes", "no")} 
输出结果是: 
yes 
数字格式化插值 
数字格式化插值可采用如下#{expr; format}形式可以用来格式化数字,其中format可以是: 
mX:小数部分最小X位 
MX:小数部分最大X位 
看下面的FreeMarker模版: 
<#assign x=2.582/> 
<#assign y=4/> 
#{x; M2} <#-- 输出2.58 --> 
#{y; M2} <#--输出4 --> 
#{x; m1} <#-- 输出2.6 --> 
#{y; m1} <#-- 输出4.0 --> 
#{x; m1M2} <#-- 输出2.58 --> 
#{y; m1M2} <#-- 输出4.0 -->


--
----------------------------------

   你的支持 我的坚持
  Lead to The IT Future

----------------------------------

JMesa简介-ExtremeTable的下一代


说到ExtremeTable(以下简称ET,呃,,,ET.....),可以说不知道的人甚少.不过估计用的也未必多罢了.今天,给大家介绍一个由ET的作者重新实现的一套关于Table的API.JMesa.
我是一个偶然的机会知道Jmesa,我在做一个数据展现系统的时候想寻找ET的帮忙,但发现ET己不再更新,作者把精力转移到了新的项目中,也就是这个 JMesa.这个项目的目的是为开发者提供更有效的表格展现的API,而不是简单的TagLib.无论从灵活性,易扩展性,易用性,均比ET上了一个层 次.最近Release的版本里面,并不包括TagLib.而在下一个版本(2.1.0)将会加入TagLib,目前TagLib己经可用,在SVN里已 有.只是等待下一个版本的发布,其间会有一些更新,不过会兼容目前的TagLib的.
假如我从API开始介绍JMesa,恐怕并不是个好的办法,像我以前的文章里面有介绍,结果反响不大.这次决定从TagLib入手,来给大家介绍一下Jmesa.
大家可以从附件里拿到一个Demo.注意Demo依赖JMesa以及其他Lib.在Lib文件夹下有详细说明.
现在来看看JMesa的使用:
xml 代码
 
<jm:table id="product" items="products" caption="product listing">   
  <jm:column property="name" sortable="true" filterable="true"/>   
  <jm:column property="price" />   
  <jm:column property="createdTime" />   
  <jm:column property="id" title="edit">   
  <a href="viewProduct.action?id="><jm:property name="name"/></a>   
  </jm:column>   
</jm:table>   

估计比较容易看得懂的代码吧.
Jmesa 的检签规范当中只有三个Tag:Table,Row,Column.而当前的TagLib实现中只实现了Table和Column两个(Row是可选 的).另加一个Property的Tag.此阶段,Property的Tag是很有用的,其起到的作用与Webwork的PropertyTag相差无几, 用来获得对象的某个属性.之所以使用Property Tag是因为当前的TagLib有个限制就是暂时不支持如JSTL的${}这种写法.将来会支持,届时Property Tag也会继续获得兼容.Jeff比较倾向于使用迭代的方式实现Tag,那样可以支持${}这样的写法.不过作为TagLib的开始,问题不大.有时间再 重构一下TagLib,支持JSTL的写法.
好了,来说一说这些Tag的使用方法:
Table:Attribute Description 
id 表格的ID(必须) 
items 对象或者Map的集合 (必须)
caption 表格的标题 
theme 表格的主题,自定义样式
exportTypes 使用逗号分割导出的类型,目前支持导出类型有CSV,Excel 
width 表格宽度
style 即表格的Style属性
styleClass 使用的Css的Class名字
border 表格宽
cellpadding 表格属性
cellspacing 表格属性

实际上,真正Release的版本里面将会加上var以及Limit属性.
var属性值即在Column标签里可以获得的对象变量.
Limit属性是保存在当前请求的Limit的对象名.
Row:Attribute Description 
highlighter 是否高亮显示
onclick 点击事件
onmouseout 鼠标移出事件
onmouseover 鼠标移入事件

该Tag是可选的.实际上Jmesa提供了一系列默认的事件响应,有必要的情况下才使用.
Column:Attribute Description 
property Java对象或Map的属性名 
title 列的名称 
filterable 是否可按过滤条件查找
sortable 是否要排序
width 列宽
style Style属性
styleClass 使用的Css的Class的名字

ColumnTag的使用方法有下面几种:
xml 代码
 
<jm:column property="name"/>   

将仅仅输出对象中Name属性值.列名是Name
xml 代码
 
<jm:column property="name" title="名字" sortable="true" filterable="false"/>   

这样可以得到自定义的列名,可以让列可查找,可排序,当然你Server端需要相应提供排序及查找功能.不过就算你不提供,客户端也会把当前结果排序和查找的.
xml 代码
 
<jm:column property="id" title="edit">   
  <a href="viewProduct.action?id="><jm:property name="name"/></a>   
</jm:column>   

这里结合了PropertyTag.实现自定义列显示.可以灵活定制自己的单元格.
在ColumnTag里面,使用PropertyTag的时候,可以指定Name属性,如果不指定则使用当前Column的Property属性值.
以后将支持:

xml 代码
 
<jm:column property="id" title="edit">   
  <a href="viewProduct.action?id=${id}">${name}</a>   
</jm:column>   
这样的写法.当然会继续兼容PropertyTag,尽管不是Tag规范里的东西.

相信经过上面的一番介绍,大家对Jmesa有一定的感性认识了吧.还没有?下载Demo,扔进Tomcat 的App里跑一下就明白了.
有什么建议,请一定要告诉我 :).
 

--
----------------------------------

   你的支持 我的坚持
  Lead to The IT Future

----------------------------------

OGNL表达式语言浅谈


OGNL(Object Graphic Navigation Language,对象图导航语言)是一种功能强大的EL(Expression Language,表达式语言,JSP2.0规范),Struts2的核心表达式语言,OGNL是一个开源JAVA项目,但因为使用Struts2,我们完全不需要知道OGNL到底里面是什么东东,只需要按照Struts2的规则知道如何使用就OK了!第二章已经说过(请参看第二章的OGNL结构图),Struts2将Action中的实例压入值栈(ValueStack,值栈,Struts2的根对象,可以把它简单的理解为List,只不过它遵循堆栈的特点,先进后出!),session等放入Context Map中,然后使用OGNL遍历对象结构图进行操作。 

在JSP中,session、request、application、attr(如果可以就从pageContext查找,否则就依次到request、session、application中查找)、parameters(用于取URL上的参数,同名的变量可以使用索引)等对象取值时要使用前缀 # 告诉Struts2不要到值栈中查找,例如:(1.)#session.infomation,#session['student-information'],OGNL中使用 . 或者['']访问对象的属性,两者的区别是当属性中有"-"等特殊字符时,我们需要使用['']; 
(2.)URL为http://locaohost:9999/struts01/HelloWorld.ok?name=gold&&password=jsmart,如果我想取name的值,需要这样写#parameters.name,取password的值就是#parameters.password;如果是http://localhost:9999/struts01/HelloWorld.ok?password=gold&&password=jsmart,#parameters.password[0]取的就是gold,#parameters.password[1]=jsmart; 
(3.)%{A}所有基于这种形式的内容,都会被解析并到值栈中求值,也就是会到Value Stack中查找A所代表的值;如果你想A被当作字符串原样传递,那么可以这样表示%{'A'},当然你直接使用A有的时候也是可以的,但为了通用性,建议使用%{'A'},以免产生不必要的麻烦。 
(4.)OGNL操作集合,例如值栈中存在map,我们可以这样访问map['a'],表示访问Map中key值为a的value值是多少,map.size访问大小等等。 
(5.)OGNL访问类中的静态变量和静态方法:@完整类名@属性名,@完整类名@方法名,例如: 
Package net.ilkj.ognl 
Public Class A{ 
Public static final String a="1"; 

Public static String findA() 

Return "2"; 

,我们就可以在页面上使用<:sproperty value="@net.ilkj.ognl.A@a"/>尽心输出! 

从上面可以看出,在Struts2中使用OGNL,可以简单看作就是对象.属性。


星期二, 五月 20, 2008

让图片黑白的css





星期一, 五月 19, 2008

Hibernate的get和load的区别



1、hibernate中get方法和load方法的根本区别在于:如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。
对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。

2、虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。

3 get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。

总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

星期日, 五月 18, 2008

调整



〔调整落差〕

在学校里,自己的成绩好,也只是与同班同学相比。

出了社会,自己的工作的成绩,是与不同国家、不同年纪、不同背景的人比。

可能一下子会有很大的落差。

你可能说,人生不是比来比去的。

但是好朋友一定要跟你说,你可以不比,不过你不能不知道:你究竟输在那里?

找到一群可以帮助你成长的好朋友和聪明的竞争者,你就赢了别人好几步。

有一位很有智能的长者说过:「今天每一个家长都会说,『孩子,我要你赢!』但是,
却很少有家长教导说,『孩子,你该怎么输!输的原因怎么检讨出来!怎么原地爬起来
!怎样渡过人生的各种难关!』

〔工作态度〕

每天上班最好有正面的心情。用快乐的心情面对每个人,你会有很多朋友,老板也会想
教你东西,乐于与你沟通。如果与老板无法沟通,你觉得你会有加薪机会吗﹖
就算你不缺那份薪水,你也得不到新增的工作机会,来帮助你日后的发展。

【静静的吃三碗饭】

绝对没错,不要一出社会,就一天到晚与人计较或说谁谁谁没做他的工作。

真正的赢家是不出声的。

〔把掌声留给别人〕

把掌声留给别人,投资在别人的身上。
把掌声留给自己,你的荷包不会变多一点,但你的朋友会少一个。
而把掌声留给自己的伙伴,你会多一个朋友,你的荷包不会变少一点。

〔永远不要说---我已经尽力了!〕

我们可以安慰受挫折的朋友:『你已经尽力了!』

但当我们说出『我已经尽力了!』时,任何人都可以质疑你。
人们会问:『喔!真的吗?如果你是这么尽力,为什么成果是如此不堪!!』

如果你真的已经尽力了,那万一下一次不能再加力,那成果岂不更糟?!

通常,只有失败者、逃避者,才会大言不惭地说:『我已经尽力了!』

社会上的人,很务实地,从来就不会谅解一个一味地说『我已经尽力了!』的人!

你要不相信,换个说法,说『对不起!我应该可以做的更好的!如果能再有机会,我一
定尽力做好!』


你将发现,机会将源源而至。

再提醒一句,说『我已经够认真了!』、『我真的很不错!』,跟说『我已经尽力
了!』,有异曲同工之「坏」结果。

〔薪水〕

薪水与能力是相关的,但不是绝对的。
我有一个女性朋友,硕士毕业后领3万2仟的薪水;10年后,增加不到25%。

最后她的工作是被另一个刚刚硕士毕业的女生换掉。

她的问题很简单,毕业后就停止进修,她的履历表多了很多年资,但并没有很多经验。

聪明的你,一定要好好的做一张履历表。

而且你一定要知道自己那一张履历表值多少钱,说句不中听的话,至少遇到结婚或丧
事,别人才知道要怎么介绍你嘛!


很多东西不能规划,但是自己的履历表,一定要好好的规划。


〔跟对人〕

虽然【跟对人】很重要,但我要跟你说如果没跟对人,也要在他身上挤出东西来学。

我以前有一个老板,日本作风,不但吹毛求疵,还蔽护他自己的人。前一两年,我好气
他喔。

但是我发现,虽然他不是我的贵人,可是我在他身上学到他的扎实和彻底执行的工作能
力。

对那老板而言,因为我很年轻,还有很多机会。

但是有些人没被裁培,他们一辈子都起不来,他们将来都会面临被裁员的可能。

所以老板并没有错。有时候,看事情要设身处地,换成老板的眼光还看自己,往大方向
看。

〔读书〕
读书是增加知识,但也不要太相信书里面的人。

有些人读了太多书,但是不知变通,不能拿出来适应瞬息万变的社会,结果是变成读死
书了。

但是不能不读书,因为这社会,有时候很复杂,你会需要些书当精神食粮。

〔婚姻〕
家庭结构是脆弱的,禁不起任何人的刻意攻击。

婚姻是可以经营的,放弃自我主见、偶而多迁就对方一些,有时候是解决问题的好办
法。

感情是没有绝对的!不如意时,至少谢谢他
/她陪你走过往日的春夏秋冬。

但女人不能没钱,婚姻或感情出了问题,还可以有尊严地走出家门晒晒和煦的冬阳。

如果又没钱,又不会经营感情,这种问题,只能在家看韩剧哭死你。


〔金钱观〕
金钱是重要工具,但不是生命的全部。

人人要设法让家人丰衣足食,更要知道你钱花去那,要会管理你的收支表。

百分之90的人赚的都是计算式的财富Calculated Wealth
(相信我,英文跟计算机一样,都只是沟通的工具)。

计算式的财富就是你今年赚24万,明年你的目标应该是多少?

稳健收入的前题,是不乱换工作,而且你与你的上司
/工作伙伴合作愉快。

一定要有投资观念,投资不一定是股票那些,而是如投资外文能力,计算机能力,投资自
己的presentation
skills,或沟通能力。

投资未来,不要投资过去。


〔人格〕
人格比薪水或什么都还重要。成功的人大部份都具有好的人格特质。
许多年薪好几百万和千万的人,虽然不是每个人都是白手起家,但是只有好的人格特质
才会在业界长长久久。


只有好的人格,才能在社会上备受尊重。


〔好习惯〕
好的人格又是如何培养的呢?简单说,就是多多培养一些好习惯。以下列举21种可以改
变人生的好习惯。


1 当一个人生活枯燥的时候,他忘了用心体会是一种习惯。

2 当一个人觉得人生乏味的时候,他忘了培养幽默是一种习惯。

3 当一个人体力日差的时候,他忘了运动建身是一种习惯。

4 当一个人工作疲惫的时候,他忘了认真休息是一种习惯。

5 当一个人孤傲狂放的时候,他忘了感恩惜福是一种习惯。

6 当一个人志得意满的时候,他忘了谦冲为怀是一种习惯。

7 当一个人钱不够用的时候,他忘了投资理财是一种习惯。

8 当一个人觉得工作低迷的时候,他忘了激励自己是一种习惯。

9 当一个人怀疑自己的时候,他忘了建立自信是一种习惯。

10 当一个人忽略家人的时候,他忘了爱与关怀是一种习惯。

11 当一个人浑噩度日的时候,他忘了阅读好书是一种习惯。

12 当一个人忙于工作的时候,他忘了安排休闲是一种习惯。

13 当一个人目中无人的时候,他忘了不断学习是一种习惯。

14 当一个人服务不佳的时候,他忘了让顾客满意是一种习惯。

15 当一个人慌张失措的时候,他忘了万全准备是一种习惯。

16 当一个人推诿责任的时候,他忘了勇于承担是一种习惯。

17 当一个人肠枯思竭的时候,他忘了转型思考是一种习惯。

18 当一个人沮丧失意的时候,他忘了检讨改进是一种习惯。

19 当一个人畏惧调职的时候,他忘了提升自己是一种习惯。

20 当一个人沟通障碍的时候,他忘了真诚倾听是一种习惯。

21 当一个人业绩消退的时候,他忘了积极行动是一种习惯。

星期一, 五月 05, 2008

工作流相关术语和定义



1.1.1. 工作流
就是工作从开始到完成的过程。工作流由流程逻辑和路线规则组成。流程逻辑定义了任务的顺序和必须遵循的路线规则,还有截止期限以及由工作流引擎实现的其他业务规则
1.1.2. 流程定义(process definition)
一个图形流程定义或流程图,代表工作流的流程逻辑元素以及各元素之间的关系
1.1.3. 流程实例(process instance):
一个流程实例,通常称为工作,是一个流程定义的运行实例
1.1.4. 状态(state,或者说等待状态):
代表一种对外部参与者的依赖;这意味着在流程运行时流程引擎必须等待,直到外部参与者通知工作流系统指定的状态完成了
1.1.5. 动作(action):
在流程运行过程中,工作流系统为响应指定事件运行的一段程序逻辑;当流程运行过程中指定的事件发生时,工作流系统启动并执行这些动作
1.1.6. 流程上下文变量(process context variable):
保存每一个流程运行的上下文信息;通常在流程定义中声明这些变量,然后在流程实例生成时被实例化
1.1.7. 参与者
以下类型之一:资源集、特定资源、组织单元、角色(一个人在组织内部的作用)、人或系统(自动代理)。
1.1.8. 活动
组成流程定义中的一个逻辑步骤的任务。可以是自动的或人工的。自动指在流程操作过程中定义脚本和触发器的能力。流程定义中的特定活动可以作为无人参与的任务来运行,自动化可以在手工或人力驱动的任务中执行业务规则。常见的一种自动活动就是截止期限管理,如果某个工作项在预定的截止期限之前未能完成,该管理可以自动发送一条提醒消息或触发一个延期程序。
1.1.9. 活动所有者
活动所有者是有权宣布一个活动结束,然后推进工作到流程中的下一个活动的参与者
1.1.10. 工作所有者
工作所有者是有权整体控制流程实例执行过程的参与者
1.1.11. 工作项
代表流程实例中活动的参与者将要执行的工作