分类目录归档:澳门新葡京娱乐场

用 HttpServletResponseWrapper 实现 Etag 过滤器

原文出处:http://blog.chenlb.com/2009/07/use-httpservletresponsewrapper-implement-etag-filter.html

最近对 http caching 感兴趣,决定一步步学习之。现先来了解 Etag。

什么是“ETag”?

HTTP协议规格说明定义ETag为“被请求变量的实体值” (参见 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html —— 章节 14.19)。 另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单 独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端。

如果http 请求头 If-None-Match 的内容,与服务器对资源算出来的 etag 相同,就返回 304 响应。

下面来动动手,实现一个 etag 过虑器。原理:用 HttpServletResponseWrapper 把正常的页面输出到一个 byte 数组里,然后计算 etag,etag 是否与请求头一致,再进一步处理。

代码实现:

  1. package  com.chenlb.http;  
  2.   
  3. import  java.io.ByteArrayOutputStream;  
  4. import  java.io.IOException;  
  5. import  java.io.PrintWriter;  
  6. import  java.util.Calendar;  
  7. import  java.util.Date;  
  8. import  java.util.zip.CRC32;  
  9.   
  10. import  javax.servlet.Filter;  
  11. import  javax.servlet.FilterChain;  
  12. import  javax.servlet.FilterConfig;  
  13. import  javax.servlet.ServletException;  
  14. import  javax.servlet.ServletOutputStream;  
  15. import  javax.servlet.ServletRequest;  
  16. import  javax.servlet.ServletResponse;  
  17. import  javax.servlet.http.HttpServletRequest;  
  18. import  javax.servlet.http.HttpServletResponse;  
  19. import  javax.servlet.http.HttpServletResponseWrapper;  
  20.   
  21. public   class  EtagFilter  implements  Filter {  
  22.   
  23.     public   void  destroy() {}  
  24.   
  25.     public   void  doFilter(ServletRequest request, ServletResponse response,  
  26.             FilterChain chain) throws  IOException, ServletException {  
  27.   
  28.         HttpServletRequest servletRequest = (HttpServletRequest) request;  
  29.         HttpServletResponse servletResponse = (HttpServletResponse) response;  
  30.   
  31.         ByteArrayOutputStream baos = new  ByteArrayOutputStream();  
  32.         HttpServletResponseWrapper hsrw = new  MyHttpResponseWrapper(servletResponse, baos);  
  33.   
  34.         chain.doFilter(request, hsrw);  
  35.   
  36.         hsrw.flushBuffer();  
  37.   
  38.         byte [] bytes = baos.toByteArray();  
  39.   
  40.         CRC32 crc = new  CRC32();  
  41.         crc.update(bytes);  
  42.   
  43.         String token = “w//””  + crc.getValue() +  ‘”‘ ;  
  44.         servletResponse.setHeader(“ETag” , token);  
  45.         // always store the ETag in the header   
  46.         String previousToken = servletRequest.getHeader(“If-None-Match” );  
  47.         if  (previousToken !=  null  && previousToken.equals(token)) {  
  48.             // compare previous token with current one         
  49.   
  50.             System.out.println(“ETag match: returning 304 Not Modified” );  
  51.             servletResponse.sendError(HttpServletResponse.SC_NOT_MODIFIED);  
  52.             // use the same date we sent when we created the ETag the first time through   
  53.             servletResponse.setHeader(“Last-Modified” , servletRequest.getHeader( “If-Modified-Since” ));  
  54.         } else   {  
  55.             // first time through – set last modified time to now   
  56.             Calendar cal = Calendar.getInstance();  
  57.             cal.set(Calendar.MILLISECOND, 0 );  
  58.             Date lastModified = cal.getTime();  
  59.             servletResponse.setDateHeader(“Last-Modified” , lastModified.getTime());  
  60.             System.out.println(“Writing body content” );  
  61.             servletResponse.setContentLength(bytes.length);  
  62.             ServletOutputStream sos = servletResponse.getOutputStream();  
  63.             sos.write(bytes);  
  64.             sos.flush();  
  65.             sos.close();  
  66.         }  
  67.   
  68.     }  
  69.   
  70.     public   void  init(FilterConfig config)  throws  ServletException {}  
  71.   
  72.     private   static   class  MyHttpResponseWrapper  extends  HttpServletResponseWrapper {  
  73.   
  74.         ByteServletOutputStream servletOutputStream;  
  75.         PrintWriter printWriter;  
  76.   
  77.         public  MyHttpResponseWrapper(HttpServletResponse response, ByteArrayOutputStream buffer) {  
  78.             super (response);  
  79.             servletOutputStream = new  ByteServletOutputStream(buffer);  
  80.         }  
  81.   
  82.         public  ServletOutputStream getOutputStream()  throws  IOException {  
  83.             return  servletOutputStream;  
  84.         }  
  85.   
  86.         public  PrintWriter getWriter()  throws  IOException {  
  87.             if (printWriter ==  null ) {  
  88.                 printWriter = new  PrintWriter(servletOutputStream);  
  89.             }  
  90.             return  printWriter;  
  91.         }  
  92.   
  93.         public   void  flushBuffer()  throws  IOException {  
  94.             servletOutputStream.flush();  
  95.             if (printWriter !=  null ) {  
  96.                 printWriter.flush();  
  97.             }  
  98.         }  
  99.     }  
  100.   
  101.     private   static   class  ByteServletOutputStream  extends  ServletOutputStream {  
  102.   
  103.         ByteArrayOutputStream baos;  
  104.   
  105.         public  ByteServletOutputStream(ByteArrayOutputStream baos) {  
  106.             super ();  
  107.             this .baos = baos;  
  108.         }  
  109.   
  110.         public   void  write( int  b)  throws  IOException {  
  111.             baos.write(b);  
  112.         }  
  113.     }  
  114. }  

