??xml version="1.0" encoding="utf-8" standalone="yes"?>
文g打包地址Qhttp://m.tkk7.com/Files/lifenote/tomcat配置ssl.rar
一下ؓ帮助说明Q?br />
1.1. 安全d SSL
1.1.1 WebLogic下面SSL配置Q?br />
1Q生?keystoreFileQ?br />
* keystoreFile 文g的生成:
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks
* csr 文g的生成:
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks
* 注意Q?http 的默认端口是80Qhttps 的默认端口是433Qftp 的默认端口是21?br />
2Q部|keystore 文g
?<http://hostname:7001/console> 中配|刚才生成的 testKey.jks 文g?/p>
1.1.2 Tomcat 下面SSL配置
1Q生?keystoreFileQ?br />
* keystoreFile 文g的生成:
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks
Example for inner testQ?br />
[root@localhost ~]#
/home/tomcat/jdk1.5.0_12/bin/keytool -genkey -alias localhost-tomcat -keyalg RSA -validity 365 -keystore /home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks
Enter keystore password: someday2007
What is your first and last name?
[Unknown]: lifenote
What is the name of your organizational unit?
[Unknown]: Java
What is the name of your organization?
[Unknown]: Sunxc
What is the name of your City or Locality?
[Unknown]: Beijing
What is the name of your State or Province?
[Unknown]: Beijing
What is the two-letter country code for this unit?
[Unknown]: ZH
Is CN=lifenote, OU=Java, O=Sunxc, L=Beijing, ST=Beijing, C=ZH correct?
[no]: y
Enter key password for <localhost-tomcat>
(RETURN if same as keystore password): someday2007
[root@localhost ~]#
* csr 文g的生成:
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks
* 注意Q?http 的默认端口是80Qhttps 的默认端口是433Qftp 的默认端口是21?/p>
2Q部|keystore 文g
打开 server.xml 文gQ修改内容如下:
* 只需L server.xml 中对SSL定义的注释,在加?keystoreFile、keystorePass q两个属性即可?br />
<Service
name="Catalina">
<Connector
port="8080"
...
</Connector>
<!-- Define a SSL HTTP/1.1 Connector on port 8443 --------------------- 要加入的内容在这?-->
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="e:/temp_E/ssl/testKey.jks"
keystorePass="aaaaaa"/>
<Connector
port="8009"
...
</Connector>
...
Example for inner testQ?br />
<Connector port="443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="/home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks"
keystorePass="password"/>
注意需默认要?443 而不?8443Q要使用8443要在apache中配|,保证从apachehtomcat 采用 <https://ip:8443/>... 的格式?/p>
1.1.3 使用http讉KWebService s的客L配置
Servlet服务器配|好SSL之后Q客L可以使用https讉K了?br />
对于用户使用览器访问https的方式,览器会弹出安装证书的对话框Q确认之后可以正怋用https讉K?br />
对于WebService 通过https方式讉KQ按照一下步骤:
1Q?nbsp;WebService客户端要先取得keyStore文gQ?br />
2Q?nbsp;虚拟机系l?System.setProperties(…) 讄keyStore信息Q?br />
3Q?nbsp;使用 url=<https://ip:port/...> 讉KWebService服务
to_char(sysdate, 'dd') 查看今天是几号to_char(sysdate, 'ww') 查看q是q个月第几个星期
to_char(sysdate, 'mm') 查看q是一q中W几个月
to_char(sysdate, 'yyyy') 查看q䆾last_day(to_date('2007-02-01','YYYY-MM-DD'))查看一个月的最后一天,add_months(sysdate,10)查看若干个月后的今天Qnext_day(sysdate,'星期?)l个日期查看后面的最q的星期几的日期Q不q这个星期五要是换成英文居然有问题,W?个参数可以是数字1-7Q分别表C周日到周六?/p>
下面贴个全的Q需要的时候顺便查一下?/p>
一、PL/SQL单行函数和组函数详解
函数是一U有零个或多个参数ƈ且有一个返回值的E序。在SQL中Oracle内徏了一pd函数Q这些函数都可被UCؓSQL或PL/SQL语句Q函C要分Z大类Q单行函数和l函数?/p>
本文讨论如何利用单行函C及用规则?br /> 1、SQL中的单行函数
SQL和PL/SQL中自带很多类型的函数Q有字符、数字、日期、{换、和混合型等多种函数用于处理单行数据Q因此这些都可被l称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY{子句中Q例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX{单行函数?/p>
SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)
单行函数也可以在其他语句中用,如update的SET子句QINSERT的VALUES子句QDELET的WHERE子句,认证考试特别注意在SELECT语句中用这些函敎ͼ所以我们的注意力也集中在SELECT语句中?/p>
2、NULL和单行函?/p>
在如何理解NULL上开始是很困隄Q就是一个很有经验的Z然对此感到困惑。NULLDCZ个未知数据或者一个空|术操作W的M一个操作数为NULL|l果均ؓ提个NULL?q个规则也适合很多函数Q只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL倹{在q些中NVL函数时最重要的,因ؓ他能直接处理NULL|NVL有两个参?NVL(x1,x2),x1和x2都式表达式,当x1为null时返回X2,否则q回x1?/p>
下面我们看看emp数据表它包含了薪水、奖金两,需要计ȝ补偿?/p>
column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2
不是单的薪水和奖金加v来就可以了,如果某一行是null值那么结果就是nullQ比如下面的例子Q?/p>
update empset salary=(salary+bonus)*1.1
q个语句中,雇员的工资和奖金都将更新Z个新的|但是如果没有奖金Q即 salary + null,那么׃得出错误的结论,q个时候就要用nvl函数来排除null值的影响?/p>
所以正的语句是:
update empset salary=(salary+nvl(bonus,0)*1.1
3、单行字W串函数
单行字符串函数用于操作字W串数据Q他们大多数有一个或多个参数Q其中绝大多数返回字W串?/p>
ASCII()
c1是一字符Ԍq回c1W一个字母的ASCII码,他的逆函数是CHR()
SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122
CHR()[NCHAR_CS]
i是一个数字,函数q回十进制表C的字符?/p>
select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B
CONCAT(,)
c1,c2均ؓ字符Ԍ函数c2q接到c1的后面,如果c1为null,返回c2.如果c2为null,则返回c1Q如果c1、c2都ؓnullQ则q回null。他和操作符||q回的结果相?/p>
select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda
INITCAP()
c1Z字符丌Ӏ函数将每个单词的第一个字母大写其它字母小写返回。单词由I格Q控制字W,标点W号限制?/p>
select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici
INSTR(,[,[,]])
c1,c2均ؓ字符Ԍi,j为整数。函数返回c2在c1中第jơ出现的位置Q搜索从c1的第i个字W开始。当没有发现需要的字符时返?,如果i敎ͼ那么搜烦从叛_左进行,但是位置的计还是从左到叻Ii和j的缺省gؓ1?/p>
select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2
INSTRB(,[,i[,j])
与INSTR()函数一P只是他返回的是字节,对于单字节INSTRB(){于INSTR()?/p>
LENGTH()
c1为字W串Q返回c1的长度,如果c1为nullQ那么将q回null倹{?/p>
select LENGTH('Ipso Facto') ergo from dualergo10
LENGTHb()
与LENGTH()一Pq回字节?/p>
lower()
q回c的小写字W,l常出现在where子串中?/p>
select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite
LPAD(,[,])
c1,c2均ؓ字符Ԍi为整数。在c1的左侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ单空|参见RPAD?/p>
select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe
LTRIM(,)
把c1中最左边的字W去掉,使其W一个字W不在c2中,如果没有c2Q那么c1׃会改变?/p>
select LTRIM('Mississippi','Mis') from dualLTRppi
RPAD(,[,])
在c1的右侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ单空?其他与LPAD怼?/p>
RTRIM(,)
把c1中最双的字W去掉,使其W后一个字W不在c2中,如果没有c2Q那么c1׃会改变?/p>
REPLACE(,[,])
c1,c2,c3都是字符Ԍ函数用c3代替出现在c1中的c2后返回?/p>
select REPLACE('uptown','up','down') from dualREPLACEdowntown
STBSTR(,[,])
c1Z字符Ԍi,j为整敎ͼ从c1的第i位开始返回长度ؓj的子字符Ԍ如果j为空Q则直到串的N?/p>
select SUBSTR('Message',1,4) from dualSUBSMess
SUBSTRB(,[,])
与SUBSTR大致相同Q只是I,J是以字节计算?/p>
SOUNDEX()
q回与c1发音怼的词?/p>
select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250
TRANSLATE(,,)
c1中与c2相同的字W以c3代替
select TRANSLATE('fumble','uf','ar') test from dualTEXTramble
TRIM([[]] from c3)
c3串中的第一个,最后一个,或者都删除?/p>
select TRIM(' space padded ') trim from dual TRIMspace padded
UPPER()
q回c1的大写,常出现where子串?/p>
select name from dual where UPPER(name) LIKE 'KI%'NAMEKING
4、单行数字函?/p>
单行数字函数操作数字数据Q执行数学和术q算。所有函数都有数字参数ƈq回数字倹{所有三角函数的操作数和值都是弧度而不是角度,oracle没有提供内徏的弧度和角度的{换函数?/p>
ABS()
q回n的绝对?/p>
ACOS()
反余弦函敎ͼq回-1?之间的数。n表示弧度
select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0
ASIN()
反正弦函敎ͼq回-1?Qn表示弧度
ATAN()
反正切函敎ͼq回n的反正切|n表示弧度?/p>
CEIL()
q回大于或等于n的最整数?/p>
COS()
q回n的余玄|n为弧?/p>
COSH()
q回n的双曲余玄|n 为数字?/p>
select COSH(<1.4>) FROM dualCOSH(1.4)2.15089847
EXP()
q回e的nơ幂Qe=2.71828183.
FLOOR()
q回于{于N的最大整数?/p>
LN()
q回N的自然对敎ͼN必须大于0
LOG(,)
q回以n1为底n2的对?/p>
MOD()
q回n1除以n2的余?br /> POWER(,)
q回n1的n2ơ方
ROUND(,)
q回舍入数点右边n2位的n1的|n2的缺省gؓ0Q这回将数Ҏ(gu)接近的整敎ͼ如果n2数就舍入到小数点左边相应的位上,n2必须是整数?/p>
select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54
SIGN()
如果n敎ͼq回-1,如果n为正敎ͼq回1Q如果n=0q回0
SIN()
q回n的正玄?n为弧度?/p>
SINH()
q回n的双曲正玄?n为弧度?/p>
SQRT()
q回n的^Ҏ(gu),n为弧?/p>
TAN()
q回n的正切?n为弧?/p>
TANH()
q回n的双曲正切?n为弧?/p>
TRUNC(,)
q回截尾到n2位小数的n1的|n2~省讄?Q当n2为缺省设|时会将n1截尾为整敎ͼ如果n2|截֜数点左边相应的位上?/p>
5、单行日期函?/p>
单行日期函数操作DATA数据cdQ绝大多数都有DATA数据cd的参敎ͼl大多数q回的也是DATA数据cd的倹{?/p>
ADD_MONTHS(,)
q回日期d加上i个月后的l果。i可以使Q意整数。如果i是一个小敎ͼ那么数据库将隐式的他转换成整敎ͼ会截去数点后面的部分?/p>
LAST_DAY()
函数q回包含日期d的月份的最后一?/p>
MONTHS_BETWEEN(,)
q回d1和d2之间月的数目,如果d1和d2的日的日期都相同Q或者都使该月的最后一天,那么返回一个整敎ͼ否则会返回的l果包含一个分数?/p>
NEW_TIME(,,)
d1是一个日期数据类型,当时区tz1中的日期和时间是dӞq回时区tz2中的日期和时间。tz1和tz2时字W串?/p>
NEXT_DAY(,)
q回日期d后由dowl出的条件的W一天,dow使用当前会话中给出的语言指定了一周中的某一天,q回的时间分量与d的时间分量相同?/p>
select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004
ROUND([,])
日期d按照fmt指定的格式舍入,fmt为字W串?/p>
SYADATE
函数没有参数Q返回当前日期和旉?/p>
TRUNC([,])
q回由fmt指定的单位的日期d
6、单行{换函?/p>
单行转换函数用于操作多数据类型,在数据类型之间进行{换?/p>
CHARTORWID()
c 使一个字W串Q函数将c转换为RWID数据cd?/p>
SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')
CONVERT(,[,])
c֭W串Qdset、sset是两个字W集Q函数将字符串c由sset字符集{换ؓdset字符集,sset的缺省设|ؓ数据库的字符集?/p>
HEXTORAW()
x?6q制的字W串Q函数将16q制的x转换为RAW数据cd?/p>
RAWTOHEX()
x是RAW数据cd字符Ԍ函数RAW数据c{换ؓ16q制的数据类型?/p>
ROWIDTOCHAR()
函数ROWID数据cd转换为CHAR数据cd?/p>
TO_CHAR([[,)
x是一个data或number数据cdQ函数将x转换成fmt指定格式的char数据cdQ如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制q回的月份和日䆾所使用的语a。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定数位和千分位的分隔W,以及货币W号?/p>
NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"
TO_DATE([,[,)
c表示字符Ԍfmt表示一U特D格式的字符丌Ӏ返回按照fmt格式昄的c,nlsparm表示使用的语a。函数将字符串c转换成date数据cd?/p>
TO_MULTI_BYTE()
c表示一个字W串Q函数将c的担子截字符转换成多字节字符?/p>
TO_NUMBER([,[,)
c表示字符Ԍfmt表示一个特D格式的字符Ԍ函数q回值按照fmt指定的格式显C。nlsparm表示语言Q函数将q回c代表的数字?/p>
TO_SINGLE_BYTE()
字W串c中得多字节字W{化成{h(hun)的单字节字符。该函数仅当数据库字W集同时包含单字节和多字节字W时才?/p>
7、其它单行函?/p>
BFILENAME(,)
dir是一个directorycd的对象,fileZ文g名。函数返回一个空的BFILE位置值指C符Q函数用于初始化BFILE变量或者是BFILE列?/p>
DECODE(,,[,,,[])
x是一个表辑ּQm1是一个匹配表辑ּQx与m1比较Q如果m1{于xQ那么返回r1,否则,x与m2比较Q依ơ类推m3,m4,m5....直到有返回结果?/p>
DUMP(,[,[,[,]]])
x是一个表辑ּ或字W,fmt表示8q制?0q制?6q制、或则单字符。函数返回包含了有关x的内部表CZ息的VARCHAR2cd的倹{如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回?/p>
EMPTY_BLOB()
该函数没有参敎ͼ函数q回 一个空的BLOB位置指示W。函数用于初始化一个BLOB变量或BLOB列?/p>
EMPTY_CLOB()
该函数没有参敎ͼ函数q回 一个空的CLOB位置指示W。函数用于初始化一个CLOB变量或CLOB列?/p>
GREATEST()
exp_list是一列表辑ּQ返回其中最大的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,那么q回的结果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?br /> LEAST()
exp_list是一列表辑ּQ返回其中最的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,返回的l果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?/p>
UID
该函数没有参敎ͼq回唯一标示当前数据库用L整数?/p>
USER
q回当前用户的用户名
USERENV()
Zoptq回包含当前会话信息。opt的可选gؓQ?/p>
ISDBA 会话中SYSDBA脚色响应Q返回TRUE
SESSIONID q回审计会话标示W?/p>
ENTRYID q回可用的审计项标示W?/p>
INSTANCE在会话连接后Q返回实例标C符。该值只用于q行Parallel 服务器ƈ且有 多个实例的情况下使用?/p>
LANGUAGEq回语言、地域、数据库讄的字W集?/p>
LANGq回语言名称的ISO~写?/p>
TERMINAL为当前会话用的l端或计机q回操作pȝ的标C符?/p>
VSIZE() x是一个表辑ּ。返回x内部表示的字节数?/p>
二、SQL中的l函?/p>
l函C叫集合函敎ͼq回Z多个行的单一l果Q行的准数量无法确定,除非查询被执行ƈ且所有的l果都被包含在内。与单行函数不同的是Q在解析时所有的行都是已知的。由于这U差别ɾl函C单行函数有在要求和行Z有微的差异.
1、组(多行)函数
与单行函数相比,oracle提供了丰富的Zl的Q多行的函数。这些函数可以在select或select的having子句中用,当用于select子串时常帔R和GROUP BY一起用?/p>
AVG([{DISYINCT|ALL}])
q回数值的q_倹{缺省设|ؓALL
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413
COUNT({*|DISTINCT|ALL} )
q回查询中行的数目,~省讄是ALL,*表示q回所有的行?/p>
MAX([{DISTINCT|ALL}])
q回选择列表目的最大|如果x是字W串数据cdQ他q回一个VARCHAR2数据cdQ如果X是一个DATA数据cdQ返回一个日期,如果X是numeric数据cdQ返回一个数字。注意distinct和all不v作用Q应为最大gq两U设|是相同的?/p>
MIN([{DISTINCT|ALL}])
q回选择列表目的最倹{?/p>
STDDEV([{DISTINCT|ALL}])
q回选者的列表目的标准差Q所谓标准差是方差的qx栏V?/p>
SUM([{DISTINCT|ALL}])
q回选择列表目的数值的d?/p>
VARIANCE([{DISTINCT|ALL}])
q回选择列表目的统计方差?/p>
2、用GROUP BYl数据分l?/p>
正如题目暗示的那L函数是操作那些已经分好l的数据Q我们告诉数据库用GROUP BY怎样l数据分l或者分c,当我们在SELECT语句的SELECT子句中用组函数Ӟ我们必须把ؓ分组或非常数列放|在GROUP BY子句中,如果没有用group byq行专门处理Q那么缺省的分类是将整个l果设ؓ一cR?/p>
select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982
在这个例子中Q我们用state字段分类;如果我们要将l果按照zip_codes排序,可以用ORDER BY语句QORDER BY子句可以使用列或l函数?/p>
select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982
3、用HAVING子句限制分组数据
现在你已l知道了在查询的SELECT语句和ORDER BY子句中用主函数Q组函数只能用于两个子串中,l函C能用于WHERE子串中,例如下面的查询是错误的:
错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk
q个语句中数据库不知道SUM()是什么,当我们需要指C数据库对行分组Q然后限制分l后的行的输出时Q正的Ҏ(gu)是用HAVING语句Q?/p>
SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;
4、嵌套函?/p>
函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可l承的执行过E。但函数的优先权只是Z位置Q函数遵循由内到外,由左到右的原则。嵌套技术一般用于象DECODEq样的能被用于逻辑判断语句IF....THEN...ELSE的函数?/p>
嵌套函数可以包括在组函数中嵌套单行函敎ͼ或者组函数嵌套入单行函数或l函C。比如下面的例子Q?/p>
SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt,COUNT(DISTINCT job) jobs,COUNT(DISTINCT mgr) mgrsFROM empGROUP BY deptno;DEPTNO CNT JOBS MGRS------ --- ---- ----10 4 4 220 4 3 430 3 3 2
2、Foreach 和For一样?/p>
3、Hiddenlg L多余S的处?br /> <input jwcid="@Hidden" type="hidden" value="ognl:blahblah" encode="false"/>
4?Insert lg
e.g.
<input type="text" jwcid="name@Insert" value="ognl:user.name"/>
面表现?会到页面类中寻找getUser().getName()Ҏ(gu)获取初值ƈ输出
相当于在面上显C数?
5?TextField lg
e.g.
<input type="text" jwcid="username@TextField" value="ognl:username"/>
面表现?会到页面类中寻找getUsername()Ҏ(gu)获取初?
*如果是修改信息页?通常初始D在页面表C前由setUsername()手动讄从数据库中读取出来的?
表单提交?通过setUsername()写入新?即用戯入?,在类中通过getUsername()获取新?
相当于在修改个h信息?首先d用户名赋予文本框(用户?初?用户修改时填入新?后台获取?
*Hidden属性区分是普通文本输入框(默认false)和密码输入框(hidden="ognl:true")
readonly属性设|只?readonly="true"为只?后台可读?
*disabled属性设|是否可?diabled="true"Z可写(后台也不可读?
6?TextArea lg
e.g.
<textarea jwcid="content@TextArea" value="ognl:content" cols="40" rows="10"></textarea>
面表现?会到页面类中寻找getContent()Ҏ(gu)获取初?
工作原理同TextField
7?RadioGroup/Radio lg
e.g.
<span jwcid="headImage@RadioGroup" selected="ognl:headImage">
<input jwcid="@Radio" type="radio" value="1"/>头像1
<input jwcid="@Radio" type="radio" value="2"/>头像2
<input jwcid="@Radio" type="radio" value="3"/>头像3
<input jwcid="@Radio" type="radio" value="4"/>头像4
<input jwcid="@Radio" type="radio" value="5"/>头像5
<input jwcid="@Radio" type="radio" value="6"/>头像6
</span>
RadioGroup为每一个Radio提供一个唯一的ID。RadioGroup跟踪当前被选中的属性|q且只有一个Radio能够被选中.
面提交ӞRadioGrouplg利用OGNL表达式向headImage字段写入被选中的Radiolg的value参数?
面表现?修改面),会到页面类中寻找getHeadImage()Ҏ(gu)获取初?然后L@Radiolg中与其相同的lgq勾选上.
8?PropertySelection lg
使用PropertySelectionlg必须要构造一个类来实现IPropertySelectionModel接口Qƈ且重写该接口?个方?
public int getOptionCount() //提供下拉菜单的长?
public Object getOption(int index) //提供select标签的option
public String getLabel(int index) //提供select标签的Label|也就是下拉菜单显C的内容
public String getValue(int index) //提供select标签的value?
public Object translateValue(String value) //selected后的q回|value值未必就是我们需要的q回|可以在这个方法里面对q回的value做对应的转换或修?
e.g.1. 性别下拉?
<select jwcid="gender@ProPertySelection" name="genderSelect" value="ognl:gender" model="supportedGender">
<option selected>先生</option>
<option>奛_</option>
</select>
代码
GenderSelectionModel.java
public class GenderSelectionModel implements IPropertySelectionModel {
public static final String male = "先生";
public static final String female = "奛_";
public static final String[] genderOptions = { male, female };
public int getOptionCount() {
return genderOptions.length;
}
public Object getOption(int index) {
return this.translateValue(genderOptions[index]);
}
public String getLabel(int index) {
return genderOptions[index].toString();
}
public String getValue(int index) {
return genderOptions[index];
}
public Object translateValue(String value) {
if (value.equals("先生")) {
return "1";
} else {
return "0";
}
}
}
代码
ModUserInfo.java
public IPropertySelectionModel getSupportedGender() {
return new GenderSelectionModel();
}
存入数据库中"1"代表先生,"0"代表奛_,通过translateValue(String value)Ҏ(gu)转换
面表现?通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedGender().
然后通过getGender()Ҏ(gu)获取初?比如获取"0",则在面昄时寻找valuegؓ"0"的选项即ؓ"奛_",q择之作为初始选择?
e.g.2. 日志cd下拉?
<select jwcid="logType@PropertySelection" name="typeSelect" value="ognl:logType" model="supportedType">
<option>心情日记</option>
<option>情感天地</option>
<option>生活感触</option>
</select>
代码
TypeSelectionModel.java
public class TypeSelectionModel implements IPropertySelectionModel {
private List typeList = new ArrayList();
public TypeSelectionModel(List typeList) {
this.typeList = typeList;
}
public int getOptionCount() {
return typeList.size();
}
public Object getOption(int index) {
return ((LogType)typeList.get(index)).getValue();
}
public String getLabel(int index) {
return ((LogType) typeList.get(index)).getName();
}
public String getValue(int index) {
return ((LogType) typeList.get(index)).getValue();
}
public Object translateValue(String value) {
return value;
}
}
代码
ModLog.java
public IPropertySelectionModel getSupportedType() {
TypeSelectionModel typeSelectionModel =
new TypeSelectionModel(loadType(getUser().getUserId()));
return typeSelectionModel;
}
private List loadType(int userid) {
...//从数据库载入该用L日志cd列表
}
面表现?通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedType().
然后通过value属性给出的初始值即,getLogType()Ҏ(gu)获取初?比如获取"2",则在面昄时寻找valuegؓ"2"的选项即ؓ"生活感触",q择之作为初始选择?
9?Formlg
e.g.
<form jwcid="logForm@Form">
...
</form>
Form的监?listener)Ҏ(gu)可以有两U方?
1. 在Formlg中声?
<form jwcid="logForm@Form" listener="ognl:listener:onLogin">
...
</form>
2. 在submitcdlg中声?
<input type="submit" jwcid="onLogin@Submit" listener="listener:onLogin" value="发表"/>或?
<span jwcid="@ImageSubmit" image="..." listener="listener:onLogin"><img src="..." width="" height=""/></span>
前一U方式当Form中只要有submit׃触发监听Ҏ(gu),后一U方式是Form中有多个submit,各自实现不同的监听方?
G) Foreach lg
e.g.
<span jwcid="@Foreach" source="ognl:logList" value="ognl:item">
循环lg,遍历source参数,在表现其内容前更新value参数,Foreachlg所包含的内定w复表?其中可以通过value参数获取所需昄内容.
本例?面表现旉过getLogList()Ҏ(gu)获取日志列表,循环取出其中数据更新item(日志对象)q予以显C?其中item需要在面规范(.page)文g中声?
<property name="item"/>
*class参数用来LcMCSS的文件对Foreachq行修饰.
Foreachlg: class="ognl:beans.evenOdd.next"
Page文g: <bean name="evenOdd" class="org.apache.tapestry.bean.EvenOdd"/>
CSS文g: tr.odd{background-color: #ffffff;}tr.even{background-color: #eeeeee;}
10?Conditional lg
e.g.
<span jwcid="@Conditional" condition='ognl:item.sex.equals("1")'>先生</span>
<span jwcid="@Conditional" condition='ognl:item.sex.equals("0")'>奛_</span>
conditional参数为true时运行Conditionallg中的HTML模板内容.
在Tapestry4.0以后׃支持该组件了, 可以使用其他lg来实?
1. Contrib:Choose和Contrib:When
<library id="contrib" specification-path="classpath:/org/apache/tapestry/contrib/Contrib.library"/>(.application文g中引入Contribcd)
<span jwcid="@contrib:Choose">
<span jwcid="@contrib:When" condition='ognl:user.gender.equals("1")'>先生</span>
<span jwcid="@contrib:When" condition='ognl:user.gender.equals("0")'>奛_</span>
</span>
2. Iflg
<span jwcid="@If" condition='ognl:item.sex.equals("1")'>先生</span>
<span jwcid="@If" condition='ognl:item.sex.equals("0")'>奛_</span>
3. Elselg
<span jwcid="@Else">man</span>
?===========================ts的函数执行顺?=======================================?br />
对之前的该文章进行了一些修正,主要是针对finishLoad()Ҏ(gu)?
我觉得对初学者会有一些帮助?
下面q几个函数是我在使用的,它们的执行顺序依ơ从上到下?
1.protected void finishLoad() {} ***
2.public void pageValidate(PageEvent event) {}
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {}
4.public void pageBeginRender(PageEvent event) {}
// 如果有表单提交,则将form中的各字D늚Dl页面类
5. ...... 赋?
6.public void submit() // 表单提交{用listenter:调用的方?
7.protected void prepareForRender(IRequestCycle cycle) {}
----------------------------------------------------
1.protected void finishLoad() {}
q个函数最先执行,但是它实际上没有什么用处(我感觉)。因为:
q个函数只在面池中没有某一个页面类、需要生成一个新的页面对象时才调用。这里就有一个陷阱:如果你的tomcat启动时用了-Dorg.apache.tapestry.disable-caching=true(Z调试方便而设)Q那么你每次h面Ӟ它都会执行(因ؓ每个request都会新生成一个页面类对象Q,造成了它L执行的假象。在实际的部|时Q会使用cachingQ则q个函数执行的机会很。所以要注意?
初始化的代码攑֜4 pageBeginRender()?
2.public void pageValidate(PageEvent event) {}
如果实现了PageValidateListener接口Q则可以在这里进行验证,比如讉K权限{。执行完1后,它就开始执行?
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {}
如果实现了IExternalPage接口Q则可以从这里取得由外面传过来的参数。执?后,执行到这里。在q里可以把那些参数取出,赋给面cR?
4.public void pageBeginRender(PageEvent event) {}
执行?后,执行本函数。但是这时从客户端传q来的参数还没有被赋?如果提交了表单的?。这里可以进行一些初始化操作?
5.执行?后,如果有表单提交,在这里将会取出那些|赋给对应的字Dc?注意Q只是将表单中有的Dq来)
6.public void submit()
如果有表单提交的话,在这里将q行对应的操作。因为此时各字段已经取好gQ所以可以拿来直接用?
7.protected void prepareForRender(IRequestCycle cycle) {}
最后才执行q个Ҏ(gu)。我们可以在其中q行Z在页面上昄数据而进行的操作Q比如取得什么对象什么的Q因里页面类的属性赋值已l结束,可以直接拿来使用了?
注意Q如果执行了6Q则q要执行4Q再执行7。如果没?Q?完了q接是7?
以上是我所ȝ的执行顺序,不当之处h出?nbsp;
-----------------------------------------------------
最开始学tapestry的时候,觉得“怎么有这么多地方需要持久啊”。原来以前只知道pageBeginRenderq个函数Q什么初始化操作都放在它里面。可是它是在赋g前执行,所以拿到的字段多都是空的,却都以ؓ是没有持久化的缘故。所以在客户端里放了一大堆的@HiddenQ或者session中持久,非常ȝQ,Q对tapestry也生的怀疑。现在才知道那些需要取得客L传来的参数的代码Q最好放在prepareForRender里,很多不必要的持久都可以省掉了