海水正蓝

面朝大海,春暖花开
posts - 145, comments - 29, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

一般我们的前台代码Ext.grid.ColumnModel里会这样写,以便显示日期格式:

//////////////////////////////////////////////////////////////

Js代码
....  
{   header:"birthday",

    dataIndex:"birthday"

    ....

    renderer:new Ext.util.Format.dateRenderer("Y-m-d"),  
    .... 

}

....

//////////////////////////////////////////////////////////////

 

  如果你前台这样写的话,那恭喜你,你的显示日期那列将不再正确显示时间,

而是显示为"NaN-NaN-NaN",是吧?

  呵呵,问我怎么知道的?因为最开始我也是这么错的。

  为什么会是错的呢?

  让我们来看看Ext.format.dateRenderer的源代码(开源的东西就是好),

它的源代码是这样的:

 

Js代码

//////////////////////////////////////////////////////////////
dateRenderer : function(format) {   
    return function(v) {   
        return Ext.util.Format.date(v, format);、   
    }  

////////////////////////////////////////////////////////////// 


   可以看出,我们传会来的值,被当做日期又被格式化了一次,我们传回来的是日期吗?

以前是,经过昨天后台代码的修改,我们传回来的仅仅是个字符串了,至于为什么要这么改,

请看昨天写的“Extjs日期格式问题(一) ”,那咋办?有的朋友应该已经想到了,既然是字符串,

那就直接显示呗,不用renderer了,于是前台代码Ext.grid.ColumnModel里就变成了:

 

Js代码

////////////////////////////////////////////////////////////// 
....  
{header:"birthday",dataIndex:"birthday".......),  
.... 
//////////////////////////////////////////////////////////////

 

  可以负责任的告诉你,这样写,绝对可以正确显示了,这样是不是感觉更简单了呢?

 

  但是,基于我项目里的要求,这个问题并没有解决完,因为在这里不是一个简单的gridpanel,

而是一个editgridpanel,所以还得定义一个editor,于是有了下面这样一段代码:

 

Js代码

//////////////////////////////////////////////////////////////
....  
{header:"birthday",dataIndex:"birthday".......,   
      editor:new Ext.grid.GridEditor(new Ext.form.DateField({format:"Y-m-d"})),  
..... 

//////////////////////////////////////////////////////////////

 
  加了这个DateField控件后,每次可以正常的选择日期,但是选择完日期后,

grid里显示的格式就又不正确了,这次显示的内容成了: "Wed Mar 04 1970......",

这样的格式一看就是个日期,这样显示的原因当然是因为我们没有写renderer进行格式化处理的缘故。。。

说到这里,有人应该已经想到解决办法了,另外有些人可能就抓狂了,这renderer加了不能正常显示,

不加也不能正常显示,这很矛盾啊。。

  问题往往到了最矛盾的时候,也是到了解决的时候,现在我把解决代码贴出来,大家一看就明白了。

多的不说,看代码:

 

Js代码
//////////////////////////////////////////////////////////////

renderer:function(value){   
    if(value instanceof Date){   
        return new Date(value).format("Y-m-d");   
    }else{   
        return value;   
    }  
}  
//////////////////////////////////////////////////////////////

  简单吧?自己写renderer就是了。

原文出自:http://ks2144634.blog.163.com/blog/static/133585503201081544950656/

posted @ 2012-12-30 13:06 小胡子 阅读(2277) | 评论 (0)编辑 收藏

错误”ora-04031 无法分配XXX字节的共享内存(XXX)”的解决办法:

oracle 9i:
sys用户以sysdba身份登录
先查看当前shared_pool_size值
sql>show parameter shared_pool_size;
然后
sql>alter system set shared_pool_size=’比原先值适当增加’ scope=spfile;
然后
sql>shutdown immediate
sql>startup

oracle 10g:
oracle 10g shared_pool_size默认值为0,也就是系统自动管理shared pool内存,这时可以适当增加shared_pool_reserved_size的值,仍然让系统自动管理这部分内存

sql>alter system set shared_pool_reserved_size=’比原先值适当增加’ scope=spfile;
sql>shutdown immediate
sql>startup

原文出自:http://openwares.net/database/cant_alloc_share_memory.html

posted @ 2012-12-29 22:35 小胡子 阅读(3572) | 评论 (0)编辑 收藏

对依赖注入( http://www.oschina.net/code/snippet_871522_15682) 的进一步加强.
作为基本功能的注册,使用语法是:registration.register<Interface,Implementation>().
可以到了实际的项目中,要注册的接口和类可能不止一个两个,会成百上千。无论是用C#代码来注册,还是用XML文件来配置,都是开发者的噩梦。

这里,让我们来个思维的反转: 变集中配置为分散声明。
1 为要注册的类,加入RegisterInContainer的声明
2 在系统启动的时候,扫描所有的类,对有RegisterInContainer的类,找到它所有实现的接口,把这些接口和该类绑定注册。

用于装饰要注入类的Attribute.


 1 using System;
 2 using System.Linq;
 3 using Skight.eLiteWeb.Domain.BasicExtensions;
 4 
 5 namespace Skight.eLiteWeb.Domain.Containers
 6 {
 7     [AttributeUsage(AttributeTargets.Class)]
 8     public class RegisterInContainerAttribute : Attribute
 9     {
10         public RegisterInContainerAttribute(LifeCycle life_cycle) {
11             this.life_cycle = life_cycle;
12         }
13 
14         public LifeCycle life_cycle { getset; }
15         public Type type_to_register_in_container { getset; }
16 
17         public void register_using(Registration registration) {
18             DiscreteItemResolver resolver = new TypeResolver(type_to_register_in_container);
19             if (life_cycle == LifeCycle.singleton) resolver = new SingletonResolver(resolver);
20             registration.register(resolver,type_to_register_in_container.all_interface().ToArray());
21         }
22     }
23 }

注入声明Attribute参数,指定是否单件方式生成注册类。


1 namespace Skight.eLiteWeb.Domain.Containers
2 {
3     public enum LifeCycle
4     {
5         single_call,
6         singleton
7     }
8 }

注册声明Attribute的使用示例


 1 //调用Container.get_an<FrontController>()将会得到FrontControllerImpl的对象
 2 
 3 using Skight.eLiteWeb.Domain.Containers;
 4 
 5 namespace Skight.eLiteWeb.Presentation.Web.FrontControllers
 6 {
 7     [RegisterInContainer(LifeCycle.single_call)]
 8     public class FrontControllerImpl : FrontControllers.FrontController
 9     {
10         private CommandResolver command_resolver;
11 
12         public FrontControllerImpl(CommandResolver commandResolver)
13         {
14             command_resolver = commandResolver;
15         }
16 
17         public void process(WebRequest request)
18         {
19             command_resolver.get_command_to_process(request).process(request);
20         }
21     }
22 }

Registration添加一个方法:反过来,为一个解析器(实现类)注册多个接口。


1 void register(DiscreteItemResolver resolver, params Type[] contracts);
2 

扫描注册机,在系统启动时调用一次。


 1 using System.Collections.Generic;
 2 using System.Reflection;
 3 using Skight.eLiteWeb.Domain.BasicExtensions;
 4 using Skight.eLiteWeb.Domain.Containers;
 5 
 6 namespace Skight.eLiteWeb.Application.Startup
 7 {
 8     public class RegistrationScanner:StartupCommand
 9     {
10         private readonly Registration registration;
11         private readonly IEnumerable<Assembly> assemblies;
12 
13         public RegistrationScanner(Registration registration, params Assembly[] assemblies)
14         {
15             this.registration = registration;
16             this.assemblies = assemblies;
17         }
18 
19         public void run()
20         {
21             assemblies
22                 .each(assembly =>
23                       assembly.GetTypes()
24                               .each(type =>
25                                     type.run_againste_attribute<RegisterInContainerAttribute>(
26                                         attribute =>
27                                             {
28                                                 attribute.type_to_register_in_container = type;
29                                                 attribute.register_using(registration);
30                                             })));
31         }
32     }
33 }

系统启动:创建注册类,然后传入必要的Assembly,调用注册机注册所有加了Attribute的类。


 1 using System;
 2 using System.Collections.Generic;
 3 using System.Reflection;
 4 using Skight.eLiteWeb.Domain.Containers;
 5 using Skight.eLiteWeb.Presentation.Web.FrontControllers;
 6 
 7 namespace Skight.eLiteWeb.Application.Startup
 8 {
 9     public class ApplicationStartup
10     {
11         public void run()
12         {
13             var registration = create_registration();
14             new RegistrationScanner(registration,
15                                                Assembly.GetAssembly(typeof (Container)),
16                                                Assembly.GetAssembly(typeof (FrontController)),
17                                                Assembly.GetAssembly(typeof (StartupCommand)))
18                                                .run();
19 
20         }
21 
22         private Registration create_registration()
23         {
24             IDictionary<Type, DiscreteItemResolver> item_resolvers = new Dictionary<Type, DiscreteItemResolver>();
25             Container.initialize_with(new ResolverImpl(item_resolvers));
26             return new RegistrationImpl(item_resolvers);
27         }
28     }
29 }

Global.asax系统入口,把所有的代码串起来。


 1 <%@ Application Language="C#" %>
 2 <%@ Import Namespace="Skight.eLiteWeb.Application.Startup" %>
 3 <script  RunAt="server">
 4 
 5     private void Application_Start(object sender, EventArgs e)
 6     {
 7        new ApplicationStartup().run();
 8     }
 9 
10 </script>

原文出自:
http://www.oschina.net/code/snippet_871522_16735

posted @ 2012-12-25 15:24 小胡子 阅读(352) | 评论 (0)编辑 收藏

     摘要: http://www.umlchina.com/Tools/Newindex1.htmUML相关工具一览(截止2012年10月)  整理 本文的PDF版本在此下载>> 以下总结了全世界的各种UML相关工具,按工具名称字母排序。     工具(最新版本) 厂商&地址 版权 ...  阅读全文

posted @ 2012-12-25 15:16 小胡子 阅读(2615) | 评论 (0)编辑 收藏

1.活动图、用例图、类图
http://yuml.me/diagram/scruffy/class/draw

2.序列图
http://www.websequencediagrams.com/



3.序列图、协作图
http://www.diagrammr.com/

posted @ 2012-12-25 15:15 小胡子 阅读(2855) | 评论 (1)编辑 收藏

     摘要: Container注入框架的进入点Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 namespace Skight.LightWeb.Domain 2 { 3  &n...  阅读全文

posted @ 2012-12-25 13:33 小胡子 阅读(225) | 评论 (0)编辑 收藏

在这里我们总结了Oracle临时表的集中用法,临时表创建之后基本不占用表空间,如果你没有指定临时表存放的表空的时候,你插入到临时表的数据是存在系统的临时表空间中。

Oracle临时表可以说是提高数据库处理性能的好方法,在没有必要存储时,只存储在Oracle临时表空间中。希望本文能对大家有所帮助。

1 、前言

目前所有使用 Oracle 作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。

当然在 Oracle 中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的某一张或者某几张表关联 之后得到的结果集非常小并且查询得到这个结果集的速度非常快,那么这个时候我考虑在 Oracle 中创建“临时表”。

我对临时表的理解:在 Oracle 中创建一张表,这个表不用于其他的什么功能,主要用于自己的软件系统一些特有功能才用的,而当你用完之后表中的数据就没用了。 Oracle 的临时表创建之后基本不占用表空间,如果你没有指定临时表(包括临时表的索引)存放的表空的时候,你插入到临时表的数据是存放在 ORACLE 系统的临时表空间中( TEMP )。

2 、临时表的创建

创建Oracle 临时表,可以有两种类型的临时表:

会话级的临时表

事务级的临时表 。

1) 会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION 不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION 的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION 登陆的时候是看不到另外一个SESSION 中插入到临时表中的数据的。即两个不同的SESSION 所插入的数据是互不相干的。当某一个SESSION 退出之后临时表中的数据就被截断(truncate table ,即数据清空)了。会话级的临时表创建方法:


1     Create Global Temporary Table Table_Name  
2     (Col1 Type1,Col2 Type2On Commit Preserve Rows ;

举例:

1     create global temporary table Student  
2     (Stu_id Number(5),  
3     Class_id Number(5),  
4     Stu_Name Varchar2(8),  
5     Stu_Memo varchar2(200)) on Commit Preserve Rows ;

2) 事务级临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION 的时候,事务级的临时表也会被自动截断)。事务级临时表的创建方法:

1     Create Global Temporary Table Table_Name  
2     (Col1 Type1,Col2 Type2On Commit Delete Rows ;

举例:

1     create global temporary table Classes  
2     (Class_id Number(5),  
3     Class_Name Varchar2(8),  
4     Class_Memo varchar2(200)) on Commit delete Rows ;

3) 两中类型临时表的区别

会话级临时表采用 on commit preserve rows ;而事务级则采用 on commit delete rows ;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是 commit 、 rollback 或者是会话结束,临时表中的数据都将被截断

4 )什么时候使用临时表

1 )、当某一个 SQL 语句关联的表在 2 张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中