web.xml 配置:

  1. < filter >   
  2.     < filter-name > etag </ filter-name >   
  3.     < filter-class > com.chenlb.http.EtagFilter </ filter-class >   
  4. </ filter >            
  5.   
  6. < filter-mapping >   
  7.     < filter-name > etag </ filter-name >   
  8.     < url-pattern > *.jsp </ url-pattern >   
  9. </ filter-mapping >   

测试环境是 tomcat 6.0.18。

用 httpwatch 可以观察效果。

用 HttpServletResponseWrapper 实现 Etag 过滤器

etag-filter,点击放大

第二次请求(刷新),返回 304 。说明有效了。

过虑器同时还加了 Last-Modified 是为了兼容不支持 Etag 头的客户端。

参考:使用ETags减少Web应用带宽和负载

infoq 下载来的代码没试用通过,原因是没有 flush PrintWriter。虽然有 304,但返回的内容为空。

当然算 etag 可用其它算法,我这里用 crc32。infoq 例子中用 md5。

项目经理需要修炼的8件事

作为项目经理,最重要的就是带领整个项目团队一起战斗,做好团队建设,才能激发整个团队成员的士气,提高团队成员的绩效。

 

所以,作为项目经理,是一种修炼,以下种种都是需要慢慢修炼的:

1,脾气一定要控制好。不管是团队成员没有按时完成工作或者是客户方总是发生变更,总之你没有任何理由可以发脾气,尤其是当着团队成员的面发脾气;

 

2,遇事莫慌。项目风险总是存在的,各种问题也总是存在的,天大的事情只要冷静,一定会想出解决方法。倘若不够冷静,很可能胡乱作出错误决定,一个错误的决定后果往往是严重的,带来的可能是返工、项目失败等后果。记住,一定要坚持一次把事情做对;

 

