posts - 40,  comments - 4,  trackbacks - 0
 

http://www.dhtmlgoodies.com/
http://webfx.eae.net/
http://www.miniajax.com/
http://www.dynamicdrive.com

posted @ 2007-09-13 09:24 larryjava 阅读(108) | 评论 (0)编辑 收藏
<directory /some/where/dir> 
<FilesMatch "\.(mov|avi|bov|rm)"> 
Order Deny,Allow 
Deny from all 
</FilesMatch> 
</directory>

限制指定的文件后缀…
posted @ 2007-08-23 10:23 larryjava 阅读(308) | 评论 (0)编辑 收藏
 

项目中Struts/Spring/Hibernate的基本流程

 

Struts+Spring+Hibernate  develepment process:

1.Write your business class : DTO,FormBean,Action,Service Interface,Service Implementation.

 2.Write JSP pages.
3.struts-config.xml Configuration : FormBean,Action,Forward pages.
4.applicationContext-service.xml Configuration: add your Service Interface and Service Implementation.
5.Add your service factory Get method to ServiceFactory.java
6.Build project and Generate the Description file(*.hbm.xml) of DTO.
7.applicationContext.xml Configuration: add *.hbm.xml file to applicationContext for O/R mapping. 

Spring+hibernate的单元测试Junit

 spring提供的单元测试是强大的,spring的单元测试很简单,封装的很好。我们要用spring的单元测试测试我们写的adddelete等方法时候需要spring提供的一个额外包spring-mock.jar,我已经传上来了。你只要熟悉单元测试,编写一个测试案例,然后把继承改为org.springframework.test.AbstractTransactionalDataSourceSpringContextTests就可以了,此时编译器会提示你要实现
  /**
  *  必须实现的方法
  */
  public  String[]  getConfigLocations(){
  String[]  config  =  new  String[]{"applicationContext.xml","applicationContext-dao.xml","applicationContext-hibernate.xml","applicationContext-service.xml"};
  return  config;
  }
  看了大家应该明白,就是把你配置好的xml赋值给它,
  然后大家就可以通过下面方法:
  下面的applicationContext这个变量是你只要继承了刚才那个抽象类就可以得到的一个恒量。
  FriendService  friendService  =  (FriendService)applicationContext.getBean("friendService");
  得到你的实例来进行业务逻辑测试了,是不是很简单,大家试试吧,它在此时完成以后会把数据库回滚一次,不会影响你的数据库记录,非常好。

 

spring中提供 ContextLoaderListenter类,用来加载contextxml文件。

springstruts提供ContextLoaderPlugIn类,此类也可以加载contextxml文件。

区别在于,两种方式加载的WebApplicationContext,以不同的Key存放在ServletContext中。而如果你定义了HibernateFilter的话,spring会利用WebApplicationContextUtils来获取WebApplicationContext而此类并不识别ContextLoaderPlugIn类所加载的上下文,此时便会抛出异常: No WebApplicationContext found: no ContextLoaderListener registered?

利用ContextLoaderListenter来加载daoservice级别的context,而对于strutsaction,用ContextLoaderPlugIn加载。

2005年漂泊的一年,先后求职于南京,上海和北京三地,因此惨遭京沪宁三地java高手蹂躏。
这些都是面试java架构师的比较变态的题目:
1
。变态指数 4
int x=4;
System.out.println("value is " +((x>4)?99.9:9));
答案 9.0 问号表达式的后面两个条件有要求,因为前面的是float,所以后面转为float.
估计出题者才通过SCJP的考试。
2.
变态指数 5
public class Test {

public static void main(String[] args) {
int x = 4;
java.util.Date date = (x > 4) ? new A() : new B();
}
}

class A extends java.util.Date {}
class B extends java.util.Date {}
答案 jdk1.4编译不通过,1.5可以
不知道出题人的意图
3.
变态指数 6
String s=new String("abc");
创建了几个String对象?
答案 2
这样的公司最好不要去