2 )、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。

3 . 例子:略

4 .临时表的不足之处

1 )不支持 lob 对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。

2 )不支持主外键关系

所以,由于以上原因,我们可以自己创建临时表,以弥补 oracle 临时表的不足之处

上面的都是本人经过测试的,但下面是在网上搜索到的方法,本人具体没有测试过,不过觉得可行性很强,有时间测试下

创建方法:

1 、以常规表的形式创建临时数据表的表结构,但要在每一个表的主键中加入一个 SessionID 列以区分不同的会话。(可以有 lob 列和主外键)

2 、写一个用户注销触发器,在用户结束会话的时候删除本次会话所插入的所有记录 (SessionID 等于本次会话 ID 的记录 ) 。

3 、程序写入数据时,要顺便将当前的会话 ID(SessionID) 写入表中。

4 、程序读取数据时,只读取与当前会话 ID 相同的记录即可。

功能增强的扩展设计:

1 、可以在数据表上建立一个视图,视图对记录的筛选条件就是当前会话的SessionID 。

2 、数据表中的SessionID 列可以通过Trigger 实现,以实现对应用层的透明性。

3 、高级用户可以访问全局数据,以实现更加复杂的功能。

扩展临时表的优点:

1 、实现了与Oracle 的基于会话的临时表相同的功能。