3,永远不要让上级领导来帮你想解决方案。这个是很多人容易犯的错误,经常把问题抛给领导,然后怪领导不支持你的工作不解决你遇到的问题。记住,领导只是做决策的,而不是帮你想解决方案的,否则要你干啥用?举个例子,当项目资源不足,需要申请资源时,千万不要直接告诉领导资源不足就完了,一定要告诉他面对资源不足,有什么样的后果,然后有几种解决方案,每种方案的优缺点是什么,然后请领导来选择一个方案;

 

4,记住抱怨是没有用的。仔细回想一下,什么时候抱怨有用过?如果抱怨有用的话,那还要你干嘛?大家随便抱怨一下,心中的理想就能实现了,抱怨工资低,老板就乖乖涨工资了,你觉得可能吗?记住,抱怨是没有用的,过多的抱怨,只会证明你是一个没有用的项目经理。遇到问题,就想破脑袋去解决。比如,团队成员有背景,耍专家大牌,不听你的话,抱怨有用吗?不如想想问题的根源,再自己进修一把与人沟通的技巧吧,这问题一定是出在你自己身上,毋庸置疑的;

 

5,要相信你的团队成员,多鼓励他们。批评是在团队建设中最为忌讳的,除非出现非常严重的问题,才要慎重的考虑是否要批评。在批评的各种方法里,当众点名批评是最为严重的了。切记,每个人都是有自尊的。你要相信你的团队成员,相信他们都是优秀的。如果他们不优秀,一定是你的责任,你没有能够激发他们的士气,没有能够帮助他们提高工作绩效。相信他们,并鼓励他们,让他们做合适的工作;

 

6,注意公平公正。这是一个项目经理必须具备的品质,是一种职业道德。对待项目团队成员,必须公平公正地评价他们的工作绩效,并加以适当奖励。

7,客观如实汇报。这也是一个职业道德。对于项目状态,必须客观如实公布给干系人,越是隐瞒风险越高。人总会害怕因为犯错误被批评而有所隐瞒项目中坏的一面,报喜不报忧估计很多人都干过。其实做项目,出现问题不可怕,可怕的是不把问题暴露出来,不让大家一起帮你分析解决,到了项目失败的时候也就是你的职业失败的时候了。我知道,要能客观如实地汇报,有点难,但是记住,这是必须的;

 

8,功劳不是自己的。记住,作为一个团队,你激励大家完成了项目,最终获得的功劳不是你一个人的,而是大家的。不仅如此,项目过程中,任何一个点子一个解决方案的功劳,你都不能据为己有,哪怕这个真的是你想出来的,你也不能说是自己的,那是大家的智慧。甚至,你根本就不应该从你的嘴里去说出解决方案,而是应该引导团队成员让他们说出来,然后表扬他们的智慧;

银证合作的业务种类