4.变态指数 7
const
是不是java的关键字?
答案 constjava的关键字,但是java没有实现它
一般人绝对用不到它

5.
变态指数 8
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
答案 12对,1因为向上转型了,最后导致类型不匹配错误 ,
因为s1+=是一个操作符,能够自动转型,
short s1 = 1;
s1 = s1+1;
这句话在c++里面可以的
不知道出题人的意图
6.
变态指数 9
上海贝尔的面试题:你认为效率最高的方法,实现从1加到100.
答案 1-100的累加相当于加50101,这样循环次数从100次降为50次:
int sun = 0
for(int i = 1,j = 100 ; i <= 50 ; i++,j--){
    sun = sun + i + j;

出题人脑子有问题,直接(1+100)*50不是最快...其实类似这样的优化应该不是程序员考虑的范畴吧
7.
变态指数 10
 System.out.println(5.0942*1000);
     System.out.println(5.0943*1000);
  System.out.println(5.0944*1000);
的结果
答案 :5094.2 5094.299999999999 5094.400000000001
原理和浮点数的计算机表示方式有关 ,你不用上机,就答对了,你最好去微软,接替安德尔森.

posted @ 2007-07-05 17:33 larryjava 阅读(895) | 评论 (0)编辑 收藏

<script  language="javascript">
function test(){
if(escape(document.all.type.value).indexOf("%u")!=-1) alert("含有汉字");
else alert("全是字符");

}
</script>
<input type="text" name="type"><input type="button" name="test" onclick="test();">

posted @ 2007-07-05 17:31 larryjava 阅读(215) | 评论 (0)编辑 收藏
                                                                   应用系统架构设计   

我们在做着表面上看似是对于各种不同应用的开发,其实背后所对应的架构设计都是相对稳定的。在一个好的架构下编程,不仅对于开发人员是一件赏心悦目的事情,更重要的是软件能够表现出一个健康的姿态;而架构设计的不合理,不仅让开发人员受苦受难,软件本身的生命周期更是受到严重威胁。这里我将针对在微软dotNet平台上做应用开发系统的一般架构流程设计做一个粗浅的讨论。

 

总体设计图 

 表示层

表示层由UI(User Interface)和UI控制逻辑组成。

l         UI(User Interface)

UI是客户端的用户界面,负责从用户方接收命令,请求,数据,传递给业务层处理,然后将结果呈现出来。根据客户端的不同我们大体将应用程序分为BS(Browser-Server) 浏览器结构,CS(Client-Server)桌面客户端结构。

BS的优点是无需操心客户端,只需要部署维护好服务器即可。CS的优点在于强大的界面交互表达能力。RIA(Rich Internet Application)是为了融合这两种结构优点的一种技术,它依赖在客户端一次性安装一个通用解释器之后即获得强大的界面交互表达能力和无需部署具体客户端的方便性。具体的实现技术很多,例如微软的SmartClient, Avalon; Macromedia的Flex;以JS为基础的Bindows;Ajax等等很多。

 

l         UI控制逻辑

UI控制逻辑负责处理UI和业务层之间的数据交互,UI之间状态流程的控制,同时负责简单的数据验证和格式化等功能。具体的说在dotNet事件驱动的编程模型下,UI控制逻辑被自然的实现在了事件函数中,例如PageLoad事件函数,ButtonClick事件函数。在这些事件函数中,主要任务就是做UI控件与业务实体的数据交换与业务调用,但面对大量的数据交换工作量与维护量就成了最大的问题。而在复杂应用的系统中,状态与流程的管理是必须要考虑的因素,它们同样是业务逻辑的一部分,如果不加以封装的直接写在事件函数中将导致业务依赖表示层。下面分别讨论这两个问题。

 

1.         1.UI与业务实体之间的数据交互

此阶段负责数据交换的业务实体称为DTO(Data Transfer Object),处理输入时我们从UI控件的获得数据填入DTO再向下传播,处理输出时用户发出请求业务层会将数据以DTO的形式返出再赋给UI控件展现。因此需要一种方式来自动解决这样的来回赋值问题。遗憾的是dotNet下的不少控件虽然支持数据绑定但仍然没有一个现成完整的解决办法。我们可以自己设计一个Adapter按照某种映射关系来自动处理这样的绑定,这样的映射关系最好是UI控件与DTO属性的事先命名约定,以此种方式的约定作为映射关系无需增加任何配置文件和配置工作即可实现。

 

2.         2.状态与流程的管理

既然是业务逻辑的一部分就不应该耦合再表示层当中。MVC(Model-View-Controller)模式提供了实现这一目标的方法。Controller是整个方案的核心,它是一个流程管理器,来自UI所有的命令与数据经过Controller分发给业务层或其他UI,这样我们可以把流程,权限等逻辑单独封装,例如配置文件中,达到最大化的业务重用。dotNet下MVC的方案并不像Java下有那么多选择,目前有以下几种选择:

微软的UIPAB,它可以处理bs,cs下的流程跳转,可以使得相同的业务系统有webform和winform不同的展现方式。

开源的Mavrick.Net,它只适用于Asp.Net应用程序,它对流程,国际化,页面包装,xslt页面转换提供了很好的支持。

开源的Lattis,同样只适用于Asp.Net应用程序。

 

业务层

业务层封装了实际业务逻辑,包含数据验证,事物处理,权限处理等业务相关操作,是整个应用系统的核心。因此设计一个能够真实反映实际需要的业务层是非常必要的,我们将实际业务具体分为业务数据与业务操作两部分。

 

l         业务数据

业务数据又是业务逻辑的核心,最终业务数据将以一种固定的格式表现于内存中,在系统的各个层次间传输,充当DTO角色。表达业务数据的方式一般分为两种Table Model和Domain Model。

Table Model是将数据库中的表直接映射成为业务数据对象,这样的优点是适合于机器操作,ADO.NET直接提供了这种操作的便利,但对于复杂业务关系的表达就很不直观。只适合于业务需求与数据表对应关系很直接的需要快速开发的情况。通常我们选用Dataset或者强类型Dataset(Strong Typed Dataset),强类型Dataset支持编译时的类型检查,效率上要略高于普通Dataset。Dataset有很多方便的特性:无需自己编写维护类,支持序列化,数据副本保存,支持数据集合,对控件绑定支持效果好,微软提供了相应的生成工具以及持久方案。但缺点也是明显,复杂数据表现不直观,做为DTO在各个层次间传输,尤其是分布式环境,庞大的体积,相对缓慢的实例化对于性能造成很大压力。

Domain Model则是根据实际业务按照现实方式用OO思想建模,这样很适合业务复杂的系统。通常采用自定义数据实体(Custom Data Entity)方式表达。自定义数据实体,有着良好的性能,编译时的类型检查,数据表现方式非常直观符合实际业务的操作方式等优点,但需要自己定义维护类,在分布式环境下需要自己编写序列化方法。

综合各种因素考虑,虽然业务简单对应直接的系统我们以Table Model建模开发效率很高但难免保证系统日后不会变的复杂,因此出于复用性,扩展性,性能等方面选用Domain Model建模为佳。

 

l         业务操作

业务操作负责对业务数据进行各种业务相关的处理,例如验证,流向,整合,事物,权限等,但它不负责有关对数据源的操作。它与业务数据的关系设计有2种方式。

分离业务数据与业务操作,将业务数据单独封装到只有数据get,set的数据类中,这个数据类只充当DTO。将业务操作封装到独立的service类中与业务数据一起充当业务层。这样当系统不复杂的时候显的简单直观,而随着系统日益复杂,service类会变的杂乱,而将本身耦合紧密的数据与操作分离对于复用也是不利的因素。具体可参考Martin Fowler 的贫血的Domain Model一文,但我并不倾向于业务层直接访问数据源。

整合业务数据与业务操作,将业务数据与相关的业务操作封装在一起称为业务实体,业务实体作为统一的业务层为表示层提供服务,同时也负责作为DTO在各个层次间传输,我倾向于这样完整的Domain Model设计方式,每个业务实体都可以做为一个单独组件形式存在,对于组件化复用有着莫大的好处。

 

l         业务模块间的依赖

各个业务模块之间的依赖,有时候会是难以解决的问题,尤其是一些可以重复利用的业务组件,例如权限管理,邮件发送等等。管理好这些各种不同的业务组件是我们的目标,IoC容器为我们提供了最完美的方案,通过它将不同的模块注入到系统中我们可以在不知道这个组件存在的情况下调用它。但目前只有不成熟的Spring.Net一个选择,我们只有一声叹息,因此也就不多讨论了。

 

业务数据访问层

业务数据访问层是一个针对具体应用系统的专属层,它为业务层提供与数据源交互的最小操作方式,仅仅是业务层需要的数据访问接口,业务层完全依赖业务数据访问层所提供的服务。这些服务负责从业务层接收数据或返回业务实体,它屏蔽了实际业务数据与机器存储方式的差别。当然,数据层选用抽象的解决方案同样可以达到这个效果,但业务数据访问层最大的特点就是针对具体业务做抽象,而抽象的数据层访问方案是针对通用做抽象。往往业务中针对具体的设计生命力会变的更强,这样我们可以最大限度的保持了上层代码的复用性,当需要更换存储策略如果数据层访问差别太大,通过更换数据层无法解决问题的时候我们最多只需要更换业务数据访问层,而无需改变业务层。

 

业务数据访问层由DAO(Data Access Object)层和系统服务层两部分组成。DAO层为每个业务实体提供最基本的数据访问服务,系统服务层为系统全局提供与业务关系不大的通用数据访问服务,这两层处于系统中的同一个层次位置。

 

业务层与业务数据访问层关系图

 

 

数据层

数据层的宗旨就是为数据源提供一个可供外界访问的接口,我们应该选用一种能够提供数据源无关的抽象数据访问接口并通过在其下挂接各种不同的DataProviador来访问数据源的数据层组件,这样做便于移植到不同的数据源上。目前有以下3种数据层方案:

 

1.        1. 封装ADO.Net

这些数据访问组件都是基于ADO.Net的浅封装,它的优点在于封装层次低所以速度最快,我们可以手动组织sql语句用来适应复杂的操作以及个性的优化等。缺点是无法直接处理自定义数据实体方式的业务实体对象,需要将业务实体中的数据属性以参数形式传入传出。这样的方式虽然最为保险,但随着系统规模增大,开发效率,质量,,后期的维护,二次开发都变成尤为突出的问题,对开发人员的要求会变的越来越高。另外对于事物操作封装不是很好,无法提供声明性事物,经常会在业务层出现访问数据层的需要。这样的组件目前应用的很广泛,例如微软在EnterpriseLibrary中提供的DAAB(Data Access Application Block),还有以前的DAAB3.1。EnterpriseLibrary是个成熟的产品,包括了数据访问,异常,日志,缓存,加密,配置,安全等组件做为通用服务非常适合。

 

2.        2. OR-Mapping组件

ORM是最好的数据持久解决方案,它的优点在于能够以面向对象的方式操纵数据,因此可以直接处理自定义数据实体的业务对象,我们根本不用操心sql语句以及底层存储方式,这样极大的简化的代码提高了开发效率,对于日后维护扩展都带来极大的便利。缺点在于屏蔽了底层使得我们无法针对具体数据源做优化,而且对于复杂关联的sql操作有些力不从心,同时性能也差一些但辅助以缓存情况会好很多,而在dotNet下最大的问题就是没有一个成熟便宜的ORM产品供我们使用,全部都是beta版本和商业版本。这些版本或多或少都存在一些问题,以至于真正应用中需要经过仔细考察。例如NHibernate,Gentle.Net,XPO,Grove.Net等等非常多。

 

3.        3. DataMapper(SqlMapper)

SqlMapper为以上两种方式提供了一个折中的选择,它可以以面向对象的方式直接处理自定义数据实体的业务对象,同时可以根据与数据源与业务实体的映射关系执行手写的sql语句,这样完全使得我们可以针对具体数据源做优化,对于复杂操作同样可以胜任。目前只有iBatis.Net一个产品,它是一个java移至的开源项目,已经比较成熟,可以在无需编译的情况下随意替换DAO。

 

 

至此,整个架构方案的讨论已经完成,我们可以看出dotNet下可供选择的解决方案是那么的有限,反看Java世界,有那么多成熟可供利用的组件框架,流口水中...不过dotNet也正在走向成熟,我们需要时间等待。这个架构设计的思路只代表了我个人的理解,而且也并不是说所有的开发都是这么一套方案,在具体环境中需要做具体的调整。希望能起到一个抛砖引玉的作用。我的邮箱是i-simon AT msn.com,由于我经验尚浅,有不正确或不足的地方欢迎指正讨论,另外本文将根据技术的最新进展持续更新。

posted @ 2007-05-29 13:11 larryjava 阅读(188) | 评论 (0)编辑 收藏
1. DAO的职责就是增删改查,不该有多余的逻辑。这个问题其实我碰到过很多人写的代码和接口的设计都非常不合理。我个人有一个标准,你可以参考一下,如果用Hibernate的话,DAO的实现代码绝不会超过15行,至少我现在的DAO就是这样的。DAO互相调用?这是绝对不可能的,除非你设计有问题。

2. Service层的职责就是实现具体的业务操作。我不认为Service之间有必要相互调用,至少目前我还没有碰到过有必要互相调用的情况,我认为良好的设计也是可以避免这一点的。

3. 配置文件多使用autowire就可以变得异常简单,除非你认为autowire会影响性能。

4. 看实际情况,我Facade有时候是个好主意,不过我还没有使用过,Service接口直接暴露给Action层。
posted @ 2007-05-23 08:55 larryjava 阅读(151) | 评论 (0)编辑 收藏

■ 影像地图

  <MAP> <AREA>

  欲明白本篇【HTML彻底剖析】之标记分类,请看 【标记一览】。
  也请先明白围堵标记与空标记的分别,请看 【HTML概念】。

■ <MAP> <AREA>:

<MAP>...</MAP>
用法:      当在AREA元素中使用时,创建一个客户端的图形镜像
开始/结束标识: 必须/必须
属性:      %coreattrs
         name="..."将要创建的图形镜像的名字
空:       不允许

<AREA>
用法:      用来定义链接和锚
开始/结束标识: 必须/非法
属性:      shape="..."允许我们使用已定义的形状定义客户端的图形镜像(default, rect, circle, poly)
         coords="..."使用像素或者长度百分比来定义形状的尺寸
         href="..."所链接的源文件的URL
         target="..."决定把源文件显示在什么地方(用户自定义, _blank, _parent, _self, _top)
         nohref="..."说明该域没有反应
         alt="..."显示可替换的文本
         tabindex="..."通过使用定义过的"tabindex"属性设置不同元素之间获得焦点的顺序
空:       允许

  相信不会太多人手动设定 Image Map,通常使用网页编辑部工具的向导,那是很方便的方法,至于 <MAP> <AREA> 的详细的介绍,我们以后有空会补上。

★target的属性:
★_blank 在新窗口打开
★_parent 在父级窗口打开
★_self 在本窗口打开
★_top 在整个浏览器窗口打开

在HTML中有一个具有把图片划分成多个作用区域,并链接到不同网页的标记,那就是 <area>地图作用区域标记。
  <area>标记主要用于图像地图,通过该标记可以在图像地图中设定作用区域(又称为热点),这样当用户的鼠标移到指定的作用区域点击时,会自动链接到预先设定好的页面。其基本语法结构如下:
<area class=type  id=Value href=url alt=text  shape=area-shape  coods=value>
其中。class和id:是分别指定热点的类型和id号。
alt:用于设定热点的替代性文字。
href:用于设定该热点所链接的url地址。
shape和coords:是两个主要的参数,用于设定热点的形状和大小。其基本用法如下:
<area shape="rect" coords="x1, y1,x2,y2" href=url>表示设定热点的形状为矩形,左上角顶点坐标为(X1,y1),右下角顶点坐标为(X2,y2)。
<area shape="circle" coords="x1, y1,r" href=url>表示设定热点的形状为圆形,圆心坐标为(X1,y1),半径为r。
<area shape="poligon" coords="x1, y1,x2,y2 ......" href=url>表示设定热点的形状为多边形,各顶点坐标依次为(X1,y1)、(X2,y2)、(x3,y3) ......。
  <area>标记是在图像地图中划分作用区域的,因此其划分的作用区域必须在图像地图的区域内,所以在用 <area> 标记划分区域前必须用HTML的另一个标记<map>来设定图像地图的作用区域,并为指定的图像地图设定名称,该标记的用法很简单,即<map name="图像地图名称"> ...... </map>。
  下面通过一个例子来说明这两个标记的用法:
  这里是一幅新书架的图片,要做的效果是:当鼠标点“网址大全”这本书时,新开一窗口,显示关于这本书的简介及订单的网页(urlall.htm);当 鼠标点“网站设计攻略”这本书时,新开一窗口,显示关于这本书的简介及订单的网页(siteall.htm);当鼠标点“网页技巧大全”这本书时,新开一 窗口,显示关于这本书的简介及订单的网页(pagejqlall.htm)。制作方法:
  1、插入图片,并设置好图像的有关参数,且在<img>标记中设置参数usemap="newbook" ismap,以表示对图像地图(newbook)的引用;
  2、用<map>标记设定图像地图的作用区域,并取名为:newbook;
  3、分别用<area>标记针对三本书的位置划分出三个矩形作用区域,并设定好其链接参数href。
  制作完成,本例的源代码如下:
<img src="image/htmlp3.gif" width="207" height="148" alt="新书架" hspace="10" align="left" usemap="#newbook" border="0">
<map name="newbook">
<area shape="rect" coords="56,69,78,139" href="urlall.htm" target="_blank" alt="这里收集十万多个网址。" title="这里收集十万多个网址。">
<area shape="rect" coords="82,70,103,136" href="siteall.htm" target="_blank" alt="网站设计师的启蒙读本。" title="网站设计师的启蒙读本。">
<area shape="rect" coords="106,68,128,136" href="pageall.htm" target="_blank" alt="网页制作者不可不读的书。" title="网页制作者不可不读的书。">
</map>

  在制作本文介绍的效果时应注意的几点:
  1、在<img>标记不要忘记设置usemap、ismap参数,且usemap的参数值必须与<map>标记中的name参数值相同,也就是说,“图像地图名称”要一致;
  2、同一“图像地图”中的所有热点区域都要在图像地图的范围内,即所有<area>标记均要在<map>与</map>之间;
  3、在<area>标记中的 cords 参数设定的坐标格式要与shape参数设定的作用区域形状配套,避免出现在shape参数设置的矩形作用区域,而在cords 中设置的却是多边形区域顶点坐标的现象出现。

posted @ 2007-05-10 12:59 larryjava 阅读(909) | 评论 (0)编辑 收藏
手机与电话的正则表达式 
验证手机号码的正确性:
^0{0,1}13[0-9]{9}$

验证电话号码的正确性:(
^[0-9]{3,4}\-[0-9]{3,8}$)|(^[0-9]{3,8}$)

验证有效 日期时间 的正则表达式(已解决闰二月)

^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\s(((0?[0-9])|([1-2][0-3]))\:([0-5]?[0-9])((\s)|(\:([0-5]?[0-9])))))?$