2 、支持SDO_GEOMETRY 等lob 数据类型。

3 、支持表间的主外键连接,且主外键连接也是基于会话的。

4 、高级用户可以访问全局数据,以实现更加复杂的功能


原文出自:
http://database.51cto.com/art/201001/180851.htm






posted @ 2012-12-24 10:08 小胡子 阅读(250) | 评论 (0)编辑 收藏

Heritrix资源

网络上的Heritrix中文资源比较少,整理一下:

 

中文:

l         《开发自己的搜索引擎 Lucene 2.0 + Heritrix》作者邱哲&符滔滔的BLOG

http://lucenebook.spaces.live.com/

 

l         《开发自己的搜索引擎 Lucene 2.0 + Heriterx第十章扩展Heritrix试读章节

(可以考虑开发的,比较有用)

http://book.csdn.net/bookfiles/312/10031212848.shtml

 

l         Heritrix笔记

http://wiki.hoodong.com/wiki/jRwNBCFgWA1dYB0NC

 

l         Heritrix crawler vs Nutch crawler

http://www.dbanotes.net/web/heritrix_crawler_vs_nutch_crawler.html

 

l         天下维客-爬虫程序

http://www.allwiki.com/wiki/Heritrix#Heritrix.E7.9A.84.E5.B1.80.E9.99.90

 