银证合作的业务种类也趋于一致,通常可以划分为以下几类:

    1、账户管理类:开户、销户、变更、查询

    2、资金转账类:转入、转出、冲正、查询

    3、资金冻结类:冻结、解冻、冲正、查询

    4、清算对账类:总账、明细、清算、查询

    对应于每一个业务种类,不同银行和证券公司之间在操作流程上的差异仍然较大,同一业务可能有多种应用方式:券商发起、银行发起、双方发起,但每一个业务对应的信息交换内容趋同。

     本标准的结构设计参考了ISO15022,并借鉴了很多国际成熟产品和系统的经验。国际标准化组织(ISO)作为全球影响力最大的国际标准化组织,制定了多个行业的多个标准。ISO15022是一个最新的先进的数据标准化的标准,它主要是定义了证券交易过程里,需要交换传递的信息中每个字段的意义,交易里每条信息应该包括哪些内容。ISO15022符合加入WTO后我们国家的采标大原则,也符合中国金融业的开放需要,有利于金融行业内部各主体之间的互利合作;ISO15022的发展方向与中国银行业和证券业的发展趋势一致,且能满足大部分业务需要。

    在证券行业中,FIX是最重要的标准,但是它有它的局限性。在交易的三个领域中,FIX协议在交易前与交易中这两个领域中占有绝对的地位,而交易后的领域,按照STP的实施模式,交易双方的资金流向多发生在不同的银行系统中,这正是SWIFT/ISO15022的应用领域。尤其是ISO15022已经在192个国家、7000家金融机构应用颇广的协议。

    1、面向对象化的设计 

   目前国内对银证转账业务的数据交换主要有2种模式:一种是文件交换、一种是包交换,国际上主流的数据交换协议(如FIX,ISO15022)都是包交换方式,本标准采用的也是包交换方式。主要设计思路是:在将业务要素从其实际表现形式中分离出来并保证所有业务信息(Message)均以相同的方式表达。

    (1)数据字段(Data Field):

    先将信息元素抽象成数据字段;

    (2)数据域:

    数据域(MessageSet)是构成信息块的唯一要素,按照亲合度由数据字段组成数据域。它包括两类:通用数据域(如交易地点,时间,币种,账号等通用商业要素)和非通用数据域,可以重用。

    (3)信息块(Message Blocks):

    将数据域按照相应的交易类型组成信息块,它包含通用信息块和业务信息块。通用信息块应被每个信息体引用,是必选信息块。每个信息体都应该包含:块开始标志,发送方参考信息,信息功能,发送时间,交易类型,块结束标志。

    (4)信息体(Message Type):

    信息体由一个或多个信息块组成,每个信息体对应一种交易类型,本标准又称为数据包(如表1)。

    2、信息体结构和设计

    信息体的设计采用ISO15022MT5xx系列信息包设计方法,每一个信息体有许多彼此平行或嵌套的小信息体组成,每个信息体的结构如图2。

    3、业务定义

    将银证转账划分为以下几个交易类型,每个交易类型对应一类信息体,每个信息体的包名称及包编码如表2所示。

    (1)认证 (MT001)

    认证包括签到与签退两个业务类型。

    (2)开户(MT002)

    开户是为了实现建立证券端资金账户和银行账户之间的对应关系,包括开设资金账户或开设股票账户并建立对应关系。

    (3)账户管理(MT003)

    账户管理包括:销户、冻结、解冻等业务类型。

    (4)换卡管理(MT004)

    换卡管理包括更换银行卡、更换证券卡等业务类型。

    (5)投资者资料修改(MT005)

    投资者资料修改包括:修改个人信息、修改代理人信息、修改机构信息、修改证券端投资者信息、修改银行端投资者信息等业务类型。

    (6)转账请求(MT006)

    转账请求用来传递一个资金转账指令,转账请求由发起投资者指定的金融机构发送,直接或者通过中间机构,送给受益投资者所在的金融机构。

    转账请求用来作净支付。不能用于作支票,汇款,或者分步执行的交易。

    (7)转账回执(MT 007)

    转账回执用作转账MT 006的回应。

    (8)对账信息(MT008)

    对账用于请求进行明细对账或汇总对账。对账可以由银行端发出,或证券端发出,接受方接受到MT008后应返回对账回执MT009(明细对账、汇总对账)。

    (9)对账回执(MT 009)

    MT009用于反馈对账请求(MT008) 的请求,向传送方传送指定账户账目发生明细,合计等。

    (10)查询信息(MT010)

    查询包括:查询资金信息、查询投资者基本信息、查询资金发生流水。

    (11)查询回执(MT011)

    用来回应MT010的查询,包括:回答资金信息、回答投资者基本信息、回答资金发生流水、回答行情信息、回答股票余额等业务类型。

    结束语

    在硝烟弥漫的金融战场,竞争的大幕已经拉开,随着我们标准化工作的探索,银证合作业务一定会从不规范走向规范,从无序走向有序。吹雪弹剑看峥嵘,只有通过市场参与主体的推动,标准的宣传贯彻才能得以实行,才能切实提高市场运行效率,打造资本市场的核心竞争力。我们相信,依靠标准化建章立制,促进市场发展和技术进步,面对混业竞争的江湖,我们才能问一声,剑在手,天下谁是英雄。