C# Code Test:

public class Class1
{
static void Main(string[] args)
{
// string regex = @"^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([13579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\s(((0?[0-9])|([1-2][0-3]))\:([0-5]?[0-9])((\s)|(\:([0-5]?[0-9])))))?$";
string regex = @"^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13578]
)|(1[02]))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[4
69])|(11))[\-\/\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\
s]
?((0?[1-9])|([1-2][0-9])))))|(\d{2}(([02468][1235679])|([1
3579][01345789]))[\-\/\s]?((((0?[13578])|(1[02]))[\-\/\s]?((
0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\-\/\s]?((
0?[1-9])|([1-2][0-9])|(30)))|(0?2[\-\/\s]?((0?[1-9])|(1[0-9]
)
|(2[0-8]))))))"; //日期部分
regex += @"(\s(((0?[0-9])|([1-2][0-3]))\:([0-5]?[0-9])((\s)|(\:([0-5]?[0-9])))))?$"//时间部分
System.Text.RegularExpressions.RegexOptions options = ((System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace | System.Text.RegularExpressions.RegexOptions.Multiline) | System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex reg 
= new System.Text.RegularExpressions.Regex(regex, options);

string s 
= "2003-02-29 23:59:59";
System.Console.Out.WriteLine(s 
+ " {0}",reg.IsMatch(s));

= "2004-02-29 23:59:59";
System.Console.Out.WriteLine(s 
+ " {0}",reg.IsMatch(s));

= "2004-04-30 0:59:59";
System.Console.Out.WriteLine(s 
+ " {0}",reg.IsMatch(s));

= "2004-04-30 01:11:0";
System.Console.Out.WriteLine(s 
+ " {0}",reg.IsMatch(s));

= "2004-04-30 0:0:0";
System.Console.Out.WriteLine(s 
+ " {0}",reg.IsMatch(s));

= "2004-04-30 00:00:00";
System.Console.Out.WriteLine(s 
+ " {0}",reg.IsMatch(s));
}

}



