1 目的
规范
数据库设计。
2 概述
从
数据库的
设计原则
设计文档几方面论述
数据库设计的规范思想及命名规则。
3
数据库应用结构
根据对一般
业务系统的分析,将
数据库和程序系统
统一进行整体描述,展示
数据库的
表之间以及与程序模块间的关系。
3.1 数据表和程序模块的分类
根据“处理特点”,将数据表和程序模块进行分类如下:
数据表分类:业务数据表、基本编码表、辅助编码表、系统信息表、累计数据表、结
算数据表、决策数据表。
程序模块分类:初始化、业务处理、完整性检测与修正、结算处理、统计处理。
3.1.1 数据表分类说明
业务数据表:记录业务发生的过程和结果。如,合同、出仓单、申请单、凭证。
基本编码表:描述业务实体的基本信息和编码。如,产品、客户、供应商、雇员。
辅助编码表:描述属性的列表值。如,合同类型、职称、民族、付款方式。
系统信息表:存放与系统操作、业务控制有关的参数。如,用户信息、权限、用户配
置信息、
成本核算方式。
累计数据表:存放业务的当前值和累计值。如,当前
库存、当前存款、累计销售、累
计支出、应收账款。
结算数据表:存放各个时期末的结存数。如,月末库存、月末银行存款、应收账款月
结。
决策数据表:存放各个时期内发生的统计值。如,月销售统计、月回款统计、出入库
统计。
3.1.2 程序模块分类说明
初始化:系统运行前对系统进行数据的初始化。如,库存初始化。
业务处理:业务过程的控制和结果记录。如,合同录入、费用审批、出入库。
完整性检测与修正:对累计数据表进行检查并自动修正。如对当前库存、当前存款、
累计销售的检查和重新
计算。
结算处理:计算并记录各个时期末的结存数。库存月结、应收账款月结。
统计处理:计算并记录各个时期内发生的统计数。如,统计月销售、统计月回款、统
计出入库。
3.2 数据表间的关系
业务数据表<-->基本编码表 主-外键关系。如,合同表<-->客户编码表;
业务数据表<-->辅助编码表 主-外键关系。如,合同表<-->付款方式;
业务数据表、累计数据表、结算数据表:累计数据表=结算数据表(上期末) + 业务数
据表(本期内发生)。如当前库存=上月末库存数+(本月入库数-本月出库数);
决策数据表<-->业务数据表 决策数据表的数据是由业务数据表中数据导出(统计)的;
3.3 数据表与程序模块间的关系
由一个例子(仓库管理)来说明数据表与程序模块之间的关系:
. 系统使用前,由初始化模块对库存数(累计数据表)和上月末库存数(结存数据表)进
行初始化;
. 当有入库业务发生时,由入库模块(业务处理)将入库单录入并保存到入库单明细帐(
业务数据表)中,同时将入库数累加到库存数(累计数据表)中;
. 定期或不定期,库存数核算模块(检查完整性检测与修正)根据上月末的库存数(结存
数据表)、本月已发生数(业务数据表)检查当前的库存数(累计数据表)是否符合,不符合
则给出提示,可手工或自动进行更正(当前库存数=上月末库存数+本月入库数-本月出库数
);
. 每月初,进行上月的月结处理。月结模块(结算处理)根据上月初的库存数(结存数据
表)、上月发生数(业务数据表)计算出上月末的库存数(累计数据表)。公式为:上月末库
存数=上月初库存数+上月入库数-上月出库数;
. 每个月月结后,库存业务月统计模块(统计处理)统计上月的各种库存商品的入库和
出库数,便于查询和生成报表,也作为决策
支持的数据
基础。
3.4 数据表命名时对数据表分类的考虑
. 业务数据表:t_d_<系统标识>_<表标识>。如销售系统的合同表 t_d_SH_Contract
或 t_d_SH_合同;
. 基本编码表:t_b_[<系统标识>]_<表标识>。如客户编码表t_b_Customer 或 t_b_客
户;
. 辅助编码表:t_a_[<系统标识>]_<表标识>。如合同类别t_a_ContType 或 t_a_合同
类别;
. 系统信息表:t_s_[<系统标识>]_<表标识>。如用户表t_s_User 或 t_s_用户;
. 累计数据表:t_t_<系统标识>_<表标识>。如当前库存表t_t_SO_Stock 或 t_t_SO_
库存;
. 结算数据表:t_c_<系统标识>_<表标识>。如库存月结表t_c_SO_StockMonth 或
t_c_SO_库存月结;
. 决策数据表:t_w_<系统标识>_<表标识>。如月销售统计表t_w_SH_SellMonth 或
t_w_SH_月销售统计;
注:[]内的内容表示可选。如“t_s_[<系统标识>]_<表标识>”表示t_s_SH_User 和
t_s_User 都是符合规则的。
4
数据库结构原则
规定除
数据库设计所遵循的范式外的一些适用原则,在遵循
数据库设计范式的基础上
,合理地划分表,添加状态和控制字段等。
4.1 辅助编码表
为了使辅助编码表能起到预期的效能,又不因过多的辅助编码表难以管理,故对辅助
编码表的使用作如下规定:
1. 当某辅助编码表的编码允许用户添加时,应
设计成“独立”的数据表;否则,将不
允许用户添加编码的各辅助编码表合并成一个“通用”的辅助编码表。
2. “独立”的辅助编码表与主表的列采用主-外约束保证列数据完整性。
3. “通用”的辅助编码表与各主表间没有约束关系,主表列的数据完整性由列说明的
“域”来保证。
4. “通用”的辅助编码表除编码和名称列外,还有一个标识列,用来标识合并前的各
码表,该标识列+编码列作为该表的主键。
5. 对于“独立”的辅助编码表,用户只可添加新的编码和改变名称,并且不能改变一
个编码所代表的意义;对于“通用”的辅助编码表,原则上不允许用户修改,或只有限地
允许修改名称。
4.2 基本编码表
1. 基本编码表可以有如下的标识列:内编码、外编码、助记码、简称、全称。内编码
(唯一编码)作为主键有程序自动生成,用户不可见;外编码(唯一编码)由用户按某种
规则自行定义,用户可见;助记码为拼音缩,方便录入,不唯一,重码时由列表
选择;简
称用于列表显示和报表,以便缩短行宽。以上的列在实现时可视情况和习惯加以删减。
2. 当码表的列较多且也行较多时,可将上述的标识列和常用的信息存于一个表,将其
它的信息另表存储。
4.3 业务数据表
1. 设有‘录入人’和‘录入日期’列,由系统自动记录。
2. 记录单据的表中设置“自动单据号”,由两个字符开始以区分单据类型,后跟一数
字序列表示序号。‘自动单据号’由系统自动生成,作为主表的主键,不允许用户修改。
当有对应的纸质单据时,设置“单据号”用于记录纸质单据的单据号。
3. 明细表中设有行序号,自动记录行的录入顺序。
4. 设置“存档标记”列,用于抽取数据到决策
数据库时的更新标记。插入新行或修改
已有行时设置该标记;数据抽取后清除该标记。
5. 对于用于查询过滤条件的列,不可为空,以免行“丢失”。
6. 对于数值列,不可为空,“0”作为默认值。
7. 对于必要的“冗余”列,如客户名称,应有相应的程序保持各“冗余”列的同一性
,以免出现异议。
8. 设置“过程状态”列和“记录状态”列。过程状态列用于记录如创建、审核、记账
、冲红等状态;记录状态用于记录如有效、删除等状态。
5
数据库命名原则
5.1 表名
. 业务数据表:t_d_<系统标识>_<表标识>。
. 基本编码表:t_b_[<系统标识>]_<表标识>。
. 辅助编码表:t_a_[<系统标识>]_<表标识>。
. 系统信息表:t_s_[<系统标识>]_<表标识>。
. 累计数据表:t_t_<系统标识>_<表标识>。
. 结算数据表:t_c_<系统标识>_<表标识>。
. 决策数据表:t_w_<系统标识>_<表标识>。
5.2 视图
v_<视图类型>_[<系统标识>]_<视图标识>。视图类型参见《表的分类》。
5.3 存储过程
p_[<系统标识>]_<存储过程标识>
5.4 函数
f_[<系统标识>]_<函数标识>
5.5 触发器
tr_<表名>_<i,u,d的任意组合> (after)
ti_<表名>_<i,u,d的任意组合> (instead)
5.6 自定义数据类型
ud_<自定义数据类型标识>_<数据类型>
5.7 Default
df_<Default标识>
5.8 Rule
ru_<Rule标识>
5.9 主键
pk_<表名>_<主键标识>
5.10 外键
fk_<表名>_<主表名>_<外键标识>
posted @
2007-04-09 16:46 larryjava 阅读(165) |
评论 (0) |
编辑 收藏
jikes
是一个速度远快于 javac 的
java
编译器.
整合 ant 的方法:
- 设置环境变量 JIKESHOME 为 jikes 的路径
- 设置 ANT_OPTS=-Dbuild.compiler=jikes
- 将 jikes 路径添加到系统 PATH 中
注意区分大小写.
然后在所有的ant任务就默认使用 jikes 了, 如果你想在单个工程中使用 ant, 就不要添加 ANT_OPTS 环境变量, 只需要修改 build.xml 中 javac 标签中的 compiler 为 jikes, 例如:
<javacdestdir="${build.dir}"debug="true"deprecation="false"optimize="false"failonerror="true"compiler="jikes">
jikes 中可以设置如下值:
- classic ( JDK 1.1 或者 1.2 标准 ) – 也可以使用 javac1.1 和 javac1.2 作为别名.
- modern ( JDK 1.3/1.4/1.5 标准 ) – javac1.3, javac1.4, javac1.5 可以作为别名.
- jikes
- jvc - 微软的那个编译器
- kjc - kopi 编译器
- gcj - GCC 中的 gcj 编译器
- sj - Symantec 的 java 编译器
- extJavac 根据现有 jvm 决定使用 classic 或者 modern 模式
另外 jikes 中还有几个附加的属性设置:
build.compiler.emacs=false
build.compiler.fulldepend=false
build.compiler.pedantic=false
build.compiler.warnings=true
build.compiler.warnings 这个属性设置最好在 javac 标签中使用 nowarn 属性.
保存为 build.properties 文件, 在 build.xml 中这样调用:
<propertyfile="build.properties"/>
就可以使用 jikes 的附加属性了。
整合 tomcat 的方法:先如上设置 JIKESHOME 和系统 PATH ,在 web 应用的 web.xml 中添加:
<servlet>
<servlet-name>
jsp
</servlet-name>
<servlet-class>
org.apache.jasper.servlet.JspServlet
</servlet-class>
<init-param>
<param-name>jspCompilerPlugin</param-name>
<param-value>org.apache.jasper.compiler.JikesJavaCompiler</param-value>
</init-param>
<load-on-startup>
-1
</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>
jsp
</servlet-name>
<url-pattern>
*.jsp
</url-pattern>
</servlet-mapping>
如果想要在所有 WEB 应用中使用 jikes, 则设置环境变量 CATALINA_OPTS=-Dbuild.compiler.emacs=true, 然后打开 ${TOMCAT_HOME}/conf/web.xml, 找到:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet> 改为:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>compiler</param-name>
<param-value>jikes</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
posted @
2007-02-05 10:03 larryjava 阅读(266) |
评论 (0) |
编辑 收藏
#
!/
bin
/
sh
#
# chkconfig:
345
86
14
# description: manager tomcat
#
# filename:
/
etc
/
rc.d
/
init.d
/
tomcat5
#
javaDir
=
`ls
/
usr
/
java`
for
java in $javaDir
do
export JAVA_HOME
=
"
/usr/java/${java}
"
done
export TOMCAT_HOME
=
"
/usr/tomcat5
"
case
$
1
in
start) $TOMCAT_HOME
/
bin
/
startup.sh
;;
stop) $TOMCAT_HOME
/
bin
/
shutdown.sh
;;
restart) $TOMCAT_HOME
/
bin
/
shutdown.sh
$TOMCAT_HOME
/
bin
/
startup.sh
;;
*
) echo
"
Usage: $0 {start|stop|restart}
"
;;
esac
exit
0
posted @
2007-02-02 09:40 larryjava 阅读(249) |
评论 (0) |
编辑 收藏
Tomcat启动可以用自带的确jsvc来实现:jsvc本来要从
http://jakarta.apache.org/ 下载 commons-daemon-1.0-Alpha ,不过tomcat 已经自己带了一个了,在tomcat/bin目录下有一个jsvc.tar.gz 解压,编译: #tar -xzvf jsvc.tar.gz #cd jsvc-src 运行#sh support/buildconf.sh #./configure --with-java=/usr/java#make(注意:tomcat-5.0.18版本带的jsvc源代码有一个低级错误--少一个分号,会导致编译不成功,可以自己加上这个分号) tomcat自己带的jsvc-src/native目录下还有两个脚本 Tomcat.sh 和 Tomcat5.sh ,可以用作启动和停止tomcat的脚本,我把Tomcat5.sh略作修改,文件如下: 代码:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#!/bin/sh
#
# Startup Script for Tomcat5
#
# chkconfig: 345 87 13
# description: Tomcat Daemon
# processname: jsvc
# pidfile: /var/run/jsvc.pid
# config:
#
# Source function library.
. /etc/rc.d/init.d/functions
#
prog=tomcat
#
# Small shell script to show how to start/stop Tomcat using jsvc
# If you want to have Tomcat running on port 80 please modify the server.xml
# file:
#
#
# # port="80" minProcessors="5" maxProcessors="75"
# enableLookups="true" redirectPort="8443"
# acceptCount="10" debug="0" connectionTimeout="60000"/>
#
# You need a developement version of Tomcat (Apache Tomcat/4.1-dev)
#
# Adapt the following lines to your configuration #设定自己的参数
JAVA_HOME=/usr/local/j2sdk1.4.2-04
CATALINA_HOME=/usr/local/jakarta-tomcat-5.0.19
DAEMON_HOME=$CATALINA_HOME/bin
#需要在系统中设定一个没有权限的
#用户来运行,这样比较安全
TOMCAT_USER=tomcat5
TMP_DIR=/var/tmp
CATALINA_OPTS=
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar start(){
echo -n $"Starting $prog: "
#
# Start Tomcat
#
$DAEMON_HOME/jsvc-src/jsvc \
-user $TOMCAT_USER \
-home $JAVA_HOME \
-Dcatalina.home=$CATALINA_HOME \
-Djava.io.tmpdir=$TMP_DIR \
-outfile $CATALINA_HOME/logs/catalina.out \
-errfile '&1' \
$CATALINA_OPTS \
-cp $CLASSPATH \
org.apache.catalina.startup.Bootstrap
#
# To get a verbose JVM
#-verbose \
# To get a debug of jsvc.
#-debug \
RETVAL=$?
[ $RETVAL = 0 ] && touch /var/lock/subsys/jsvc
[ $RETVAL = 0 ] && echo_success || echo_failure
echo
return $RETVAL
}
stop(){
echo -n $"Stopping $prog: "
#
# Stop Tomcat
#
PID=`cat /var/run/jsvc.pid`
kill $PID
RETVAL=$?
[ $RETVAL = 0 ] && rm /var/lock/subsys/jsvc
[ $RETVAL = 0 ] && echo_success || echo_failure
echo
return $RETVAL
} case "$1" in
start)
start
;; stop)
stop
;; restart|reload)
stop
start
;; *)
echo "Usage $0 start/stop"
exit 1;;
esac^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^把这段代码保存为 /etc/rc.d/init.d/tomcat ,然后运行 #chkconfig --add tomcat用--list看一下是否系统已有tomcat启动文件
#ckhconfig --list即可把tomcat 添加为系统服务自动随系统启动了。这个脚本会在runlevel 3/4/5三种模式自动启动。注意这段脚本是为tomcat5创建的,如果你用tomcat4,则需要在另一个tomcat.sh的基础上修改。
posted @
2007-02-02 09:26 larryjava 阅读(163) |
评论 (0) |
编辑 收藏
webwork默认的类型转换是不支持lob的,开发的时候formBean直接用域模型代替,往往根据域模型生成的model有lob字段,webwork不支持,我们需要手工加个。
java 代码
public class ClobConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map map, Object object, Class clazz) {
if (null != object && clazz == Clob.class) {
return ClobUtils.createClob(String.valueOf(object));
}
return super.convertValue(map, object, clazz);
}
} 在classpath中加上如下的全局的类型转换:xwork-conversion.properties
properties代码
java.sql.Clob=com.shunpe.framework.typeconverter.ClobConverter
posted @
2007-01-13 18:17 larryjava 阅读(190) |
评论 (0) |
编辑 收藏
返回值进行区分: 1.如果是String型
代码
-
<
ww:
if
test
=
"
sftd.equals(\
"
4
\
"
)
"
></
ww:
if
>
2.如果是char型
代码
-
<
ww:
if
test
=
"
sftd.equals('4')
"
></
ww:
if
>
3.如果是int型
代码
-
<
ww:
if
test
=
"
sftd==4
"
></
ww:
if
>
在循环中:
代码
注意:id==model.belong,而不是belong==model.belong
定义变量
代码 <ww:set name="tt1" value="'aaaaaaaaaaaaaa'"/> <ww:property value="#tt1"/>
注意:字符串要加''
日期显示:
<ww:property value="createTime.toString()" />
<ww:if test="selectedByOthers!='true'">
<input onclick="ST(this); " type="checkbox" name="$$SelectDoc" value="<ww:property value='id'/>" style="border: 0pt;"/>
</ww:if>
<ww:else>
<input type="radio" name="$$SelectDoc" value="<ww:property value='id'/>|<ww:property value='topic'/>"
<ww:if test="id.toString().equals(aboutDocid)">checked</ww:if>
<ww:if test="#status.count % 2">style="border: 0pt;"</ww:if>
<ww:else>style="border: 0pt;background-color:#F7F7F7"</ww:else> >
</ww:else>
在ww:if比较时id.toString().equals(aboutDocid)中的id是长整型,必须通过toString()成为字符串后再与字符型的aboutDocid比较,否则不报错,却也得不到想要的结果。因为这些代码是写在jsp页面的,这个小细节经常忘记,导致显示的结果不正确却又一时想不起原因来。:) |
posted @
2007-01-13 17:45 larryjava 阅读(292) |
评论 (0) |
编辑 收藏
转载于CSDN
在.net开发中,充分利用免费控件是好事情,但是如果不能修改控件达到自己的需求,就要动用JS大法了,前提是研究好浏览器模型 的各种对象的方法属性。尤其是熟悉CSS+HTML就会做的很酷。就JS语言本身来说要求不高。
1,动态删除Table 里面内容技巧,不需要写太多代码,一行:
tb.removeNode(true)
2,动态增加行,除了CreateElement方法,还可以这样比较短小:
<table id=tb1></table>
<SCRIPT>
function addTable(){
var row1 = tb1.insertRow();
var cell1=row1.insertCell();
var cell2=row1.insertCell();
cell1.innerText="灰豆宝宝";
cell2.innerText="超级大笨狼"
}
</SCRIPT>
<INPUT TYPE = "button" VALUE = "AddTable" onclick = "addTable()">
3,在DIV中动态增加Table
<SCRIPT>
function addTable(){
var tb1 = document.createElement("table");
tb1.border="1px";
var row1 = tb1.insertRow();
var cell1=row1.insertCell();
var cell2=row1.insertCell();
mydiv.appendChild(tb1);
cell1.innerText="wanghr100";
cell2.innerText="panyuguang962"
}
</SCRIPT>
<BODY>
<div id=mydiv style="width:400;height:300;"></div>
<INPUT TYPE = "button" VALUE = "AddTable" onclick = "addTable()">
4,在DIV中删除Table,简单只要Div.innerHTML=""就可以。
以上是部分实用相对短小的代码,当然有其他各种办法实现,不过一般都比上面的长,比如组合使用DIV对象的insertAdjacentHTML 方法等,在不同需要下使用不同方法,前提是研究好浏览器模型 的各种对象的方法属性。尤其是熟悉CSS+HTML就会做的很酷。就JS语言本身来说要求不高。
以下是以Document对象为例,相关方法有:
Method Description
attachEvent
createAttribute
createComment
createDocumentFragment
createElement
createEventObject
createStyleSheet
createTextNode
detachEvent
getElementById
getElementsByName
getElementsByTagName
mergeAttributes
recalc
write
writeln
以DIV对象为例相关方法有:
addBehavior
appendChild
applyElement
attachEvent
clearAttributes
cloneNode
contains
detachEvent
getAdjacentText
getAttribute
getAttributeNode
getElementsByTagName
hasChildNodes
insertAdjacentElement
insertAdjacentHTML
insertAdjacentText
insertBefore
mergeAttributes
normalize
removeAttribute
removeAttributeNode
removeBehavior
removeChild
removeExpression
removeNode
replaceAdjacentText
replaceChild
replaceNode
setActive
setAttribute
setAttributeNode
setExpression
其他,比如下拉列表对象,和拖拽操作等我有时间也整理比较一下,实现相同功能,相对比较短的精彩代码是值得收藏的。
1. removeNode(true) 非IE浏览器不支持的,应该用 obj.parentNode.removeChild(obj);
2. insertRow(x) insertCell(y) 这个参数是IE里是可以缺省,但是在非IE浏览器里不可缺省
<SCRIPT>
function addTable(){
var tb1 = document.createElement("TABLE");
tb1.border="1px";
var row1 = tb1.insertRow(0);
var cell1=row1.insertCell(0);
var cell2=row1.insertCell(1);
document.getElementById("mydiv").appendChild(tb1);
cell1.innerHTML="wanghr100";
cell2.innerHTML="panyuguang962";
row1.insertCell(2).innerHTML="要注意:给的例子要考虑全面";
}
</SCRIPT>
<BODY>
<div id="mydiv" style="width:400;height:300;"></div>
<INPUT TYPE = "button" VALUE = "AddTable" onclick = "addTable()">
posted @
2006-11-24 19:10 larryjava 阅读(389) |
评论 (0) |
编辑 收藏
Oralce中的to_date()函数用于将字符串转换为日期对象,具体使用格式为:
to_date( string,
[
format_mask
]
,
[
nls_language
]
)
string1
要转换的字符串.
format_mask
可选项,日期转换格式.
nls_language
可选项. 指定用于转换字符串的nls language.
其中
format_mask主要有以下几种格式:
Format Code
|
Explanation
|
YEAR
|
Year, spelled out
|
YYYY
|
4-digit year
|
MM
|
Month (01-12; JAN = 01).
|
MON
|
Abbreviated name of month.
|
MONTH
|
Name of month, padded with blanks to length of 9 characters.
|
D
|
Day of week (1-7).
|
DAY
|
Name of day.
|
DD
|
Day of month (1-31).
|
DDD
|
Day of year (1-366).
|
DY
|
Abbreviated name of day.
|
HH
|
Hour of day (1-12).
|
HH12
|
Hour of day (1-12).
|
HH24
|
Hour of day (0-23).
|
MI
|
Minute (0-59).
|
SS
|
Second (0-59).
|
SSSSS
|
Seconds past midnight (0-86399).
|
[问题]
ORA-01810: format code appears twice
可能是像Java那样指定日期格式,比如:
to_char('2006-06-01 18:00:00' 'yyyy-mm-dd hh:MM:ss')
而在Oracle中的日期格式是不区分大小写的,所以 mm 出现了两次。
正确的写法是:
to_char('2006-06-01 18:00:00' 'yyyy-mm-dd hh:mi:ss')
ORA-01722: invalid number
可能是指定小时为hh,而hh取值范围是 1-12,所以如果指定小时为 0 点将出现这个异常,比如:
to_char('2006-06-01 00:00:00' 'yyyy-mm-dd hh:MM:ss')
正确的写法是:
to_char('2006-06-01 00:00:00' 'yyyy-mm-dd hh24:MM:ss')
posted @
2006-11-19 20:18 larryjava 阅读(351) |
评论 (0) |
编辑 收藏
在很多程序请求是都有等待的页面!
在WebWork2.1.1开始,就新增了一个拦截器:execAndWait
<interceptor name="execAndWait" class="com.opensymphony.webwork.interceptor.ExecuteAndWaitInterceptor"/>
execAndWait将请求的Action放到后台执行,同时返回"wait"的输出结果;再次同样的Action请求,如果Action执行完毕,它将返回
真正的输出结果。
注意:"wait"输出等待页面时必须包含下面语句:
<meta http-equiv="refresh" content="5;url="<ww:url includeParams="'all'" />">
它每隔5秒钟,重新刷新前面的action请求。
Example:
// WaitAction.java
package example.wait;
import com.opensymphony.xwork.Action;
public class WaitAction implements Action{
public String execute() throws Exception {
try {
System.out.println("-----start sleep!");
Thread.sleep(2000 * 10);
System.out.println("-----end sleep!");
} catch (InterruptedException e) {
e.printStackTrace();
}
return SUCCESS;
}
}
xwork.xml:
<action name="wait" class="example.wait.WaitAction">
<result name="success" type="dispatcher">
<param name="location">/success.jsp</param>
</result>
<result name="wait" type="dispatcher">
<param name="location">/wait.jsp</param>
</result>
<interceptor-ref name="execAndWait"/>
</action>
wait.jsp:
<%@ taglib uri="webwork" prefix="ww" %>
<HTML>
<HEAD>
<meta http-equiv="refresh" content="5;url="<ww:url includeParams="'all'" />">
</HEAD>
<BODY>
Wait..............
</BODY>
</HTML>
posted @
2006-11-08 17:13 larryjava 阅读(455) |
评论 (0) |
编辑 收藏
posted @
2006-11-01 16:30 larryjava 阅读(277) |
评论 (0) |
编辑 收藏