英文:

l         Heritrix主页

http://crawler.archive.org/

 

l         HTMLParser主页

http://htmlparser.sourceforge.net/

 
 

Heritrix绑定主机IP

关键字:Heritrix 127.0.0.1 IP 主机

 

Heritrix默认绑定的IP127.0.0.1

org.archive.crawler.Heritrix

 

final private static Collection<String> LOCALHOST_ONLY =

     Collections.unmodifiableList(Arrays.asList(new String[] { "127.0.0.1" }));

private static Collection<String> guiHosts = LOCALHOST_ONLY;

 

protected static String doCmdLineArgs(final String [] args)

throws Exception {

    // Now look at options passed.

        for (int i = 0; i < options.length; i++) {

            switch(options[i].getId()) {

                …

                case 'b':

                    Heritrix.guiHosts = parseHosts(options[i].getValue());

                    break;

                …

                default:

                    assert false: options[i].getId();

            }

        }

}

 

首先定义了默认IP127.0.0.1,然后赋给guiHost主机变量。当指定-b--bind参数时,才会把指定的IP赋给主机变量。

另外,中间还有一步参数处理,对于--xxxx参数会转为-x的形式统一处理,所以--bind-b有一样的效果。

 

Heritrix启动参数

关键字:Heritrix 启动 参数 bind admin properties

 

Heritrix的启动参数,除了--bind外,都可以在heritrix.properties设置,而不用每次都在命令行中输入。

如常用的--port, --admin等。

 

heritrix.cmdline.admin = admin:admin

heritrix.cmdline.port = 8080

heritrix.cmdline.run = false

heritrix.cmdline.nowui = false

heritrix.cmdline.order =

heritrix.cmdline.jmxserver = false

heritrix.cmdline.jmxserver.port = 8081

 

关于HeritrixExtractor中文乱码

关键字:Heritrix 中文 乱码 GB2312 Extractor

 