posted @ 2007-05-10 11:26 larryjava 阅读(1018) | 评论 (0)编辑 收藏
      404错误页出现这个问题,我在web.xml定义了如下的定义,
  <error-page>
    <error-code>404</error-code>
    <location>/error_404.htm</location>
  </error-page>
路径的是对的,奇怪的是我测试时输入一个不存在的页,出现404错误提示出现的却不是我所定义的页面,这就怪了.
主要有以下几个因素:
1.使用 tomcat 服务器
2.tomcat服务器版本
3.浏览器问题
4.IE的设置
5.错误页本身的大小

下面是提供的解决方法:

1.升级tomcat (换成其它服务器,代价沉重)
2.ie 设定   工具-->Internet选项-->高级--->显示http友好错误信息(取消选择) ,
3. 把错误页做大一点,具体几个字节,没测试,估计三四百足够了, (加一个div块,display设为none就可以了)
4.设置指定错误页页状态为正确,骗过IE的自定义错误页 方法
<%
    response.setStatus(200); // 200 = HttpServletResponse.SC_OK
%>

posted @ 2007-05-10 11:21 larryjava 阅读(961) | 评论 (1)编辑 收藏

操作系统的时间格式不同可能会有不同的结果,你先ECHO一下就看到了
例如:
C:\>echo %DATE%
星期二 2002-10-22

C:\>echo %date:~4,10%
2002-10-22

C:\>echo %date:~0,3%
星期二

C:\>echo %date:~-10%
2002-10-22
你可以在控制面板里设置日期格式

posted @ 2007-04-20 16:23 larryjava 阅读(1899) | 评论 (0)编辑 收藏
仅列出标题
共4页: 上一页 1 2 3 4 下一页