Computerworld在对多位IT高管进行调查之后,得出了2012 最需要IT技能,不过由于调查范围不够大,可能会出现偏差,仅供参考。
1)编程及应用开发:需求从2010年的44%上升到2012年的61%。
2)项目管理:不仅仅管理人才监管项目,还需要洞察用户需求并转述给其他IT员工,包括需求日益增加的商业分析师。
3)服务台支持/技术支持:随着移动操作系统的发展,需求随之增加
4) 网络设计:这类需求部分归结于虚拟化及云计算的发展,相关人员最好具有虚拟系统及思杰系统经验的人。
5) 商务智能(Business Intelligence):这类需求大部分归因于企业日益将重心从节省成本转向技术投资。
6) 数据中心:虚拟化及云技术也排在其后
7) Web 2.0:围绕社交媒体的技术需求将会增加,Net,AJAX及PHP作关键后端技术,HTML,XML,CSS,Flash及Javascript作前端支持。
8) 安全:2010年需求为32%,现在有所下降,但由于日趋严重的安全问题,许多人又将此提到一个新的高度
9 )电信:对IP电话技术人员的需求也相当大,尤其是对Cisco IPCC电话中心系统熟悉的人。
posted @
2012-01-10 20:45 kylixlu 阅读(200) |
评论 (0) |
编辑 收藏
The Oracle TO_CHAR(datetime,
fmt)
function converts datetime values to a string in the format specified by
the fmt option.
MySQL has the DATE_FORMAT function that allows datetime values
converting to a string in the specified format.
SQLWays converts the Oracle TO_CHAR function to the MySQL DATE_FORMAT
function and converts elements of format string from Oracle to
corresponding specifier in MySQL as specified in the following table.
TABLE 56. Conversion of Oracle TO_CHAR(datetime) with format string to MySQL
Mapping of datetime format specifiers between MySQL and Oracle
|
MySQL
|
Oracle (independently from register)
|
Description
|
%a
|
DY
|
Abbreviated weekday name (Sun..Sat)
|
%b
|
MON
|
Abbreviated month name (Jan..Dec)
|
%D
|
-
|
Day of the month with English suffix (0th, 1st, 2nd, 3rd, etc.)
|
%d
%e
|
DD
|
Day of the month, numeric ((00..31) and (0..31))
|
%j
|
DDD
|
Day of year (001..366)
|
%m
%c
|
MM
|
Month, numeric ((00..12) and (0..12))
|
%M
|
MONTH
|
Month name (January..December)
|
%f
|
-
|
Microseconds (000000..999999)
|
%i
|
MI
|
Minutes, numeric (00..59)
|
%h
%I
%l
|
HH
HH12
|
Hour ((01..12) and (1..12))
|
%H
%k
|
HH24
|
Hour ((00..23) and (0..23))
|
%p
|
AM
PM
|
AM or PM
|
%r
|
-
|
Time, 12-hour (hh:mm:ss followed by AM or PM)
|
%S
%s
|
SS
|
Seconds ((00..59) and (0..59))
|
%T
|
-
|
Time, 24-hour (hh:mm:ss)
|
%u
|
WW
IW
|
Week (00..53), where Monday is the first day of week
|
%U
|
-
|
Week (00..53), where Sunday is the first day of week
|
%V
|
-
|
Week (01..53), where Sunday is the first day of week, used with %X
|
%v
|
WW
IW
|
Week (01..53), where Monday is the first day of week, used with %x
|
%W
|
DAY
|
Weekday name (Sunday..Saturday)
|
%w
|
-
|
Day of the week (0=Sunday .. 6=Saturday)
|
%X
|
-
|
Year for the week, where Sunday is the first day of the week, numeric 4
digits; used with %V
|
%x
|
-
|
Year for the week, where Monday is the first day of the week, numeric 4
digits; used with %v
|
%Y
|
YYYY
SYYYY
IYYY
|
Year, numeric, 4 digits
|
%y
|
YY
IYY
|
Year, numeric, 2 digits
|
-
|
J
|
Julian day; the number of days since January 1, 4712 BC.
|
-
|
Q
|
Quarter of year (1, 2, 3, 4; JAN-MAR = 1).
|
-
|
RR
|
Given a year with 2 digits:
· If the year is <50 and the last 2 digits of the current year are
>=50, then the first 2 digits of the returned year are 1 greater than
the first 2 digits of the current year.
· If the year is >=50 and the last 2 digits of the current year are
<50, then the first 2 digits of the returned year are 1 less than the
first 2 digits of the current year.
|
-
|
RRRR
|
Round year. Accepts either 4-digit or 2-digit input. If 2-digit,
provides the same return as RR. If you don't want this functionality,
then simply enter the 4-digit year.
|
-
|
W
|
Week of month (1-5) where week 1 starts on the first day of the month
and ends on the seventh.
|
-
|
SSSSS
|
Seconds past midnight (0 - 86399).
|
-
|
X
|
Local radix character.
|
-
|
Y,YYY
|
Year with comma in the position.
|
-
|
YEAR
SYEAR
|
Year, spelled out; "S" prefixes BC dates with "-".
|
-
|
YYY
|
3 digits of year.
|
-
|
Y
|
1 digit of year.
|
-
|
IY
|
2 digits of ISO year.
|
-
|
I
|
1 digit of ISO year.
|
-
|
AD
A.D.
|
AD indicator with or without periods.
|
-
|
BC
B.C.
|
BC indicator with or without periods.
|
-
|
CC
SCC
|
One greater than the first two digits of a four-digit year; "S" prefixes
BC dates with "-".
For example, '20' from '1900'.
|
-
|
D
|
Day of week (1 - 7).
|
-
|
A.M.
P.M.
|
Meridian indicator with periods.
|
-
|
TZH
|
Time zone hour.
|
-
|
TZM
|
Time zone minute.
|
-
|
TZR
|
Time zone region information.
|
-
|
RM
|
|
TABLE 57. Example of Conversion
posted @
2010-04-22 17:00 kylixlu 阅读(1194) |
评论 (0) |
编辑 收藏
近日在项目中写了个OPhone 调用Webservice的工具类,主要是使用了KSoap2来实现的,代码如下:
1package com.ictehi.ophone.util;
2
3import java.io.IOException;
4import java.util.Iterator;
5import java.util.Map;
6
7import org.ksoap2.SoapEnvelope;
8import org.ksoap2.SoapFault;
9import org.ksoap2.serialization.SoapObject;
10import org.ksoap2.serialization.SoapSerializationEnvelope;
11import org.ksoap2.transport.AndroidHttpTransport;
12import org.ksoap2.transport.HttpTransportSE;
13import org.xmlpull.v1.XmlPullParserException;
14
15import android.util.Log;
16
17public class WSUtils {
18
19 public WSUtils() {
20 }
21
22 /** *//**
23 * @author Eric.Lu
24 * @param endPoint
25 * @param methodName
26 * @param params
27 * @param wsdl
28 * @return SoapObject
29 */
30 public static SoapObject callWS(String nameSpace, String methodName,
31 Map params, String wsdl) {
32
33 final String SOAP_ACTION=nameSpace+methodName;
34 SoapObject request = new SoapObject(nameSpace, methodName);
35 SoapObject soapResult=null;
36
37 if(params !=null && !params.isEmpty()){
38 for(Iterator it=params.entrySet().iterator();it.hasNext();){//遍历MAP
39 Map.Entry<String, Object> e=(Map.Entry<String, Object>) it.next();
40 request.addProperty(e.getKey().toString(),e.getValue());
41 }
42 }
43
44 /** *//**
45 * 设置Soap版本
46 * 类型:VER1.0,VER1.1,VER1.2
47 */
48 // SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER10);//SOAP 1.0
49 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);// SOAP 1.1
50 // SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER12);//SOAP 1.2
51
52 envelope.dotNet=true;//是否是dotNet WebService
53 envelope.bodyOut = request;
54
55// HttpTransportSE ht = new HttpTransportSE(wsdl);
56 AndroidHttpTransport androidHT=new AndroidHttpTransport(wsdl);
57 try {
58// ht.call(SOAP_ACTION, envelope);
59 androidHT.call(SOAP_ACTION,envelope);
60 } catch (IOException e) {
61 Log.e("IOException:", e.getMessage());
62 } catch (XmlPullParserException e1) {
63 Log.e("XmlPullParserException", e1.getMessage());
64 }
65 try {
66 soapResult=(SoapObject)envelope.getResponse();
67 } catch (SoapFault e) {
68 Log.e("SoapFault",e.getMessage());
69 }
70 return soapResult;
71 }
72}
73
74
75本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kylixlu/archive/2010/03/12/5372846.aspx
调用这个工具类的方法如下:
1HashMap<String, Object> params = new HashMap<String, Object>();
2 params.put("theCityName", peoples[position]);
3 String wsdl = "webservice的wsdl地址";
4 String nameSpace = "wsdl中的namespace";
5 String methodName = "方法名";//
6 // SoapObject result = WSUtils.callWS(nameSpace, methodName,
7 // wsdl,peoples[position]);
8 SoapObject result = WSUtils.callWS(nameSpace, methodName, params, wsdl);
9
10
11本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kylixlu/archive/2010/03/12/5372846.aspx
posted @
2010-03-24 09:23 kylixlu 阅读(800) |
评论 (0) |
编辑 收藏
摘要: 系统架构设计师考试大纲
一、考试说明:
1.考试目标
考试合格人员应能够根据系统需求规格说明书,结合应用领域和技术发
展的实际情况,考虑有关约束条件,设计正确、合理的软件架构,确保系统架构具有良好的特性;能够对项目睥系统架构进行描述、分析、设计与评估;能够按照相
关标准编写相应的设计文档;能够与系统分析师、项目管理...
阅读全文
posted @
2010-03-09 13:28 kylixlu 阅读(278) |
评论 (0) |
编辑 收藏
<?xml version="1.0" encoding="UTF-8"?>
<license>
<terms>
<issued_to>rapidhorse.com.cn</issued_to>
<license_identifier>SN732563653</license_identifier>
<edition>enterprise</edition>
<evaluation>N</evaluation>
<start_date>12/13/2007</start_date>
<expiration>5/29/2099</expiration>
<full_test_director>500</full_test_director>
<additional_defects>500</additional_defects>
<tolerance>0%</tolerance>
<requirements>Y</requirements>
<advanced_reports>Y</advanced_reports>
<business_process_testing>500</business_process_testing>
<version_control>Y</version_control>
<dashboard>Y</dashboard>
</terms>
<Signature>lA0FAVrF+UTDW2qVIDjVPCSpPKRUpKcoTO8/GI95D1RLIzQAq/8mv+HnIGQ0Grv9am8QKHfncRsARR153QxqKw==</Signature>
</license>
posted @
2010-02-24 17:24 kylixlu 阅读(266) |
评论 (1) |
编辑 收藏
permission:android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS
permission:android.permission.FACTORY_TEST
permission:android.permission.SET_ACTIVITY_WATCHER
permission:android.permission.CLEAR_APP_USER_DATA
permission:android.permission.ACCESS_DOWNLOAD_MANAGER
permission:android.permission.CALL_PRIVILEGED
permission:android.permission.FORCE_BACK
permission:android.permission.ACCESS_CHECKIN_PROPERTIES
permission:android.permission.CONTROL_LOCATION_UPDATES
permission:android.permission.WRITE_SECURE_SETTINGS
permission:android.permission.READ_FRAME_BUFFER
permission:android.permission.INTERNAL_SYSTEM_WINDOW
permission:android.permission.ADD_SYSTEM_SERVICE
permission:android.permission.INJECT_EVENTS
permission:android.permission.MASTER_CLEAR
permission:android.permission.STATUS_LED
permission:android.permission.ACCESS_DRM
permission:android.permission.STATUS_BAR
permission:android.permission.PACKAGE_USAGE_STATS
permission:android.permission.BATTERY_STATS
permission:android.permission.INSTALL_PACKAGES
permission:android.permission.MANAGE_APP_TOKENS
permission:android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED
permission:android.permission.SET_PROCESS_FOREGROUND
permission:android.permission.BIND_INPUT_METHOD
permission:com.android.providers.streaming.permission.READ_ONLY
permission:android.permission.ACCESS_SURFACE_FLINGER
permission:android.permission.CHANGE_COMPONENT_ENABLED_STATE
permission:android.permission.READ_INPUT_STATE
permission:android.permission.DELETE_PACKAGES
permission:android.permission.UPDATE_DEVICE_STATS
permission:android.permission.BRICK
permission:android.permission.ACCESS_CACHE_FILESYSTEM
permission:android.permission.WRITE_GSERVICES
permission:android.permission.REBOOT
permission:android.permission.DELETE_CACHE_FILES
permission:com.android.providers.streaming.permission.WRITE_ONLY
permission:android.permission.FOTA_UPDATE
permission:android.permission.SET_ORIENTATION
permission:android.permission.DEVICE_POWER
posted @
2010-02-08 10:00 kylixlu 阅读(739) |
评论 (0) |
编辑 收藏
1.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/config/spring/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.orm.hibernate3.LocalSessionFactoryBean]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/dom4j/DocumentException
解决方法:添加dom4j.jar
2.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/config/spring/applicationContext.xml]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/transaction/TransactionManager
解决方法: 添加jta.jar
posted @
2010-01-28 22:43 kylixlu 阅读(186) |
评论 (0) |
编辑 收藏
1. 查看你的Eclipse中使用的是什么SVN Interface
windows > preference > Team > SVN #SVN Interface
2. 如果是用的JavaHL, 找到以下目录并删除auth目录.
C:\Documents and Settings\[YourUserName]\Application Data\Subversion\
3. 如果你用的SVNKit, 找到以下目录并删除.keyring文件.
[eclipse]\configuration\org.eclipse.core.runtime
posted @
2009-12-21 17:08 kylixlu 阅读(264) |
评论 (0) |
编辑 收藏
使用svn log命令生成一个changelog.xml文件:
1.生成文件需要记录所有的变更:
svn log <path> -v --xml > changelog.xml
-v :verbose模式
--xml :输出xml文件
changelog.xml输出的xml文件名
2.生成的文件只需记录当前最新的变更:
svn log <path> -r HEAD -v --xml >changelog.xml
-r:revision
HEAD :最新的版本信息
还有两个参数与上面同解
BTW: svn log 还有好多参数,请自己使用
svn log -h 查阅
也许你执行了以上的命令后,你会发现自己的最新变更信息并不在changelog.xml中,这是为什么呢?
这是因为SVN中的“update”与"commit"是分开的.在版本做出变更后,还需执行以下的命令:
svn update <path>
当然svn update也有很多其它参数,详情请使用
svn update -h 查阅
先写到这里,后面还要介绍用ant脚本怎么来实现同样的操作.
posted @
2009-08-12 21:54 kylixlu 阅读(727) |
评论 (0) |
编辑 收藏
Eclipse+ADT是目前最推荐的一种开发Android的开发环境,不过有些Android程序是使用Android提供的一些工具(如:Android命令)和其它IDEs中建立的,那怎么样才能将这些非Eclipse中建立的Android项目导入进来呢?
1.首先要确保你的Eclipse安装了ADT(Android Development Tools)插件.(
详细资料请查阅官方文档)
2.新建一个Android项目
,此时选择"Create project form existing source",在Location中点"Browse...",先中Android项目所在文件夹。
其它的所以一切Eclipse会自动识别,之后你点"Finish",项目就成功导入到Eclipse中了。
posted @
2009-07-31 09:41 kylixlu 阅读(950) |
评论 (0) |
编辑 收藏
项目中的OTA Server中的一个功能。具体使用请看https://www.clickatell.com/developers/api_http.php
代码如下:
1 protected void SendSMS()
2 {
3
4 string api_id = "xxxxxx";//api_id请查阅clicktell网站帮助
5 string user = "xxxxxx";
6 string password = "xxxxx";
7 //string mobile = "xxxxxx";
8 string mobile = txtMobile.Text;//一个输入手机号的文本框
9
10 string appUri = getAppUri();//发送给手机的App链接,出于保密,此处假设了getAppUri()方法
11
12 StringBuilder smsParams = new StringBuilder();
13 smsParams.Append("api_id=" + api_id);
14 smsParams.Append("&user=" + user);
15 smsParams.Append("&password=" + password);
16 smsParams.Append("&to=" + mobile);
17 smsParams.Append("&text=" + appUri);
18
19
20
21 Uri smsuri = new Uri(string.Format("http://api.clickatell.com/http/sendmsg?{0}", smsParams));
22
23 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(smsuri);
24
25 request.AllowAutoRedirect = false;
26
27 request.Method = "GET";
28
29
30 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
31
32 }
33
34
这个方法不仅适用于clicktell公司的服务,其它的一些SMS服务提供商,用C#调用方法也差不多,仅供大家参考,呵呵
posted @
2009-07-16 21:52 kylixlu 阅读(218) |
评论 (0) |
编辑 收藏
protected void getAllDirs(string path)
{
DirectoryInfo dirinfo = new DirectoryInfo(@path);
DirectoryInfo[] dirs = dirinfo.GetDirectories();
for (int i = 0; i < dirs.Length; i++) {
Response.Write(dirs[i].FullName + "<br>");//页面上打印输出
getAllDirs(dirs[i].FullName);//递归
}
}
posted @
2009-07-16 20:31 kylixlu 阅读(177) |
评论 (0) |
编辑 收藏
我用了一个虚拟机做NightlyBuild脚本的测试,因为要装三个JDE的版本,发现装完JDK+ANT+三个JDE之后,硬盘没空间了,去虚拟机配置里看了一下,还没地方可以调整硬盘大小的。
不过VMWare,提供了以命令行的方式,调整硬盘的大小,在<VMWare_HOME>下有一个vmware-vdiskmanager.exe 可以增加虚拟硬盘的容量:
e.g :我要把硬盘变成5G大小,可以用以下命令
C:\VMware安装路径>vmware-vdiskmanager -x 6Gb X:\你虚拟机文件的路径\Windows" "XP" "Professional.vmdk
(
注意:我的虚拟机创建时用了默认文件名Windows XP Professional.vmdk,所以中间有空格,所以要用引号括起来)
如果命令正确,就会出现上图的操作.
D:\System\VMware\VMware Workstation>vmware-vdiskmanager -x 6Gb F:\VM_XP_EN\Windo
ws" "XP" "Professional.vmdk
Using log file C:\DOCUME~1\ERICLU~1.IBM\LOCALS~1\Temp\vmware-Eric.Lu\vdiskmanage
r.log
Grow: 100% done.
The old geometry C/H/S of the disk is: 10402/16/63
The new geometry C/H/S of the disk is: 12483/16/63
Disk expansion completed successfully.
WARNING: If the virtual disk is partitioned, you must use a third-party
utility in the virtual machine to expand the size of the
partitions. For more information, see:
http://www.vmware.com/support/kb/enduser/std_adp.php?p_faqid=1647
D:\System\VMware\VMware Workstation>
等Grow:100%后,并不等于我们的虚拟机硬盘就是5Gb了,我们要用PQ之类的软件对其进行重新分配置,调整分区大小,才会有效果,不然 硬盘的分区大小还是原来那么大。
posted @
2009-07-02 20:01 kylixlu 阅读(1594) |
评论 (0) |
编辑 收藏
Ant的概念
可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令。当编译Linux内核及一些软件的源程序时,经常要用这个命令。Make命令其实就是一个项目管理工具,而Ant所实现功能与此类似。像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant却克服了这些工具的缺陷。最Ant开发者在开发跨平台的应用时,用样也是基于这些缺陷对Ant做了更好的设计。
Ant 与 makefile
Makefile有一些不足之处,比如很多人都会碰到的烦人的Tab问题。最初的Ant开发者多次强调”只是我在Tab前面加了一个空格,所以我的命令就不能执行”。有一些工具在一定程度上解决了这个问题,但还是有很多其他的问题。Ant则与一般基于命令的工具有所不同,它是Java类的扩展。Ant运行需要的XML格式的文件不是Shell命令文件。它是由一个Project组成的,而一个Project又可分成可多target,target再细分又分成很多task,每一个task都是通过一个实现特定接口的java类来完成的。
Ant的优点
Ant是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点。跨平台性。Ant是存Java语言编写的,所示具有很好的跨平台性。操作简单。Ant是由一个内置任务和可选任务组成的。Ant运行时需要一个XML文件(构建文件)。Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。由于Ant构建文件时XML格式的文件,所以和容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。
Ant 开发
Ant的构建文件
当开始一个新的项目时,首先应该编写Ant构建文件。构建文件定义了构建过程,并被团队开发中每个人使用。Ant构建文件默认命名为build.xml,也可以取其他的名字。只不过在运行的时候把这个命名当作参数传给Ant。构建文件可以放在任何的位置。一般做法是放在项目顶层目录中,这样可以保持项目的简洁和清晰。下面是一个典型的项目层次结构。
(1) src存放文件。
(2) class存放编译后的文件。
(3) lib存放第三方JAR包。
(4) dist存放打包,发布以后的代码。
Ant构建文件是XML文件。每个构建文件定义一个唯一的项目(Project元素)。每个项目下可以定义很多目标(target元素),这些目标之间可以有依赖关系。当执行这类目标时,需要执行他们所依赖的目标。每个目标中可以定义多个任务,目标中还定义了所要执行的任务序列。Ant在构建目标时必须调用所定义的任务。任务定义了Ant实际执行的命令。Ant中的任务可以为3类。
(1) 核心任务。核心任务是Ant自带的任务。
(2) 可选任务。可选任务实来自第三方的任务,因此需要一个附加的JAR文件。
(3) 用户自定义的任务。用户自定义的任务实用户自己开发的任务。
1.<project>标签
每个构建文件对应一个项目。<project>标签时构建文件的根标签。它可以有多个内在属性,就如代码中所示,其各个属性的含义分别如下。
(1) default表示默认的运行目标,这个属性是必须的。
(2) basedir表示项目的基准目录。
(3) name表示项目名。
(4) description表示项目的描述。
每个构建文件都对应于一个项目,但是大型项目经常包含大量的子项目,每一个子项目都可以有自己的构建文件。
2.<target>标签
一个项目标签下可以有一个或多个target标签。一个target标签可以依赖其他的target标签。例如,有一个target用于编译程序,另一个target用于声称可执行文件。在生成可执行文件之前必须先编译该文件,因策可执行文件的target依赖于编译程序的target。Target的所有属性如下。
(1) .name表示标明,这个属性是必须的。
(2) .depends表示依赖的目标。
(3) if表示仅当属性设置时才执行。
(4) unless表示当属性没有设置时才执行。
(5) description表示项目的描述。
Ant的depends属性指定了target的执行顺序。Ant会依照depends属性中target出现顺序依次执行每个target。在执行之前,首先需要执行它所依赖的target。程序中的名为run的target的depends属性compile,而名为compile的target的depends属性是prepare,所以这几个target执行的顺序是prepare->compile->run。一个target只能被执行一次,即使有多个target依赖于它。如果没有if或unless属性,target总会被执行。
3.<mkdir>标签
该标签用于创建一个目录,它有一个属性dir用来指定所创建的目录名,其代码如下:
<mkdir dir=”${class.root}”/>
通过以上代码就创建了一个目录,这个目录已经被前面的property标签所指定。
4<jar>标签
该标签用来生成一个JAR文件,其属性如下。
(1) destfile表示JAR文件名。
(2) basedir表示被归档的文件名。
(3) includes表示别归档的文件模式。
(4) exchudes表示被排除的文件模式。
5.<javac标签>
该标签用于编译一个或一组java文件,其属性如下。
(1).srcdir表示源程序的目录。
(2).destdir表示class文件的输出目录。
(3).include表示被编译的文件的模式。
(4).excludes表示被排除的文件的模式。
(5).classpath表示所使用的类路径。
(6).debug表示包含的调试信息。
(7).optimize表示是否使用优化。
(8).verbose 表示提供详细的输出信息。
(9).fileonerror表示当碰到错误就自动停止。
6.<java>标签
该标签用来执行编译生成的.class文件,其属性如下。
(1).classname 表示将执行的类名。
(2).jar表示包含该类的JAR文件名。
(3).classpath所表示用到的类路径。
(4).fork表示在一个新的虚拟机中运行该类。
(5).failonerror表示当出现错误时自动停止。
(6).output 表示输出文件。
(7).append表示追加或者覆盖默认文件。
7.<delete>标签
该标签用于删除一个文件或一组文件,去属性如下。
(1)/file表示要删除的文件。
(2).dir表示要删除的目录。
(3).includeEmptyDirs 表示指定是否要删除空目录,默认值是删除。
(4).failonerror 表示指定当碰到错误是否停止,默认值是自动停止。
(5).verbose表示指定是否列出所删除的文件,默认值为不列出。
8.<copy>标签
该标签用于文件或文件集的拷贝,其属性如下。
(1).file 表示源文件。
(2).tofile 表示目标文件。
(3).todir 表示目标目录。
(4).overwrite 表示指定是否覆盖目标文件,默认值是不覆盖。
(5).includeEmptyDirs 表示制定是否拷贝空目录,默认值为拷贝。
(6).failonerror 表示指定如目标没有发现是否自动停止,默认值是停止。
(7).verbose 表示制定是否显示详细信息,默认值不显示。
Ant的数据类型
在构建文件中为了标识文件或文件组,经常需要使用数据类型。数据类型包含在org.apache.tool.ant.types包中。下面镜简单介绍构建文件中一些常用的数据类型。
1. argument 类型
由Ant构建文件调用的程序,可以通过<arg>元素向其传递命令行参数,如apply,exec和java任务均可接受嵌套<arg>元素,可以为各自的过程调用指定参数。以下是<arg>的所有属性。
(1).values 是一个命令参数。如果参数种有空格,但又想将它作为单独一个值,则使用此属性。
(2).file表示一个参数的文件名。在构建文件中,此文件名相对于当前的工作目录。
(3).line表示用空格分隔的多个参数列表。
(4).path表示路径。
2.ervironment 类型
由Ant构建文件调用的外部命令或程序,<env>元素制定了哪些环境变量要传递给正在执行的系统命令,<env>元素可以接受以下属性。
(1).file表示环境变量值得文件名。此文件名要被转换位一个绝对路径。
(2).path表示环境变量的路径。Ant会将它转换为一个本地约定。
(3).value 表示环境变量的一个直接变量。
(4).key 表示环境变量名。
注意 file path 或 value只能取一个。
3.filelist类型
Filelist 是一个支持命名的文件列表的数据类型,包含在一个filelist类型中的文件不一定是存在的文件。以下是其所有的属性。
(1).dir是用于计算绝对文件名的目录。
(2).files 是用逗号分隔的文件名列表。
(3).refid 是对某处定义的一个<filelist>的引用。
注意 dir 和 files 都是必要的,除非指定了refid(这种情况下,dir和files都不允许使用)。
4.fileset类型
Fileset 数据类型定义了一组文件,并通常表示为<fileset>元素。不过,许多ant任务构建成了隐式的fileset,这说明他们支持所有的fileset属性和嵌套元素。以下为fileset 的属性列表。
(1).dir表示fileset 的基目录。
(2).casesensitive的值如果为false,那么匹配文件名时,fileset不是区分大小写的,其默认值为true.
(3).defaultexcludes 用来确定是否使用默认的排除模式,默认为true。
(4).excludes 是用逗号分隔的需要派出的文件模式列表。
(5).excludesfile 表示每行包含一个排除模式的文件的文件名。
(6).includes 是用逗号分隔的,需要包含的文件模式列表。
(7).includesfile 表示每行包括一个包含模式的文件名。
5.patternset 类型
Fileset 是对文件的分组,而patternset是对模式的分组,他们是紧密相关的概念。
<patternset>支持4个属性:includes excludex includexfile 和 excludesfile,与fileset相同。Patternset 还允许以下嵌套元素:include,exclude,includefile 和 excludesfile.
6.filterset 类型
Filterset定义了一组过滤器,这些过滤器将在文件移动或复制时完成文件的文本替换。
主要属性如下:
(1).begintoken 表示嵌套过滤器所搜索的记号,这是标识其开始的字符串。
(2).endtoken表示嵌套过滤器所搜索的记号这是标识其结束的字符串。
(3).id是过滤器的唯一标志符。
(4).refid是对构建文件中某处定义一个过滤器的引用。
7.Path类型
Path元素用来表示一个类路径,不过它还可以用于表示其他的路径。在用作揖个属性时,路经中的各项用分号或冒号隔开。在构建的时候,此分隔符将代替当前平台中所有的路径分隔符,其拥有的属性如下。
(1).location 表示一个文件或目录。Ant在内部将此扩展为一个绝对路径。
(2).refid 是对当前构建文件中某处定义的一个path的引用。
(3).path表示一个文件或路径名列表。
8.mapper类型
Mapper类型定义了一组输入文件和一组输出文件间的关系,其属性如下。
(1).classname 表示实现mapper类的类名。当内置mapper不满足要求时,用于创建定制mapper.
(2).classpath表示查找一个定制mapper时所用的类型路径。
(3).classpathref是对某处定义的一个类路径的引用。
(4).from属性的含义取决于所用的mapper.
(5).to属性的含义取决于所用的mapper.
(6).type属性的取值为identity,flatten glob merge regexp 其中之一,它定义了要是用的内置mapper的类型。
Ant 的运行
安装好Ant并且配置好路径之后,在命令行中切换到构建文件的目录,输入Ant命令就可以运行Ant.若没有指定任何参数,Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为构建文件。如果使用了 –find 选项,Ant 就会在上级目录中找构建文件,直至到达文件系统得跟目录。如果构建文件的名字不是build.xml ,则Ant运行的时候就可以使用 –buildfile file ,这里file 指定了要使用的构建文件的名称,示例如下:
Ant
如下说明了表示当前目录的构建文件为build.xml 运行 ant 执行默认的目标。
Ant –buildfile test.xml
使用当前目录下的test.xml 文件运行Ant ,执行默认的目标
posted @
2009-06-05 20:22 kylixlu 阅读(278) |
评论 (0) |
编辑 收藏
小写
α
|
β
|
γ
|
δ
|
ε
|
ζ
|
Alpha
|
Beta
|
Gamma
|
Delta
|
Epsilon
|
Zeta
|
ν
|
ξ
|
ο
|
π
|
ρ
|
σ
|
Nu
|
Xi
|
Omicron
|
Pi
|
Rho
|
Sigma
|
η
|
θ
|
ι
|
κ
|
λ
|
μ
|
Eta
|
Theta
|
Iota
|
Kappa
|
Lambada
|
Mu
|
τ
|
υ
|
φ
|
χ
|
ψ
|
ω
|
Tau
|
Upsilon
|
Phi
|
Chi
|
Psi
|
Omega
|
大写
α
|
β
|
γ
|
δ
|
ε
|
ζ
|
Alpha
|
Beta
|
Gamma
|
Delta
|
Epsilon
|
Zeta
|
ν
|
ξ
|
ο
|
π
|
ρ
|
σ
|
Nu
|
Xi
|
Omicron
|
Pi
|
Rho
|
Sigma
|
η
|
θ
|
ι
|
κ
|
λ
|
μ
|
Eta
|
Theta
|
Iota
|
Kappa
|
Lambada
|
Mu
|
τ
|
υ
|
φ
|
χ
|
ψ
|
ω
|
Tau
|
Upsilon
|
Phi
|
Chi
|
Psi
|
Omega
|
posted @
2009-05-06 17:03 kylixlu 阅读(192) |
评论 (0) |
编辑 收藏
最近经常发生Android的配置文件(像:AndroidManifest.xml)在ECLIPSE中读取出错的情况,报错情况如下:
Could not open the editor: The editor class could not be instantiated. This usually indicates a missing no-arg constructor or that
the editor's class name was mistyped in plugin.xml.
这个问题可能是由于编辑器是用JDK1.5编译而造成的,而我使用的是JDK1.6。
我把JDK设置成1.5后问题解决了(方法:Windows->Preferences->Java->Compiler->Compiler compliance level:1.5)。
如图所示:
posted @
2009-04-29 21:04 kylixlu 阅读(1280) |
评论 (0) |
编辑 收藏
http://www.blogjava.net/Files/kylixlu/NMEA0183.7z
posted @
2009-04-22 20:13 kylixlu 阅读(402) |
评论 (0) |
编辑 收藏
http://java.sun.com/blueprints/patterns/catalog.html
posted @
2009-04-15 20:33 kylixlu 阅读(124) |
评论 (0) |
编辑 收藏
1. 打开 Android的模拟器,%Android_HOME%\tools\emulator.exe
2. 打开一个COMMAND窗口,输入:adb shell 连接模拟器
3. 使用"cd"命令将当前目录调整成 ../data/com.android.providers.settings/databases (注意是'/')
4.我们使用'ls'命令可以看到有个settings.db数据文件
5.使用'sqlite3'连接这个数据文件
6.我们来查看一下数据库和库中的表单
7.用Insert语句往system表中插入proxy的设置(e.g:
Insert into system Values(_id,'http_proxy','IPAddress:port');)
8.我们可以用'Select * From system'来查看一下我们插入的配置,下图可以看到我们插入那个配置
9.删除这个配置(e.g:
Delete From system Where _id=1984)
我们可以再用'Select * from system',查看一下这个数据库,如下图可见,我们插入的配置已经删除了,不过我试了一下,好像要重启一下模拟器,才能使用新的配置,不知道是不是我机器的问题,没有仔细研究。
posted @
2009-03-12 15:30 kylixlu 阅读(1391) |
评论 (0) |
编辑 收藏
复习多线程,一个经典的实例:生产者消费者问题:
1.number表示产品编号,flag表示现在应该由谁来操作.
2.ProcuctData类中有两个同步方法setNumber()和getNumber(),分别代表生产者生产产品和消费者消费 产品。
3.两个线程类Producer和Consumer分别代表生产者与消费者
Java代码
- package cn.luxsoft.javafirststep.Thread;
-
- class ProductData {
-
-
- private int number;
-
-
- private boolean flag = true;
-
- public synchronized void setNumber(int number) {
- if (!flag) {
- try {
-
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- this.number = number;
-
-
- flag = false;
-
-
- notify();
- }
-
- public synchronized int getNumber() {
- if (flag) {
- try {
-
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
-
- flag = true;
-
-
- notify();
- return this.number;
- }
- }
-
- class Procucer extends Thread {
- private ProductData s;
-
- Procucer(ProductData s) {
- this.s = s;
- }
-
- @Override
- public void run() {
- for (int i = 0; i < 10; i++) {
- s.setNumber(i);
- System.out.println("P[" + i + "]生产.");
- }
- }
- }
-
- class Consumer extends Thread {
- private ProductData s;
-
- Consumer(ProductData s) {
- this.s = s;
- }
-
- public void run() {
- int i;
-
- do {
- i = s.getNumber();
- System.out.println("P[" + i + "]消费.**");
- } while (i != 9);
- }
- }
-
- public class ProducerConsumer {
-
-
-
-
-
- public static void main(String[] args) {
-
- ProductData s = new ProductData();
- Thread producer = new Procucer(s);
- Thread consumer = new Consumer(s);
-
- producer.start();
- consumer.start();
- }
-
- }
文章来源:
http://www.my1984.net/?action=show&id=177
posted @
2009-03-08 17:12 kylixlu 阅读(784) |
评论 (0) |
编辑 收藏
一个JAR包,可用RAR等解压文件解压缩后查看代码hfdp.jar
文章来源:
http://www.my1984.net/?action=show&id=176
posted @
2009-03-08 16:25 kylixlu 阅读(178) |
评论 (0) |
编辑 收藏
包括对bug的修复和在7.0M2和 6.6版本的加强。提供的支持包括:Eclipse 3.4.1/Ganymede、REST web服务、新的myeclipse操作板、spring工具集更新、集成Manven2、open JPA支持、高级javascript工具、专业的jsdt实现、报表工具加强、jsf和ICEfaces工具更。
The MyEclipse 7.0 production release includes enhancements and bug fixes for the MyEclipse environment over the previous 7.0 milestone and 6.6 production releases. Notably, this release includes support for the Eclipse 3.4.1/Ganymede platform, REST Web Services, a new MyEclipse dashboard, Spring tools update, integration with Maven 2 (m2e), Open JPA support, advances in JavaScript tooling, a professional implimentation of JSDT, enhancements to MyEclipse Reports tooling and updates to MyEclipse's extensive JSF and ICEfaces tooling.
windows集成版本下载地址: http://downloads.myeclipseide.com/downloads/products/eworkbench/7.0/myeclipse-7.0-win32.exe
文章来源:
http://www.my1984.net/?action=show&id=169
posted @
2009-03-01 15:17 kylixlu 阅读(113) |
评论 (0) |
编辑 收藏
/Files/kylixlu/intellij.idea.v8_keygen.rar
posted @
2009-02-08 12:22 kylixlu 阅读(120) |
评论 (0) |
编辑 收藏
1. JS代码:
JavaScript代码
- function SelectAll(chkbox)
- {
- var chkHeader=chkbox;
- state=chkHeader.checked;
- elem=chkHeader.form.elements;
- for(i=0;i<elem.length;i++)
- if(elem[i].type=="checkbox" && elem[i].id!=chkHeader.id)
- {
- if(elem[i].checked!=state)
- elem[i].click();
- }
- }
2.GridView代码:
XML/HTML代码
- <Columns>
- <asp:TemplateField>
- <HeaderTemplate>
- <input type="checkbox" id='chkHeader' onclick="SelectAll(this)" />
- </HeaderTemplate>
- <ItemTemplate>
- <asp:CheckBox ID="gvChkBox" runat="server" />
- </ItemTemplate>
- </asp:TemplateField>
3.后台获取CheckBox状态代码
C#代码
- bool chkBoxState = ((CheckBox)gr.FindControl("gvChkBox")).Checked;
说明: 1.JS实现了对CHECKBOX的全选(取消全选)功能
2.实现了GRIDVIEW的第一列显示为CHECKBOX
3.实现了对GRIDVIEW 中的gvChkBox控件的取值
文章来源:
http://www.my1984.net/?action=show&id=162
posted @
2008-12-22 14:41 kylixlu 阅读(228) |
评论 (0) |
编辑 收藏
这个做法没什么新意,就是就用一个Hidden,不过里面有些问题有搞了半天,听说细细说来。
还是先上代码(代码跟上一篇的差不多):
1.JS的代码
JavaScript代码
- function onClientClick()
- {
-
- var table=document.getElementById("<%=GridView1.ClientID %>");
- for(var i=1;i<table.rows.length;i++)
- {
- var AbsenseType=table.rows[i].cells[3].getElementsByTagName("select")[0].value;
- var AbsenseDay=table.rows[i].cells[3].getElementsByTagName("select")[1].value;
- var WotDay=table.rows[i].cells[4].getElementsByTagName("select")[0].value;
- if(AbsenseType!=12 && AbsenseDay == "请选择")
- {
- alert("第"+i+"行数据“未选缺勤时间”错误!");
- ra=1;
-
- }
- else if(AbsenseType==12 && AbsenseDay != "请选择")
- {
- alert("第"+i+"行数据“未缺勤,但选了缺勤时间”错误!");
- r=1;
- }
- else if(AbsenseDay=="" && WotDay=="")
- {
-
- }
-
- }
- document.getElementById("<%=Hidden1.ClientID %>").value=r;
- }
-
2.Hidden
XML/HTML代码
- <input id="Hidden1" type="hidden" runat="Server" value="" />
3.C#服务端
C#代码
- Response.Write("Hidden1.Value=" + Hidden1.Value + "</br>");
这个里面有一点我很搞不懂:网上很多同志都说在给Hidden赋值时要用下面这样的语句(而且都说成功了)
JavaScript代码
- document.getElementById("Hidden1").value=r;
一开始我也是这样的,但我用了ASP.net的BUTTON来触发的,死活取不到值。后来我用了HTML中的BUTTON进了测试,发现报了一个空对象的错误,我才发现,这种方法根本无法取到Hidden控件的值,为什么,因为这个Hidden 控件是runat="Server"的,即为一个服务端的控件,我把runat="Server"鼓起去掉后,即:
XML/HTML代码
- <input id="Hidden1" type="hidden" value="" />
用:
JavaScript代码
- document.getElementById("Hidden1").value=r;
就可以正常取到值。
后来想来想去,我用了
JavaScript代码
- document.getElementById("<%=Hidden1.ClientID %>").value=r;
这样对于服务端的控件就可以正确取到值拉。同理:要取一个JS的返回值也是一样的做法了:)
文章来源:
http://www.my1984.net/?action=show&id=160
posted @
2008-12-18 22:32 kylixlu 阅读(1265) |
评论 (0) |
编辑 收藏
今天实现了两个效果,一个是用JS来遍历GRIDVIEW中的DROPDOWNLIST控件,一个是从C#服务端来读取JS中的变量(当然返回值的原理也一样)。下面先介紹一下用JS来遍历GRIDVIEW中控件的效果。
不说废话,先上代码:
JavaScript代码
- function onClientClick()
- {
-
- var table=document.getElementById("<%=GridView1.ClientID %>");
- for(var i=1;i<table.rows.length;i++)
- {
- var AbsenseType=table.rows[i].cells[3].getElementsByTagName("select")[0].value;
- var AbsenseDay=table.rows[i].cells[3].getElementsByTagName("select")[1].value;
- var WotDay=table.rows[i].cells[4].getElementsByTagName("select")[0].value;
- if(AbsenseType!=12 && AbsenseDay == "请选择")
- {
- alert("第"+i+"行数据“未选缺勤时间”错误!");
- ra=1;
-
- }
- else if(AbsenseType==12 && AbsenseDay != "请选择")
- {
- alert("第"+i+"行数据“未缺勤,但选了缺勤时间”错误!");
- r=1;
- }
- }
- }
-
这里有几点要注意的:
1.
JavaScript代码
- var table=document.getElementById("<%=GridView1.ClientID %>");
getElementById里面一定是
"<%=GridView1.ClientID %>",GridView1是我的GridView的ID,如下所示:
ASP/Visual Basic代码
- <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
- BackColor="White" AllowPaging="True" PageSize="50"
- BorderColor="#DEDFDE" BorderStyle="None" BorderWidth="1px" CellPadding="3" ForeColor="Black"
- PagerSettings-Position="TopAndBottom" Width="100%" GridLines="Vertical">
2.
JavaScript代码
- var AbsenseType=table.rows[i].cells[3].getElementsByTagName("select")[0].value;
rows[i]是指GridView的行,Cells[i]是指GridView的单元格,getElementsByTagName("select")[0]表示取得
这个单元格中第一个dropdownlist控件(因为在前台用浏览器查看源代码,我们发现Asp.net的dropdownlist就是HTML里的select),所以getElementsByTagName里应该是“select”。
差不多就是这样了,OK,结束,嘿嘿。
文章来源:
http://www.my1984.net/?action=show&id=159
posted @
2008-12-18 22:16 kylixlu 阅读(1310) |
评论 (0) |
编辑 收藏
■“文本框”用於顯示單個實例資料。文本框可以放在報表上的任何位置,可以包含標籤、欄位或計算資料。您可以使用運算式來定義文字方塊中的資料。
■“表”是用於創建表格格式報表或向報表添加表結構的資料區域。
■“矩陣”是將資料排列成在特定資料點相交的列和行的資料區域。矩陣的功能與交叉表和透視表類似。與包括一組靜態列的表不同的是,矩陣的列可以是動態的。可以定義包含靜態列、靜態行、動態列和動態行的矩陣。
■“圖像”用於在報表中顯示二進位圖像資料。可以使用 .bmp、.jpeg、.gif 和 .png 格式的外部圖像、嵌入圖像或資料庫圖像。
■“子報表”用於將一個報表嵌入到另一個報表。子報表可以是獨立運行的完整報表,也可以是嵌入到主報表中才表現最佳的報表。定義子報表時,還可以定義用於篩選子報表資料的參數。
■“清單”是用於顯示單個欄位的重複行資料或包含其他報表項的資料區域。
■“矩形”用作圖形元素或作為其他報表項的容器。如果在矩形內放入報表項,則可以隨矩形一起移動這些報表項。
■“線條”是可放在頁面上任何位置的圖形元素。線條沒有與其關聯的資料。
文章来源:
http://www.my1984.net/?action=show&id=158
posted @
2008-12-03 09:51 kylixlu 阅读(457) |
评论 (0) |
编辑 收藏
1、DateTime 数字型
System.DateTime currentTime=new System.DateTime();
1.1 取当前年月日时分秒
currentTime=System.DateTime.Now;
1.2 取当前年
int 年=currentTime.Year;
1.3 取当前月
int 月=currentTime.Month;
1.4 取当前日
int 日=currentTime.Day;
1.5 取当前时
int 时=currentTime.Hour;
1.6 取当前分
int 分=currentTime.Minute;
1.7 取当前秒
int 秒=currentTime.Second;
1.8 取当前毫秒
int 毫秒=currentTime.Millisecond;
(变量可用中文)
1.9 取中文日期显示——年月日时分
string strY=currentTime.ToString("f"); //不显示秒
1.10 取中文日期显示_年月
string strYM=currentTime.ToString("y");
1.11 取中文日期显示_月日
string strMD=currentTime.ToString("m");
1.12 取当前年月日,格式为:2003-9-23
string strYMD=currentTime.ToString("d");
1.13 取当前时分,格式为:14:24
string strT=currentTime.ToString("t");
更多介绍:
在使用Asp.net的过程中,我们经常需要对时间日期进行转换,达到不同的显示效果。默认格式为:2006-6-6 14:33:34 ,如果要换成成200606,06-2006,2006-6-6或更多的格式该怎么办呢?
这里将要用到:DateTime.ToString的方法(String, IFormatProvider)
示例:
using System;
using System.Globalization;
String format="D";
DateTime date=DataTime.Now;
Response.Write(date.ToString(format, DateTimeFormatInfo.InvariantInfo));
结果输出
Thursday, June 16, 2006
在这里列出了参数format格式详细用法
=======================
格式字符 关联属性/说明
d ShortDatePattern
D LongDatePattern
f 完整日期和时间(长日期和短时间)
F FullDateTimePattern(长日期和长时间)
g 常规(短日期和短时间)
G 常规(短日期和长时间)
m、M MonthDayPattern
r、R RFC1123Pattern
s 使用当地时间的 SortableDateTimePattern(基于 ISO 8601)
t ShortTimePattern
T LongTimePattern
u UniversalSortableDateTimePattern 用于显示通用时间的格式
U 使用通用时间的完整日期和时间(长日期和长时间)
y、Y YearMonthPattern
下表列出了可被合并以构造自定义模式的模式
========================================
这些模式是区分大小写的;例如,识别“MM”,但不识别“mm”。如果自定义模式包含空白字符或用单引号括起来的字符,则输出字符串页也将包含这些字符。未定义为格式模式的一部分或未定义为格式字符的字符按其原义复制。
格式模式 说明 :
d 月中的某一天。一位数的日期没有前导零。
dd 月中的某一天。一位数的日期有一个前导零。
ddd 周中某天的缩写名称,在 AbbreviatedDayNames 中定义。
dddd 周中某天的完整名称,在 DayNames 中定义。
M 月份数字。一位数的月份没有前导零。
MM 月份数字。一位数的月份有一个前导零。
MMM 月份的缩写名称,在 AbbreviatedMonthNames 中定义。
MMMM 月份的完整名称,在 MonthNames 中定义。
y 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。
yy 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示具有前导零的年份。
yyyy 包括纪元的四位数的年份。
gg 时期或纪元。如果要设置格式的日期不具有关联的时期或纪元字符串,则忽略该模式。
h 12 小时制的小时。一位数的小时数没有前导零。
hh 12 小时制的小时。一位数的小时数有前导零。
H 24 小时制的小时。一位数的小时数没有前导零。
HH 24 小时制的小时。一位数的小时数有前导零。
m 分钟。一位数的分钟数没有前导零。
mm 分钟。一位数的分钟数有一个前导零。
s 秒。一位数的秒数没有前导零。
ss 秒。一位数的秒数有一个前导零。
f 秒的小数精度为一位。其余数字被截断。
ff 秒的小数精度为两位。其余数字被截断。
fff 秒的小数精度为三位。其余数字被截断。
ffff 秒的小数精度为四位。其余数字被截断。
fffff 秒的小数精度为五位。其余数字被截断。
ffffff 秒的小数精度为六位。其余数字被截断。
fffffff 秒的小数精度为七位。其余数字被截断。
t 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项的第一个字符(如果存在)。
tt 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项(如果存在)。
z 时区偏移量(“+”或“-”后面仅跟小时)。一位数的小时数没有前导零。例如,太平洋标准时间是“-8”。
zz 时区偏移量(“+”或“-”后面仅跟小时)。一位数的小时数有前导零。例如,太平洋标准时间是“-08”。
zzz 完整时区偏移量(“+”或“-”后面跟有小时和分钟)。一位数的小时数和分钟数有前导零。例如,太平洋标准时间是“-08:00”。
: 在 TimeSeparator 中定义的默认时间分隔符。
/ 在 DateSeparator 中定义的默认日期分隔符。
% c 其中 c 是格式模式(如果单独使用)。如果格式模式与原义字符或其他格式模式合并,则可以省略“%”字符。
\ c 其中 c 是任意字符。照原义显示字符。若要显示反斜杠字符,请使用“\\”。
只有上面第二个表中列出的格式模式才能用于创建自定义模式;在第一个表中列出的标准格式字符不能用于创建自定义模式。自定义模式的长度至少为两个字符;例如,
DateTime.ToString( "d") 返回 DateTime 值;“d”是标准短日期模式。
DateTime.ToString( "%d") 返回月中的某天;“%d”是自定义模式。
DateTime.ToString( "d ") 返回后面跟有一个空白字符的月中的某天;“d”是自定义模式。
比较方便的是,上面的参数可以随意组合,并且不会出错,多试试,肯定会找到你要的时间格式
如要得到2005年06月 这样格式的时间
可以这样写:
date.ToString("yyyy年MM月", DateTimeFormatInfo.InvariantInfo)
如此类推.
下面列出一些Asp.net中具体的日期格式化用法:
============================================
1.绑定时格式化日期方法:
<ASP:BOUNDCOLUMN DATAFIELD= "JoinTime " DATAFORMATSTRING= "{0:yyyy-MM-dd} " >
<ITEMSTYLE WIDTH= "18% " > </ITEMSTYLE >
</ASP:BOUNDCOLUMN >
2.数据控件如DataGrid/DataList等的件格式化日期方法:
e.Item.Cell[0].Text = Convert.ToDateTime(e.Item.Cell[0].Text).ToShortDateString();
3.用String类转换日期显示格式:
String.Format( "yyyy-MM-dd ",yourDateTime);
4.用Convert方法转换日期显示格式:
Convert.ToDateTime("2005-8-23").ToString
("yyMMdd",System.Globalization.DateTimeFormatInfo.InvariantInfo); //支持繁体数据库
5.直接用ToString方法转换日期显示格式:
DateTime.Now.ToString("yyyyMMddhhmmss");
DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss")
6.只显示年月
DataBinder.Eval(Container.DataItem,"starttime","{0:yyyy-M}")
7.显示时间所有部分,包括:年月日时分秒
<asp:BoundColumn DataField="收款时间" HeaderText="收款时间"
DataFormatString="{0:yyyy-MM-dd HH24:mm:ss}">
</asp:BoundColumn>
[ASP.NET] 如何在GridView中使用DataFromatString
在我们从业务逻辑层获得数据实体时候,接下来的事情就是要绑定到控件中。数据实体中的一些字段可以直接绑定到界面中,但是有一些字段需要重新格 式化格式。比如货币单位字段,需要显示货币符号和每隔三位显示分隔符;再比如日期字段,数据库中存放的是日期和时间,但是在界面上需要按照XXXX年XX 月XX日的格式显示。这时候我们就用到了DataFormatString属性。
<asp:GridView ID="grvResult" runat="server" AutoGenerateColumns="False" Width="100%">
<Columns>
<asp:BoundField HeaderText="预定日期" DataField="OperationDate" DataFormatString="{0:yyyy-MM-dd}" HtmlEncode="False">
</asp:BoundField>
<asp:BoundField HeaderText="订单总计" DataField="TotalRate" DataFormatString="{0:C}" HtmlEncode="False">
</asp:BoundField>
</Columns>
</asp:GridView>
例如上面的代码展示了日期和货币两种绑定方式。DataFormatString中的{0}是固定的格式,这和 String.Fromat(“{0}”, someString)中的{0}是一个用法,表示绑定上下文的参数索引编号。然后,在后面加入格式化字符串,具体的使用方法可以参考MSDN。
这里需要注意以下几点
1. 在GridView中的asp:BoundField使用DataFormatString必须设置属性HtmlEncode="False",否则不起作用。
2. 如果需要使用日期类型的格式化字符串,必须数据实体中对应的字段也应该日起类型的。
3. 格式化字符串C代表货币单位,需要绑定的数据类型应该是数字类型的。如果是字符串类型的不起作用,需要手动添加格式化字符串为DataFormatString="¥{0:C}"。
文章来源:
http://www.my1984.net/?action=show&id=150
posted @
2008-11-05 23:34 kylixlu 阅读(975) |
评论 (0) |
编辑 收藏
原文地址:http://www.cnblogs.com/catxp/archive/2006/10/20/534408.html
//大家在做报表或查询的时候都会有给用户预设一些可选的日期范围(如上图)
//如本年度销售额、本季度利润、本月新增客户
//C#里内置的DateTime基本上都可以实现这些功能,巧用DateTime会使你处理这些事来变轻松多了
//今天
DateTime.Now.Date.ToShortDateString();
//昨天,就是今天的日期减一
DateTime.Now.AddDays(-1).ToShortDateString();
//明天,同理,加一
DateTime.Now.AddDays(1).ToShortDateString();
//本周(要知道本周的第一天就得先知道今天是星期几,从而得知本周的第一天就是几天前的那一天,要注意的是这里的每一周是从周日始至周六止
DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOfWeek)))).ToShortDateString();
DateTime.Now.AddDays(Convert.ToDouble((6 - Convert.ToInt16(DateTime.Now.DayOfWeek)))).ToShortDateString();
//如果你还不明白,再看一下中文显示星期几的方法就应该懂了
//由于DayOfWeek返回的是数字的星期几,我们要把它转换成汉字方便我们阅读,有些人可能会用switch来一个一个地对照,其实不用那么麻烦的
string[] Day = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
Day[Convert.ToInt16(DateTime.Now.DayOfWeek)];
//上周,同理,一个周是7天,上周就是本周再减去7天,下周也是一样
DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOfWeek))) - 7).ToShortDateString();
DateTime.Now.AddDays(Convert.ToDouble((6 - Convert.ToInt16(DateTime.Now.DayOfWeek))) - 7).ToShortDateString();
//下周
DateTime.Now.AddDays(Convert.ToDouble((0 - Convert.ToInt16(DateTime.Now.DayOfWeek))) + 7).ToShortDateString();
DateTime.Now.AddDays(Convert.ToDouble((6 - Convert.ToInt16(DateTime.Now.DayOfWeek))) + 7).ToShortDateString();
//本月,很多人都会说本月的第一天嘛肯定是1号,最后一天就是下个月一号再减一天。当然这是对的
//一般的写法
DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + "1"; //第一天
DateTime.Parse(DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + "1").AddMonths(1).AddDays(-1).ToShortDateString();//最后一天
//巧用C#里ToString的字符格式化更简便
DateTime.Now.ToString("yyyy-MM-01");
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).AddDays(-1).ToShortDateString();
//上个月,减去一个月份
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(-1).ToShortDateString();
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();
//下个月,加去一个月份
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(1).ToShortDateString();
DateTime.Parse(DateTime.Now.ToString("yyyy-MM-01")).AddMonths(2).AddDays(-1).ToShortDateString();
//7天后
DateTime.Now.Date.ToShortDateString();
DateTime.Now.AddDays(7).ToShortDateString();
//7天前
DateTime.Now.AddDays(-7).ToShortDateString();
DateTime.Now.Date.ToShortDateString();
//本年度,用ToString的字符格式化我们也很容易地算出本年度的第一天和最后一天
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).ToShortDateString();
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).AddDays(-1).ToShortDateString();
//上年度,不用再解释了吧
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(-1).ToShortDateString();
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddDays(-1).ToShortDateString();
//下年度
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(1).ToShortDateString();
DateTime.Parse(DateTime.Now.ToString("yyyy-01-01")).AddYears(2).AddDays(-1).ToShortDateString();
//本季度,很多人都会觉得这里难点,需要写个长长的过程来判断。其实不用的,我们都知道一年四个季度,一个季度三个月
//首先我们先把日期推到本季度第一个月,然后这个月的第一天就是本季度的第一天了
DateTime.Now.AddMonths(0 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01");
//同理,本季度的最后一天就是下季度的第一天减一
DateTime.Parse(DateTime.Now.AddMonths(3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();
//下季度,相信你们都知道了。。。。收工
DateTime.Now.AddMonths(3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01");
DateTime.Parse(DateTime.Now.AddMonths(6 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();
//上季度
DateTime.Now.AddMonths(-3 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01");
DateTime.Parse(DateTime.Now.AddMonths(0 - ((DateTime.Now.Month - 1) % 3)).ToString("yyyy-MM-01")).AddDays(-1).ToShortDateString();
文章来源:
http://www.my1984.net/?action=show&id=128
posted @
2008-09-16 20:59 kylixlu 阅读(173) |
评论 (0) |
编辑 收藏
摘要: C#代码
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
&n...
阅读全文
posted @
2008-07-22 23:57 kylixlu 阅读(2654) |
评论 (0) |
编辑 收藏
C#代码
- if ((GridView1.Rows[i].RowState & DataControlRowState.Edit) == DataControlRowState.Edit) {
- //GridView为编辑状态的操作
- } else {
- //GridView为正常状态的操作
- }
GridView1.Rows[i]只是表示取得当前行,若在GRIDVIEW的相关的事件中取得当前行方法可以为:e.Row.RowState
文章来源:
http://www.my1984.net/?action=show&id=112
posted @
2008-07-22 16:06 kylixlu 阅读(159) |
评论 (0) |
编辑 收藏
刚刚在看C#学习笔记,发现一个arity的单词,好像以前接触过,我还以为是书印刷错的,经过放狗查询,找到如下解释:
arity 元数 arity 是一个合成词,源于如binary (arity=2)、tertiary (arity=3),等等中的后缀。
文章来源:
http://www.my1984.net/?action=show&id=105
posted @
2008-06-28 13:59 kylixlu 阅读(219) |
评论 (0) |
编辑 收藏
CodeSmith 4.1.2 专业版 破解下载地址
文章来源:
http://www.my1984.net/?action=show&id=96
posted @
2008-06-21 15:45 kylixlu 阅读(547) |
评论 (0) |
编辑 收藏
.NET设计模式,最近没时间看了,先记录一下,以后再看。
http://terrylee.cnblogs.com/archive/2006/06/01/334911.html
文章来源:
http://www.my1984.net/?action=show&id=81
posted @
2008-05-28 22:01 kylixlu 阅读(53) |
评论 (0) |
编辑 收藏
//比较DateTime类型
DateTime dt1=DateTime.Now;
DateTime dt2=Convert.ToDateTime ("2006-11-09 18:04:11");
if(dt1.CompareTo (dt2)< 0) //CompareTo:0-两者相等
Response.Write ("<script>alert(\"dt1<dt2\");</script>");
else
Response.Write ("<script>alert(\"dt1>dt2\");</script>");
//比较string
DateTime dt3=DateTime.Now ;
string strdt3=dt3.ToString ("yyyy-MM-dd HH:mm:ss");
string strdt4="2006-11-09 18:04:11";
//字符串比较时,主要把时间都转换成yyyy-MM-dd HH:mm:ss的格式
if (strdt3.CompareTo(strdt4)<0)//CompareTo:0-两者相等
Response.Write ("<script>alert(\"strdt3<strdt4\");</script>");
else
Response.Write ("<script>alert(\"strdt3>strdt4\");</script>");
文章来源:
http://www.my1984.net/?action=show&id=79
posted @
2008-05-27 10:31 kylixlu 阅读(2900) |
评论 (0) |
编辑 收藏
- 使用VS2005 工具--->导入导出设置--->重置所有设置;此种方法网上介绍甚多,但与我的环境却没有其作用;
- 关闭VS,然后在命令行运行microsoft visual studio 8\common7\ide\devenv.exe /setup /resetuserdata /resetsettings 打开VS2005,智能感知恢复正常。
文章来源:
http://www.my1984.net/?action=show&id=76
posted @
2008-05-25 23:19 kylixlu 阅读(383) |
评论 (0) |
编辑 收藏
下载:C#高级编程(第四版)
文章来源:
http://www.my1984.net/?action=show&id=72
posted @
2008-05-23 09:11 kylixlu 阅读(149) |
评论 (0) |
编辑 收藏
让GridView控件在绑定的数据源没有数据时也显示标题
阅读全文文章来源:
http://www.my1984.net/?action=show&id=71
posted @
2008-05-22 23:20 kylixlu 阅读(413) |
评论 (0) |
编辑 收藏
生成有4个随机数字和杂乱背景的图片,数字和背景颜色会改变,服务器端刷新(用history.go(-1)也会变)
原型参考ALIBABA http://china.alibaba.com/member/showimage
产生验证码图片的文件-----image.jsp
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
Color getRandColor(int fc,int bc){//给定范围获得随机颜色
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
// 在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
//生成随机类
Random random = new Random();
// 设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);
//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
// 取随机产生的认证码(4位数字)
String sRand="";
for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
// 将认证码显示到图象中
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16);
}
// 将认证码存入SESSION
session.setAttribute("rand",sRand);
// 图象生效
g.dispose();
// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
%>
---------------使用验证码图片的文件---------a.jsp------------------------------------
<%@ page contentType="text/html;charset=gb2312" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>认证码输入页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</head>
<body>
<form method=post action="check.jsp">
<table>
<tr>
<td align=left>系统产生的认证码:</td>
<td><img border=0 src="image.jsp"></td>
</tr>
<tr>
<td align=left>输入上面的认证码:</td>
<td><input type=text name=rand maxlength=4 value=""></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit value="提交检测"></td>
</tr>
</form>
</body>
</html>
-----------------验证的页面----------check.jsp
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
<title>认证码验证页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</head>
<body>
<%
String rand = (String)session.getAttribute("rand");
String input = request.getParameter("rand");
%>
系统产生的认证码为: <%= rand %><br>
您输入的认证码为: <%= input %><br>
<br>
<%
if (rand.equals(input)) {
%>
<font color=green>输入相同,认证成功!</font>
<%
} else {
%>
<font color=red>输入不同,认证失败!</font>
<%
}
%>
</body>
</html>
posted @
2008-04-24 23:50 kylixlu 阅读(183) |
评论 (0) |
编辑 收藏
点击下载
破解文件下载
posted @
2008-03-11 19:36 kylixlu 阅读(6547) |
评论 (31) |
编辑 收藏
function isDate(oStartDate){
var a=/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})/;
if (!a.test(oStartDate)){
return false
} else{
return true
}
}
posted @
2008-03-05 09:23 kylixlu 阅读(1246) |
评论 (0) |
编辑 收藏
网上COPY地,拿来用一下,哈
1<script language="javascript">
2
3//验证给定的日期是否合法 ,参数格式要求:yyyy-mm-dd 可以根据情况更改正则表达式
4function isDate(oStartDate)
5{
6 //对日期格式进行验证 要求为2000-2099年 格式为 yyyy-mm-dd 并且可以正常转换成正确的日期
7 var pat_hd=/^20\d{2}-((0[1-9]{1})|(1[0-2]{1}))-((0[1-9]{1})|([1-2]{1}[0-9]{1})|(3[0-1]{1}))$/;
8
9 try{
10 if(!pat_hd.test(oStartDate)){throw "日期非法!";}
11 var arr_hd=oStartDate.split("-");
12 var dateTmp;
13 dateTmp= new Date(arr_hd[0],parseFloat(arr_hd[1])-1,parseFloat(arr_hd[2]));
14 if(dateTmp.getFullYear()!=parseFloat(arr_hd[0]) || dateTmp.getMonth()!=parseFloat(arr_hd[1]) -1 || dateTmp.getDate()!=parseFloat(arr_hd[2]))
15 {
16 throw "日期非法!";
17 }
18 }
19 catch(ex)
20 {
21 if(ex.description)
22 {return false;}
23 else
24 {return false;}
25 }
26 return true;
27}
28
29//调用
30
31alert(isDate("2005-12-12"));
32alert(isDate("2004-13-30"));
33alert(isDate("2005-12-32"));
34alert(isDate("2005-02-30"));
35
36</script>
37
38
posted @
2008-02-28 20:06 kylixlu 阅读(253) |
评论 (0) |
编辑 收藏
昨天把公司机器关了,今天早上发现ORACLE启动不了,输入cmd->lsnrctl后,出现如下错误,
经查资料,发现是主机名可能解析有问题,后来在D:\oracle\ora92\network\admin下打开listener.ora文件后将HOST后的主机名 (ADDRESS = (PROTOCOL = TCP)(HOST = SUZSOFT-8CB5627)(PORT = 1521))
改成IP即可解决上面遇到问题 (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.7.115)(PORT = 1521))
posted @
2008-02-27 10:16 kylixlu 阅读(4163) |
评论 (3) |
编辑 收藏
很多人也许并不清楚,null event其实不是空事件,因为不是没有等待事件,而是Oracle忘记了刚才等待的事件的名字具体是什么了,但却保留了该事件的真实情况。Oracle的开发人员直到9.2.0.3才更新了这些事件的名称。
那是不是我们每当遇到性能问题的时候都要patch到9.2.0.3呢?
我们已经知道他的真实情况依然在v$session_wait的p1、p2、p3参数里体现,所以,我们可以根据这些参数,找出这个null event究竟是什么等待事件。
相关信息:
1. lck processes to pick up extra or missed 'posts' (messages)。
in all cases that can be identified the wait time is zero,
although on most ports this is changed to 1/100th second in
order to force the process to be rescheduled.
2. multiple db writers.
two cases:
- when the master has sent i/o requests to the slaves, it
waits on this event for up to 6 seconds until the slaves
signal that the i/o is complete.
- the slaves wait on this event for up to 3 seconds whilst
waiting for requests from the master db writer.
目前已经被证实的会涉及到null event
的等待事件还有有sql.net message to client、
db file scattered (or sequential) read
posted @
2008-02-15 01:03 kylixlu 阅读(185) |
评论 (0) |
编辑 收藏
与无压缩格式下存储数据相比,新的Oracle数据压缩技术能够确保以较小的开销节省三倍以上的磁盘存储空间。这一点比仅节省磁盘空间要具有更大的优势,因为它能够使企业节约更多的开支,以便有更多的资金来巩固自己的地位。
自动诊断知识库(Automatic Diagnostic Repository,ADR)是专门针对严重错误的知识库。该知识库基本上能够自动完成一些以往需要由数据库管理员来手动完成的操作。
作为ADR的一部分,SQL性能分析器(SQL Performance Analyzer,SPA)是最让人惊喜的特性之一。SQL性能分析器是一个整体调整工具,管理员可以通过该工具在数据库上定义和重演(replay) 一个典型的工作负载,之后管理员可以调节整体参数来使数据库尽快的达到最佳性能——而这一任务同样也是许多年以来由数据库管理员手动完成的。
由于获得了最优的初始参数,数据库管理员就不需要调整数以万计的SQL语句。管理员需要做的就是给定一个典型的负载 ,由SAP根据历史记录来决定SQL的最终设置,而不用管理员来检测哪一个SQL设置是最合理的。
多年以来,甲骨文公司一直在努力完成地另一个新特性便是“联机更新”(在不down机的情况下更新软件)。实际上,很难从软件工程的角度来设计一个运行时能自动升级的软件。由于真正的应用集群(Real Application Clusters ,RAC)特性,甲骨文公司再一次对其他的数据库供应商造成了更大的压力。在实际的使用过程中,数据库产品的用户总是希望产品有持续的高可用性,这并不是说只需满足下次补丁更新之前的3年的时间就够了。
自动内存管理特性可以追根溯源至Oracle 9i,那时甲骨文公司推出首款自动调节存储池的工具。AMM工具其实就是一种探测机制。实际上,Oracle 11g 有很多随机访问存储池,当AMM探测到某个存储池中已满时,它将整个RAM从一个区域分配到其他相对合适的区域。
posted @
2008-02-15 01:01 kylixlu 阅读(197) |
评论 (0) |
编辑 收藏
当你想用Java写一Facebook的应用?你把在facebook的帐号中加入的程序开发模块,下载了相关的java类库。忽然你发现不得不停下来:开发相关的入门介绍,样例代码和文档说明在哪儿?这样的挫败感令人愤怒,而最终导致你不得不放弃。
但愿有人会尽快写一个不错的应用Java 开发facebook应用的入门指南。也许只需要你给我些好吃的巧克力,我们可以写些相关的介绍文档,老实说我们的确也解决了不少相关的问题。这里有一些技巧帮助你使用java开始建立自己的 facebook应用。 这并不是一个完整的入门指南,但他可以帮你在着手做时少走些弯路。
八个注意事项辅助你构建Java/facebook应用
1.为了你的幸福和健康,建议你使用5.0或更高的JDK开发包。
2.不用看facebook java开发包中的列子,因为那些例子是针对java桌面应用程序的。而通常你是需要写一个web应用,这两种应用的区别还是很大的。 一开始,你需要一个web应用服务容器,你可以能会选择tomcat,但我不会,这里面有另一个故事,我会找个合适的时间再告诉你。Facebook的网络应用有一个不常见的调用模式。大多数你的页面会被facebook调用。用户请求一个facebook的页面,页面中的主要内容会从你的服务器中返回给用户。你体统的内容会融合到facebook的页面里返回给用户。大多数情况下这些流程不需要你的干预就能很好的执行。但需要注意的是你服务器端产生的页面中的javascript是不能执行的,这就意味着普通的ajax不再在facebook中应用。如果你需要使用AJAX的技术实现facebook 提供的 mock-ajax不能完成的功能,则需要通过facebook的页面跳到你服务配器上的一般页面。
3.配置你在facebook上的应用程序
不要忘了填写facebook应用的配置文件,你应该设置: 应用程序的回调网址。
应用程序的名字- 这个名字用来表示标识在facebook的页面。(这些页面可以是用iframe嵌入到facebook的导航页,也可以是用FBML标记的页面)。一但设定,比如http://apps.facebook.com/yourappname/yourpagename 这个页面就会从facebok产生一个请求到你的服务器 .对于新用户来说,这就是一个你的应用程序的欢迎页面,邀请用户来使用传播你的这个应用。
4.用facebookrestclient
最重要的阶级,在客户端类库中最重要的类是facebookrestclient.这个类中包含一系列调用facebook服务端的方法,并涵盖了大部分你需要的功能。可惜facebookrestclient是不是个架构清晰的类。几乎所有的请求,需要一个facebookrestclient 这是建造一个会话密钥 .用户登陆后可以从CGI变量中获得会话的密钥。(参考 FacebookParam.SESSION_KEY.toString())没有登陆的用户需要引导到一个登陆页面。 试试以下方法:
// 创建一个无会话状态的FacebookRestClient
FacebookRestClient client = new FacebookRestClient ( 你的api密钥 , 你的加密密钥 ) ;
String token = client.authcreateToken () ;
String loginURL = “http : //www.facebook.com/login.php?v=1.0&apikey=&”+ YOUR APIKEY +“&auth_token =”+ token ;
// 这里转向到登陆页面
// 登陆后就会返回会话key
FacebookRestClient.auth_getSession() 以我的经验基本没用。他的作用是把一个无会话的client变成一个有会话的。我发现从CGI变量中获取会话要比试用这个方法简单。
当有一个会话key的FacebookRestClient,你可以调用这个类提供的各种facebook编辑方法。这些方法可以很方便与facebook进行交换操作。但不幸的事这些方法返回的是未经处理的XML文档,这些文档后续的处理会比较麻烦。
比如 friends_get()返回的是
<document>
<friendsgetresponse>
<uid>1</uid>
<uid>2</uid>
<uid>3</uid>
</friendsgetresponse>
</document>
你也许想封装一些提取信息的方法,例如调用friends_get(),试试这个
Document d = client . friends_get () ;
NodeList userIDNodes = d . getElementsByTagName ( " uid " ) ;
int fcount = ids . getLength () ;
List < Integer > friends = new ArrayList < Integer > () ;
for ( int i = 0 ; i < fcount ; i ++ )
{ Node node = userIDNodes . item ( i ) ;
String idText = node . getTextContent () ;
Integer id = Integer . valueOf ( idText ) ;
friends . add ( id ) ; }
这样friends的列表里就填充好了用户的id.
5.servlet返回局部页面
当你生产在facebook中的页面时,比如这样的一个地址http://apps.facebook.com/yourappname/yourpagename,你必须返回的一个HTML或FBML标记的页面片段,而不是一个完全的HTML页面。
6.学习FBML .
FBML这是一套特有的facebook标签。试用标签可以让你很方便的完成很多功能(比如显示用户的名称和图片)。
7.用户邀请好友
你想完成病毒式推广的邀请好友?facebook最近修改了他的api(2007.11)。新版本主要改进了一个特殊的form,fb:form.
原来完成这功能的方法FacebookRestClient.notifications_sendRequest()已经不再使用了,如果你不慎调用将会得到一个异常。
8.用户档案信息显示页面
要想将一些信息放入用户的档案信息页面,使用FacebookRestClient.profile_setFBML()。这个方法复写了你在应用里设定的默认信息页面。当你设定了用户的个人档案的FBML页面,这些页面被流量时,facebook会缓存这些页面信息而不会即时更新。这样就使得用户信息的动态更新会麻烦一些。当一个事件触发用户信息改变时,你需要重新调用profile_setFBML()更新这些信息。幸运的时既然你已经有一个登陆的客户端可以做任何事情,所以这个客户端也可以任意设置你的用户资料的数据项。
posted @
2008-02-15 01:00 kylixlu 阅读(459) |
评论 (0) |
编辑 收藏
Bean是Enterprise Java Bean的缩写,一个Bean扮演着应用程序素材的角色。她包含有一个functional interface,一个life-cycle interface,以及一个实做它所支援的商业方法的类别。
Bean Instance(Bean实例)
一个Bean Instance是Bean位于一个容器中的instantiation,如果把bean比作class,那么Bean Instance就是Java Object。
Bean-managed persistence(Bean自己所管理的永续性)
这个术语是用来描述Enterprise Java Bean如何来存储它们的state到数据库或者是其他的存储机制。容器将促使Bean呼叫Bean的EjbLoad()和EjbSave()方法。
Container(容器)
一个Bean的容器会实做bean的home
interfaces与remote interfaces。它应该提供一组公用程序类别以便能够隐藏bean
instances,介入方法调用,维持交易完整性与bean
instances池的一般管理。虽然Ejb规则中规定一个容器必须管理超过一种以上的bean,不过通常每个容器只有一个bean。
Container-managed demarcation
对于一个enterprise bean,不论何时,当其中的一个商业方法被呼叫,容器便自动启动一项新的交易。商业方法完成后,交易就结束了。容器启动交易的形式由bean的交易属性来决定,或者,由商业方法本身来决定(如果有指明的话)。
Container-managed persistence(委托容器管理的永续性)
Bean开发者可以委托容器来负责记录Bean的最新状态。Bean的状态必须由
Bean中的许多public Fields得到。容器可以确保这些public fields在任何bean的方法被唤醒之前为正确的。public
fields必须在deployment descriptor中定义,然后才产生container classes。
Entity beans
Entity beans 代表可以辨认的永续物件。典型的实例就是:它可以代表关系数据库中个别的rows。当然,也可以是档案系统中的档案,或者是任何其他独一无二的可辨识资料。
Home
每一个Enterprise
Bean,不论是Session或者是Entity bean,都有一个interface来让客户端能够建立与移除一个bean
instance。以Entity为例,home interface 提供一些方法以允许客户端对于一个bean
instance来作定位用。这个interface遵循Java RMI interface的规定。每个home
interface都继承自一个远端界面,即EJBHome。
Remote
一个bean的remote interface 描述对于一个bean
instance中可供客户端呼叫的方法集合。这个interface 遵循Java RMI interface的规定。每个remote
interface都继承自一个远端界面,即EJBObject。
Session beans
Session beans为 particular client所建立。如果经过一段被称为timeout的指定空闲时间之后,就不再存在。
Session synchronization
Session beans 可选择性地实做Session
Synchronization interface。这样可以允许Session beans在交易将完成之前与完成之后被通知。session
bean可以使用beforeCompletion()方法来否决交易的成功完成,并且能够使用afterCompletion()来判断交易成功与否。
Transaction Attribute (交易属性)
一项transaction
attribute可以用在bean与其特殊的商业方法上。其可能的值有六种,分别是TX_NOT_SUPPORTED,TX_REQUIRED,
TX_SUPPORTS,TX_REQUIRES_NEW,TX_MANDATORY,TX_BEAN_MANAGED。
posted @
2008-02-05 19:09 kylixlu 阅读(219) |
评论 (0) |
编辑 收藏
Hibernate一共包括了23个jar包,令人眼花缭乱。本文将详细讲解Hibernate每个jar包的作用,便于你在应用中根据自己的需要进行取舍。
下载Hibernate,例如2.0.3稳定版本,解压缩,可以看到一个hibernate2.jar和lib目录下有22个jar包:
hibernate2.jar:
Hibernate的库,没有什么可说的,必须使用的jar包
cglib-asm.jar:
CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库,必须使用的jar包
dom4j.jar:
dom4j是一个Java的XML
API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML
API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM
developerWorks上面可以找到一篇文章,对主流的Java XML
API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j,直到现在。如今你可以看到越
来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包,
Hibernate用它来读写配置文件。
odmg.jar:
ODMG是一个ORM的规范,Hibernate实现了ODMG规范,这是一个核心的库,必须使用的jar包。
commons-collections.jar:
Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包。
commons-beanutils.jar:
Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。
commons-lang.jar:
Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。
commons-logging.jar:
Apache
Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本身包含了一个Simple
Logger,但是功能很弱。在运行的时候它会先在CLASSPATH找log4j,如果有,就使用log4j,如果没有,就找JDK1.4带的
java.util.logging,如果也找不到就用Simple
Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾,当初Apache极力游说Sun把log4j加入JDK1.4,
然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了,因此拒绝了Apache的要求,使用自己的java.util.logging,这个包
的功能比log4j差的很远,性能也一般。后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用
commons-logging.jar写的log程序,底层的Logger是可以切换的,你可以选择log4j,java.util.logging或
者它自带的Simple
Logger。不过我仍然强烈建议使用log4j,因为log4j性能很高,log输出信息时间几乎等于System.out,而处理一条log平均只需
要5us。你可以在Hibernate的src目录下找到Hibernate已经为你准备好了的log4j的配置文件,你只需要到Apache
网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。
使用Hibernate必须的jar包就是以上的这几个,剩下的都是可选的。
ant.jar:
Ant编译工具的jar包,用来编译Hibernate源代码的。如果你不准备修改和编译Hibernate源代码,那么就没有什么用,可选的jar包
optional.jar:
Ant的一个辅助包。
c3p0.jar:
C3PO是一个数据库连接池,Hibernate可以配置为使用C3PO连接池。如果你准备用这个连接池,就需要这个jar包。
proxool.jar:
也是一个连接池,同上。
commons-pool.jar, commons-dbcp.jar:
DBCP数据库连接池,Apache的Jakarta组织开发的,Tomcat4的连接池也是DBCP。
实际上Hibernate自己也实现了一个非常非常简单的数据库连接池,加上上面
3个,你实际上可以在Hibernate上选择4种不同的数据库连接池,选择哪一个看个人的偏好,不过DBCP可能更通用一些。另外强调一点,如果在
EJB中使用Hibernate,一定要用App Server的连接池,不要用以上4种连接池,否则容器管理事务不起作用。
connector.jar:
JCA 规范,如果你在App Server上把Hibernate配置为Connector的话,就需要这个jar。不过实际上一般App Server肯定会带上这个包,所以实际上是多余的包。
jaas.jar:
JAAS是用来进行权限验证的,已经包含在JDK1.4里面了。所以实际上是多余的包。
jcs.jar:
如果你准备在Hibernate中使用JCS的话,那么必须包括它,否则就不用。
JDBC2_0-stdext.jar:
JDBC2.0的扩展包,一般来说数据库连接池会用上它。不过App Server都会带上,所以也是多余的。
jta.jar:
JTA规范,当Hibernate使用JTA的时候需要,不过App Server都会带上,所以也是多余的。
junit.jar:
Junit包,当你运行Hibernate自带的测试代码的时候需要,否则就不用。
xalan.jar, xerces.jar, xml-apis.jar:
Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是
JAXP。一般App
Server都会带上,JDK1.4也包含了解析器,不过不是Xerces,是Crimson,效率比较差,不过Hibernate用XML只不过是读取
配置文件,性能没什么紧要的,所以也是多余的。
posted @
2008-02-05 18:57 kylixlu 阅读(189) |
评论 (0) |
编辑 收藏
解决JAVA加密出口限制
jce_policy-1_5_0 download
posted @
2008-01-28 14:36 kylixlu 阅读(798) |
评论 (1) |
编辑 收藏
以前也有過個問題,忘記怎麼弄了,GOOGLE一把,找到了答案,為了防止忘記,記錄一下,嘻嘻
需要新建一个 jaxp.properties, 内容如下:
javax.xml.parsers.SAXParserFactory: org.apache.xerces.jaxp.SAXParserFactoryImpl
保存文件到$JAVA_HOME/jre/lib/下面
接下来可能会出现下面的错误信息:
javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.SAX
ParserFactoryImpl could not be instantiated: java.lang.NullPointerException
因此还需要把xercesImpl.jar复制到D:\jdk1.5.0_01\jre\lib\endorsed下面(没有这个目录就创建这个目录)
重新启动resin,我的webapp启动成功了。
访问 http://lizongbo.myresintest.com/mywebapp/,页面正常出现。
b.另外一种更简单的解决方法,不需要修改jdk的配置
((此方法没有测试过,请参考http://www-900.ibm.com/developerWorks/cn/webservices/ws-axisfaq/index.shtml和http://www.caucho.com/quercus/faq/question.xtp?question_id=295)):
<host id="lizongbo.myresintest.com" root-directory=".">
<web-app id='/' document-directory="webapps/ROOT"/>
<web-app id='/lizongbo' document-directory="E:/jb/oscachedemo/test">
<system-property javax.xml.transform.TransformerFactory="org.apache.xalan.processor.TransformerFactoryImpl"/>
<system-property javax.xml.parsers.DocumentBuilderFactory="org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"/>
<system-property javax.xml.parsers.SAXParserFactory="org.apache.xerces.jaxp.SAXParserFactoryImpl"/>
<system-property org.xml.sax.driver="org.apache.xerces.parsers.SAXParser"/>
</web-app>
</host>
posted @
2008-01-28 12:49 kylixlu 阅读(971) |
评论 (0) |
编辑 收藏
最近要做这方面的工作,收集点资料,理解一下
何谓数字证书?
数字证书是一个经证书认证中心(CA)数字签名的包含公开密钥拥有者信息以及公开密钥的数据文件。认证中心的数字签名可以确保证书信息的真实性,用户公钥信息可以保证数字信息传输的完整性,用户的数字签名可以保证数字信息的不可否认性。
数字证书是各类终端实体和最终用户在网上进行信息交流及商务活动的身份证明,在电子交易的各个环节,交易的各方都需验证对方数字证书的有效性,从而解决相互间的信任问题。
认证中心(CA)作为权威的、可信赖的、公正的第三方机构,专门负责为各种认证需求提供数字证书服务。认证中心颁发的数字证书均遵循X.509 V3标准。X.509标准在编排公共密钥密码格式方面已被广为接受。
数字证书的功能主要包括:身份验证、信息传输安全、信息保密性(存储与交易)、信息完整性、交易的不可否认性。
数字安全证书的工作流程
如果客户A想和银行B通信,他首先必须从数据库中取得银行B的证书,然后对它进行验证。如果他们使用相同的CA(证书认证中心),事情就很简单,客户A只需验证银行B证书上CA的签名。如果他们使用不同的CA,问题就较为复杂。客户A必须从CA的树形结构底部开始,从底层CA往上层CA查询,一直追踪到同一个CA为止,找出共同的信任CA。目前个人获取网上银行安全证书的途径都是通过银行申请,所以双方肯定采用同一证书认证中心颁发的证书。
现在假设客户A向银行B传送数字信息,为了保证信息传送的真实性、完整性和不可否认性,需要对要传送的信息进行数字加密和数字签名,其传送过程如下:
(1)客户A准备好要传送的数字信息(明文)。
(2)客户A对数字信息进行哈希(hash)运算,得到一个信息摘要。
3)客户A用自己的私钥(SK)对信息摘要进行加密得到客户A的数字签名,并将其附在数字信息上。
4)客户A随机产生一个加密密钥(DES密钥),并用此密钥对要发送的信息进行加密,形成密文。
5)客户A用双方共有的公钥(PK)对刚才随机产生的加密密钥进行加密,将加密后的DES密钥连同密文一起传送给乙。
6)银行B收到客户A传送过来的密文和加过密的DES密钥,先用自己的私钥(SK)对加密的DES密钥进行解密,得到DES密钥。
7)银行B然后用DES密钥对收到的密文进行解密,得到明文的数字信息,然后将DES密钥抛弃(即DES密钥作废)。
8)银行B用双方共有的公钥(PK)对客户A的数字签名进行解密,得到信息摘要。银行B用相同的hash算法对收到的明文再进行一次hash运算,得到一个新的信息摘要。
9)银行B将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。
posted @
2008-01-22 10:50 kylixlu 阅读(2247) |
评论 (3) |
编辑 收藏
Java Servlet 开发工具(JSDK)提供了多个软件包,在编写 Servlet 时需要用到这些软件包。其中包括两个用于所有 Servlet 的基本软件包:javax.servlet 和 javax.servlet.http。可从sun公司的Web站点下载 Java Servlet 开发工具。 下面主要介绍javax.servlet.http提供的HTTP Servlet应用编程接口。
HTTP Servlet 使用一个 HTML 表格来发送和接收数据。要创建一个 HTTP Servlet,请扩展 HttpServlet 类, 该类是用专门的方法来处理 HTML 表格的 GenericServlet 的一个子类。 HTML 表单是由 < FORM > 和 < /FORM > 标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定服务器应执行哪一个Servlet(或其它的程序)。 HttpServlet 类包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是继承的。
init() 方法
在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。 可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。 无论有多少客户机访问 Servlet,都不会重复执行 init() 。
缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法来覆盖它,典型的是管理服务器端资源。 例如,可能编写一个定制 init() 来只用于一次装入 GIF 图像,改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的 init() 方法设置了 Servlet 的初始化参数,并用它的 ServletConfig 对象参数来启动配置, 因此所有覆盖 init() 方法的 Servlet 应调用 super.init() 以确保仍然执行这些任务。在调用 service() 方法之前,应确保已完成了 init() 方法。
service() 方法
service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。
= 当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用doPost()方法。
= 当一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。
Servlet的响应可以是下列几种类型:
一个输出流,浏览器根据它的内容类型(如text/HTML)进行解释。
一个HTTP错误响应, 重定向到另一个URL、servlet、JSP。
destroy() 方法
destroy() 方法仅执行一次,即在服务器停止且卸装Servlet 时执行该方法。典型的,将 Servlet 作为服务器进程的一部分来关闭。缺省的 destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果 Servlet 在运行时会累计统计数据,则可以编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。
当服务器卸装 Servlet 时,将在所有 service() 方法调用完成后,或在指定的时间间隔过后调用 destroy() 方法。一个Servlet 在运行service() 方法时可能会产生其它的线程,因此请确认在调用 destroy() 方法时,这些线程已终止或完成。
GetServletConfig()方法
GetServletConfig()方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和ServletContext。ServletContext 接口提供有关servlet 的环境信息。
GetServletInfo()方法
GetServletInfo()方法是一个可选的方法,它提供有关servlet 的信息,如作者、版本、版权。
当服务器调用sevlet 的Service()、doGet()和doPost()这三个方法时,均需要 "请求"和"响应"对象作为参数。"请求"对象提供有关请求的信息,而"响应"对象提供了一个将响应信息返回给浏览器的一个通信途径。javax.servlet 软件包中的相关类为ServletResponse和ServletRequest,而javax.servlet.http 软件包中的相关类为HttpServletRequest 和 HttpServletResponse。
Servlet 通过这些对象与服务器通信并最终与客户机通信。Servlet 能通过调用"请求"对象的方法获知客户机环境,服务器环境的信息和所有由客户机提供的信息。Servlet 可以调用"响应"对象的方法发送响应,该响应是准备发回客户机的。
posted @
2008-01-20 20:34 kylixlu 阅读(207) |
评论 (0) |
编辑 收藏
介绍
有了SQL Server 2005之后,我们使用分页查询比老版本容易多了。在本文中,我将主要用到的是NorthWind数据库,所以你也可以仿照编写我所列举的范例。我尽量使例子简单化;因为任何复杂的东西都会都会造成混淆。我将从“传统”的方法着手,比如:SELECT, TOP,然后慢慢进入具体的SQL Server 2005 分页的例子。
背景
我常常会被问到这样的一个问题或者说一系列这样的问题,“你如何在SQL中进行分页?在有很多个记录的情况下,你又如何做,比如10000个记录或者更多呢?
我思索着答案。更确切地说,我考虑了更多的问题并且我都认真去思考,“这必定是一个普篇的问题,每一个开发人员必须处理或者说解决的。具有非常大的数据库集的工作和分页大小是怎样的?从多种表所得到的结果集又是如何?”
因此,我决定具体结合SQL Server 2005来研究这些问题。下面的方法是至今为止最容易的,建议采纳。但是这是非常罕见的,并非易事。
select * from mytable
Where ID between20and30
SQL Top
SQL Top(从结果集返回记录)非常善于从结果集的每个尾部返回大量的记录。
下面的例子通过命令qty获得了前10名顾客。在论坛上这是一个非常普骗的问题。尽管TOP也可以拉动一定百分比的记录,但是我们这里不讨论。
selecttop10 * from customers -- This is a very basic example.
selectTOP10 Customers.CustomerID, Customers.CompanyName, count(*) OrderCount
from Customers innerjoin Orders on Orders.CustomerID = Customers.CustomerID
GROUPBY Customers.CustomerID, Customers.CompanyName
ORDERBY OrderCount DESC
这是很有用的。当你要把记录从11拉到20时,你就可以使用临时表。
-- SELECT First 30 records in to Temp table
SELECTTOP30 * INTO
#TEMP
from Customers
ORDERBY CompanyName ASC
--Select Bottom 10 records in another temp table
SELECTTOP10 *
INTO #TEMP2
from #Temp
ORDERBY CompanyName DESC
-- GET THE RECORDS
SELECT * FROM #TEMP2
这对少数前几个页面或者前几个用户是种惩罚。如果拥有这样的用户,他们想从一页一页之后返回页面,你将以使1000条记录返回10条来结束,这是非常低效的。你可以在第一个临时表中内置一个身份,然后用一个SELECT声明来作替代。
TOP的替代
有一个这样的TOP替代,它使用的是rowcount(行计数)。使用行计数要小心。如果它不关闭的话,将你将陷入各种各样的困境。
SETrowcount10
SELECT * from Customers
ORDERBY CompanyName
WITH, ROW_NUMBER (行数)and OVER
这对SQL Server 2005来说非常新鲜并且看上去非常有用。下面一个例子显示从一个结果集得到20至19条记录。刚开始,我有一点惊奇,但是我浏览了查询器后我发现它是如此简单。
With Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (orderby CompanyName) as RowNumber
FROM Customers )
select *
from Cust
Where RowNumber Between20and30
SQL Server 2005的WITH指定了一个临时命名的结果,很像SQL Server以前版本中的临时表。但是,输入部分是ROW_NUMBER和OVER声明,它根据公司的名称在每组中创建行数。这就像通过命令条文向临时表添加一个身份种子。
我希望你赞成我的看法。如果不,运行代码并查看结果集。对大表来说速度真的非常快;表的速度超过250,000条记录,对此我留下了深刻的印象。
一起整合到储存过程中
现在我们把它一起整合到储存过程,这个储存过程我们可以通过应用程序来使用。我不打算展示.NET Datagrid或者相似的控件,因为是本文探讨范围之外。下面看到的储存过程使用了灵活的页面大小和页面数目,所以你可以随意地选择任何页面。这样,如果你想跳过前十页去寻找某一条记录就非常方便了。下面的例子是从第一页开始分页的,而不是从第0页,但也可以随意更改。
CREATEPROC GetCustomersByPage
@PageSize int, @PageNumber int
AS
Declare @RowStart int
Declare @RowEnd int
if @PageNumber > 0
Begin
SET @PageNumber = @PageNumber -1
SET @RowStart = @PageSize * @PageNumber + 1;
SET @RowEnd = @RowStart + @PageSize - 1 ;
With Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (orderby CompanyName) as RowNumber
FROM Customers )
select *
from Cust
Where RowNumber >= @RowStart and RowNumber <= @RowEnd end
END
运行这个程序,仅需指定页面大小和页数目(GetCustomersByPage, @PageSize and @PageNumber),代码如下:
exec GetCustomersByPage 10, 1
posted @
2008-01-20 20:21 kylixlu 阅读(244) |
评论 (0) |
编辑 收藏
若要生成一个名为 cal.jar 的可执行jar文件:(文件名可以是任意合法名字)
(这是我认为简单实用的一种方法,还有很多别的方法在此就不介绍了)
第一 把程序生成的所有字节码文件(即.class文件)放在同一个目录下(如:D:/chat/).
第二 在该目录下新建一个manifest.mf文件,文件内容格式如下(划线中内容):
manifest.mf文件中的格式:
--------------------------------
Main-Class: calDemo
--------------------------------
注意: calDemo代表主类名(即要运行的类名,只能有一个,不要文件扩展名)
Main与Class中间不是下划线,而是短横线
Main-Class:与calDemo中间必须要有空格
Main-Class: calDemo之后必须要回车
文件中还可以加入一些其他信息如:(先不要加,以免出错)
--------------------------------------------
Manifest-Version: 1.0
Created-By: 1.4.1_02 (Sun Microsystems Inc.)
--------------------------------------------
然后用jar命令生成可执行的jar文件,例如:
(执行该命令前先要转到该目录下 D:/chat/ )
jar cvfm cal.jar manifest.mf *.class
jar用法:(仅供参考,初学者可跳过这部分内容)
jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
选项:
-c 创建新的存档
-t 列出存档内容的列表
-x 展开存档中的命名的(或所有的〕文件
-u 更新已存在的存档
-v 生成详细输出到标准输出上
-f 指定存档文件名
-m 包含来自标明文件的标明信息
-0 只存储方式;未用ZIP压缩格式
-M 不产生所有项的清单(manifest〕文件
-i 为指定的jar文件产生索引信息
-C 改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。
示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有
文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvfm classes.jar mymanifest -C foo/ .
posted @
2008-01-20 19:16 kylixlu 阅读(237) |
评论 (0) |
编辑 收藏
1、“No bean found under attribute key XXX”
在struts-config.xml里定义了一个ActionForm,但type属性指定的类不存在,type属性的值应该是Form类的全名。或者是,在Action的定义中,name或attribute属性指定的ActionForm不存在。
2、“Cannot find bean XXX in any scope”
在Action里一般会request.setAttribute()一些对象,然后在转向的jsp文件里(用tag或request.getAttribute()方法)得到这些对象并显示出来。这个异常是说jsp要得到一个对象,但前面的Action里并没有将对象设置到request(也可以是session、servletContext)里。
可能是名字错了,请检查jsp里的tag的一般是name属性,或getAttribute()方法的参数值;或者是Action逻辑有问题没有执行setAttribute()方法就先转向了。
还有另外一个可能,纯粹是jsp文件的问题,例如会指定一个id值,然后在循环里使用这个值作为name的值,如果这两个值不同,也会出现此异常。(都是一个道理,request里没有对应的对象。)
3、“Missing message for key "XXX"”
缺少所需的资源,检查ApplicationResources.properties文件里是否有jsp文件里需要的资源,例如:
这行代码会找msg.name.prompt资源,如果AppliationResources.properties里没有这个资源就会出现本异常。在使用多模块时,要注意在模块的struts-config-xxx.xml里指定要使用的资源文件名称,否则当然什么资源也找不到,这也是一个很容易犯的错误。
4、“No getter method for property XXX of bean teacher”
这条异常信息说得很明白,jsp里要取一个bean的属性出来,但这个bean并没有这个属性。你应该检查jsp中某个标签的property属性的值。例如下面代码中的cade应该改为code才对:
5、“Cannot find ActionMappings or ActionFormBeans collection”
待解决。
6、“Cannot retrieve mapping for action XXX”
在.jsp的
标签里指定action='/XXX',但这个Action并未在struts-config.xml里设置过。
7、HTTP Status 404 - /xxx/xxx.jsp
Forward的path属性指向的jsp页面不存在,请检查路径和模块,对于同一模块中的Action转向,path中不应包含模块名;模块间转向,记住使用contextRelative="true"。
8、没有任何异常信息,显示空白页面
可能是Action里使用的forward与struts-config.xml里定义的forward名称不匹配。
9、“The element type "XXX" must be terminated by the matching end-tag "XXX".”
这个是struts-config.xml文件的格式错误,仔细检查它是否是良构的xml文件,关于xml文件的格式这里就不赘述了。
10、“Servlet.init() for servlet action threw exception”
一般出现这种异常在后面会显示一个关于ActionServlet的异常堆栈信息,其中指出了异常具体出现在代码的哪一行。我曾经遇到的一次提示如下:
java.lang.NullPointerException
at org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:1003)
at org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:955)
为解决问题,先下载struts的源码包,然后在ActionServlet.java的第1003行插入断点,并对各变量进行监视。很丢人,我竟然把struts-config.xml文件弄丢了,因此出现了上面的异常,应该是和CVS同步时不小心删除的。
11、“Resources not defined for Validator”
这个是利用Validator插件做验证时可能出现的异常,这时你要检查validation.xml文件,看里面使用的资源是否确实有定义,form的名称是否正确,等等。
posted @
2008-01-20 19:15 kylixlu 阅读(205) |
评论 (0) |
编辑 收藏
0、 需要标识符
a) 不在函数内
1、 非法表达式开始
b) 可能:丢失括号 .
2. no data found
a) 可能:setInt(1,100)中,没有100这个值
3. 找不到符号
a) 可能:没导入包
4. 指定了无效URL
a) 可能:数据库名或IP错误,即连接出错
5. 类路径没有找到
a) 可能: ClassNotFoundException: oracle.jdbc.driver.OracleDriver
b) 原因: 一般是指包名写错,或者没有import包,或者没有在类路径中找到jar文件
c) 解决: 没有加载Oracle驱动jar,在.bash_profile中把ojdbc14.jar加进来
6. 空指针异常
a) 可能: 数据源错误 比如数据库名或IP错误
7. 不能执行查询
a) 可能: 数据库中表的问题,比如列名不存在
8. invalid identity
a) 可能: 列名出错
9. 若在数据库中创建了 两个sequence ,运行时出现异常可能是先后执行了多次select语句,导致与原有的序列号产生冲突
10. 表名或列名不存在
a) 可能:表不存在或者没有插入数据到表中
11. 不支持的类,类的版本错误
a) 可能:没有导入jdk5.0,或者编译器仍为1.4
12. MappingNotFoundException
a) Maybe: In the Eclipse Not refersh , or not exist in the dirctory
13. HibernateException: /hibernate.cfg.xml not found
a) Maybe1: hibernate.cfg.xml not in the root directory
b) Maybe2: Could not parse configuration .
c) resolve: database not connect or use another database
14. ConstraintViolationException
a) Maybe: used a not true database
15. 驱动没有找到 或者 JDBC Driver not found
可能:连接数据库的驱动jar包不存在或者版本不一致,比如将旧的版本换成新的会造成该类错误
16. 空指针异常 ,
java.lang.NullPointerException
a) 可能1:数据库连接出错,比如在hibernate.cfg.xml中的数据错误会导致异常。
17. 数据插入异常 ,GenericJDBCException: could not insert
a) 可能1:没有建立表或者表中没有任何数据
b) 可能2:插入数据后没有执行提交语句:commit
18. LazyInitializationException 或者延迟加载异常
a) 可能1:没有在查询语句中加fetch
19. IdentifierGenerationException
a) 可能1:高位表没有初始化(比如hi_value中没有记录)
20. could not initialize a collection: [hibernate.entity.Role.modules#32768] Syntax error: Encountered "-" at line 1, column 132.
a) 错误原因:<set name="modules" table="module-role" lazy="false">红色字部分中“-”为非法字符,替换为module_role
21. could not insert collection rows: [hibernate.entity.Module.roles#1]
在Module.hbm.xml文件的如下配置中加入inverse=”true”
<set name="roles" table="module_role" inverse="true">
22.在部署Struts时,出现如下错误信息:
HTTP Status 404 - Servlet action is not available
type Status report
message Servlet action is not available
description The requested resource (Servlet action is not available) is not available.
问题原因:
1.、web.xml文件中未配置ActionServlet。
2、struts-config.xml文件未配置你要访问的Action。
3、你的jsp文件form标记中action属性的路径名称错误。
4、非以上三种情况。
针对以上4种情况相应的解决方案如下:
1、在web.xml文件中加上ActionServlet的配置信息
?????? /WEB-INF/struts-config.xml?
?2、在struts-config.xml文件检查你要访问的Action配置文件。
3、检查jsp文件form标记中action属性的路径名称是否与struts-config.xml文件中action标记的path属性的路径名称一致。
4、非以上情况的解决办法就是检查web容器的log日志,如果时tomcat则检查下logs目录下的localhost_log文件,看里边是否记录有错误信息,然后根据错误信息提示将其纠正。
23.
java.lang.NoClassDefFoundError: org/apache/commons/beanutils/Converter
缺少spring-framework-2.0.3\lib\jakarta-commons\commons-beanutils.jar
24.
ava 代码Caused by:
java.lang.NoClassDefFoundError: org/objectweb/asm/Type
缺少spring-framework-2.0.3\lib\asm\asm-2.2.2.jar包,版本不同,该包的名字有相应的区别
java 代码Caused by:
java.lang.NoClassDefFoundError: org/dom4j/DocumentException
缺少spring-framework-2.0.3\lib\dom4j\dom4j-1.6.1.jar包,版本不同,该包的名字有相应的区别
把这个包进去就可以了:\Spring206\lib\dom4j、dom4j-1.6.1.jar
java 代码Caused by:
java.lang.NoClassDefFoundError: org/apache/commons/collections/SequencedHashMap
缺少spring-framework-2.0.3\lib\jakarta-commons\commons-collections.jar包,版本不同,该包的名字有相应的区别
java 代码Caused by:
java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter
缺少spring-framework-2.0.3\lib\cglib\cglib-nodep-2.1_3.jar包,版本不同,该包的名字有相应的区别
java 代码Caused by:
java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
缺少hibernate-3.2\lib\asm.jar包,版本不同,该包的名字有相应的区别
java 代码
org.hibernate.exception.
SQLGrammarException: could not load an entity: [www.proudsoul.xml.User#1]
JAVA工程与WEB工程包的区别:一个是asm.jar,一个是jta.jar
java 代码Caused by:
java.lang.NoClassDefFoundError:
javax/transaction/TransactionManager
缺少spring-framework-2.0.3\lib\j2ee\jta.jar包,版本不同,该包的名字有相应的区别此种错误请检查相应的***.hbm.xml配置文件的配置
25,
Exception in thread "main" org.springframework.dao.InvalidDataAccessResourceUsageException: could not get next sequence value; nested exception is org.hibernate.exception.
SQLGrammarException: could not get next sequence value
Caused by: org.hibernate.exception.
SQLGrammarException: could not get next sequence value
原因:没有加Sequence或者数据库的方言写错了
26,
我的配置文件
<id name="id" column="id">
<generator class="native" />
</id>
然后我运行保存一条数据进去
The database returned no natively generated identity value
就会报这个错误
因为你native是根据看底层数据库的能力选择identity, sequence 或者hilo中的一个
而我建表的时候id没有指定
alter table `student` change `id` `id` int auto_increment
我们把我们的表的结构小小的改动一下就没问题了
27,
UpdateManager无法启动2007-08-09 15:21如果在应用程序安装过程中,暴力中断安装程序,会出现如下状况:1.apt-get remove 和dpkg --remove 无法删除软件 2.UpdateManager无法启动3.新立得软件包管理程序无法启动
以上可能是deb损坏之类造成的
sudo dpkg -r
sqldveloper
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
E: 软件包
sqldeveloper 需要重新安装,但是我无法找到相应的安装文件。
解决方法:1.从 /var/lib/dpkg/status 中把对应的段删掉
重要:修改之前请先备份
在status中找到你对应的包删除就OK了...
28,
Exception in thread "main"
java.lang.NoClassDefFoundError: antlr/ANTLRException
少了antlr-2.7.5H3.jar包,从D:\eclipse\eclipse\plugins\com.genuitec.org.hibernate.eclipse_4.1.1\myeclipse-data\3.0\lib
29,
Caused by:
java.lang.NoClassDefFoundError:
javax/transaction/Synchronization
缺少Spring206\lib\j2ee\jta.jar
30,
Caused by:
java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy3] to required type [business.impl.PriceBiz] for property 'priceBiz': no matching editors or conversion strategy found
在
java类中设置priceBiz时应该设置的是接口PriceBizIf,而非实现类
31, 数组越界
可能1: 在命令行后面需要加入参数.
可能2:加入的参数错误
32, car is not mapped
可能1: 在cfg.xml中没有增加映射的hbm.xml文件在<mapping.../>中
33, 属性没有找到
可能1: hbm.xml文件中的 <property name =""> 有问题, 也许是name的值与对应类中的成员名不一致
34,
SQLException: 无当前连接 可能1:在比如创建帐户时没有对相应的方法添加到<list>中去,比如这个没有加入:<value>newAccount</value>
<bean id="transactionAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice">
<ref bean="advice"/>
</property>
<property name="mappedNames">
<list>
<value>transfer</value>
</list>
</bean>
35,
SQLException: Syntax error: Encountered "table" at line 1, column 8.
可能1;执行
SQL时出现冲突,可能是
SQL语句中使用了关键字作为变量来用,比如
update order set balance=1000000;
其中order被用作表名来使用,这是错误的,因为order是个关键字,用在order by中
36, Servlet /Spring-WebMvc threw load() exception
org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
jar包的冲突,spring-1.2.6.jar和spring.jar出现在一个war的目录中:JBoss/server/all/deploy/Spring-WebMvc.war/WEB-INF/lib
37,
java.
sql.
SQLException: 当事务仍处于活动状态时,无法关闭连接。
38 ,
validateJarFile(/home/soft01/Tomcat/webapps/sms-token-struts/WEB-INF/lib/servlet-api.jar)
Servlet /sms-struts-tiles threw load() exception
java.lang.ClassNotFoundException: org.apache.struts.action.ActionServlet
原因:在WEB-INF/lib/ 目录下有servlet-api.jar与/Tomcat/common/lib目录下的servlet-api.jar冲突了,把WEB-INF/lib/下的servlet-api.jar删除就可以了
39,
java.lang.ClassNotFoundException: org.springframework.web.struts.ContextLoaderPlugIn
Marking servlet action as unavailable
10:30:47,088 ERROR [/NetCT_OSS]:3953 - Servlet /NetCT_OSS threw load() exception
javax.servlet.UnavailableException
40,org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
缺少MyEclipse/eclipse/plugins/com.genuitec.eclipse.springframework_5.5.0/data/2.0/dist/modules/spring-struts.jar
41,Caused by:
java.
sql.BatchUpdateException: ORA-02291: integrity constraint (SD0702.FK82D343CF49A4B831) violated - parent key not found
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
有可能是ID生成策略的问题,我将它XML映射文件改成<generator class="increment" />就好了
42,
2007-08-19 16:21:43,290 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/OSS].[action]] - Servlet.service() for servlet action threw exception
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [entity.Module#2]
java.util.ConcurrentModificationException
原因:已经有对象拥有了所选择的module,用clear(),而不是remove();
43,
ERROR [org.apache.catalina.session.ManagerBase] - IOException while loading persisted sessions:
java.io.InvalidClassException: entity.Module; local class incompatible: stream classdesc serialVersionUID = -5988350031935445758, local class serialVersionUID = -297934247726484429
java.io.InvalidClassException: entity.Module; local class incompatible: stream classdesc serialVersionUID = -5988350031935445758, local class serialVersionUID = -297934247726484429
在Module中加上一个关键字:transient
44,
Caused by:
java.
sql.BatchUpdateException: ORA-02292: integrity constraint (SD0702.SYS_C00132664) violated - child record found
原因:有其他的表引用了该表的外建,所以报这个异常,如果没有引用就不会出现
45,
出现数组越界的时候,看看是不是循环时没有加=,比如:
for(int i = 1; i<arr.length;i++)可以改成
for(int i = 1; i<=arr.length;i++)
46.如果使用Ant和Junit是被报找不到test,检查一下是否误用了private
出错信息:
<failure message="No tests found in test.AllTest" type="junit.framework.AssertionFailedError">junit.framework.AssertionFailedError: No tests found in test.AllTest
该错误有个很特别的特点,当你不通过ant来运行测试,而是通过AllTest类来运行的话,可以正常运行。小心哦
47.如果遇到报:表名无效,且jvm报严重错误,看看是不是用了数据库的保留关键字来做表名了,如User。
48.使用ant时必须小心ant的classpath它用的不是IDE的classpath,小心!
49.小心下边的异常,
exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of xp.bean.Users.?" type="net.sf.hibernate.PropertyAccessException">
java.lang.ClassCastException at xp.bean.UsersMetaClass1.setPropertyValues(<generated>) at net.sf.hibernate.persister.AbstractEntityPersister.setPropertyValues
上次出现该错错误的原因是:
源文件里我的class类型为一个类Contact contact
而跑到mapping里却成了Set,呵呵厉害。
50.突然间冒出大量的NullPointException
重新build一下。
51.="Flush during cascade is dangerous - this might occur if an object was deleted and then re-saved by cascade"
52.Tapestry的出错信息:
Class com.bookshop.Hello does not implement the IPage interface.
location: context:/WEB-INF/Home.page, line 6
原因:与显示有关的哪个
java类没有从IPage家族继承。
53.使用ant时给出的路径好象不允许出现空格。
54.由于使用ant时用junit做测试的话,classpath中出现j2ee.jar的话,问题多多。例如xml格式的log文件生成不了,莫名其妙的NullPointException等。所以我设置了两个包个包含j2ee.jar,为编译用;一个没有,为junit用
55.进行单元测试时,在查询返回后应马上assertNotNull(),这样可以更快速的定位NullPointException
56.要使用ResourceBundle的话,要千万小心。必须用日志记录下它的状态。还有该属性文件应该放在classes下面。
57.当要显示任何页面时,都被提示无效,那么应该检查一下lib目录了,还有一些很奇怪的异常,例如你明明可以找到一个类但是服务器却提示ClassNotDefException,那么估计是缺少了该类所必须的包了。或者多了不兼容的包,如, xdoclet系列包不被struts的lib目录所兼容
58.编写clone时从
Java编程思想(2nd)上学到的(732):
.引数传递过程中会自动产生别名(alias)。
.没有局域对象(local objects),只有局域性的(local)references。
.reference受范围(scope)的限制,对象则否。
.对象的寿命从来不是
Java的讨论议题(因为有垃圾回收机制)
59.try catch finally的域居然是分离的。
60.jsp乱码的其中一个原因:charset="gb2312" 等号"="的两边不允许有空格。
61.我的基于Displaytag的简单报表解决方案。
http://displaytag.sourceforge.net/
下载displaytag.jar和displaytag.tld
displaytag.jar放在lib目录,而displaytag.tld放在WEB-INF目录,在web.xml中为displaytag.tld声明一下。
<taglib>
<taglib-uri>http://displaytag.org</taglib-uri>
<taglib-location>/WEB-INF/displaytag.tld</taglib-location>
</taglib>
在jsp里使用前,加上
<%@ taglib uri="http://displaytag.org" prefix="display" %>
注意该软件有个bug,他要用的一个包common-lang.jar版本必须在2.0以上。
如果碰到下面异常,则应坚持一下是否该包的版本问题。
java.lang.NoSuchMethodError: org.apache.commons.lang.
StringUtils.capitalize(L
java/lang/
String;)L
java/lang/
String;
然后就可放心使用了
<display:column property = "xxx"/>其中xxx为对象中的带有getter的变量>。
定义表格的样子,用css定义。如
TABLE.its THEAD TR {
BACKGROUND-COLOR: #69c
}
TABLE.its TR.even {
BACKGROUND-COLOR: #def
}
在使用分页时,可能会出现这种情况,点击其他页时,弹出下载窗口,让你下载当前jsp页面,这是因为你在当前页面读取了数据的缘故。解决办法为在action里读取数据而不是在jsp里。可以参考
http://www.displaytag.org/example-paging.jsp?d-26189-p=2
62.使用displaytag时,在一列中放入多个元素
必须在display:table中定义一个id
<display:table name = "allBooks" class = "its" pagesize = "5" id = "item">
<display:column title = "操作">
<a href = "/Bookshop/admin/bookManagement.do?action=view&id=<%=((Book)item).getId()%>" target = "_blank" >查看</a>
<a href = "/Bookshop/admin/bookManagement.do?action=edit&id=<%=((Book)item).getId()%>">编辑</a>
<a href = "/Bookshop/admin/bookManagement.do?action=delete&id=<%=((Book)item).getId()%>">删除</a>
</display:column>
要在displaytag中使用链接,必须具备paramId,否则不显示为链接
<display:column property = "product.name" href = "viewDetailV2.0.jsp" title = "书名" paramId="item" paramProperty="product.id"/>
可以这样使用display
<display:column property = "product.id" title = "ID"/>
其中product为对象
63.<bean:write name = "xxxx" property = "xxx"/> 可以直接取到session.getAttribute()取到的东西。
64.实验struts-upload例子时要注意的地方:
1.If you would rather write this file to another file, please check here:
这一行要打钩
2.If you checked the box to write to a file, please specify the file path here:
在这里要重命名如:c:\b.jpg
上传成功的话,会出现提示 The file has been written to "c:\b.jpg"
65.Hibernate的like可以这么用:
Query query = session.createQuery("from src.persistent.Book as book where upper(book.name) like :name ");
query.set
String("name", "%");
result = query.list();
66.Hibernate出现 duplicate import : className
异常也可能是因为忘了为持久类在configuration中addClass了
67.<logic:iterate id = "author" name = "authors">
name所引用的是session里的attribute。
68.如果发现要出现询问下载的情况,有可能是因为要跳转的页面出现了问题。试试在要跳转到的页删掉
<%@ page contentType="text/html; charset=gb2312"%>
69.如果JSP页面跳转时出现下边的错误信息:
The request sent by the client was syntactically
incorrect (Invalid path /web/shoppingCart was requested).
原因是struts-config的action = "x" 写成了 action = "x.do"
70.在struts中,strut-config.xml中,forward时使用redirect = "true"可以将.do重定向为.jsp
71.以后在判断相等性之前先用logger把两个值显示出来。
72.从session里getAttribute后,修改并不需要重新setAttribute一次。
73.在hibernate中使用subclass是一棵继承树共用一个表,仅生成个mapping。
每个类中必须有discrimator-value。在最上层的类中必须声明:
@hibernate.discriminator column = "class"。
不可以将子类添加到configuration里去。(即不可addClass(子类))
使用Xdoclet的建立subclass的例子(该类是父类)
/**
* @hibernate.class discriminator-value = "customer"
* @hibernate.discriminator column = "class"
*/
而使用joined-subclass则是一类一表,也不许将子类添加进configuration里去。
/**
* @hibernate.joined-subclass
* @hibernate.joined-subclass-key
* column="customer_id"
*/
如果发现生成的mapping文件中joined-subclass的key column为空,那么可能是@hibernate.joined-subclass-key这句没有写对。
用joined-subclass生成的表,仔细看。Member extends Customer
create table Customer (
id VARCHAR2(255) not null,
name VARCHAR2(255),
description VARCHAR2(255),
primary key (id)
)
create table Member (
customer_id VARCHAR2(255) not null,
password VARCHAR2(255),
primary key (customer_id)
)
74.在junit中尽量使用assertEquals代替assertTrue;
75.Hibernate
如果Child extends Parent
那么from Parent as parent 也将会将Child选出来,而from Child as child 则不会选出Parent
76.Hibernate
使用hibernate的one-to-one时,应该两方向都set,否则会报save NullPointException
parent.setChild(child);
child.setParent(parent);
77.Hibernate
遇到下边的异常,估计是与因为外键出现了问题:
java.lang.NullPointerException
at net.sf.hibernate.persister.AbstractEntityPersister.getPropertyValue(AbstractEntityPersister.
java:675)
at net.sf.hibernate.id.ForeignGenerator.generate(ForeignGenerator.
java:33)
如:
* @hibernate.id generator-class = "foreign"
* @hibernate.generator-param name = "property" value = "customer"
* @hibernate.one-to-one name = "custmoer" class = "src.persistent.Customer"
value的值和one-to-one 中name的值不符,则会出现上边的异常。如果不显示指定name则默认取成员变量名
如
Customer a
则name = "a" 需要小心的是不是类名。所以,以后最好显示指定名字为好。
78.出现异常:
Exceptionobject references an unsaved transient instance - save the transient instance before flushing: src.persistent.Product
原因没有为某对象进行set设置, 如上边的这个就是某对象没有调用setProduct
79.
"xxx action = "/a" 不用.do和根目录名
<a href = "b.do" 需要.do和根目录名
80.
Caused by:
java.
sql.
SQLException: ORA-02291: 违反完整约束条件 (BOOKSHOP.FK4AAEE
47687CCA6B) - 未找到父项关键字
如果你觉得该做的e是出现这个问题,那么检查一下,是否将类的继承关系在hibernate的mapping中反映了出来。joined-subclass或subclass
例如a extends b
如果持久类c 需要Set的是持久类a,那么你把b传入,而b又没有在mapping中将父子关系反映出来的话,就会出现该异常
81.使用DynaActionForm需要注意的问题
在struts-config声明
<form-bean name="memberloginForm" dynamic ="true" type="org.apache.struts.action.DynaActionForm">
<form-property name = "name" type = "
java.lang.
String"/>
<form-property name = "password" type = "
java.lang.
String"/>
</form-bean>
在Action里将form强制转化成DynaActionForm,然后get("属性名")就可以了
82.struts的validate最简单实现
1.首先准备好错误提示信息。
xxx.properties 里
errors.required={0} is required.(默认已有)
2.Form必须从ValidatorForm继承
3.不可以重载ValidatorForm的validate函数
4.在validate.xml中为你想验证的表单进行验证设计。例如
<form name="logonForm">
<field property="userName" depends="required">
<arg0 key="prompt.userName"/>
(该参数将在显示错误信息是从xxx.properties读取prompt.userName,填入{}方括号里,取代0。如果是arg1将将填入{1}位置,以此类推。
</field>
</form>
不需要在action里做任何处理。只管forward就行了。作为forward的目标页,不需要任何有关用于处理出错信息的处理。
83.服务器报
The requested resource (/xxxx/xxx.htm) is not available.的很奇怪的一个的可能原因
在web.xml中定义的tld,没有找到
或者是lib目录下的包太多出现了问题。
如
<taglib>
<taglib-uri>/spring</taglib-uri>
<taglib-location>/WEB-INF/spring.tld</taglib-location>
</taglib>
如WEB-INF目录下不存在spring.tld的话,就会报上边的错误
84.
spring的xxx-servlet.xml的使用SimpleFormController系列的类问题:
<bean id = "priceIncreaseForm" class="PriceIncreaseFormController">
<property name="sessionForm"><value>true</value></property>
<property name="beanName"><value>priceIncrease</value></property>
<property name="commandClass"><value>PriceIncrease</value></property>
<property name="formView"><value>priceIncrease</value></property>
<property name="successView"><value>hello</value></property>
<property name="productManager">
<ref bean="prodMan"/>
</property>
</bean>
这里要注意几个问题:
(1)上边的PriceIncrease是了类名,必须在classes里存在该类,否则报:
PropertyVetoExceptionsException: 1 errors:-- ErrorCodedPropertyVetoException: message=[Failed to convert property value of type [
java.lang.
String] to required type [
java.lang.Class] for property named 'commandClass'; nested exception is:
java.lang.IllegalArgumentException: Invalid class name [PriceIncrease]: PriceIncrease]; errorCode=[typeMismatch]
java.lang.IllegalArgumentException: Invalid class name [PriceIncrease]: PriceIncrease
(2)<property name="formView"><value>priceIncrease</value></property>
这一行必不可少,priceIncrease是页面的名字,他将会是prefix + priceIncrease + suffix
如果缺少该行,则报:
javax.servlet.ServletException: Error in ModelAndView object or View resolution encountered by servlet with name 'pocketSpring': View to render cannot be null with ModelAndView [ModelAndView: materialized View is [null]; Model=[{priceIncrease=PriceIncrease@148e798, org.springframework.validation.BindException.priceIncrease=org.springframework.validation.BindException: BindException: 0 errors}]]
使用Errors的rejectValue相关问题:
rejectValue(
java.lang.
String field,
java.lang.
String errorCode,
java.lang.Object[] errorArgs,
java.lang.
String defaultMessage)
Reject the given field of the current object, using the given error description.
当前对象指的是xxx-servlet.xml中与validator类有联系的哪个对象。
第一个是:当前对象的属性名,必须存在
第二个是:将要从属性文件中读取的消息
第三个是:传递给所读取的消息的参数,如:
error.too-low=You have to specify a percentage higher than {0}!
第四个是:当从属性文件中读取消息不成功时,所reject的值
以后从request中读取parameter可以借用spring的RequestUtils包里的
get
StringParameter
public static
java.lang.
String get
StringParameter(
javax.servlet.http.HttpServletRequest request,
&bsp;
java.lang.
String name,
java.lang.
String defaultVal)
Get a
string parameter, with a fallback value. Never throws an exception. Can pass a distinguished value to default to enable checks of whether it was supplied.
不会抛异常
Hibernate的问题:2.1rc的问题
INFO: cache provider: net.sf.ehcache.hibernate.Provider
net.sf.hibernate.HibernateException: could not instantiate CacheProvider:
解决办法,2.1rc比以前的版本多需要一个包
ehcache.jar
85.static的问题
static函数只可以访问static成员变量。
而static变量可以被任何成员函数访问。
86.
java.lang.NoClassDefFoundError:
javax/transaction/Synchronization];
需要添加JTA.jar
posted @
2008-01-18 13:25 kylixlu 阅读(633) |
评论 (0) |
编辑 收藏
摘要: 最近HR要求把公司的HRMS一些关键数据加密,加密的数据应该包括两方面,一个是当然Spring读取的属性文件(e.g :System.properties),还有一个是数据库的关键字段(不知道当初设计时为什么没有实现加密,我真是搞不懂,现在扔给我,恶改ing)。
...
阅读全文
posted @
2008-01-13 13:18 kylixlu 阅读(2284) |
评论 (2) |
编辑 收藏
出错状况:
我用的是Windows XP,在“服务”中启动“OracleOraHome90TNSListener”失败,说是
在 本地计算机 无法启动 OracleOraHome90TNSListener 服务。
错误 3: 系统找不到指定的路径。
于是,我在CMD中输入“LSNRCTL”
LSNRCTL for 32-bit Windows: Version 9.0.1.1.1 - Production on 28-1月 -2005 10:56
:54
Copyright (c) 1991, 2001, Oracle Corporation. All rights reserved.
欢迎来到LSNRCTL,请键入"help"以获得信息。
LSNRCTL> start
启动tnslsnr:请稍候...
Failed to start service, error 3.
TNS-12560: TNS: 协议适配器错误
TNS-00530: 协议适配器错误
32-bit Windows Error: 3: No such process
解决办法:
1.你修改了主机名,如果是的话,你可以把主机名改回来,然后重起计算机后,就可以找到监听程序了.
2.由于你的错误删除了监听程序的路径,要恢复很简单:点开始->运行输入"regedit"然后在查找里输入OracleOraHome90TNSListener去查找.如果找到后你就要增加一项ImagePath,定义成字符集,路径为: "盘符:\oracle\ora90\bin\tnslsnr".添加完后继续按F3来找!修改同上.至到搜索完毕为止!此方法成功几率为90%以上
posted @
2008-01-13 12:38 kylixlu 阅读(301) |
评论 (0) |
编辑 收藏
主要就我所了解的J2EE开发的框架或开源项目做个介绍,可以根据需求选用适当的开源组件进行开发。主要还是以Spring为核心,也总结了一些以前web开发常用的开源工具和开源类库
1持久层:
1)Hibernate
这个不用介绍了,用的很频繁,用的比较多的是映射,包括继承映射和父子表映射
对于DAO在这里介绍个在它基础上开发的包bba96,目前最新版本是bba96 2.0它对Hibernate进行了封装, 查询功能包括执行hsql或者sql查询/更新的方法,如果你要多层次逻辑的条件查询可以自己组装QueryObject.可以参考它做HibernateDAO.也可以直接利用它
2) iBATIS
另一个ORM工具,Apache的,没有Hibernate那么集成,自由度比较大
2:SpringMVC
原理说明和快速入门:
配置文件为:
Spring的配置文件默认为WEB-INF/xxxx-servelet.xm其中xxx为web.xml中org.springframework.web.servlet.DispatcherServlet的servlet-name.
Action分发:
Spring将按照配置文件定义的URL,Mapping到具体Controller类,再根据URL里的action= xxx或其他参数,利用反射调用Controller里对应的Action方法。
输入数据绑定:
Spring提供Binder 通过名字的一一对应反射绑定Pojo,也可以直接从request.getParameter()取数据。
输入数据验证
Sping 提供了Validator接口当然还可以使用开源的Commons-Validaor支持最好
Interceptor(拦截器)
Spring的拦截器提供接口需要自己编写,在这点不如WebWork做的好。全面
(这里提一下WebWork和Struts的区别最主要的区别在于WebWork在建立一个Action时是新New一个对象而Struts是SingleMoule所有的都继承它的一个Action,所以根据项目需要合适的选择。)
3:View层
1) 标签库:JSP2.0/JSTL
由于Webwork或Spring的标签确实很有限,一般view层用JSTL标签,而且据说JSTL设计很好速度是所有标签中最快的使用起来也很简单
2) 富客户端:DOJO Widgets, YUI(YahooUI),FCKEditor, Coolest日历控件
Dojo主要提供Tree, Tab等富客户端控件,可以用其进行辅助客户端开发
YahooUI和DOJO一样它有自己的一套javascript调试控制台,主要支持ajax开发也有很多Tree,Table,Menu等富客户端控件
FCKEditor 最流行的文本编辑器
Coolest日历控件 目前很多日历控件可用,集成在项目中也比较简单,这个只是其中的一个,界面不错的说……
3) JavaScript:Prototype.js
Prototype.js作为javascript的成功的开源框架,封装了很多好用的功能,通过它很容易编写AJAX应用,现在AJAX技术逐渐成熟,框架资源比较丰富,比如YUI,DWR等等,也是因为JavaScript没有合适的调试工具,所以没有必要从零开始编写AJAX应用,个人认为多用一些成熟的Ajax框架实现无刷新更新页面是不错的选择。
4)表格控件:Display Tag ,Extreme Table
这两个的功能差不多,都是View层表格的生成,界面也比较相向,可以导出Excel,Pdf,对Spring支持很容易。
相比较而言比较推荐ExtremeTable,它的设计很好功能上比DisplayTag多一些,支持Ajax,封装了一些拦截器,而且最方面的是在主页wiki中有详细的中文使用文档。
5):OSCache
OSCache是OpenSymphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件,Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中,通过缓存页面的输出结果,可以很显著的改善系统的稳定性和运行性能。
它主要用在处理短时间或一定时间内一些数据或页面不会发生变化,或将一些不变的统计报表,缓冲在内存,可以充分的减轻服务器的压力,防治负载平衡,快速重启服务器(通过硬盘缓存)。
6)SiteMesh
sitemesh应用Decorator模式主要用于提高页面的可维护性和复用性,其原理是用Filter截取request和response,把页面组件head,content,banner结合为一个完整的视图。通常我们都是用include标签在每个jsp页面中来不断的包含各种header, stylesheet, scripts and footer,现在,在sitemesh的帮助下,我们删掉他们轻松达到复合视图模式。
Sitemesh也是 OpenSymphony的一个项目现在最近的版本是2.2,目前OpenSymphony自从04年就没有更新的版本了……感觉它还是比较有创新的一种页面组装方式, OpenSymphony开源组织的代码一般写的比较漂亮,可以改其源代码对自己的项目进行适配。
测试发现Sitemesh还存在一些问题,比如中文问题,它的默认编码是iso-8859-1在使用时候需要做一些改动。
7)CSS,XHTML
这个不用说了,遵循W3C标准的web页面开发。
8)分页标签: pager-taglib组件
Pager-taglib 是一套分页标签库,可以灵活地实现多种不同风格的分页导航页面,并且可以很好的与服务器分页逻辑分离。使用起来也比较简单。
9)Form: Jodd Form taglib
Jodd Form taglib使用比较简单,只要把
的头尾以包住
就会自动绑定mybean, 自动绑定mybean的所有同名属性到普通html标记input, selectbox, checkbox,radiobox……在这些input框里不用再写任何代码…
10)Ajax:DWR
J2EE应用最常用的ajax框架
11)报表 图表
Eclipse BIRT功能比较强大,也很庞大……好几十M,一般没有特别需求或别的图表设计软件可以解决的不用它
JasperReports+ iReport是一个基于Java的开源报表工具,它可以在Java环境下像其它IDE报表工具一样来制作报表。JasperReports支持PDF、HTML、XLS、CSV和XML文件输出格式。JasperReports是当前Java开发者最常用的报表工具。
JFreeChart主要是用来制作各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。
琴棋报表,国产的……重点推荐,适合中国的情况,开放源代码,使用完全免费。纯JAVA开发,适用多种系统平台。特别适合B/S结构的系统。官方网站有其优点介绍,看来用它还是不错的选择,最重要的是支持国产呵呵
4:权限控制: Acegi
Acegi是Spring Framework 下最成熟的安全系统,它提供了强大灵活的企业级安全服务,如完善的认证和授权机制,Http资源访问控制,Method 调用访问控制等等,支持CAS
(耶鲁大学的单点登陆技术,这个单点登陆方案比较出名。我也进行过配置使用,可以根据项目需要,如果用户分布在不同的地方不同的系统通用一套登陆口令可以用它进行解决,一般注册机登陆机就是这样解决的)
Acegi只是于Spring结合最好的安全框架,功能比较强大,当然还有一些其他的安全框架,这里列举一些比较流行的是我从网上找到的,使用方法看其官方文档把…
JAAS, Seraph, jSai - Servlet Security, Gabriel, JOSSO, Kasai, jPAM, OpenSAML都是些安全控制的框架……真够多的呵呵
5:全文检索
1) Lucene
Lucene是一套全文索引接口,可以通过它将数据进行倒排文件处理加入索引文件,它的索引速度和查询速度是相当快的,查询百万级数据毫秒级出结果,现在最火的Apache开源项目,版本更新速度很快现在已经到了2.0,每个版本更新的都比较大,目前用的最多的版本应该是1.4.3,但它有个不太方面的地方单个索引文件有2G文件限制,现在2.0版本没有这个限制,我研究的比较多,它的扩展性比较好,可以很方面的扩充其分词接口和查询接口。
基于它的开发的系统很多,比如最常用的Eclipse的搜索功能,还有一些开源的软件比如Compass,Nutch,Lius,还有我最近做的InSearch(企业级FTP文件网页搜索)
6:公共Util类
主要是Jakarta-Commons类库,其中最常用得是以下几个类库
1) Jakarta-Commons-Language
最常用得类是StringUtils类,提供了使用的字符串处理的常用方法效率比较高
2) Jakarta-Commons-Beantuils
主要用Beantuils能够获得反射函数封装及对嵌套属性,map,array型属性的读取。
3) Jakarta-Commons-Collections
里面有很多Utils方法
7 日志管理
Log4J
任务是日志记录,分为Info,Warn,error几个层次可以更好的调试程序
8 开源的J2EE框架
1) Appfuse
Appfuse是Matt Raible 开发的一个指导性的入门级J2EE框架, 它对如何集成流行的Spring、Hibernate、iBatis、Struts、Xdcolet、JUnit等基础框架给出了示范。 在持久层,AppFuse采用了Hibernate O/R映射工具;在容器方面,它采用了Spring,用户可以自由选择Struts、Spring/MVC,Webwork,JSF这几个Web框架。
2) SpringSide
。SpringSide较完整的演示了企业应用的各个方面,是一个电子商务网站的应用 SpringSide也大量参考了Appfuse中的优秀经验。最重要的是它是国内的一个开源项目,可以了解到国内现在的一些实际技术动态和方向很有指导意义…
9:模版 Template
主要有Veloctiy和Freemarker
模板用Servlet提供的数据动态地生成 HTML.编译器速度快,输出接近静态HTML 页面的速度。
10:工作流
我所知道比较出名的主要有JBpm Shark Osworkflow,由于对它没有过多的研究所以还不是很清楚之间有什么区别。
项目管理软件
dotProject:是一个基于LAMP的开源项目管理软件。最出名的项目管理软件
JIRA: 项目计划,任务安排,错误管理
Bugzilla:提交和管理bug,和eclipse集成,可以通过安装MyEclipse配置一下即可使用
BugFree借鉴微软公司软件研发理念、免费开放源代码、基于Web的精简版Bug管理
CVS:这个就不介绍了都在用。
SVN: SubVersion已逐渐超越CVS,更适应于JavaEE的项目。Apache用了它很久后,Sourceforge刚刚推出SVN的支持。
测试用例:主要JUnit单元测试,编写TestCase,Spring也对Junit做了很好的支持
posted @
2007-12-28 13:54 kylixlu 阅读(150) |
评论 (0) |
编辑 收藏
一.JSP页面部分
1. 页面文字处理
1.1概述
由于STRUTS提供了很好的国际化的支持,因此JSP页面可以STRUTS的这一特性做到国际化。
STRUTS允许将不同语言的文字写在多个资源文件中,每个资源对应一种语言,而在JSP页面上则通过STRUTS标签< bean:message>来显示文字,该标签可以根据浏览器的当前语言设置确定从对应的语种资源文件中取出字符串,显示在页面上。
1.2资源文件
实现国际化,首先需要准备好资源文件,需要支持的语言各对应一个。资源文件一定要用支持多国语言文字的文本编辑器(如WORD,一定不能用NOTEPAD、UE等)编写,其格式如下:
# Project international
index.title=XX信息系统
index.copyright=XXX有限公司 版权所有
其中以#开头的行是注释,其它的行都是KEY=VALUE的形式,定义了一个KEY对应当前语言下的文字。保存资源文件时,需要在文件类型选项中选择纯文本类型,编码选择其它>>UTF-8,注意资源文件的扩展名为.properties,文件名可以任意取。
这样保存的资源文件还不能直接被STRUTS使用,JDK提供了一个工具native2ascii对编写的资源文件进行转换,该工具位于%JDK%/bin/目录下,一般在JDK正确安装后可以直接在命令行使用。使用native2ascii工具转换的资源的文件的命令行格式如下:
native2ascii -encoding UTF-8 ApplicationResources.properties ApplicationResources_zh_CN.properties
其中-encoding参数指明编写的资源文件的编码格式,这里必须与编辑时选择保存的编码格式一致,后面两个参数分别是需要转换的资源文件名和转换后保存的资源文件名。
转换后的资源文件名都必须以一个特定的前辍开头,该前辍写在struts-config.xml配置中,后辍是对应语言的简称,如
英文(美国) ApplicationResources _en_US.properties
中文(简体)ApplicationResources _zh_CN.properties
中文(繁体)ApplicationResources _tw.properties
泰语 ApplicationResources _th.properties
资源文件的存放目录可以是/WEB-INF/classes/下的任意目录,为了便于管理 ,建议在/WEB-INF/ classes/下建立目录resources,将所有的资源文件都放在该目录下。STRUTS通过配置文件struts-config.xml配置资源文件的所在位置,如:
< message-resources parameter="resources.ApplicationResources" />
其中目录以包的方式表示。
1.3 JSP页面显示
为了支持国际化,JSP页面的编码方式需要设成UTF-8,即在页面的头部加入以下几行:
< %@ page contentType="text/html; charset=UTF-8" %>
< %@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
……(STRUTS及其它标签库引用)
< html:html locale="true">
JSP页面的中文字要全部写到资源文件中,注意每种语言资源文件都要写到,否则在使用某种语言访问系统时可能会报错。JSP中使用STRUTS标签< bean:message key="index.title"/>显示资源文件中定义的字符串。这样当改变浏览器的当前语言后,页面会自动取得与浏览器当前语言对应的资源文件中的字符串显示在页面上。
对于在ACTION的JAVA代码中直接设置的变量,如需要在JSP页面上进行显示,那么在设置变量时也需要从资源文件中通过KEY取到当前语言的字符串,再使用request.setAttribute方法进行设置,这样在JSP页面上使用< bean:write>标签展现设置的变量才会对应不同的语言会呈现不同的字符串。
在JAVA代码中取资源文件的信息的方法是,首先通过Globals.MESSAGES_KEY从request或session变量中取得资源对象(MessageResources),再调用MessageResources.getMessage方法即可取得相应的字符串,该方法需的两个参数是当前语言区域设置(Locale)和字符串的KEY,其中当前语言区域设置(Locale)保存在SESSION变量中,其变量名为Globals.LOCALE_KEY,该变量在下一节手工设置语言时也有提到。
1.4手工设置显示语言
用浏览器的语言设置来决定系统采用哪种语言展现可能会出现一个问题,就是用户的浏览器语言与他想要使用系统的语言不一致的情况,如某客户浏览器的语言设置为英文,但他还是在使用主站系统时看到的是中文界面。该问题可以通过手工选择语言来解决,在程序中可以通过设置名为Globals.LOCALE_KEY(Globals.LOCALE_KEY 是 struts的常量)的SESSION变量,也能改变系统中当前语言的设置,代码类似于:
Locale newLocale = new Locale( language, country );
session.setAttribute( Globals.LOCALE_KEY, newLocale );
其中变量language, country 可以通过用户的选择设置相应的值,各种语言的对应值参考http://www.unicode.org/unicode/onlinedat/countries.html。
2. 带有文字的图片处理
2.1静态图片
带有文字的图片应该也要根据语言的不同而显示不同的图片,但图片本身不是文本信息,无法直接用< bean:message>标签来完成国际化操作。但由于页面上显示图片取决于< image>标签的src属性,因此可以为每个图片对应各种语言的都准备一个版本,文件名或路径有所差异,然后将每种语言对应的图片的路径及文件名放在资源文件中,而在JSP页面上< image>标签的src属性由< bean:message>标签指定,这样即可以完成图片的国际化。
2.2 JAVA生成动态图片
由于生成动态图片是在服务器端进行,因此同样需要将生成图形字符的静态部分放在资源文件中,如图形名称等,从资源文件中取字符串的方法在JSP页面显示部分已有说明;从数据库中取出的部分可以不用做任何处理,直接从数据库取出与静态部分拼装成图形字符串即可,数据库相关设置在数据库部分有详细说明。
3. 页面提交参数处理
页面上向WEB服务器提交参数有两种方式,一是在访问URL后面附加上request变量,这样的变量在服务器端可以通过request.getParameter方法得到,另一种方式是在JSP页面上用FORM表单方式提交,这种方法提交的变量在服务器端可以通过form的getXXX方法取到变量的值。
当WEB系统需要国际化时,JSP页面的编码方式被指定为UTF-8(前面已有说明),也就是说页面上可以处理各国文字,在使用URL传递变量时需要将变量用JS方法encodeURI方法处理过,才能在服务器端得到正确的值,如
location.href="int/do/common/queryUserInfo.do?sqlcode=QUERY0001&hh="+encodeURI(document.all.hh.value)+"&hm="+encodeURI(document.all.hm.value)+"&bmbh="+encodeURI(document.all.bmbh.value);
由于这种方式需要对每个request变量调用encodeURI方法,处理起来比较麻烦,但用FORM表单提交的方式即不需要进行任何处理,因此在开发时应尽量使用FORM表单提交的方式进行数据传递。
如果需要JAVA代码中生成URL,则其中传递的参数也需要调用URLEncoder.encode方法进行处理,并指定编码方式为"UTF-8"。
在服务器端取得客户端传递的参数时也需要对参数进行字符集的转换后才可以下确使用,如
strString = new String(strString.getBytes("ISO-8859-1"), "GBK");
但如此对每个变量都需要这样处理也是非常麻烦,实际上可以利用servlet的Filter机制进行统一处理。在调用servlet(包括struts)时,在到达实际的servlet类前,会首先调用指定的Filter进行处理,Filter处理完成后再决定是否交给实际请求的servlet类处理。
利用这一点,我们可以新建一个类继承自Filter基类,重载doFilter方法,并在该方法中加入
request.setCharacterEncoding(“UTF-8”);
指定客户端的字符集为UTF-8(默认客户端的字符集为ISO8859),这样在ACTION类中取得的参数就不需要进行任何的转换处理了。
配置Filter的地方在web.xml,在web.xml文件中加入类似这样的配置即可以使自定义的Filter生效:
< filter>
< filter-name>charsetfilter< /filter-name>
< filter-class> international.CharsetFilter< /filter-class>
< init-param>
< param-name>encoding< /param-name>
< param-value>UTF-8< /param-value>
< /init-param>
< /filter>
< filter-mapping>
< filter-name>charsetfilter< /filter-name>
< url-pattern>/*< /url-pattern>
< /filter-mapping>
二.数据库设置
在数据库建库时需要将数据库的字符集指定为unicode编码类型,以支持多种语言。
有一点需要特别说明的是UTF-8是用3个字节表示一个汉字,这点在进行表结构设计时需要注意,适当设置字段的长度。
posted @
2007-12-28 09:54 kylixlu 阅读(185) |
评论 (0) |
编辑 收藏
Struts应用采用两个基于XML的配置文件来配置,分别是web.xml和struts-cofig.xml文件.web.xml文件是配置所有web应用的而struts-config.xml文件是struts专用的配置文件,事实上也是可以根据需要给这个配置文件起其他名称的.
Web应用的发布描述文件:
web应用发布描述文件可以在应用开着者,发布者和组装者之间传递配置信息,Web容器在启动的时候从该文件中读取配置信息,根据它来装载和配置web应用.文档类型定义DTD对XML文档的格式做了定义,DTD吧XML文档划分为元素,属性,实体每一种XML文档都有独自的DTD文件.可以从网上下载.<web-app>元素是web.xml的根元素,其他元素必须嵌入在<web-app>元素之内.要注意的是子元素也是有顺序的比如必须是首先<servlet>,然后<servlet-mapping>最后<taglib>.
为Struts应用配置Web.xml文件:
首先最重要的一步是配置ActionServlet,这个用<servlet>标签的servlet-name属性起一个名字叫action,然后用servlet-class属性指定ActionServlet的类.
然后用<servlet-mapping>标签的servlet-name属性指定action,在用url-pattern指定接收范围是*.do的请求.不管应用中包含了多少子应用,都只需要配置一个ActionServlet,类来出来应用中的不同的功能,其实者就是不必要的,因为Servlet本身就是多线程的,而且目前Struts只允许配置一个ActionServlet.声明ActionServlet的初始化参数:<servlet>的<init-param>子元素用来配置Servlet的初始化参数.param-name设置config参数名.param-value设置struts-config.xml的路径参数值.
配置欢迎使用清单:
如果客户访问Web的时候值是访问了WEB应用的根目录URL.没有具体的指定文件,Web会自动调用Web的欢迎文件.<welcome-file-list>元素来配置的.通过其中的<welcome-file>欢迎页面</welcome-file>来配置.
配置错误处理:
尽管Struts框架功能强大的错误处理机制,但是不能保证处理所有的错误或者异常.当错误发生时,如果框架不能处理这种错误,把错误抛弃给Web容器,在默认的情况下web容器会想客户端返回错误信息.如果想避免让客户看到原始的错误信息,可以在Web应用发布描述文件中配置<error-page>元素.通过<error-code>404来定义错误的类型.然后通过<location>要处理错误的JSP页面来对错误进行处理.还可以用<exception-type>来设置异常,然后通过<location>来处理异常的JSP页面来处理异常.
配置Struts标签库:
这个就和以前学到的JSP自定义标签类似,配置元素为<taglib>来配置.<taglib-uri>这个指定标签库的uri,类似起一个名称.<taglib-location>这个是标签库的位置也就是实际所在的路径.通过这样的方法引入一个标签库,然后在前台JSP页面就可以通过自己定义的URI来调用标签.
Struts配置文件:
struts-config.xml文件.
首先研讨一下org.apache.struts.config包,在struts应用启动的时候会把Struts配置文件信息读取到内存中,并把它们存放在config包中相关的JavaBean类的实例中.包中的每一个类都和struts配置文件中特定的配置元素对应,ModuleConfig在Struts框架中扮演了十分重要的角色,它是整个config包的核心,在Struts运行时来存放整个应用的配置信息.如果有多个子应用都会有一个ModuleConfig对象,它和Struts文件根元素的<struts-config>对应.根元素中包含<form-bean><action><forward>等元素.
<struts-config>元素:时Struts配置文件的根元素,和它对应的配置类ModuleConfig类,<struts-config>元素有8个子元素.他们的DTD定义是data-sources?form-bean? global-exception?global-forwards?action-mapping?controller?message-resources?plug-in*在Struts配置文件中,必须按照DTD指定的先手顺序来配置<struts-config>元素的各个子元素,如果颠倒了这些子元素的顺序,会产生错误.
<data-sources>元素:用来配置应用所需要的数据源,数据源负责创建和特定的数据库的连接.许多数据源采用连接池的机制实现.以便提高数据库访问的性能.JAVA语言提供了javax.sql.DataSource接口,所有的数据源都必须实现这个接口.许多应用服务器和Web服务器都提供了数据源组件.很多数据库厂商也提供了数据源的实现.<data-sources>元素包含多个<data-source>子元素永远配置特定的数据源.他们可以包含多个<set-property>子元素用于设置数据源的各种属性.配置了数据源以后,就可以在Action类中访问数据源,在Action中定义了getDataSource(HttpRequest)方法,用于获取数据源对象的引用.然后可以利用DataSource对象调用getConnection获取一个连接对象对数据库进行操作.在配置文件中声明多个数据源的时候需要为每一个数据源分配唯一的Key值,通过这个来表示特定的数据源.获取特定的数据源的时候可以用dataSource = getDataSource(reqeust,”A”);
<form-beans>元素:用来配置多个ActionForm,包含一个或者N个<form-bean>子元素.每个<form-bean>元素都包含多个属性.className指定和<form-bean>匹配的类.name指定该ActionForm的唯一标识符,这个属性是必须的以后作为引用使用.type指定ActionForm类的完整类名,这个属性也是必须的.注意包名也要加上.<form-property>是指定动态的Form的元素,以后会深入了解.
<global-exception>元素:用于配置异常处理,元素可以包含一个或者多个<exception>元素,用来设置JAVA异常和异常处理类ExceptionHandler之间的映射.className指定和元素对应的配置类,默认的不用动.handler指定异常处理类默认是ExceptionHandler.key指定在本地资源文件中异常的消息Key,path指定当前异常发生的时候转发的路径.scope指定ActionMessages实例存放的范围.type指定需要处理异常类的名字,必须的.bundle指定Resource Bundle.
<global-forwards>元素:用来声明全局转发,元素可以有一个或者N个<forward>元素组成,用于把一个逻辑名映射到特定的URL,通过这种方法Action类或者JSP页面无需指定URL,只要指定逻辑名称就可以实现请求转发或者重定向.这样可以减少控制组件和视图的聚合.易于维护.className对应的配置类.contextRelative如果为true表示当path属性以/开头的时候,给出的是对应的上下文URL默认是false.name转发路径的逻辑名,必须写.path转发或者重定向的URL,必须写必须是以/开头.redirect设置为true的时候表示执行重定向操作,此项为false的时候,表示执行请求转发操作.重定向与请求转发的区别以后就是重定向是把请求生成应答给客户端然后在重新发送给定向的URL,浏览器地址栏会有显示.而转发就是直接把请求转发给本应用的另一个文件,不生成应答所以客户端IE没显示.
<action-mapping>元素:包含一个或者N个<action>元素,描述了从特定的请求路径到响应的Action的映射.在<action>元素中可以包含多个<exception>和<forward>子元素,他们分别配置局部异常处理和局部转发.attribute设置Action关联的ActionForm在request或者session范围内的key.就是在request或者session共享内的名称.className对应配置元素的类.默认的是ActionMapping.forward指定转发URL路径include指定包含URL路径.input指定包含表单的URL,当表单验证失败的时候发送的URL.name,指定和该Action关联的Form名字.该名字必须是在form-bean中定义过的,可写可不写.path必须/开头的方位Action的路径.parameter指定Action配置参数.在Action的execute()方法中可以调用ActionMapping的getParameter()方法来读取匹配的参数.roles指定允许调用该Action的安全角色,多个角色之间逗号格开.scope指定Form的存在范围.默认是session.tyep指定Action的完整类名.unknown如果是true表示可以处理用户发出的所有的无效的ActionURL默认是false.validate指定是否调用ActionForm的validate方法.
<controller>元素:用于配置ActionServlet.buffreSize指定上载文件的输入缓冲大小.该属性为可选默认4096.className指定元素对应的配置类,ControllerConfig.然后是contentType指定响应结果内容类型和字符编码,该属性为可选,默认是text/html如果在Action或者JSP网页也设置了类型内容,会覆盖这个.locale指定是否把Locale对象保存到当前用户的session中默认false.tempDir指定处理文件上载的临时工作目录.nochache如果是true在响应结果中加入特定的头参数.
<message-resources>元素:用来配置Resource Bundle.用于存放本地文本消息文件.className元素对应的配置类.MessageResourcesConfig.factory指定消息的工厂类.key指定文件存放的Servlet对象中采用的属性Key.null指定如何处理未知消息.parameter指定消息的文件名.
<plug-in>元素:用于配置Struts插件.
配置多应用模块:所有的子应用都可以共享同一个ActionServlet实例,但是每个子应用都有单独的配置文件.把应用划分为多个子应用模块.首先为每个应用创建单独的Struts配置文件,在web.xml的ActionServlet配置代码中添加几个子应用信息.采用<forward>元素来实现应用之间的切换.
Digester组件:是一个Apache的另一个开源代码项目.当Struts被初始化的时候,首先会读取并解析配置文件,框架采用Digester组件来且西配置文件.然后创建config包中的对象.者对象用于存放配置信息.
其实配置文件不难,只要都理其中的原理就OK了.真正实际的项目开发中,采用的工具例如Eclipse系列,提供了相应的插件,在创建一个Struts工程的时候配置文件的标签都是自动生成的,而我们只需要往里面填写属性就OK了.
posted @
2007-12-27 21:23 kylixlu 阅读(154) |
评论 (0) |
编辑 收藏
Key Generator
主键产生器
可选项说明:
1) assigned
主键由外部程序负责生成,无需Hibernate参与。
2) hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主
键生成历史状态。
3) seqhilo
与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史
状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。
4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持
一个变量,以保存着当前的最大值,之后每次需要生成主键的时候
将此值加1作为主键。
这种方式可能产生的问题是:如果当前有多个实例访问同一个数据
库,那么由于各个实例各自维护主键状态,不同实例可能生成同样
的主键,从而造成主键重复异常。因此,如果同一数据库有多个实
例访问,此方式必须避免使用。
5) identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL
中的主键生成机制。
6) sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的
Sequence。
7) native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence
其中一种作为主键生成方式。
8) uuid.hex
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后
以长度32 的字符串表示)作为主键。
9) uuid.string
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些
数据库中可能出现问题(如PostgreSQL)。
10) foreign
使用外部表的字段作为主键。
一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适
应性。
另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提
供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数
据库提供的主键生成机制上,采用generator-class=native的主键生成方式。
不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,
大量并发insert数据时可能会引起表之间的互锁。
数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状
态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),
之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之
后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据
库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生
了较大影响。
因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成
机制。
posted @
2007-12-27 21:12 kylixlu 阅读(153) |
评论 (0) |
编辑 收藏