继承从org.archive.crawler.extractor.Extractor的子类,在extract方法中可以从参数CrawlURI中取出要解析的内容。

 

curi.getHttpRecorder().getReplayCharSequence.toString()

 

有中文时,不做处理会输出乱码。可以在取到的HttpRecorder后设置编码:

 

HttpRecorder hr = curi.getHttpRecorder();

if ( hr == null ) {

    throw new IOException( "Why is recorder null here?" );

}

hr.setCharacterEncoding( "gb2312" );

cs = hr.getReplayCharSequence();

System.out.println( cs.toString() );

 

原文出自:

http://blog.chinaunix.net/uid-8464637-id-2461166.html

posted @ 2012-12-21 12:34 小胡子 阅读(553) | 评论 (0)编辑 收藏

原文出自:

http://blog.csdn.net/jbxiaozi/article/details/7351768

 


1.右键项目-》属性-》java bulid path-》jre System Library-》access rules-》resolution选择accessible,下面填上** 点击确定即可!!!

2.

在MyEclipse中编写Java代码时,用到了BASE64Decoder,import sun.misc.BASE64Decoder;可是Eclipse提示:
Access restriction: The type BASE64Decoder is not accessible due to restriction on required library C:\Program
files\java\jre6\lib\rt.jar
Access restriction : The constructor BASE64Decoder() is not accessible due to restriction on required library C:\Program files\java\jre6\lib\rt.jar

解决方案1(推荐):

只需要在project build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。

解决方案2:

Windows -> Preferences -> Java -> Compiler -> Errors/Warnings ->
Deprecated and trstricted API 
-> Forbidden reference (access rules): -> change to warning

posted @ 2012-12-18 09:28 小胡子 阅读(11545) | 评论 (3)编辑 收藏

项目中有时需要用到起始日期和结束日期,要做到起始日期必须小于结束日期。在extjs中已经有现成的函数,摘录如下:

 1 Ext.apply(Ext.form.VTypes, {
 2             daterange : function(val, field) {
 3                 var date = field.parseDate(val);
 4                 if (!date) {
 5                     return;
 6                 }
 7                 if (field.startDateField
 8                         && (!this.dateRangeMax || (date.getTime() != this.dateRangeMax
 9                                 .getTime()))) {
10                     var start = Ext.getCmp(field.startDateField);
11                     start.setMaxValue(date);
12                     start.validate();
13                     this.dateRangeMax = date;
14                 } else if (field.endDateField
15                         && (!this.dateRangeMin || (date.getTime() != this.dateRangeMin
16                                 .getTime()))) {
17                     var end = Ext.getCmp(field.endDateField);
18                     end.setMinValue(date);
19                     end.validate();
20                     this.dateRangeMin = date;
21                 }
22                 /*
23                  * Always return true since we're only using this vtype to set
24                  * the min/max allowed values (these are tested for after the
25                  * vtype test)
26                  */
27                 return true;
28             }
29         });

然后分别定义起始日期和结束日期控件:

 1 var startDate = new Ext.form.DateField({
 2                 fieldLabel : '开始日期',
 3                 emptyText : '请选择',
 4                 disabledDays : [125],//将星期一,二,五禁止.数值为0-6,0为星期日,6为星期六
 5                 labelWidth : 100,
 6                 readOnly : true,
 7                 allowBlank : false,
 8                 format : 'Y-m-d',//日期格式
 9                 name : 'startdt',
10                 id : 'startdt',
11                 vtype : 'daterange',//daterange类型为上代码定义的类型
12                 endDateField : 'endDate'//必须跟endDate的id名相同
13             })
14     var endDate = new Ext.form.DateField({
15                 fieldLabel : '结束日期',
16                 emptyText : '请选择',
17                 disabledDays : [125],//将星期一,二,五禁止.数值为0-6,0为星期日,6为星期六
18                 readOnly : true,
19                 allowBlank : false,
20                 format : 'Y-m-d',//日期格式
21                 name : 'enddt',
22                 id : 'endDate',
23                 vtype : 'daterange',//daterange类型为上代码定义的类型
24                 startDateField : 'startdt'//必须跟startDate的id名相同
25             })

效果如下两图:

1

 

                               图1.选择开始日期

 

 

2

 

                                  图2.选择结束日期

原文出自:
http://blog.csdn.net/security08/article/details/5070749







posted @ 2012-12-16 22:31 小胡子 阅读(598) | 评论 (0)编辑 收藏

仅列出标题
共15页: First 上一页 2 3 4 5 6 7 8 9 10 下一页 Last