Eclipse智能提示及快捷键

 

1、java智能提示

(1). 打开Eclipse,选择打开” Window - Preferences”。

(2). 在目录树上选择”Java-Editor-Content Assist”,在右侧的”Auto-Activation”找到”Auto Activation triggers for java”选项。默认触发代码提示的就是”.”这个符号。

(3). 在”Auto Activation triggers for java”选项中,将”.”更改:.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

2、XML智能提示

(1). 打开Eclipse,选择打开” Window - Preferences”。

(2). 在目录树上选择”XML-Editor-Content Assist”,在右侧的”Auto-Activation”找到”Prompt when these characters are inserted “选项。

(3). 在”Prompt when these characters are inserted”选项中,将”<=: ,”更改:<=:.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW(,

3、快捷键

(1)Ctrl+Space

说明:内容助理。提供对方法,变量,参数,javadoc等得提示,应运在多种场合,总之需要提示的时候可先按此快捷键。注:避免输入法的切换设置与此设置冲突

(2)Ctrl+Shift+Space

说明:变量提示

(3)Ctrl+/

说明:添加/消除//注释,在eclipse2.0中,消除注释为Ctrl+/

(4)Ctrl+Shift+/

说明:添加/* */注释

(5)Ctrl+Shift+/

说明:消除/* */注释

(6)Ctrl+Shift+F

说明:自动格式化代码

(7)Ctrl+1

说明:批量修改源代码中的变量名,此外还可用在catch块上.

(8)Ctril+F6

说明:界面切换

(9)Ctril+Shift+M

说明:查找所需要得包

(10)Ctril+Shift+O

说明:自动引入所需要得包

(11)Ctrl+Alt+S

说明:源代码得快捷菜单。其中的Generate getters and setters 和 Surround with try/catchblock比较常用.建议把它们添加为快捷键.快捷键设置在windows->preferences->Workbench->Keys

4、跟踪调式

单步返回 F7

单步跳过 F6

单步跳入 F5

单步跳入选择 Ctrl+F5

调试上次启动 F11

继续 F8

使用过滤器单步执行 Shift+F5

添加/去除断点 Ctrl+Shift+B

显示 Ctrl+D

运行上次启动 Ctrl+F11

运行至行 Ctrl+R

Ctrl+U重构作用域 功能 快捷键

撤销重构 Alt+Shift+Z

抽取方法 Alt+Shift+M

抽取局部变量 Alt+Shift+L

内联 Alt+Shift+I

移动 Alt+Shift+V

重命名 Alt+Shift+R

重做 Alt+Shift+Y

当您尝试登录到 Telnet 服务器正在运行 Windows Server 2003,与 Service Pack 1 或 Service Pack 2 时出现

http://support.microsoft.com/kb/309523
当试图登录到 Telnet 服务器与 Service Pack 1 或 Service Pack 2 运行 Microsoft Windows Server 2003 时您会收到以下错误消息:
正在初始化 telnet 会话时出错。外壳程序进程可能不具有已启动。
Telnet 服务器已关闭了连接

此外,Telnet 服务器上应用程序事件日志中记录以下事件:

事件类型: 错误
事件源: TlntSvr
事件类别: 无
事件 ID: 4049
用户: 不适用
说明:
创建 CMD 进程时出错。
系统错误: 该存根 (stub) 接收到坏数据。

如果用户帐户登录到 Telnet 服务器上使用的环境变量中有多个 5,120 的字符,就会出现此问题。

原因

出现此问题是由于在 Telnet 服务器上 Seclogon.dll 文件中的行为。如果在函数中指定的环境变量中包含多个 5,120 字符 Seclogon.dll 文件 CreateProcessWithTokenW 函数返回一个错误。

解决方案

修补程序信息

可以从 Microsoft 获得支持的修补程序。但是,此修补程序被用于解决本文所述的此问题。此修补程序仅应用于出现这一特定问题的系统。此修补程序可能会接受进一步的测试。因此,如果此问题没有对您造成严重的影响,我们建议您等待包含此修补程序的下一个软件更新。

是否可供下载此修补程序没有”提供修补程序下载”部分中,在这篇知识库文章的顶部。如果不会显示此部分,请联系 Microsoft 客户服务和支持以获取此修复程序。

注意 如 果出现其他问题,或者如果需要进行任何故障诊断,则您可能不得不创建单独的服务请求。将正常收取支持费用将应用于其他支持问题和不需要进行此特定的修补程 序的问题。有关完整列表的 Microsoft 客户服务和支持的电话号码,或创建一个单独的服务请求,请访问下面的 Microsoft 网站:

注意 “提供修补程序下载”窗体所显示的此修复程序是可用的语言。如果您看不到您的语言,则是一个修复程序不能用于该语言。

系统必备组件

若 要将此修补程序必须具有 Windows Server 2003 Service Pack 1 或 Windows Server 2003 Service Pack 2 计算机上安装。有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

889100   如何获取最新的 service pack,Windows Server 2003 的

重新启动要求

应用此修补程序后,您必须重新启动计算机。

修补程序替换信息

此修补程序不替代任何其他修补程序。

文件信息

此修补程序的英文版具有的文件属性 (或更新的文件属性) 在下表中列出。日期和时间对这些文件列出在协调世界时 (UTC)。当您查看文件信息时,将转换为本地时间。若要 UTC 与本地时间之间的时差使用控制面板中的 日期和时间 项中的 时区 选项卡。

Windows Server 2003 与 x 基于 x86 版本的 Service Pack 1
文件的名称 文件版本 文件大小 日期 时间 平台
Seclogon.dll 5.2.3790.2938 18,944 2007 年五月 17 日 19: 43 x86

Windows Server 2003 与 x 基于 x86 版本的 Service Pack 2
文件的名称 文件版本 文件大小 日期 时间 平台
Seclogon.dll 5.2.3790.4083 18,432 2007 年五月 17 日 19: 04 x86

Windows Server 2003 与 Service Pack 1,基于 Itanium 的版本
文件的名称 文件版本 文件大小 日期 时间 平台 SP 要求 服务分支
Seclogon.dll 5.2.3790.2938 48,128 2007 年五月 17 日 05: 00 IA 64 sp1 不适用
Wseclogon.dll 5.2.3790.2938 18,944 2007 年五月 17 日 05: 00 x86 sp1

Windows Server 2003 与 Service Pack 2,基于 Itanium 的版本
文件的名称 文件版本 文件大小 日期 时间 平台 SP 要求 服务分支
Seclogon.dll 5.2.3790.4083 48,128 2007 年五月 17 日 05: 05 IA 64 sp2 不适用
Wseclogon.dll 5.2.3790.4083 18,432 2007 年五月 17 日 05: 05 x86 sp2

x 基于 x64 的版本的 Windows Server 2003
文件的名称 文件版本 文件大小 日期 时间 平台 SP 要求 服务分支
Seclogon.dll 5.2.3790.2938 28,160 2007 年五月 17 日 05: 00 x64 sp1 不适用
Wseclogon.dll 5.2.3790.2938 18,944 2007 年五月 17 日 05: 00 x86 sp1

Windows Server 2003 与 x 基于 x64 的版本的 Service Pack 2
文件的名称 文件版本 文件大小 日期 时间 平台 SP 要求 服务分支
Seclogon.dll 5.2.3790.4083 28,160 2007 年五月 17 日 05: 05 x64 sp2 不适用
Wseclogon.dll 5.2.3790.4083 18,432 2007 年五月 17 日 05: 05 x86 sp2

替代方法

要变通解决此问题,限制环境变量所使用的字符少于 5,120 用户帐户。

状态

Microsoft 已经确认这是在”适用于”一节中列出的 Microsoft 产品中的问题。

更多信息

根据对 Microsoft 开发人员网络文档进程的环境块的总大小不能超过 32,767 个字符。有关详细的信息,请访问下面的 Microsoft 网站:

有关用于描述 Microsoft 软件更新的标准术语的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

824684   用于描述 Microsoft 软件更新的标准术语的说明


这篇文章中的信息适用于:
  • Microsoft Windows Server 2003 Service Pack 1 当用于
    • Microsoft Windows Server 2003 Standard Edition
    • Microsoft Windows Server 2003 Web Edition
    • Microsoft Windows Server 2003, Enterprise x64 Edition
    • Microsoft Windows Server 2003 Datacenter Edition
    • Microsoft Windows Server 2003, Enterprise Edition for Itanium-based Systems
    • Microsoft Windows Server 2003, Datacenter Edition for Itanium-Based Systems
  • Microsoft Windows Server 2003 Service Pack 2 当用于
    • Microsoft Windows Server 2003 Standard Edition
    • Microsoft Windows Server 2003 Web Edition
    • Microsoft Windows Server 2003 Enterprise Edition
    • Microsoft Windows Server 2003 Datacenter Edition
    • Microsoft Windows Server 2003, Standard x64 Edition
    • Microsoft Windows Server 2003, Enterprise x64 Edition
    • Microsoft Windows Server 2003, Datacenter x64 Edition
    • Microsoft Windows Server 2003, Enterprise Edition for Itanium-based Systems
    • Microsoft Windows Server 2003, Datacenter Edition for Itanium-Based Systems
  • Microsoft Windows Server 2003, Standard x64 Edition
  • Microsoft Windows Server 2003, Enterprise x64 Edition
  • Microsoft Windows Server 2003, Datacenter x64 Edition
  • Microsoft Windows XP Professional x64 Edition
关键字: 
kbmt kbautohotfix kbexpertiseinter kbwinserv2003postsp2fix kbbug kbfix kbhotfixserver kbqfe kbpubtypekc KB935761 KbMtzh

jquery设置元素的readonly和disabled

Jquery的api中提供了对元素应用disabled和readonly属性的方法,在这里记录下。如下:
 1.readonly
    $(‘input’).attr(“readonly”,”readonly”)//将input元素设置为readonly
    $(‘input’).removeAttr(“readonly”);//去除input元素的readonly属性
    if($(‘input’).attr(“readonly”)==true)//判断input元素是否已经设置了readonly属性

    对于为元素设置readonly属性和取消readonly属性的方法还有如下两种:
    $(‘input’).attr(“readonly”,true)//将input元素设置为readonly
    $(‘input’).attr(“readonly”,false)//去除input元素的readonly属性

    $(‘input’).attr(“readonly”,”readonly”)//将input元素设置为readonly
    $(‘input’).attr(“readonly”,””)//去除input元素的readonly属性

 2.disabled
 

    $(‘input’).attr(“disabled”,”disabled”)//将input元素设置为disabled
    $(‘input’).removeAttr(“disabled”);//去除input元素的disabled属性
  
    if($(‘input’).attr(“disabled”)==true)//判断input元素是否已经设置了disabled属性

  对于为元素设置disabled属性和取消disabled属性的方法还有如下两种:
    $(‘input’).attr(“disabled”,true)//将input元素设置为disabled
    $(‘input’).attr(“disabled”,false)//去除input元素的disabled属性

    $(‘input’).attr(“disabled”,”disabled”)//将input元素设置为disabled
    $(‘input’).attr(“disabled”,””)//去除input元素的disabled属性

ImageView.ScaleType8种用法

1·ImageView.ScaleType.center:图片位于视图中间,但不执行缩放。

2·ImageView.ScaleType.CENTER_CROP 按统一比例缩放图片(保持图片的尺寸比例)便于图片的两维(宽度和高度)等于或者大于相应的视图的维度

3·ImageView.ScaleType.CENTER_INSIDE按统一比例缩放图片(保持图片的尺寸比例)便于图片的两维(宽度和高度)等于或者小于相应的视图的维度

4·ImageView.ScaleType.FIT_CENTER缩放图片使用center

5·ImageView.ScaleType.FIT_END缩放图片使用END

6·ImageView.ScaleType.FIT_START缩放图片使用START

7·ImageView.ScaleType.FIT_XY缩放图片使用XY

8·ImageView.ScaleType.MATRIX当绘制时使用图片矩阵缩放

grails资源

1,网上资源

http://groups.google.com.hk/group/grailsunion

http://grails.group.javaeye.com/

2,grails知名应用

grailsflow

grailsblog

http://www.grails.org/OpenSource+Projects

   http://code.google.com/p/grailsblog http://www.grailsblog.com

http://code.google.com/p/grails-domain-uml/

http://code.google.com/p/grails-petstore

http://code.google.com/p/ket-framework/

http://code.google.com/p/grailsmda

http://code.google.com/p/6footplus/

http://code.google.com/p/grum/

http://code.google.com/p/groovyblogs

http://code.google.com/p/simpejob

http://code.google.com/p/biz-portal

http://code.google.com/p/grailsportal

http://svn.codehaus.org/grails/trunk/grails-samples/grails.org/

http://www.grailsdeveloper.com/blog/2008/09/a-lot-of-grails-sample-applications-grails-open-source-projects/

3,工具

  grails文档里说没有自带功能测试,但支持Canoo WebTest

4,网站

  http://www.grailsjobs.com/

4,好文章

  ibm网站有一系列Mastering Grails文章,非常棒。主题有 Testing your Grails application, Grails in the enterprise,Asynchronous Grails with JSON and Ajax等十来个。

  http://www.ibm.com/developerworks/views/java/libraryview.jsp?search_by=mastering+grails

  http://www.ibm.com/developerworks/java/library/j-grails10148/index.html

  SiteMesh学习入门

GRAILS对于我这样的所谓老Java程序员来说,上手还是挺容易的,所谓最难掌握的闭包概念,我认为可以简单的认为是以前的匿名类+委托(当然还有很多其他的好处)。GRAILS给控制器划分了一个Service层,在业务逻辑重用上,比RAILS做的更好。GRAILS相对没有太多的单复数规约,相对RAILS的“约定”要简单很多。GRAILS目前没有RAILS那么强大的路由功能,不过反而可以带来的相对简单。

言归正传,其实我这里不是准备比较两个框架的优劣,而是想分享一下GRAILS多对多查询的一些经验。关于GRAILS本身还有GROOVY,我建议大家可以看看这里。

GRAILS使用Hibernate作为ORM的基础。方便的同时也带来一些复杂,比如多对多查询。假设我有两个领域模型(其实就是rails里面的model,不过Java的东西嘛,总是比较学术化)

class Product {

static hasMany=[scenario:Scenario]

static belongsTo=Scenario

}

class Scenario{

static hasMany=[product:Product]

}

如果我要查询Product中,所属scenario在scenario表中的id为1,可以通过如下的方法查询:

def scenario=Scenario.get(1)

return scenario? Product.findAll(“from Product p where :scenario in elements(p.scenario)”,[scenario:scenario]):[]

来源:http://www.leesoft.com.cn/2009/04/12/grails%E5%A4%9A%E5%AF%B9%E5%A4%9A%E7%9A%84%E6%9F%A5%E8%AF%A2%E6%9E%84%E9%80%A0/

http://rainboyan.com/post/use_groovy_tables_to_doc.html

可以通过Scriptom(现在还是beta版)嵌入vbs、js脚本(包括使用WSH,FSO)或者调用InternetExplorer、Media Player、Word和Excel等windows组件

Groller项目启动http://rainboyan.com/post/groller_was_launched.html

http://code.google.com/p/rainboyan/source/browse/groller

http://www.blogjava.net/emu/archive/2005/05/18/4784.html里面有讲到8皇后