2005年5月25日
#
昨天学到一招,在hibernate下怎么获得po的一些信息。如:
/**
* 获得po关键字属性名字
*/
public String getIdName(Class claz){
SessionImpl impl=(SessionImpl)getSession();
String rt = "";
try {
ClassPersister persister=impl.getPersister(claz.newInstance());
rt = persister.getIdentifierPropertyName();
} catch (Exception e) {
e.printStackTrace();
}
return rt;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public String getIdName(Class claz) {
String rt = null;
rt = this.getSessionFactory().getClassMetadata(claz).getIdentifierPropertyName();
return rt;
}
2005年5月11日
#
比如部门树结构:
<class name="com.jh.biz.security.pojo.Dept" table="DEPT"
schema="PERSONS">
<id name="deptid" type="java.lang.Long" column="DEPTID">
<generator class="sequence">
<param name="sequence">SYS_SEQ</param>
</generator>
</id>
<property name="name" type="java.lang.String" column="NAME"
not-null="true" length="40" />
<property name="bianhao" type="java.lang.String"
column="BIANHAO" length="20" />
<property name="deptinfo" type="java.lang.String"
column="DEPTINFO" length="100" />
<property name="color" type="java.lang.Long" column="COLOR"
length="22" />
<property name="icon" type="java.lang.Long" column="ICON"
length="22" />
<!-- Associations -->
<set name="users" table="USERS" lazy="true" inverse="true"
cascade="all">
<key column="DEPTID" />
<one-to-many class="com.jh.biz.security.pojo.User" />
</set>
<set name="subdept" table="DEPT" lazy="true" inverse="true"
cascade="all">
<key column="PAREDEPTID" />
<one-to-many class="com.jh.biz.security.pojo.Dept" />
</set>
<many-to-one name="parentdept"
class="com.jh.biz.security.pojo.Dept" outer-join="auto" update="false"
insert="false" column="PAREDEPTID" />
</class>
测试代码:
Dept dept = (Dept)dao.getObject(Dept.class,new Long(1));
List list = new ArrayList(dept.getSubdept());
Iterator iter = list.iterator();
while(iter.hasNext()){
Dept d = (Dept)iter.next();
Dept p = d.getParentdept();
Log.info("子记录:"+d.getName()+"--父记录"+p.getName());
}
注意:数据库中第一条记录要把deptid和parentdeptid设置为相同的如:0和0
2005年3月5日
#
比如一个XML文件中含有
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
那么每次读取这个xml文件的时候都从internet上去下载这个dtd规则文件,如果服务器不在internet上还会报错。
解决办法:
把规则文件从网上down下来,拷贝到xml文件所在目录,然后修改xml如下
<!DOCTYPE hibernate-mapping SYSTEM " hibernate-mapping-3.0.dtd" >
2005年3月1日
#
最近写的一个MDB在jboss3.2上配置出现了问题,但是同样的方法在jboss4.0.1上没有任何问题。
在google中找了半天终于找到了解决办法,就是修改
jboss-service.xml文件
<attribute name="RecursiveSearch">False</attribute>
为
<attribute name="RecursiveSearch">True</attribute>
其它配置照常:
ejb-jar.xml:
<message-driven>
<display-name>QueueMDB</display-name>
<ejb-name>QueueMDB</ejb-name>
<ejb-class>seperp.msg.ejb.mdb.QueueMDB</ejb-class>
<transaction-type>Container</transaction-type>
<message-driven-destination>
<destination-type>javax.jms.Queue</destination-type>
</message-driven-destination>
</message-driven>
<container-transaction>
<method>
<ejb-name>QueueMDB</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
jboss.xml:
<message-driven>
<ejb-name>QueueMDB</ejb-name>
<destination-jndi-name>queue/seperp</destination-jndi-name>
</message-driven>
2005年1月23日
#
每一个软件项目,无论是工程类项目,还是产品类项目,都必须经历需求分析、系统设计、编码实现、集成测试、部署、交付、维护和支持的过程。在这个过程中,将生成各种各样不同的工件,包括文档、源程序、可执行代码、支持库。更可怕的是,频繁出现的变更是不可避免的,因此面向如此庞大且不断变动的信息集,如何使其有序、高效地存放、查找和利用就成为了一个突出的问题。
针对这一问题,最早的开发人员尝试过的解决办法是通过手工来实现:
1)文档:每次修改时都另存为一个新的文件,然后通过文件名进行区分,例如"XXX 软件需求说明书V1.0,XXX软件需求说明书V1.1,XXX 软件需求说明书V2.0.",并且在文件中注明每次版本变化的内容;
2) 源代码:每次要修改时就将整个工程目录复制一份,将原来的文件夹进行改名,例如"XX 项目V1.0、XX 项目1.01、.",然后在新的目录中进行修改;
但是这种方法,不仅十分繁琐,容易出错,而且会带来大量的垃圾数据。如果是团队协同开发或者是项目规模较大时,还是会造成很大的混乱。很显然,这样简陋的方法是无法应对这一问题的。
后来,有人尝试从制造工业领域引入了"配置管理"这一概念,通过不懈的研究与实践,最终形成了一套管理办法和活动原则,这也就是软件配置管理。
通过软件配置管理,将对软件系统中的多重版本实施系统的管理;全面记载系统开发的历史过程,包括为什么修改,谁作了修改,修改了什么;管理和追踪开发过程中危害软件质量以及影响开发周期的缺陷和变化。并对开发过程进行有效地管理和控制,完整、明确地记载开发过程中的历史变更,形成规范化的文档,不仅使日后的维护和升级得到保证,而且更重要的是,这还会保护宝贵的代码资源,积累软件财富,提高软件重用率,加快投资回报。
正如前面所述,由于软件配置管理过程十分繁杂,管理对象错综复杂,如果是采用人工的办法不仅费时费力,还容易出错,产生大量的废品。因此,引入一些自动化工具是十分有裨益的,这也是做好配置管理的必要条件。
正是因为如此,市场上出现了大量的自动化配置管理工具,这些工具的实现原理与基本机制均十分接近,但由于其定位不同,因此各有特点,下面我们就对一些常见的配置管理工具做一简单的介绍。
元老:CCC、SCCS、RCS
上个世纪七十年代初期加利福利亚大学的Leon Presser教授撰写了一篇论文,提出控制变更和配置的概念,之后在1975年,他成立了一家名为SoftTool的公司,开发了自己的配置管理工具:CCC,这也是最早的配置管理工具之一。
在软件配置管理工具发展史上,继CCC之后,最具有里程碑式的是两个自由软件:Marc Rochkind 的SCCS (Source Code Control System) 和Walter Tichy 的RCS (Revision Control System),它们对配置管理工具的发展做出了重大的贡献,直到现在绝大多数配置管理工具基本上都源于它们的设计思想和体系架构。
中坚:Rational ClearCase
Rational 公司是全球最大的软件CASE 工具提供商,现已被IBM收购。也许是受到其拳头产品、可视化建模第一工具Rose 的影响,它开发的配置管理工具ClearCase 也是深受用户的喜爱,是现在应用面最广的企业级、跨平台的配置管理工具之一。
ClearCase提供了比较全面的配置管理支持,其中包括版本控制、工作空间管理、Build管理等,而且开发人员无需针对其改变现有的环境、工具和工作方式。
其最大的缺点就在于其价格不菲,每个客户端用户许可证大约需要几千美金,所以在国内应用群体有限。
1) 版本控制
ClearCase不仅可以对文件、目录、链接进行版本控制,同时还提供了先进的版本分支和归本功能用于支持并行开发。另外,它还支持广泛的文件类型。
2)工作空间管理
可以为开发人员提供私人存储区,同时可以实现成员之间的信息共享,从而为每一位开发人员提供一致、灵活、可重用的工作空间域。
3) Build管理
对ClearCase 控制的数据,既可以使用定制脚本,也可使用本机提供的make 程序。
其最大的缺点就在于其价格不菲,每个客户端用户许可证大约需要几千美金,所以在国内应用群体有限。
新秀:Hansky Firefly
做为H a n s k y 公司软件开发管理套件中重要一员的Firefly,可以轻松管理、维护整个企业的软件资产,包括程序代码和相关文档。Firefly是一个功能完善、运行速度极快的软件配置管理系统,可以支持不同的操作系统和多种集成开发环境,因此它能在整个企业中的不同团队,不同项目中得以应用。
Firefly基于真正的客户机/服务器体系结构,不依赖于任何特殊的网络文件系统,可以平滑地运行在不同的LAN、WAN 环境中。它的安装配置过程简单易用,Firefly 可以自动、安全地保存代码的每一次变化内容,避免代码被无意中覆盖、修改。项目管理人员使用Firefly可以有效地组织开发力量进行并行开发和管理项目中各阶段点的各种资源,使得产品发布易于管理;并可以快速地回溯到任一历史版本。系统管理员使用Firefly的内置工具可以方便的进行存储库的备份和恢复,而不依赖于任何第三方工具。
开源奇葩:CVS
CVS 是Concurrent Versions System 的缩写,它是开放源代码软件世界的一个伟大杰作,由于其简单易用、功能强大,跨平台,支持并发版本控制,而且免费,它在全球中小型软件企业中得到了广泛使用。
其最大的遗憾就是缺少相应的技术支持,许多问题的解决需要自已寻找资料,甚至是读源代码。
小工作组级:Merant PVCS
MERANT 公司的PVCS 能够提供对软件配置管理的基本支持,通过使用其图形界面或类似SCCS 的命令,能够基本满足小型项目开发的配置管理需求。PVCS 虽然功能上也基本能够满足需求,但是其性能表现一直较差,逐渐地被市场所冷落。
入门级:Microsoft Visual Source Safe
Visual Source Safe,即VSS,是微软公司为Visual Studio配套开发的一个小型的配置管理工具,准确来说,它仅能够称得上是一个小型的版本控制软件。VSS的优点在于其与Visual Studio实现了无缝集成,使用简单。提供了历史版本记录、修改控制、文件比较、日志等基本功能。
但其缺点也是十分明显的,只支持Windows平台,不支持并行开发,通过Check out - Modify - Check in的管理方式,一个时间只允许一个人修改代码,而且速度慢、伸缩性差,不支持异地开发。甚至于微软本身也不采用其做为配置管理工具,而是使用一个名为SLM 的内部工具。
面对这些形形色色,各有千秋的配置管理工具,如何根据组织特点、开发团队需要,选择切合适用的工具呢?笔者就结合工作实践中的经验与大家做一些交流与探讨。
配置管理工具的选择所需考虑的因素大体包括以下几个因素:
功能是否符合实际需求?是否符合团队特点?性能是否满意?费用是否可以接受?售后服务如何?接下来,我们就这几方面逐一深入地探讨:
1)功能是否符合实际需求,是否符合团队特点 工具就是用来帮助您解决问题的,因此功能是否符合实际需求是最重要的判断因素。而大多数主流配置管理工具的基本功能都能够满足,因此主要需要判断以下几个因素:
并行开发支持 在团队协作开发过程中,有两种主要的模式:集体代码权和个体代码权。采用集体代码权模式进行开发时,一段代码可能同时会被多个开发人员同时修改;而采用个体代码权模式进行开发时,每一段代码都始终被一个开发人员独享,别人需要修改时也会通过该开发人员完成。
而配置管理软件针对这一情况,也采用了不同的策略:Copy-Modify-Merge(拷贝、修改、合并) 的并行开发模式、Check out-Modify-Check in(签出、修改、签入)的独占开发模式。在并行开发模式下,开发人员可以并行开发、更改代码,Firefly会自动检测到代码冲突,并自动合并,或提示开发人员手动解决。
表一、并行开发支持比较表
|
工具名称 |
说明 |
| ClearCase |
Copy-Modify-Merge 模式 |
| Firefly |
Copy-Modify-Merge 模式 |
| CVS |
Copy-Modify-Merge 模式 |
| PVCS |
Check out-Modify-Check in 模式 |
| VSS |
Check out-Modify-Check in 模式 |
异地开发支持 如果你的开发团队分布在不同的开发地点,就需要对工具的异地开发功能进行仔细的评估了。大多数工具都提供基于Web的界面,用户可以通过浏览器执行配置管理的相关操作,而且有些工具就通过这样的方法来实现对异地开发的支持。
这种实现方法有太多的局限性,例如网络(Internet)连接带宽的限制、防火墙以及安全问题等。真正意义上的异地开发支持,是指在不同的开发地点建立各自的存储库,通过工具提供同步功能自动或手动同步。这样做的好处是与网络无关,即便各个开发地点之间没有实时连通的网络,也可以通过E-Mail 附件等其它方式将同步包发给对方,实现手动的同步。
表二异地开发支持比较表
|
工具名称 |
说明 |
| ClearCase |
提供MultiSite 模块,通过自动或手动同步位于不同开发地点的存储库的方式,支持异地开发 |
| Firefly |
提供ServerSync 模块,通过自动或手动同步位于不同开发地点的存储库的方式,支持异地开发 |
| CVS |
无专门支持的模块 |
| PVCS |
无专门支持的模块 |
| VSS |
无专门支持的模块 |
值得说明的是,在不同开发点建立各自存储库的方式,主要适用于两个或两个以上位于不同地点的开发团队协作开发的情况。如果仅是采用虚拟团队合作的方式,开发人员以个体的形式散落在不同地方,则更适合通过Internet 直接操作远程的配置管理服务器。
跨平台开发支持 如果企业需要从事多个不同平台下的开发工作,就需要配置管理工具能够对跨平台开发提供支持,否则势必会给开发、测试、发布等各个环节带来不便,将使大量的时间被浪费于代码的手工上传、下载中。
表三跨平台开发支持比较表
|
工具名称 |
说明 |
| ClearCase |
支持常见的平台 |
| Firefly |
软件本身基于Java开发,可在Windows、Linux、Solaris、HP-UX、AIX等常见平台上使用,平台之间的移植也非常方便 |
| CVS |
支持几乎所有的操作系统 |
| PVCS |
软件本身基于Java 开发,能够支持常见的平台 |
| VSS |
仅支持Windows 操作系统 |
与开发工具的集成性 配置管理工具与开发工具是编码过程中最常用到两种工具,因此它们之间的集成性直接影响到开发人员的便利性,如果无法良好集成,开发人员将不可避免地在配置管理工具与开发工具之间来回切换。
表四与开发工具集成性比较表
|
工具名称 |
说明 |
| ClearCase |
直接与资源管理器集成,十分易用 |
| Firefly |
与常见开发工具无缝集成 |
| CVS |
对开发工具集成性较差 |
| PVCS |
仅支持Windows 操作系统 |
| VSS |
与Visual Studio开发工具包无缝连接,其它开发工具集成性差 |
2)性能是否满意 配置管理工具软件的一些性能指标对于最终的选择也有着至关重要的影响。
运行性能 如果开发团队规模不大的情况下,配置管理工具软件的性能不会造成很大影响,但如果项目规模比较大,团队成员逐渐增多的情况下,其运行性能就会带来很大的影响。
表五运行性能比较表
|
工具名称 |
说明 |
| ClearCase |
服务器采用多进程机制,使用自带多版本文件系统MVFS,对性能有较大负面影响。做为一款企业级、全面的开发配置管理工具,适用于大型开发团队 |
| Firefly |
服务器采用了多线程的应用服务器,性能表现优秀,做为一款企业级、全面的开发配置管理,能适用于50人到上千人的团队 |
| CVS |
较高的运行性能,适用于各种级别的开发团队 |
| PVCS |
服务器采用文件系统共享方式,对CPU、内存及网络要求较高,性能一般,仅适用于中小型项目团队,不适合于企业级应用 |
| VSS |
相对功能单一、简陋,适用于几个人的小型团队,在数据量不大的情况下,性能可以接受 |
易用性 表六易用性比较表
|
工具名称 |
说明 |
| ClearCase |
安装、配置、使用相对较复杂,需要进行团队培训 |
| Firefly |
在提供全面配置管理功能的情况下,安装、配置、使用较为简单,包括安装、配置、培训在内的整个实施周期一般不会超过一个月。 |
| CVS |
安装、配置较复杂,但使用比较简单,只需对配置管理做简单培训即可 |
| PVCS |
使用比较简单,只需对配置管理做简单培训即可 |
| VSS |
安装、配置、使用均较简单,很容易上手使用 |
从用户界面、与开发工具的集成性角度来说,这几款主流的配置管理软件均有较好的设计,均有较好的易用性。
安全性 表七安全性比较表
|
工具名称 |
说明 |
| ClearCase |
采用C/S模式,需要共享服务器上的存储目录以供客户端访问,这将带来一定安全隐患 |
| Firefly |
服务器上的存储目录不用共享,对客户端不透明,客户端不可直接访问存储目录,使系统更安全可靠 |
| CVS |
采用C/S 模式,不需要共享服务器上的存储目录,安全性较好 |
| PVCS |
基于文件系统共享,而且需要以"可写"的权限共享存储目录,存在较大的安全隐患 |
| VSS |
基于文件系统共享实现对服务器的访问,需要共享存储目录,这将带来一定安全隐患 |
3)费用是否可以接受 Rational ClearCase、Hansky Firefly 两款均属于企业级配置管理工具软件,ClearCase价格较贵,,相比之下Hansky Firefly 是一款不错的选择。
而PVCS其价格大约是每客户端几百美元的水平,对于国内企业来说,性价比不太划算。VSS 是微软打包在Visual Studio开发工具包之中的,显然花费的精力不大,价格也比较便宜,可以做为个人、小项目团队版本控制之用。
而CVS则是一款完全免费的开源软件,性能较之企业级配置管理工具差距不大,也是一种不错的选择。
4) 售后服务如何 表八售后服务比较表
|
工具名称 |
说明 |
| ClearCase |
大型商用软件,已被IBM公司收购,但国内市场拓展有限,因此服务支持会受到限制。现在中国用户的支持是由位于澳大利亚悉尼的支持中心联系 |
| Firefly |
大型商用软件,已在中国成立分公司,全面拓展市场之中,在北京设有支持中心 |
| CVS |
做为开源软件,无官方支持,需要用户自己查找资料解决技术问题,现在也出现专门为CVS做技术支持的公司 |
| PVCS |
在中国市场开拓有限,国内没有支持中心 |
| VSS |
做为微软的非核心产品,技术支持有限。在其网站上有提供一些常见问题,只有对正式购买的用户提供一定的技术支持 |
售后服务与产品支持也是一个很重要的考察点,工具在使用过程中出现这样那样的问题是很平常的事,有些是因为使用不当,有些则是工具本身的缺陷。这些问题都会直接影响到开发团队的使用,因此随时能够找到专业技术人员解决这些问题就变成十分重要。
实例说明
最后,笔者介绍几个实际的案例,希望对大家选择软件配置管理工具软件有帮助。
案例一
某公司拥有10 名专职开发人员以及一些兼职的开发人员,主要从事Windows和Linux 平台下的软件开发,采用的工具包括Visual Studio 系列、GCC 等。为了能够加强版本控制与配置管理工作,决定引入一些自动化配置管理工具。
经过慎重的选择,采用了两步走的方法:
1) 首先采用了Visual Studio 软件包中的VSS做为配置管理工具;
由于VSS安装、配置、操作都十分简单,上手容易,这样在执行配置管理的过程中,工具的培训没有带来太大的阻力,大家可以集中精力理解配置管理。这样很快就在团队中形成了版本控制、配置管理的氛围与习惯。
2) 然后构建了CVS服务器,做为整个开发组织的配置管理工具;
CVS 能够有效地支援Windows、Linux 两个平台上的应用开发,其性能优秀,而且免费,另外,它对于兼职人员的配置管理十分有效。采用CVS 至今,效果明显,除了功能、使用上有些不方便之处外,没有出过任何大问题。
案例二
北京某公司拥用230名专职开发人员,长期从事金融业务的开发,随着业务的良性发展,在管理上也出现了一些不足:
1) 开发管理沟通滞后,开发人员孤立操作,变更和维护信息无法实时反馈;
2) 主管领导对所开发的100 多种产品的项目开发进程不能及时了解,很多资源滞留在个人手中;
3) 随着产品的需求日益增加,无法快速标识和查找软件的历史版本;
4) 无法对处于不同开发平台上的项目进行统一管理和资源配置;
5) 无法实现异地开发团队的协调和沟通。
因此,该公司决定引入软件配置管理,在配置管理工具软件的选择上,考虑到其人员规模较大,项目较多,工作复杂,在针对可靠性、易用性、稳定性、安全性、技术支持能力以及软件的各功能进行了仔细的综合评估后,最后选择了国内技术支持较到位的Hansky Firefly 软件配置工具软件。
在采用了Hansky Firefly 之后,有效地解决了这些问题,还帮助其顺利地通过了CMM 2级认证,为企业的进一步发展打下了坚实的基础。
2005年1月18日
#
SELECT * FROM
(
SELECT A.*, rownum r
FROM
(
SELECT *
FROM V_PERIODITEM
where 1=1
ORDER BY TIMETASKDEFID
) A
WHERE rownum <= 20
) B
WHERE r >= 1;
2005年1月17日
#
最近在使用jboss在做开发,一些调试信息在正式发布后需要隐去,于是运用log4j来控制日志输出。以下是配置中得到的一些经验。
1、首先配置jboss\server\default\conf目录下的log4j.xml,添加以下配置:
<appender name="SysMsg.out" class="org.apache.log4j.ConsoleAppender">
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
</layout>
</appender>
<logger name="SysMsg">
<level value="debug" />
<appender-ref ref="SysMsg.out" />
</logger>
2、然后写一个通用的日志输出类,所有日志输出都使用该类:
import java.io.Serializable;
import org.apache.log4j.Logger;
/**
* @author Marc Huang
*
* TODO
*/
public class SysMsg implements Serializable {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger("SysMsg");
// 唯一存在的实例
private static SysMsg _instance = null;
/**
* 构建,禁止子类继承
*/
private SysMsg() {
}
/**
* 得到静态类的实例
*
* @return 信息输出静态类
*/
public static SysMsg getInstance() {
//检测实例
if (_instance == null) {
_instance = new SysMsg();
}
return _instance;
}
public static void debug(String msg) {
if (logger.isDebugEnabled()) {
logger.debug(msg);
}
}
public static void info(String msg) {
if (logger.isInfoEnabled()) {
logger.info(msg);
}
}
public static void erro(String msg) {
logger.error(msg);
}
public static void warn(String msg) {
logger.warn(msg);
}
}
2004年12月29日
#
去之前的准备:
简历、推荐表、协议书、证书、手机、书
先作好自己的简历并且准备几套,每套简历和相关的东西复印5-10份。上海市面上的复印费是一般是2--5角一张A4,人才市场复印1元/张。打印有1元?5元。但在上海高校里面、附近或者比较偏的地方打印和复印都很便宜,一般打印3角,复印1角。
书、和你想应聘的岗位相关的技术书。为什么我要提到书呢,一般单位都要三次面试其中必定进行技术方面的测试,有的是笔试、有的是当场口试。如果你不想在笔试中淘汰的话最好带相关的书来随时复习复习,也可以在无聊中打发时间,同时也能增加自己在笔试中的成绩。(上网方便的话,最好把应聘企业的一些资料看一看)
1、住:
来上海住的地方是很重要的。如果你有同学亲戚朋友可以投靠的话,尽量住在他们那里,这时候不要考虑面子上过不去的问题,如果有他们的帮助的话,我想你在上海找工作可能少走很多弯路。
假如你没有以上的人员,那也没有关系,你可以找一些价格便宜的旅店住,象东华大学研究生创办的求职小屋?这里主要是为求职的大学生提供住宿的。一天最低13元,还可以和其他求职的人一起交流经验,也能从那里得到一些招聘会信息及有关招聘企业信息,他们的网址是www.51jobclub.net。
还有一些家庭旅舍的房子(上海的老房子,也就是贫民窟呀),当初我和同学一起来找工作时,住的是一家招待所,也是很旧的平房,下岗职工办的,一天15元,三个人住一间房子,里面除了三张床。一张桌子,一台12寸的黑白电视,呵呵,只有一个台比较清楚,在淮海西路上离交大徐汇校区三号门3分钟的路程,和对面的高楼大厦比起来真是鲜明的对比啊。家庭旅馆的房子是上海本地人的老房子,在我眼里就是危房呀,幸亏上海没有什么大的地震,呵呵,如果你想租一个月的话你可以和他们讲价。
如果你想租房子,那你就在网上找找吧,上海热线的租房网站rent.online.sh.cn 交大的bbs、51house.com你也可以去看看。不过上海租房子一般是租三押一。
2、吃:
如果你去过的地方很多。呵呵,那吃饭不会怎么挑剔吧?在上海找工作,吃饭确实是件大事,拿一起找工作的同学的话说,在上海能吃饱就很不错了!,呵呵,虽然夸张点,但也差不多,比起小地方来,上海不仅是房价离谱而且饭价也太贵。
不过在小区附近的吃的也恨多,价格也便宜;千万不要到上海商务区吃饭,那里太贵了;还有在大学里或者附近吃的都还比较实惠。不过求职小屋(www.51jobclub.net)里也有食堂,吃的也相对比较便宜!
3、行
建议最好能买张最新的上海市地图,而且必须是有详细交通线路站点的那一种,每次出门都带上。在上海交通是非常拥挤的,地铁、轻轨是出门的首选;一般来说,选择地铁加公交的方式,比较快捷也比较节省。
求职小屋俱乐部(www.51jobclub.net)靠近地铁站附近设立,交通非常便利,半小时可到达上海各大型人才招聘市场;去各工业园区,商务办公区也是非常便利的
上海有地铁一号线(莘庄--火车站-先已延伸了)地铁二号线(中山公园--张江高科技园),轻轨(上海南站--江湾)。
如果你不想带很多硬币零钱的话,那就买站交通卡(100元的卡工本费用30,可以退还),上海的公交一般空调车是2元,非空调的一般是1元或1.5元。地铁轻轨按距离远近一般是3元左右。
提醒:在上海问路,除了问清楚在哪条路上及门牌号之外,一定要问清楚目的地靠近哪条路。如:天山商厦所在位置天山路靠近古北路。否则冤枉路就免不了
4、招聘会
一般举行招聘会的地点有:上海八万人体育馆、光大会展中心、上海展览中心、还有其它的一些地方招聘会的时间一般都是在星期六、日。
招聘的报纸你可以在招聘会上买也可在报摊上买。前程无忧的招聘报纸、人才招聘报、职场指南都是1元1份。
网上的招聘网站不用我说大家也能知道吧。
5、网吧
作为一个当代的大学生,不能上网恐怕是要抓狂了。上海的网吧都装有什么网吧管理软件和公安的监控软件。而网吧的价格一般是3元/hour,你可以找到一些条件差点的2元/hour如果幸运的话能碰到1.5元/hour。比较正规点的网吧在上海叫做公众电脑屋。
不过求职小屋俱乐部(www.51jobclub.net)里也提供上网服务,价格也便宜2元/hour,每周也有三次免费上网的机会,不过就是速度比较慢,机器配置比较差点!
6、面试的流程
一般公司都是先在招聘会上或网上收集简历,合适的话通知你去面试
有的是先作性格测试题(像小日本和台资企业)和技术题。
然后技术人员面你,问些技术的问题,如果合适的话
技术部的负责人面试你。
最后和人事部(或老总)的谈待遇问题。
求职小屋(www.51jobclub.net) 提供
2004年12月28日
#
1、JMS是一个由AS提供的Message服务。它能接受消息产生者(Message Provider)所发出的消息,并把消息转发给消息消费者(Message Consumer)。
2、JMS提供2种类型的消息服务:(1)Queue,即点对点,每个消息只转发给一个消息消费者使用。(2)Topic,即发布和订阅,每个消息可以转发给所有的订阅者(消费者)。
3、WEBLOGIC 8下的JMS配置:
(1)配置JMS Connection Factory
(2)配置JMS File Store(目前所找到的文档都是配置File Store,其实在具体的应用中,可能JMS JDBC Store更广泛,但暂时没有找到资料)
(3)配置JMS Server
(4)在JMS Server的destinations中配置JMS Queue或者JMS Topic
其中提供给消息产生者和消息消费者使用的是JMS Connection Factory的JNDI和JMS Queue或者JMS Topic的JNDI。
4、消息产生者向JMS发送消息的步骤:
(1)使用JNDI查询对象JMS ConnectionFactory和Destination(JMS Queue/Topic)
(2)使用管理对象JMS ConnectionFactory建立连接Connection
(3)使用连接Connection 建立会话Session
(4)使用会话Session和管理对象Destination创建消息生产者MessageSender
(5)使用消息生产者MessageSender发送消息
一个消息发送者的例子:
package myjms;
import java.util.*;
import javax.naming.*;
import javax.jms.*;
public class MessageProducter {
public static void main(String[] args) {
String queueConnectionFactoryName = "myjmsconnectionfactory"; //JMS Connection Factory的JNDI
String queueName = "myjmsqueue"; //JMS Queue或者JMS Topic的JNDI
boolean transacted = false;//transaction模式
int acknowledgementMode = Session.AUTO_ACKNOWLEDGE;//acknowledgement模式
String message="Message need to send";//模拟需要发送的消息
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
properties.put(Context.PROVIDER_URL, "t3://localhost:7001");
try {
Context context = new InitialContext(properties);
Object obj = context.lookup(queueConnectionFactoryName);
QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory) obj;//JMS Connection Factory的获得
obj = context.lookup(queueName);
Queue queue = (Queue) obj;//JMS Queue或者JMS Topic的获得
QueueConnection queueConnection=queueConnectionFactory.createQueueConnection();//产生连接
queueConnection.start();
QueueSession queueSession = queueConnection.createQueueSession(transacted, acknowledgementMode);
TextMessage textMessage = queueSession.createTextMessage();
textMessage.clearBody();
textMessage.setText(message);
QueueSender queueSender = queueSession.createSender(queue);
queueSender.send(textMessage);
if (transacted) {
queueSession.commit();
}
if (queueSender != null) {
queueSender.close();
}
if (queueSession != null) {
queueSession.close();
}
if (queueConnection != null) {
queueConnection.close();
}
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
5、消息消费者从JMS接受消息的步骤:
(1)使用JNDI查询对象JMS ConnectionFactory和Destination(JMS Queue/Topic)
(2)使用管理对象JMS ConnectionFactory建立连接Connection
(3)使用连接Connection 建立会话Session
(4)使用会话Session和管理对象Destination创建消息消费者MessageReceiver
(5)使用消息消费者MessageReceiver接受消息,需要用setMessageListener将MessageListener接口绑定到MessageReceiver
消息消费者必须实现了MessageListener接口,需要定义onMessage事件方法。
一个消息消费者的例子:
package myjms;
import java.util.*;
import javax.naming.*;
import javax.jms.*;
public class MessageReciever
implements MessageListener {
public void onMessage(Message message) {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("Message content is:" + textMessage.getText());
}
catch (JMSException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MessageReciever msgRcvr=new MessageReciever();
String queueConnectionFactoryName = "myjmsconnectionfactory";
String queueName = "myjmsqueue";
boolean transacted = false;
int acknowledgementMode = Session.AUTO_ACKNOWLEDGE;
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
properties.put(Context.PROVIDER_URL, "t3://localhost:7001");
try {
Context context = new InitialContext(properties);
Object obj = context.lookup(queueConnectionFactoryName);
QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory)
obj;
obj = context.lookup(queueName);
Queue queue = (Queue) obj;
QueueConnection queueConnection = queueConnectionFactory.
createQueueConnection();
queueConnection.start();
QueueSession queueSession = queueConnection.createQueueSession(transacted,
acknowledgementMode);
QueueReceiver queueReceiver = queueSession.createReceiver(queue);
queueReceiver.setMessageListener(msgRcvr);
synchronized(msgRcvr){
msgRcvr.wait(100000);
}
if (queueReceiver != null) {
queueReceiver.close();
}
if (queueSession != null) {
queueSession.close();
}
if (queueConnection != null) {
queueConnection.close();
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
6、Message-driven Bean
MDB实际上就是一个消息消费者的客户端程序。它由AS EJB Container来管理。在JBUILDER生成一个MDB非常简单。
2004年12月24日
#
在网站中经常需要进行在线人数的统计。过去的一般做法是结合登录和退出功能,即当用户输入用户名密码进行登录的时候计数器加1,然后当用户点击退出按钮退出系统的时候计数器减1。这种处理方式存在一些缺点,例如:用户正常登录后,可能会忘记点击退出按钮,而直接关闭浏览器,导致计数器减1的操作没有及时执行;网站上还经常有一些内容是不需要登录就可以访问的,在这种情况下也无法使用上面的方法进行在线人数统计。
我们可以利用Servlet规范中定义的事件监听器(Listener)来解决这个问题,实现更准确的在线人数统计功能。对每一个正在访问的用户,J2EE应用服务器会为其建立一个对应的HttpSession对象。当一个浏览器第一次访问网站的时候,J2EE应用服务器会新建一个HttpSession对象,并触发HttpSession创建事件,如果注册了HttpSessionListener事件监听器,则会调用HttpSessionListener事件监听器的sessionCreated方法。相反,当这个浏览器访问结束超时的时候,J2EE应用服务器会销毁相应的HttpSession对象,触发HttpSession销毁事件,同时调用所注册HttpSessionListener事件监听器的sessionDestroyed方法。
可见,对应于一个用户访问的开始和结束,相应的有sessionCreated方法和sessionDestroyed方法执行。这样,我们只需要在HttpSessionListener实现类的sessionCreated方法中让计数器加1,在sessionDestroyed方法中让计数器减1,就轻松实现了网站在线人数的统计功能。
下面就是利用HttpSessionListener实现在线人数统计的一个例子,这个例子已经在中创软件的J2EE应用服务器InforWeb中测试通过。
首先,编写一个简单的计数器,代码如下:
- package gongfei.cmc.articles.onlinecounter;
- public class OnlineCounter {
- private static long online = 0;
- public static long getOnline() {
- return online;
- }
- public static void raise(){
- online++;
- }
- public static void reduce(){
- online--;
- }
- }
然后,编写HttpSessionListener实现类,在这个实现类的sessionCreated方法中调用OnlineCounter的raise方法,在sessionDestroyed方法中调用OnlineCounter的reduce方法,代码如下:
再然后,把这个HttpSessionListener实现类注册到网站应用中,也就是在网站应用的web.xml中加入如下内容:
- <web-app>
- ……
- <listener>
- <listener-class>
- gongfei.cmc.articles.example.OnlineCounterListener
- </listener-class>
- </listener>
- ……
- </web-app>
OK,在线人数统计功能已经实现,只要在JSP页面中加入下面这样的脚本就能显示但前在线人数了:
- <%@ page language="java" pageEncoding="GB2312" %>
- <%@ page import="gongfei.cmc.articles.onlinecounter.OnlineCounter" %>
- <html>
- <head><title>On Line Counert</title></head>
- <body bgcolor="#FFFFFF">
- On line:<%=OnlineCounter.getOnline()%>
- </body>
- </html>
2004年12月23日
#
网页打印,可以通过浏览器的"打印"功能实现,但"打印模板"机制,却是 IE 5.5 /6.0 以及 Netscape 6.0 所独有的;准确一点, IE 5.5 只是一个机制雏形,在 IE 6.0 中才得以完全体现。IE 6.0 的打印功能模块,在精确控制页面边界,文本间隔,以及打印的统一性上,功能更为完备。
通过创建打印模板,你可以精确控制:
网页打印及预览时的页面风格与内容编排风格;
打印属性,如自动为打印的页面添加卷标或编号;
精确控制打印预览界面的各个元素与变量。
通过打印模板,你可以:
自动为所有打印页面添加固定内容,如公司标识,版权申明,或者指定广告;
自定义页面标头与尾注等元素,比如页码或卷标;
指定打印历史与任务;
书本化奇偶分页映射打印......
打印模板机制是建立在动态 HTML 语言基础上的,涉及到主要两个行为:DeviceRect, LayoutRect ,下面我们就这两个行为深入地探讨 IE 6.0 的打印机制。
另外需要说明的是,DHTML (动态超文本标识语言)的行为跟其他语言的"行为"一样,都是一种应用编程接口,初始状态下有自己的默认属性,在一定的事件下,由用户决定调用其承认的功能模块,从而产生相对应的"行为"。而且,"行为"可以自己编写,不过得以".htc"为其扩展名以供调用。
一.DeviceRect ,定义打印总体风格:
打印总体风格,包括为打印页面添加如公司标识的固定内容(网页上不一定有,只体现在打印纸张上或预览页面上,后同);打印页面的颜色风格;打印页面的边缘属性或图案;等等。
在进行 DeviceRect 引用前,先得确定页面风格,方法是用<style>进行设置。
例一:我们来定制如下的打印模板
8.5 inch 宽
11 inch 高
黄色背景
1 pixel 宽的黑色实心左边界
1 pixel 宽的黑色实心上边界
4 pixels 宽的黑色实心右边界
4 pixels 宽的黑色实心下边界
所有边界与纸张边缘为 10 pixels 的距离
现在我们用 style 进行设定,假设这个 style 名为 Mystyle1:
<style TYPE="text/css">
.Mystyle1
{
width:8.5in;
height:11in;
background:#FFFF99;
border-left:1 solid black;
border-top:1 solid black;
border-right:4 solid black;
border-bottom:4 solid black;
margin:10px;
}
</style>
下面我们给出 DeviceRect 引用的完全页面代码,
<HTML XMLNS:IE>
<HEAD>
<?IMPORT NAMESPACE="IE" IMPLEMENTATION="#default">
<style TYPE="text/css">
.Mystyle1
{
width:8.5in;
height:11in;
background:#FFFF99;
border-left:1 solid black;
border-top:1 solid black;
border-right:4 solid black;
border-bottom:4 solid black;
margin:10px;
}
</style>
</HEAD>
<BODY>
<IE:DEVICERECT ID="page1" CLASS="Mystyle1" MEDIA="print">
</IE:DEVICERECT>
<IE:DEVICERECT ID="page2" CLASS="Mystyle1" MEDIA="print">
</IE:DEVICERECT>
</BODY>
</HTML>
在这个页面中,共进行了两个 DeviceRect 引用。作为一种规则,每一个单独的打印页面,必须有一个相对应的 DeviceRect 标记,如果有 1000 个页面,那就得有 1000 个 DeviceRect 标记!吓住了?别担心,后面我们会教你一个方法,让所有的 DeviceRect 标记自动完成!
在上面的代码中,ID 是标志属性,不同的页面必须有自己不同的标识;CLASS 引用了 style 属性;MEDIA 属性则指明了本页面的最终用途是进行打印;<?IMPORT NAMESPACE="IE" IMPLEMENTATION="#default">这句话则是指输入默认的行为,它们分别是 DeviceRect, LayoutRect。
二.LayoutRect ,定义页面内容风格:
跟 DeviceRect 一样,不同的页面,要进行 LayoutRect 引用时都需要添加 LayoutRect 标记,其智能添加方法将在后面介绍; LayoutRect 与 DeviceRect 如果在同一个页面中同时出现,则前者需放在后者之内;另外, LayoutRect 对内容风格的设定,也通过 style 得以实现。
例二:我们来定制如下的内容风格的打印模板:
5.5 inches 宽
8 inches 高
与打印纸张边缘,四边保持 1 inch 的宽度(加上页面本身的边缘宽度,为实际的打印边缘宽度)
白色背景
1 inch 宽的虚线边界
先定制名为 contentstyle 的风格:
<style TYPE="text/css">
.contentstyle
{
width:5.5in;
height:8in;
margin:1in;
background:white;
border:1 dashed gray;
}
</style>
然后下面是进行引用的完整网页代码:
<HTML>
<HEAD>
<?IMPORT NAMESPACE="IE" IMPLEMENTATION="#default">
<style TYPE="text/css">
.contentstyle
{
width:5.5in;
height:8in;
margin:1in;
background:white;
border:1 dashed gray;
}
</style>
</HEAD>
<BODY>
<IE:LAYOUTRECT ID="layoutrect1" CONTENTSRC="2.html" CLASS="contentstyle" NEXTRECT="layoutrect2"/>
<IE:LAYOUTRECT ID="layoutrect2" CLASS="contentstyle"/>
</BODY>
</HTML>
跟例一中的源代码相比,例二中只是以 LayoutRect 代替了原来的 DeviceRect 标记;DeviceRect 定制的是模板整体风格,而 LayoutRect 定制的是具体内容的版面风格;LayoutRect 的 ID 属性也具有唯一性; CONTENTSRC 属性则指明了具体的将起作用网页文件;CLASS 指明了风格的引用对象;跟 DeviceRect 不同,在进行 LayoutRect 引用时,必须在每个页面指定 NEXTREC ,即依次排列的下一个内容风格,这里的"下一个内容"用其页面的相应 ID 进行标识,如本例中的 LayoutRect2 。
三.DeviceRect 与 LayoutRect 的协同作战:
上面我们分别讨论了 DeviceRect 与 LayoutRect 的作用与引用方法,现在我们来看一下,如何在同一个打印模板中进行定制与引用。
在每一个打印模板上,必然包含两方面的内容,一个是整体的模板风格(DeviceRect),另一个是内容风格(LayoutRect);第一个打印页面跟其他页面是不同的,因为第一个页面中必须指明 CONTENTSRC 属性,而同一打印任务中的其他页面不再需要进行 CONTENTSRC 的指定。
例三:
下面是第一个页面中的 DeviceRect 代码:
<IE:DEVICERECT ID="page1" CLASS="masterstyle" MEDIA="print">
<IE:LAYOUTRECT ID="layoutrect1" CONTENTSRC="2.html" CLASS="contentstyle" NEXTRECT="layoutrect2"/>
</IE:DEVICERECT>
下面是其他页面中的 DeviceRect 代码:
<IE:DEVICERECT ID="page2" CLASS="masterstyle" MEDIA="print">
<IE:LAYOUTRECT ID="layoutrect2" CLASS="contentstyle"/>
</IE:DEVICERECT>
下面我们将 DeviceRect 与 LayoutRect 结合起来使用,其源代码如下:
<HTML XMLNS:IE>
<HEAD>
<?IMPORT NAMESPACE="IE" IMPLEMENTATION="#default">
<style TYPE="text/css">
.contentstyle
{
width:5.5in;
height:8in;
margin:1in;
background:white;
border:1 dashed gray;
}
.Mystyle1
{
width:8.5in;
height:11in;
background:#FFFF99;
border-left:1 solid black;
border-top:1 solid black;
border-right:4 solid black;
border-bottom:4 solid black;
margin:10px;
}
</style>
</HEAD>
<BODY>
<IE:DEVICERECT ID="page1" CLASS="Mystyle1" MEDIA="print">
<IE:LAYOUTRECT ID="layoutrect1" CONTENTSRC="2.html" CLASS="contentstyle" NEXTRECT="layoutrect2"/>
</IE:DEVICERECT>
<IE:DEVICERECT ID="page2" CLASS="Mystyle1" MEDIA="print">
<IE:LAYOUTRECT ID="layoutrect2" CLASS="contentstyle"/>
</IE:DEVICERECT>
</BODY>
</HTML>
四.DeviceRect 与 LayoutRect 标记的动态自动添加:
前面我们说到,每个单独的打印页面都需要各自的 DeviceRect 与 LayoutRect 标记,那么,如果我们有 1000 个页面需要打印,是否就要在每个页面上重复繁琐的 Copy & Paste 操作?
答案是否定的,我们完全可以通过 JavaScript 脚本来完成这一繁琐的工作。
要实现 HTML 声明的动态创建,关键在于 <DIV> 标记的定义,下面是其定义规则。
<DIV ID="devicecontainer">
......
</DIV>
<DIV>与</DIV>之间,采用 insertAdjacentHTML() 方式,并主要利用了其 afterBegin 与 BeforeEnd 两个变量,现在我们将第一个页面"插入"到<DIV></DIV>之间:
devicecontainer.insertAdjacentHTML("afterBegin", newHTML);
具有继承属性的后续页面,调用 beforeEnd 变量:
devicecontainer.insertAdjacentHTML("beforeEnd", newHTML);
要装载 devicecontainer 页面,还需在 <Body>中添加:
<BODY ONLOAD="addFirstPage()">
现在我们在 JavaScript 中添加包含前面详细介绍的 LayoutRect 与 DeviceRect 元素,用到的命令是 addFirstPage() 。需要注意的是,newHTML 标记后使用的是双引号,而 LayoutRect 与 DeviceRect 标记后的变量使用单引号。如下:
function addFirstPage() {
newHTML = "<IE:DEVICERECT ID='devicerect1' MEDIA='print' CLASS='mystyle1'>";
newHTML += "<IE:LAYOUTRECT ID='layoutrect1' CONTENTSRC='2.html'" + "ONLAYOUTCOMPLETE='onPageComplete()' NEXTRECT='layoutrect2'" + "CLASS='contentstyle'/>";
newHTML += "</IE:DEVICERECT>";
devicecontainer.insertAdjacentHTML("afterBegin", newHTML);
}
细心的读者一定会发现,LayoutRect 后出现了一个新的属性:LayoutRect:onLayoutComplete ,这个属性主要指定了 LayoutRect 停止响应的后续事件,如系统资源消耗殆尽而停止响应,或者 LayoutRect 指定的变量溢出。
好了,有了上面的原理,下面我们来编写具有自动"插入"功能的 JavaScript 代码:
function onPageComplete() {
if (event.contentOverflow) {
newHTML = "<IE:DEVICERECT ID='devicerect" + (lastPage + 1) + "' MEDIA='print' CLASS='mystyle1'>";
newHTML += "<IE:LAYOUTRECT ID='layoutrect" + (lastPage + 1) + "' ONLAYOUTCOMPLETE='onPageComplete()' NEXTRECT='layoutrect" + (lastPage + 2) + "' CLASS='contentstyle'/>";
newHTML += "</IE:DEVICERECT>";
devicecontainer.insertAdjacentHTML("beforeEnd", newHTML);
lastPage++;
}
在上面的代码中,contentOverflow 代表的是由于页面信息过长,本页的 LayoutRect 停止响应,则直接跳到下一个页面,让 LayoutRect 重新定义下一个页面的版面;onPageComplete() 则不管页面是否过长,LayoutRect 是否停止响应,只要到了页面尾部则自动跳到下一页,这也是最常见的情况。
在编写本脚本时,关键处在于保持清醒,不能让任意一个变量出错。其中,ID 不仅针对 DeviceRect 与 LayoutRect ,还为 NextRect 所引用,页面指向不能出错;当前页面的页码应该是 lastPage+1 ,下一个页面的页码应该是 lastPage+2 ;NextRect 标记需要下一个页面的 LayoutRect 属性支持,因此它的值应该为 "layoutRect"+(lastPage+2);打开第一个页面时,这个 LastPage 初始值为 1
2004年12月21日
#
编辑ant.bat
添加:
:runAnt
"%_JAVACMD%" %ANT_OPTS% -Xms128m -Xmx512m -classpath···
这里不要超过你的物理内存大小
2004年12月14日
#
1、Content-Type和Content-Language (显示字符集的设定)
说明:设定页面使用的字符集,用以说明主页制作所使用的文字已经语言,浏览器会根据此来调用相应的字符集显示page内容。
用法:<Meta http-equiv="Content-Type" Content="text/html; Charset=gb2312">
<Meta http-equiv="Content-Language" Content="zh-CN">
注意:该META标签定义了HTML页面所使用的字符集为GB2132,就是国标汉字码。如果将其中的“charset=GB2312”替换成“BIG5”,则该页面所用的字符集就是繁体中文Big5码。当你浏览一些国外的站点时,IE浏览器会提示你要正确显示该页面需要下载xx语支持。这个功能就是通过读取HTML页面META标签的Content-Type属性而得知需要使用哪种字符集显示该页面的。如果系统里没有装相应的字符集,则IE就提示下载。其他的语言也对应不同的charset,比如日文的字符集是“iso-2022-jp ”,韩文的是“ks_c_5601”。
Content-Type的Content还可以是:text/xml等文档类型;
Charset选项:ISO-8859-1、BIG5、UTF-8、SHIFT-Jis、Euc、Koi8-2、us-ascii,
x-mac-roman, iso-8859-2, x-mac-ce, iso-2022-jp, x-sjis, x-euc-jp,
euc-kr, iso-2022-kr, gb2312, gb_2312-80, x-euc-tw, x-cns11643-1, x-cns11643-2等字符集;
Content-Language的Content还可以是:EN、FR等语言代码。
2、Refresh (刷新)
说明:让网页多长时间(秒)刷新自己,或在多长时间后让网页自动链接到其它网页。
用法:<Meta http-equiv="Refresh" Content="30">
<Meta http-equiv="Refresh" Content="5; Url=http://www.xia8.net">
注意:其中的5是指停留5秒钟后自动刷新到URL网址。
3、Expires (期限)
说明:指定网页在缓存中的过期时间,一旦网页过期,必须到服务器上重新调阅。
用法:<Meta http-equiv="Expires" Content="0">
<Meta http-equiv="Expires" Content="Wed, 26 Feb 1997 08:21:57 GMT">
注意:必须使用GMT的时间格式,或直接设为0(数字表示多少时间后过期)。
4、Pragma (cach模式)
说明:禁止浏览器从本地机的缓存中调阅页面内容。
用法:<Meta http-equiv="Pragma" Content="No-cach">
注意:这样设定,访问者将无法脱机浏览。
5、Set-Cookie (cookie设定)
说明:浏览器访问某个页面时会将它存在缓存中,下次再次访问时就可从缓存中读取,以提高速度。当你希望访问者每次都刷新你广告的图标,或每次都刷新你的计数器,就要禁用缓存了。通常HTML文件没有必要禁用缓存,对于ASP等页面,就可以使用禁用缓存,因为每次看到的页面都是在服务器动态生成的,缓存就失去意义。如果网页过期,那么存盘的cookie将被删除。
用法:<Meta http-equiv="Set-Cookie" Content="cookievalue=xxx; expires=Wednesday, 21-Oct-98 16:14:21 GMT; path=/">
注意:必须使用GMT的时间格式。
6、Window-target (显示窗口的设定)
说明:强制页面在当前窗口以独立页面显示。
用法:<Meta http-equiv="Widow-target" Content="_top">
注意:这个属性是用来防止别人在框架里调用你的页面。Content选项:_blank、_top、_self、_parent。
7、Pics-label (网页RSAC等级评定)
说明:在IE的Internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级别就是通过该参数来设置的。
用法:<META http-equiv="Pics-label" Contect="(PICS-1.1'http://www.rsac.org/ratingsv01.html'
I gen comment 'RSACi North America Sever' by '
inet@microsoft.com' for 'http://www. microsoft.com' on '1997.06.30T14:21-0500' r(n0 s0 v0 l0))">
注意:不要将级别设置的太高。RSAC的评估系统提供了一种用来评价Web站点内容的标准。用户可以设置Microsoft Internet Explorer(IE3.0以上)来排除包含有色情和暴力内容的站点。上面这个例子中的HTML取自Microsoft的主页。代码中的(n 0 s 0 v 0 l 0)表示该站点不包含不健康内容。级别的评定是由RSAC,即美国娱乐委员会的评级机构评定的,如果你想进一步了解RSAC评估系统的等级内容,或者你需要评价自己的网站,可以访问RSAC的站点:
http://www.rsac.org/。
8、Page-Enter、Page-Exit (进入与退出)
说明:这个是页面被载入和调出时的一些特效。
用法:<Meta http-equiv="Page-Enter" Content="blendTrans(Duration=0.5)">
<Meta http-equiv="Page-Exit" Content="blendTrans(Duration=0.5)">
注意:blendTrans是动态滤镜的一种,产生渐隐效果。另一种动态滤镜RevealTrans也可以用于页面进入与退出效果:
<Meta http-equiv="Page-Enter" Content="revealTrans(duration=x, transition=y)">
<Meta http-equiv="Page-Exit" Content="revealTrans(duration=x, transition=y)">
Duration 表示滤镜特效的持续时间(单位:秒)
Transition 滤镜类型。表示使用哪种特效,取值为0-23。
0 矩形缩小
1 矩形扩大
2 圆形缩小
3 圆形扩大
4 下到上刷新
5 上到下刷新
6 左到右刷新
7 右到左刷新
8 竖百叶窗
9 横百叶窗
10 错位横百叶窗
11 错位竖百叶窗
12 点扩散
13 左右到中间刷新
14 中间到左右刷新
15 中间到上下
16 上下到中间
17 右下到左上
18 右上到左下
19 左上到右下
20 左下到右上
21 横条
22 竖条
23 以上22种随机选择一种
9、MSThemeCompatible (XP主题)
说明:是否在IE中关闭 xp 的主题
用法:<Meta http-equiv="MSThemeCompatible" Content="Yes">
注意:关闭 xp 的蓝色立体按钮系统显示样式,从而和win2k 很象。
10、IE6 (页面生成器)
说明:页面生成器generator,是ie6
用法:<Meta http-equiv="IE6" Content="Generator">
注意:用什么东西做的,类似商品出厂厂商。
11、Content-Script-Type (脚本相关)
说明:这是近来W3C的规范,指明页面中脚本的类型。
用法:<Meta http-equiv="Content-Script-Type" Content="text/javascript">
2004年12月13日
#
一、每天問他愛不愛你。
二、他說愛的話,問他有多愛,然後用記事簿把它記錄下來。
三、 每天嘮叨他。
四、他對你好的時候,問他為甚麼對你這樣好,是不是做了對不起你的事。
五、 不肯和他親熱。﹝男人真是的...﹞
六、每天起碼要他和你親熱兩次。﹝吭?這樣也不行?男人真難搞!﹞
七、 半夜三更把他喚醒,要他聽你發牢騷。
八、 要他替你媽媽還巨額賭債。
九、 要他把積蓄全部交給你。
十、 在他面前數落他最愛的媽媽。
十一、 說他沒你那麼聰明。
十二、嘲笑他的英文程度。﹝英文程度還比性能力前面耶...男人真好面子...﹞
十三、 批評他的性能力。
十四、 要他陪你逛街購物,並且付錢。
十五、 常常對著他哭。
十六、 每天到他的公司接他下班。
十七、走上他的辦公室,認識他的同事,並且跟他的同事討論他。
十八、 要他每天向你報告行蹤起碼三次。
十九、 經常搜查他的口袋。
二十、 要他陪你一起節食減肥。
二十一、 不准他去見他的那些朋友。
二十二、 不准他收看他最喜歡的足球比賽。
二十三、 偷看他的日記。
二十四、每次和他去旅行時,只肯去你想去的地方。
二十五、 要他跟你結婚。﹝真狠....﹞
2004年12月10日
#
今天收到了HP从英国寄来的内存条了,服务真的很好。而且发现一个很好的国家快递公司,下面是我在快递公司网站上查到的我邮寄的记录
2004-12-07 18:10 SHANNON - IRELAND, REPUBLIC OF 快件正在发件地操作
2004-12-07 20:36 SHANNON - IRELAND, REPUBLIC OF 快件离开转运地
2004-12-07 22:09 EAST MIDLANDS - GREAT BRITAIN 快件到达转运地
2004-12-08 01:07 EAST MIDLANDS - GREAT BRITAIN 快件离开转运地
2004-12-08 05:51 COLOGNE - GERMANY 快件离开转运地
2004-12-09 01:05 HONG KONG HUB - HONG KONG 快件到达转运地
2004-12-09 02:44 HONG KONG HUB - HONG KONG 快件已在转运途中
2004-12-09 02:49 HONG KONG HUB - HONG KONG 快件已从海关放行
2004-12-09 03:18 HONG KONG HUB - HONG KONG 快件离开转运地
2004-12-09 03:18 HONG KONG HUB - HONG KONG 快件已在转运途中
2004-12-09 10:59 GUANGZHOU - CHINA, PEOPLE'S REPUBLIC 快件到达转运地
2004-12-09 11:33 GUANGZHOU - CHINA, PEOPLE'S REPUBLIC 快件已从海关放行
2004-12-09 12:29 GUANGZHOU - CHINA, PEOPLE'S REPUBLIC 快件已在转运途中
2004-12-09 12:45 GUANGZHOU - CHINA, PEOPLE'S REPUBLIC 快件已在转运途中
2004-12-09 12:46 GUANGZHOU - CHINA, PEOPLE'S REPUBLIC 快件离开转运地
2004-12-09 13:32 CAN 快件到达目的地国家
2004-12-09 16:10 CAN 快件已分给派送员,等待派送
2004-12-09 17:10 CAN 快件已经派送并签收
签收人: MS ×××