??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品在线视频观看,国产日韩一区二区三免费高清 ,中文字幕在线视频网http://www.aygfsteel.com/vaga/category/4663.htmlzh-cnMon, 02 Apr 2007 06:42:47 GMTMon, 02 Apr 2007 06:42:47 GMT60正则表达式介l(转)http://www.aygfsteel.com/vaga/articles/107738.htmlvagavagaSun, 01 Apr 2007 04:30:00 GMThttp://www.aygfsteel.com/vaga/articles/107738.htmlhttp://www.aygfsteel.com/vaga/comments/107738.htmlhttp://www.aygfsteel.com/vaga/articles/107738.html#Feedback0http://www.aygfsteel.com/vaga/comments/commentRss/107738.htmlhttp://www.aygfsteel.com/vaga/services/trackbacks/107738.html

目录

正则表达式介l?/strong>

  1. 匚w模式
  2. 字符子集
  3. 行结束符
  4. 分组和引?/li>
  5. Unicode 支持

正则表达式语法参?/strong>

  1. 字符
  2. 逻辑操作W?/li>
  3. 向后引用
  4. 边界元字W?/li>
  5. 重复指示W?/li>
  6. 字符子集
  7. 预定义子集(元字W)
  8. 扩展子集Q元字符Q?
  9. 扩展中文子集Q元字符Q?/li>
  10. POSIX字符子集Q只适用于ASCIIQ?/li>
  11. Unicode块和分类

替换表达?br />

  1. Ҏ字符
  2. 自定义替换表

匚w模式

匚w模式指得是正则表辑ּ引擎以何种模式匚w字符丌Ӏ?br />
模式名称
启用Q禁?br />~省启用
说明
UNIX_LINES
(?d)启用Q??-d)用
?br />启用Unix行模式?br />在此模式下,只有 '\n'被认为是行结束符。它会媄?tt>., ^, ?$ 的行为?br />
CASE_INSENSITIVE
(?i)启用Q??-i)用
?br />启用忽略大小写模式?br />~省Ӟ忽略大小写模式只会媄?ASCII字符的匹配?而Unicode范围的忽略大写匚w需要通过 UNICODE_CASE 标志与本标志联合使用?br />启用此模式会影响匚w性能?br />
COMMENTS
(?x)启用Q??-x)用
?br />允许I格和注释出现在正则表达式中?br />在此模式下,I格被忽略,?开始的单行注释被忽略?
MULTILINE
(?m)启用Q??-m)用
?br />启用多行模式?br />In multiline mode the expressions ^ and $ match just after or just before, respectively, a line terminator or the end of the input sequence. By default these expressions only match at the beginning and the end of the entire input sequence.

DOTALL
(?s)启用Q??-s)用
?br />?可以匚w行结束符?br />在此模式下,元字W?tt>.可以匚w行结束符。缺省不允许如此匚w?br />

UNICODE_CASE
(?u)启用Q??-u)用
?br />Enables Unicode-aware case folding.
When this flag is specified then case-insensitive matching, when enabled by the CASE_INSENSITIVE flag, is done in a manner consistent with the Unicode Standard. By default, case-insensitive matching assumes that only characters in the US-ASCII charset are being matched. 启用此模式会影响性能?br />
CANON_EQ
(?c)启用Q??-c)用
?br />Enables canonical equivalence.
When this flag is specified then two characters will be considered to match if, and only if, their full canonical decompositions match. The expression "a\u030A", for example, will match the string "?" when this flag is specified. By default, matching does not take canonical equivalence into account.
启用此模式会影响性能?br />


字符子集

字符子集可以含有别的字符子集Qƈ且可以通过联合操作W(~省Q和交集操作W(&&Q实现组合。联合操作符表示某个子集匚w它的子子集所匚w的Q意字W。交集操作符表明某个字符子集只匹配它的子子集都匹配的字符?br />字符子集所能够有的操作W的优先U如下,从高CQ?br />
  1. 转义W\x
  2. 成组W?[...]
  3. 区间W?a-z
  4. 联合W?[a-e][i-u]
  5. 交集W?[a-z&&[aeiou]]
注意Q在字符子集[]内部的语法根本不同于正则表达式其它部分中的语法。例如,在字W子集内部,正则表达?. 失去了它原有的含义,而是成了一个匹?的元字符?

行结束符

行结束符是一个或两个字符序列Q用以表明输入字W序列中一行的l束。下面的字符被认为是行结束符Q?br />
  • 一个换行符('\n')?
  • 一个回车符加上一个换行符("\r\n")?
  • 一个单独的回RW?'\r')?
  • 代表下一行的字符('\u0085')?
  • 行分隔符('\u2028')QUnicode中被定义?
  • 一个分D늬('\u2029)QUnicode中被定义?/li>
如果 UNIX_LINES 模式被启用,则只有换行符被认为是行结束符?br />如果 MULTILINE 模式被启用,?br />

分组和引?/h3>字符分组以它们的左括L出现序来排序。例如在表达?(A)(B(C)))Q有四个分组Q?br />
  1. ((A)(B(C)))
  2. (A)
  3. (B(C))
  4. (C)
W?l永q表C辑ּ本n?br />分组采用q样的命名方式,是因为,在一ơ匹配过E中Q正则表辑ּ会被匚w多次。以前的匚w子序列有可能在将来被使用Q或者在匚wl束ӞE序有可能需要重新获得所有匹配的子字W序列?br />对于正则表达式中的某个分l而言Q永q只保留最后匹配的字符序列。如果对某个分组匚w试p|Q则会保留上ơ匹配成功的字符序列。例如,对于正则表达?a(b)?)+而言Q字W序?aba"Q将会让分组2匚w的字W序列ؓ"b"?br />??开始的分组Q将不会计入分组数目Q也不会被后l匹配所引用?br />

Unicode支持

本正则表辑ּ匚w引擎的实现遵循了?a >Unicode技术报告:Unicode正则表达式指?/a>》,实现了该指南的第二层所需的功能,但是在细微处有一些简单语法修攏V?br />Unicode?Block)和分c?Category)通过\p和\P通配苻表C。\p{prop}匚w含有prop的输入序列,而\P{prop}匚w不含?b>prop的输入序列。Unicode块通过前缀In表示Q如\p{InMongolian}。Unicode分类通过可选的前缀Is表示Q因此\p{L}和\p{IsL}都代表Unicode分类 letters。Unicode块和分类都可以在正则表达式子集外部和内部使用?br />目前支持的Unicode块和分类是?a >Unicode标准Q第三版》中所指定的块和分cR?Unicode块名U在?a >Unicode 字符数据?/a>》的W?4章被定义Q文件名U叫Blocks-3.txtQ但是名UC的空DL了。例?Basic Latin"成了"BasicLatin"。无论是标准化的q是非标准化的分c,都在该标准的W?8늚W?-5表中被全部定义?br />

与Perl 5正则表达式语法对?

[TBD]


正则表达式参?/h2>

字符

正则表达式字W串
匚w的字W串
X
字符XQ包?CJK ExtB 区汉?br />
\\
反斜杠\
\0n八进?n代表的字W?0<=n<=7)
\0nn
八进?nn代表的字W?0<=n<=7)
\0mnn
八进?mnn代表的字W?0<=m<=3,0<=n<=7)
\xhh
十六q制 0xhh所代表的字W?br />
\uhhhh
十六q制 0xhhhh所代表的字W?font color="#ff0000">注意Q目前尚不支持CJK ExtB区汉字?br />
\t
制表W?'\u0009')
\n
换行('\u000A')
\r
回R('\u000D')
\a
响铃W?'\u0007')
\e
取消WEscape('\001B')
\cx
x所代表的控制字W?br />

逻辑操作W?/h3>
正则表达式字W串
匚w的字W串
XY
X后面跟随Y
X|Y
X或?i>Y
(X)
X作ؓ分组表达?br />

向后引用

正则表达式字W串
匚w的字W串
\n
W?b>n个匹配的分组

边界元字W?/h3>
边界字符
匚w的字W串
^
行首
$
行末
\b 字符边界
\B
非字W边?br />
\A
输入的开?br />
\G
上次匚w的结束处
\Z
输入的l束Q或者是最后一个行l束W,参见行结束符?br />
\z
输入的l束

重复指示W?/h3>
正则表达式字W串
匚w的字W串
X?
X重复一ơ,或者不重复
X*
X重复0ơ或多次
X+
X重复1ơ或多次
X{n}
X重复nơ,不多也不?br />
X{n,}
X臛_重复n?br />
X{n,m}
X臛_重复nơ,臛_重复mơ?br />
注:X{n,m}???方式可以联合使用?br />

字符子集

正则表达式字W串子集
匚w的字W串
l合方式
[abc]
字符a,b或cQ包?CJK ExtB 区汉?br />单子?br />
[^abc]
L非a,b或c的字W?br />排除
[a-zA-Z] 从a到zQ或者A到ZQ包含a,z,A,Z?br />区间
[a-d[m-p]]
从a到dQ或者m到pQ等于[a-dm-p]?br />联合
[a-z&&[def]]
d,e或者f?br />交集
[a-z&&[^bc]]
从a到zQ除了b和cQ等于[ad-z]
扣除
[a-z&&[^m-p]]
从a到zQƈ且不包括从m到pQ等于[a-lq-z]
扣除

预定义子集(元字W)

边界字符
匚w的字W串
.
L字符Q可能匹配行l束W?br />
\d
数字[0-9]
\D 非数字[^0-9]
\s
I白W[ \t\n\x0B\f\r]
\S
非空白符[^\s]
\w
单词W,包含有字母和数字[a-zA-Z_0-9]
\W
非单词符Q不包含有字母和数字?br />

扩展子集Q元字符Q?/h3>
正则表达式字W串
匚w的字W串




扩展中文子集Q元字符Q?/h3>
名称
块名Uͼ\p{InXXX}Q?br />化通配W?br />标准Unicode块,或者汉字列?br />
L双字节字W(汉字或全角符P
\p{InQuqnJiao}
\E
L由GBK表示的汉字,不包括GB18030扩展部分Q?br />以及CJK ExtB区的汉字?br />
L单字节字W?br />\p{InFQuanJiao}
\~E
L单字节字W?br />
L全角ASCII字符
\p{InQJAscii}
\H
标准HalfwidthandFullwidthForms?br />
L收录在BIG5码集中的双字节字W?br />\p{InBig5}
\I
Big5可编码双字节字符
匚w未收录在BIG5码集中的双字节字W?\p{InFBig5}
\~I
非Big5可编码双字节字符
匚wL汉字(不包括符?
\p{InHanziOrCJKExtB}
\X
L汉字Q包括GB18030扩展部分?br />
匚wL汉字(不包括符?
\p{InHanzi}
\M
L汉字Q不包括GB18030扩展部分?br />
匚w非汉字的双字节字W?br />\p{InFHanzi}
\~M
L非汉字的双字节字W,
包括GB18030扩展部分?br />
地支字符
\p{InDiZhi}
\U
子丑寅卯辰埩午未申酉戌亥
匚w收录在GB码集中的双字节字W?br />\p{InGB}
\g
收录在GB码集中的双字节字W,
不包括GB18030扩展部分?br />
匚w非收录在GB码集中的双字节字W?br />\p{InFGB}
\~g
未收录在GB码集中的双字节字W,
不包括GB18030扩展部分?br />
匚w收录在GBK码集中的双字节字W?br />\p{InGBK}
\h
收录在GBK码集中的双字节字W,
不包括GB18030扩展部分?br />
匚w非收录在GBK码集中的双字节字W?br />\p{InFGBK}
\~h
未收录在GBK码集中的双字节字W,
不包括GB18030扩展部分?br />
大写希腊字母
\p{InDaXila}
\K
ΑΒΓΔΕΖΗΘΙΚΛΜΝ
ΞΟΠΡΣf`ΦΨΩ
日文片假?br />\p{InPianJia}
\j
标准Katakana?br />
日文q_?br />\p{InPingJia}
\J
标准Hiragana?br />
写希腊字母
\p{InXiaoXila}
\k
βδεζηθικλμ^
ξοπρστυφχψω
数学W号
\p{InMathe}
\m
u×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒?br />∫∮≡≌≈∽∝≠≮≯≤≥∞∵?br />
中文数字
\p{InCnDigit}
\i
〇一二三四五六七八九十百千万亿兆吉京
大写中文数字
\p{InDaCnDigit}
\N
零壹贰叁肆伍陆柒捌玖拾䘪仟萬亿兆吉京
全角标点W号
\p{InQJBiaoDian}
\o
、。·ˉˇ¨〃々—~‖…‘’“”〔?br />〈〉《》「」『』〖〗【】!Q'Q)Q?br />Q.Q;Q=Q?Q]{|}`H﹊H﹌H﹎H﹐H﹒H﹕H﹗H﹚
H﹜H﹞|︶|ؓ|﹀|DH﹂H﹄
|Ӈ|P|x|?br />
写俄文字母
\p{InXiaoEWen}
\l
аб{Cеёжзийaxмн
о\рстуфхцчшщъыьэюя
大写俄文字母
\p{InDaEWen}
\R
АБВГДЕЁЖЗИЙКЛМНО
ПРСТУФ[ЦЧШЩЪЫЬfy
中文序号
\p{InCnSN}
\q
ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ
ⅰⅱ⅜yⅴⅵⅶⅷⅸⅹ
再加上Unicode标准EnclosedAlphanumerics?br />
天干字符
\p{InTianGan}
\T
甲乙丙丁戊己庚辛壬癸
竖排标点W号
\p{InSPBiaoDian}
\V
|︶|ؓ|﹀|DH﹂H﹄|Ӈ|P|x|?br />
拼音字符
\p{InPinyin}
\y
ā֙ǎàēéě؈īTǐìōQǒòūúǔùǖǘǚǜü^ɑńň
GBK -> 0xA8A1- 0xA8C0
只是Unicode标准LatinExtended-A块的一部分?br />
注音字符
\p{InZhuyin}
\Y
标准Bopomofo?br />
制表字符
\p{InZhiBiao}
\C
标准BoxDrawing块?br />l检查发?textpro 的算法含有部分非?br />准Unicode制表W:“∟∣≒≦≧⊎앐”?br />

POSIX字符子集Q只适用于ASCIIQ?/h3>
正则表达式字W串
匚w的字W串
\p{Lower}
写字母[a-z]
\p{Upper}
大写字母[A-Z]
\p{ASCII}
所有的ASCII字符[\x00-\x7F]
\p{Alpha}
大小写字母[\p{Lower}\p{Upper}]
\p{Digit}
数字[0-9]
\p{Alnum}
字母数字W,包含大小写字母和数字[\p{Alpha}\p{Digit}]
\p{Punct}
标点W号Q?"#$%&'()*+,-./:;<=>?@[\]^_`{|}~之一?br />
\p{Graph}
可显C字W[\p{Alnum}\p{Punct}]
\p{Print}
可打印字W[\p{Graph}]
\p{Blank}
I格或者制表符[ \t]
\p{Cntrl}
控制字符[\x00-\x1F\x7F
\p{XDigit}
十六q制数字[0-9a-fA-F]
\p{Space}
I白W[ \t\n\x0B\f\r]

Unicode块和分类

?br />中文名称Q摘自Word XPQ?br />代码区域
BasicLatin
基本拉丁?br />\u0000-\u007F
Latin-1Supplement
拉丁?1
\u0080-\u00FF
LatinExtended-A
拉丁语扩?A
\u0100-\u017F
LatinExtended-Bound
拉丁语扩?B
\u0180-\u024F
IPAExtensions
国际x扩充
\u0250-\u02AF
SpacingModifierLetters
q格的修饰字W?br />\u02B0-\u02FF
CombiningDiacriticalMarks
l合用发音符
\u0300-\u036F
Greek
基本希腊?br />\u0370-\u03FF
Cyrillic
襉K语
\u0400-\u04FF
Armenian

\u0530-\u058F
Hebrew

\u0590-\u05FF
Arabic

\u0600-\u06FF
Syriac

\u0700-\u074F
Thaana

\u0780-\u07BF
Devanagari

\u0900-\u097F
Bengali

\u0980-\u09FF
Gurmukhi

\u0A00-\u0A7F
Gujarati

\u0A80-\u0AFF
Oriya

\u0B00-\u0B7F
Tamil

\u0B80-\u0BFF
Telugu

\u0C00-\u0C7F
Kannada

\u0C80-\u0CFF
Malayalam

\u0D00-\u0D7F
Sinhala

\u0D800-\uDFF
Thai

\u0E00-\u0E7F
Lao

\u0E80-\u0EFF
Tibetan
藏语
\u0F00-\u0FFF
Myanmar

\u1000-\u109F
Georgian

\u10A0-\u10FF
HangulJamo

\u1100-\u11FF
Ethiopic

\u1200-\u137F
Cherokee

\u13A0-\u13FF
UnifiedCanadianAboriginalSyllabics

\u1400-\u167F
Ogham

\u1680-\u169F
Runic

\u16A0-\u16FF
Khmer

\u1780-\u17FF
Mongolian
蒙古?br />\u1800-\u18AF
LatinExtendedAdditional

\u1E00-\u1EFF
GreekExtended

\u1F00-\u1FFF
GeneralPunctuation
q义标点
\u2000-\u206F
SuperscriptsandSubscripts

\u2070-\u209F
CurrencySymbols
货币W号
\u20A0-\u20CF
CombiningMarksforSymbols

\u20D0-\u20FF
LetterlikeSymbols
cM字母的符?br />\u2100-\u214F
NumberForms
数字形式
\u2150-\u218F
Arrows

\u2190-\u21FF
MathematicalOperators
数学q算W?br />\u2200-\u22FF
MiscellaneousTechnical
零杂技术用W号
\u2300-\u23FF
ControlPictures

\u2400-\u243F
OpticalCharacterRecognition

\u2440-\u245F
EnclosedAlphanumerics
带括L字母数字
\u2460-\u24FF
BoxDrawing
制表W?br />\u2500-\u257F
BlockElements
方块囑Ş
\u2580-\u259F
GeometricShapes
几何囑Ş
\u25A0-\u25FF
MiscellaneousSymbols
零杂丁贝W(C意W等Q?br />\u2600-\u26FF
Dingbats

\u2700-\u27BF
BraillePatterns

\u2800-\u28FF
CJKRadicalsSupplement

\u2E80-\u2EFF
KangxiRadicals

\u2F00-\u2FDF
IdeographicDescriptionCharacters

\u2FF0-\u2FFF
CJKSymbolsandPunctuation
CJKW号和标?br />\u3000-\u303F
Hiragana
q_?br />\u3040-\u309F
Katakana
片假?br />\u30A0-\u30FF
Bopomofo
注音
\u3100-\u312F
HangulCompatibilityJamo

\u3130-\u318F
Kanbun

\u3190-\u319F
BopomofoExtended
扩展注音
\u31A0-\u31BF
EnclosedCJKLettersandMonths
带括LCJK字母及月?br />\u3200-\u32FF
CJKCompatibility
CJK兼容字符
\u3300-\u33FF
CJKUnifiedIdeographsExtensionA
CJKl一汉字扩展-A
\u3400-\u4dBF
CJKUnifiedIdeographs
CJKl一汉字
\u4E00-\u9fAF
YiSyllables

\uA000-\uA48F
YiRadicals

\uA490-\uA4CF
HangulSyllables

\uAC00-\uD7A3
HighSurrogates

\uD800-\uDB7F
HighPrivateUseSurrogates

\uDB80-\uDBFF
LowSurrogates

\uDC00-\uDFFF
PrivateUse
专用?br />\uE000-\uF8FF
CJKCompatibilityIdeographs
CJK兼容汉字
\uF900-\uFAFF
AlphabeticPresentationForms

\uFB00-\uFB4F
ArabicPresentationForms-A

\uFB50-\uFDFF
CombiningHalfMarks

\uFE20-\uFE2F
CJKCompatibilityForms
CJK兼容形式
\uFE30-\uFE4F
SmallFormVariants
写变体
\uFE50-\uFE6F
ArabicPresentationForms-Bound

\uFE70-\ufeFF
Specials

\uFFF0-\uFFFF
HalfwidthandFullwidthForms
半Ş及全形字W?br />\uFF00-\uFFEF


分类
全称
说明
Cn

UNASSIGNED
Lu

UPPERCASE_LETTER
Ll

LOWERCASE_LETTER
Lt

TITLECASE_LETTER
Lm

MODIFIER_LETTER
Lo

OTHER_LETTER
Mn

NON_SPACING_MARK
Me

ENCLOSING_MARK
Mc

COMBINING_SPACING_MARK
Nd

DECIMAL_DIGIT_NUMBER
Nl

LETTER_NUMBER
No

OTHER_NUMBER
Zs

SPACE_SEPARATOR
Zl

LINE_SEPARATOR
Zp

PARAGRAPH_SEPARATOR
Cc

CNTRL
Cf

FORMAT
Co

PRIVATE_USE
Cs

SURROGATE
Pd

DASH_PUNCTUATION
Ps

START_PUNCTUATION
Pe

END_PUNCTUATION
Pc

CONNECTOR_PUNCTUATION
Po

OTHER_PUNCTUATION
Sm

MATH_SYMBOL
Sc

CURRENCY_SYMBOL
Sk

MODIFIER_SYMBOL
So

OTHER_SYMBOL
L

LETTER
M

MARK
N

NUMBER
Z

SEPARATOR
C

CONTROL
P

PUNCTUATION
S

SYMBOL
LD

LETTER_OR_DIGIT
L1

Latin-1
all

ALL
ASCII

ASCII
Alnum

字母数字(0-9,a-z,A-Z)
Alpha

字母(a-z,A-Z)
Blank

I格和制表符(' '|\t)
Cntrl

控制字符Q不可打?br />
Digit

数字(0-9)
Graph

可打C可视字母Q例如空? '是可打印的但不是可视字母Q?`a' 两者都是。)
Lower

写字母
Print

可打印字母(非控制字W)
Punct

标符P字母、数字、控制、空白符以外的字母)Q如Q?@#$%}{<>,./?[]{等?br />
Space

I白W?' ',\t,0x09,0x0A,0x0B,0x0C,0x0D,0x20)
Upper

大写字母
XDigit

十六q制数字(0-9Qa-f, A-F)





替换表达?/h3>Ҏ字符
Ҏ字符介绍
描述
\n
换行
\b
向前删除一个字W。当q个字符位于替换串之首时Q将删除匚w串之前的一个字W。若匚w串位于行首,匚w串所在行与前一行相合ƈ?br />
\d
向后删除一个字W。当q个字符位于替换串之末时Q将删除匚w串之后的一个字W。若匚w串位于行末,匚w串所在行与下一行相合ƈ?br />
\e
插入一个ESC字符
\t
插入一个TAB字符
\n
n代表查找正则表达式中的子表达式(l)。\1代表W一个子表达式,\2代表W二个子表达式,依次cL。\0代表整个匚w到的字符丌Ӏ?br />
\v
大写下一个字?br />
\U
全部大写以后的字母,直到到其它指示Wؓ止?br />
\l
写下一个字?br />
\L
全部写以后的字母,直到到其它指示Wؓ止?br />
\E
取消所有的字母大小写指C符?br />


自定义替换表

在查找/替换中用自定义替换?
有的时候,上述单的自定义替换功能是不够的。例如,用户可能希望只把出现在括号内的源串替换ؓ目标丌Ӏ这U文本处理可以通过在查?替换中用自定义替换表来解决?

在查?替换功能中用自定义替换表的替换函数是\TnQ其中n?-9的数字,注意n?表示W?0张替换表。如果略去nQ其效果相当于\T1Q即使用W一张替换表。例如要把所有放在方括号中的汉字替换为拼韻I可以查找“\[(\ E)\]”,替换为“\T{\1}”。即把第一个子表达式的匚w内容按自定义替换表{换。注意,如果\T函数的参C在替换表的源串中Q\T函数的结果与源串相同Q即不做M变换?

有些情况下,用户可能希望只用替换表的一部分内容。还是以拼音ZQ前面给出的替换表中包含了拼音的韌Q如果在替换时不希望加上q些韌数字Q可以用“过滤”功能。所谓过滤,其实是用一个正则表辑ּd析替换表的目标串Qƈ把其中的某个子表辑ּ取出来?

使用“过滤”时Q在“设|自定义替换表”对话框中,点“过滤”按钮,在弹出的对话框中填入一个正则表辑ּ。再以拼音ؓ例,表达式可以写为?\p {Alpha}+)(\d)”,其中W一Ҏ号中的是不含韌的拼韻IW二Ҏh韌。在调用\T函数ӞJTextPro会在目标串中查找q个正则表达式。但是如何把其中的子表达式取出来呢?\T函数q有一个可选的下标Q取Wn个子表达式的值就写作\T{...}[n]。所以,把放在方括号中的汉字替换Z带调的拼韻I可以查找“\[(\E)\]”,替换为“\T{\1}[1]?

vaga 2007-04-01 12:30 发表评论
]]>[摘] Ajax : 一U网l应用的新理?/title><link>http://www.aygfsteel.com/vaga/articles/19115.html</link><dc:creator>vaga</dc:creator><author>vaga</author><pubDate>Thu, 10 Nov 2005 05:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/vaga/articles/19115.html</guid><wfw:comment>http://www.aygfsteel.com/vaga/comments/19115.html</wfw:comment><comments>http://www.aygfsteel.com/vaga/articles/19115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/vaga/comments/commentRss/19115.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/vaga/services/trackbacks/19115.html</trackback:ping><description><![CDATA[     摘要: Ajax : A New Approach to Web Applications Ajax : 一U网l应用的新理?If anything about current interaction design can be called “glamorous,?it’s creating Web applications. After all, when was the last ...  <a href='http://www.aygfsteel.com/vaga/articles/19115.html'>阅读全文</a><img src ="http://www.aygfsteel.com/vaga/aggbug/19115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/vaga/" target="_blank">vaga</a> 2005-11-10 13:27 <a href="http://www.aygfsteel.com/vaga/articles/19115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[摘] MVC模式解析http://www.aygfsteel.com/vaga/articles/19043.htmlvagavagaWed, 09 Nov 2005 12:31:00 GMThttp://www.aygfsteel.com/vaga/articles/19043.htmlhttp://www.aygfsteel.com/vaga/comments/19043.htmlhttp://www.aygfsteel.com/vaga/articles/19043.html#Feedback0http://www.aygfsteel.com/vaga/comments/commentRss/19043.htmlhttp://www.aygfsteel.com/vaga/services/trackbacks/19043.htmlMVC模式概述


?nbsp;   MVC是三个单词的~写,分别为:模型(Model),视图(View)和控制Controller)?BR>        
MVC模式的目的就是实现Webpȝ的职能分工:  
?nbsp;   Model层实现系l中的业务逻辑Q通常可以用JavaBean或EJB来实现?nbsp;
?nbsp;   View层用于与用户的交互,通常用JSP来实现?BR>?nbsp;   Controller层是Model与View之间沟通的桥梁Q它可以分派用户的请求ƈ选择恰当的视图以用于昄Q同时它也可以解释用L输入q将它们映射为模型层可执行的操作?BR>

MVC模式的好?/FONT>

各施其职Q互不干?/FONT>
            在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化Q就只需要更改相应的层中的代码而不会媄响到其它层中的代码?nbsp;
有利于开发中的分?BR>            在MVC模式中,׃按层把系l开Q那么就能更好的实现开发中的分工。网设计h员可以进行开发视囑ֱ中的JSPQ对业务熟悉的开发h员可开发业务层Q而其它开发h员可开发控制层?nbsp;
有利于组件的重用
分层后更有利于组件的重用。如控制层可独立成一个能用的lgQ视囑ֱ也可做成通用的操作界面?nbsp;

不同JSP构造的应用
Z么要l合使用servlet & JSP?
?nbsp;   典型的做法:使用JSP来简化HTML内容的开发与l护 
?nbsp;   对于单的动态代码,使用p本元素调用JAVA代码来完成?nbsp;
?nbsp;   对于E微复杂一些的应用Q则可用脚本元素调用定制的cL完成?x谓的helpc? 
?nbsp;   对于比较复杂的应用,则用JAVA BEAN和定制标{?BR>?nbsp;   但,q些是不够的 Q?/FONT>
?nbsp;   对于复杂的处理过E,从JSP开始做起会难以处理?nbsp;
?nbsp;   JSP除了能够带来实际的代码隔离成单独的cRbean、和定制标签的便利以外,它所隐含的假定是单个面l出单个基本视图?BR>

对MVC的误?/FONT>

?nbsp;   必须采用复杂的框?nbsp;
?nbsp;   框架有时很有?nbsp;
?nbsp;   Struts 
?nbsp;   JavaServer Faces (JSF) 
?nbsp;   但ƈ非必需! 
?nbsp;   对于大多单或者适度复杂的应用来_使用内徏的RequestDispatcherp够很好地实现MVC
?nbsp;   MVC影响整个pȝ的设?nbsp;
?nbsp;   我们可以用MVC来处理单个请?nbsp;
?nbsp;   可以它认ؓ是MVCҎQ而非MVC框架?nbsp;
?nbsp;   也被UCؓ是模?Ҏ

用RequestDispatcher实现MVC

?nbsp;   1. 定义用以表示数据的java bean 
?nbsp;   2. 使用一个servlet处理h 
?nbsp;       servletdh参数Q检查数据的~失或异常等?nbsp;
?nbsp;   3. 填充bean 
?nbsp;       该servlet调用业务逻辑或数据访问代码得到最l的l果。得出的l果被放在第一步中定义的bean中?nbsp;
?nbsp;   4. bean存储在请?会话或servlet的上下文?nbsp;
?nbsp;       该servlet调用h、会话或servlet上下文对象的setAttribute存储表达hl果的bean的引用?BR>?nbsp;   5. 请求{发到JSP面 
?nbsp;      该servlet定哪个JSP面适合于处理当前的情ŞQƈ使用RequestDispatcher的forwardҎ控制{Ud那个面?nbsp;
?nbsp;   6. 从bean中提取数?nbsp;
?nbsp;       JSP面使用jsp:useBean和与W?步匹配的位置讉K之前存储的beanQ然后用jsp:getProperty输出bean的属性?nbsp;
?nbsp;      JSP面q不创徏或修改beanQ它只是提取q显C由servlet创徏的数据?BR>
jsp:useBean在MVC中的使用与在独立JSP面中有什么不?BR>?nbsp;   JSP面不应该创建对?nbsp;
?nbsp;   应该由servlet创徏所有的数据对象。因此,Z保证JSP面不会创徏对象Q我们应该??xml:namespace prefix = jsp />而不?BR>
?nbsp;   JSP面也不应该修改已有的对?nbsp;
?nbsp;   因此Q我们应该只使用jsp:getPropertyQ不使用jsp:setProperty。提C:jsp:useBean的scope选项
?nbsp;   request 
?nbsp;   
?nbsp;   session 
?nbsp;   
?nbsp;   application 
?nbsp;   
?nbsp;   page 
?nbsp;   或者仅仅?jsp:useBean id="..." type="..." > 
?nbsp;   MVC (Model 2)构架不用这个scope?BR>
不同数据׃n方式
?nbsp;   向用hCZ个随机的数字?nbsp;
?nbsp;   ׃每次h应该产生新的数字Q因而基于请求的׃n是恰当的?nbsp;
?nbsp;   
?nbsp;   昄用户的姓和名 
?nbsp;   数据要ؓ每个客户存储Q因而基于会话的׃n比较适用?nbsp;
?nbsp;   
?nbsp;   昄一个指定长度的质数?nbsp;
?nbsp;   数据在多个客户间׃nQ因此,Z应用的共享比较恰当?BR>
Zh的数据共?BR>?nbsp;   Servlet 
    ValueObject value = new ValueObject(...); 
    request.setAttribute("key", value); 
    RequestDispatcher dispatcher = 
request.getRequestDispatcher("/WEB-INF/SomePage.jsp"); 
    dispatcher.forward(request, response); 

?nbsp;   JSP 
scope="request" /> 


Z会话的数据共?BR>?nbsp;   Servlet 
ValueObject value = new ValueObject(...); 
HttpSession session = request.getSession(); 
session.setAttribute("key", value); 
RequestDispatcher dispatcher = 
request.getRequestDispatcher("/WEB-INF/SomePage.jsp"); 
dispatcher.forward(request, response); 

?nbsp;   JSP 
scope="session" /> 


ZServletContext的数据共?BR>?nbsp;   Servlet 
    synchronized(this) 
    { 
        ValueObject value = new ValueObject(...); 
        getServletContext().setAttribute("key", value); 
        RequestDispatcher dispatcher = 
        request.getRequestDispatcher("/WEB-INF/SomePage.jsp"); 
        dispatcher.forward(request, response); 
    } 

?nbsp;   JSP 
 


JSP面中的相对URL
?nbsp;   问题Q?nbsp;
?nbsp;   使用h分配器进行的转发对客h说是透明的。初始的URL是浏览器惟一知道的URL?nbsp;
?nbsp;   Z么这会比较重要? 
?nbsp;   览器会如何处理cM下面的这些标{: 
                        HREF="JSP-Styles.css" TYPE="text/css"> 
        ?/A> 
?nbsp;   {案Q浏览器会把它们看作是相对于servlet的URL 
?nbsp;   
?nbsp;   最单的解决ҎQ?nbsp;
?nbsp;   使用以斜杠开始的URL

Summary
?nbsp;   MVC (Model 2) 方式适用于: 
?nbsp;   单次提交会生多个基本外观?nbsp;
?nbsp;   几个面拥有大量公共的处理过E?nbsp;
?nbsp;   需要ؓ同样的数据提供多个视囄应用E序,它很好地实现了数据层与表C层的分,特别适用于开发与用户囑Ş界面有关的应用程?nbsp;
?nbsp;   
?nbsp;   构架 
?nbsp;   ׃个servlet应答初始的请?nbsp;
?nbsp;   Servlet完成实际的数据处理ƈ结果存储在bean?nbsp;
?nbsp;   Bean存储在HttpServletRequest, HttpSession, 或ServletContext?nbsp;
?nbsp;   Servlet使用RequestDispatcher的forwardҎ请求{发到JSP面 
?nbsp;   JSP面通过使用jsp:useBean和相应的作用?request, session, application)从bean中读出数



vaga 2005-11-09 20:31 发表评论
]]>
[摘] JSF VS Tapestry 全面比较 Q三Q?/title><link>http://www.aygfsteel.com/vaga/articles/19014.html</link><dc:creator>vaga</dc:creator><author>vaga</author><pubDate>Wed, 09 Nov 2005 09:14:00 GMT</pubDate><guid>http://www.aygfsteel.com/vaga/articles/19014.html</guid><wfw:comment>http://www.aygfsteel.com/vaga/comments/19014.html</wfw:comment><comments>http://www.aygfsteel.com/vaga/articles/19014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/vaga/comments/commentRss/19014.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/vaga/services/trackbacks/19014.html</trackback:ping><description><![CDATA[<DT><FONT size=4>JSF VS Tapestry 全面比较Q三Q?</FONT> <DD class=ArticleInfo><FONT size=4>2005.11.09 </FONT> <DD class=ArticleContent> <P><STRONG><FONT size=4>比较2Q?java~程模型(Java Programming Model)</FONT></STRONG></P> <P><FONT size=4>  在前面我们提到Tapestry和JSF都允许表现层的模板直接和一个JavacM的属性和Ҏq行交互Q那q些cȝ实例在运行时是怎么创徏和管理的呢?<BR><BR>  Tapestry<BR>  Tapestry的一个完整过E通常都要包括三个部分Q用于显C的面模板(一般就是html)Q带有相兛_性和Ҏ的javac,用于定义面模板上的控制元素和javacȝ关系的页面定义文件。Tapestry有着一套特D的讉KHttpSess ion、ServletContext的体pR?BR>  在一个页面定义文件中描述所有的数据l定是可以的Q但是一个页面控制元素却不能在request周期内,l定一个javacR在request周期内只能通过一个pagec访问一些属性和Ҏ。这其中最主要的限制就是关于pagecȝ问题Q一个pag ecdLBasePage或者AbstractPage的派生类。从另一斚w来说Q这意味着你所~写的表现层逻辑的代码将会和框架本n的实现有着非常紧密的耦合。不q,Tapestry未来的版本就会减这U耦合Q努力成Z个松耦合的编E模型?BR><BR>  JSF<BR>  在JSF应用中没有页面定义文件。它只有一个全局的配|文Ӟ命名为:faces-config.xmlQ里面通常都定义了一?managed beans"。这些managed beans都是带有属性和事g监听器的定义良好的java bean。在faces-config.xml中定义的后端bean都有三个参数Q一个标识符、一个javacd、一个bean的生存周期,生存周期可以是request、session、application中的一U。一旦在 faces-config.xml中定义好了一个managed bean,那一个前端页面上的显C控制元素就可以使用标识W来兌q个bean。managed bean也可以配|ؓ引用另外一个managed bean?BR><BR>  JSF和Tapestry都可以方便的与其他的中间层技术整合,比如Spring。JSF managed bean facility是一个IoCQInversion of ControlQ。通过诸如 JSF-Spring q样的扩展技术,我们可以方便其和Spring很好的整合在一P使得JSF的表辑ּ可以调用Spring的bean的方法。虽然Spring可以?Tapestry3.0整合Q但是在Tapestry4.0当中才能更好的充分发挥IoCҎ;Tape stry的领导Howard Lewis Ship已经在Tapestry启动了IoC框架的工作。Spring的bean会很轻杄注入到Tapestry应用的类中?BR><BR>  JSF的编E模型提供了更大的灵zdQ因Z可以通过l合的方式来丰富你的代码功能。比如,你可以设定一个指定的managed bean完成面的某些功能,同时Q你也可以在q些bean里引用其他的managed bena,从而可在页面间׃n一些功能?BR><BR>而Tapestry必须使用cȝ承的ҎQ也是_Tapestry应用中的一个页面类必须从框架指定的基类中派?包含一大堆框架指定的状?Q这q不是一个理想的Ҏ?BR><BR>JSF能够非常直观的管理session和application周期内的状态: 面代码可以方便的访问managed beanQ而不其生命周期是request、sessionq是application。而Tapestry在这斚wq对差点,不过Q?Tapestry4.0在这斚w做了很大的改q,引入了类gJSF managed bean的技术,同时,q支持Java 5.0的annotaions技术,减少对XML配置文g的依赖,从而降低应用配|的复杂性?BR><BR>  </FONT><FONT color=#800080 size=4> JSF在编E模型上来看Q与Tapestry相比h更大的灵zL?BR></FONT></P></DD><img src ="http://www.aygfsteel.com/vaga/aggbug/19014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/vaga/" target="_blank">vaga</a> 2005-11-09 17:14 <a href="http://www.aygfsteel.com/vaga/articles/19014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[摘] JSF VS Tapestry 全面比较 Q二Q?/title><link>http://www.aygfsteel.com/vaga/articles/19010.html</link><dc:creator>vaga</dc:creator><author>vaga</author><pubDate>Wed, 09 Nov 2005 08:56:00 GMT</pubDate><guid>http://www.aygfsteel.com/vaga/articles/19010.html</guid><wfw:comment>http://www.aygfsteel.com/vaga/comments/19010.html</wfw:comment><comments>http://www.aygfsteel.com/vaga/articles/19010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/vaga/comments/commentRss/19010.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/vaga/services/trackbacks/19010.html</trackback:ping><description><![CDATA[<DT><FONT size=4>JSF VS Tapestry 全面比较Q二Q?</FONT> <DD class=ArticleInfo><FONT size=4>2005.11.09 </FONT> <DD class=ArticleContent> <P><STRONG><FONT size=4>Ҏ1Q?面开?Page Development)</FONT></STRONG></P> <P><FONT size=4>  一个web应用实际上就是后端用java代码获取相应数据Qƈ数据传递给前端表现层代码,然后最l返回给l端用户。因此,在一个开发h员看来,当他初次接触JSF和TapestryӞ最直接的感觉就是JSF的表现层是基于JSP的模板技术,而Ta pestry的表现层模板基本可以看作是一个HTML?<BR><BR>  JSF<BR>  JSF采用JSP的技术作为其表现层技术。与标准兼容的JSF实现必须实现一个核心组件的JSP标签集。下面的代码是一个用了JSFlg标签的Html代码Q?/FONT></P> <DIV> <DIV><FONT size=4>代码:<BR></FONT><FONT size=3><h:form>      <BR>  <h:panelGrid columns="2" border = "1"><BR>        <h:outputText styleClass = "label" value="No"/><BR><BR>        <h:outputText value="#{holidaySession.currentHolidayBooking.holidayID}"/><BR>        <h:outputText styleClass = "label" value="Date"/><BR>        <h:outputText value="#{holidaySession.currentHolidayBooking.date}"/><BR><BR>        <h:outputText styleClass = "label" value="Number of days"/><BR>        <h:outputText value="#{holidaySession.currentHolidayBooking.amount.value}"/><BR>        <h:outputText styleClass = "label" value="Description"/><BR><BR>        <h:outputText value="#{holidaySession.currentHolidayBooking.description}"/><BR> </h:panelGrid><BR> <BR><BR> <h:commandButton value="Back" action="#{holidaydetail_backing.home}" immediate = "true"/><BR><BR></h:form><BR></FONT></DIV></DIV> <P><FONT size=4>  含有JSF标签的html面不能在标准浏览器中预览。要x览,必须使用JSF设计工具或者直接部|到应用中,在真实运行环境中览?BR>  对于JSF技术来_其表现层技术就是JSPQ但是这不是唯一的解x法。Hans Bergsten的文章介l了可供选择的其他的ҎQ读者可阅读该文章获取详l信息,</FONT><A target=_blank><FONT color=#000066 size=4>Improving JSF by Dumping JSP</FONT></A><FONT size=4>?Bergsten的文章中指出了؜合JSF和JSP标签暴露出的一些问题。当Ӟq些问题在JSF1.2和JSP2.1中会得到解决?BR><BR>  Tapestry<BR>  对于大多数的Tapestry应用来说QTapestry的表现层模板看v来就是一个简单的规则的HtmlQ只不过其中加入了一些Tapestry的属性。下面是一D例子代码:</FONT></P> <DIV> <DIV><FONT size=4>代码:</FONT></DIV><PRE><SPAN condition="ognl:currentHolidayBooking" jwcid="@Conditional"><span jwcid = "@Conditional" condition = "ognl:currentHolidayBooking"> <p><strong>Holiday Details</strong></p> <table> <tr> <td class = "label">No</td> <td><span jwcid = "@Insert" value = "ognl:currentHolidayBooking.holidayID">1</span> </td> </tr> <tr> <td class = "label">Start date</td> <td><span jwcid = "@Insert" value = "ognl:currentHolidayBooking.date" format = "ognl:dateFormat">1</span> </td> </tr> <tr> <td class = "label">Number of days</td> <td><span jwcid = "@Insert" value = "ognl:currentHolidayBooking.amount.value">1</span> </td> </tr> <tr> <td class = "label">Description</td> <td><span jwcid = "@Insert" value = "ognl:currentHolidayBooking.description">1</span> </td> </tr> </table> </span></SPAN></PRE></DIV> <P><FONT size=4>  大家可以试把这D代码放入一个Html的body标签当中Q你会发现浏览器可以正常的观看它?BR>  上面的例子中Qjwcid = "@componentName"属性就是定义了一个Tapestry标签?BR>  Tapestry的模板不仅仅可以用HTML作ؓ载体Q它也支持其他的一些标记语aQTapestry标签是具有良好格式的标签Q即必须成对出现?Tapestry模板技术支持的标记语言典型的就是HTML以及用于无线应用的WML。其最大的一个特?是Q可qServlet容器Q直接预览?BR><BR>  事实上JSF标签׃不是标准的html标签Q得它对于初学者来_是难于用的。而对于很多javaE序员来_他们喜欢~辑HTML代码Q至是乐意~写html代码?BR><BR>  JSF技术宣U的一个技术优点就是,可用同一个模板编写运行在不同讑֤上的应用Q由此带来很大的灉|性。然而,q样做,׃要协调不同设备间的表现差异性,那么很可能同一个模板,不能正好表C的输出。同Ӟ你不得不学习新的标签库的使用ҎQƈ且搞懂它们是怎样映射到html的。随着旉的推U,JSF标签的简z可帮助你很快的~写表现层代码,同时也降低了开发者对jsf设计工具的依赖?BR><BR>  本文认ؓQJSF的学习成本高于其技术优炏V在大多数情况下Q我们ƈ不需要编写适应于不同设备的应用。尽JSF设计工具提供了简单的囑Ş化的Ҏ来构建和预览JSF应用Q但是在一个开发中Q页面设计h员更多的是喜Ƣ用行的HTML设计工具来编写和预览面Q这发生了一个冲H,卛_有将更多的页面工作{UdjavaE序员n上,因ؓ一个页面设计h员通常情况下是不乐意去操作JSF设计工具的?BR><BR>  JSF开发者一直在L一U解册些问题的Ҏ。JSF技术设计良好的扩展体系Q得这成ؓ可能Q其中一个技术Q现出来,那就是表现层控制器。一个非常有前途的表现层控制器的实现就是Facelets,由java.net创徏的开放源代码目。Facelets的灵感就来源于Tapestry的模板模型,q得JSF不再依赖于JSP技术。Facelets允许开发者创建Tapestry风格的标{,像下面q段代码一P</FONT></P> <DIV> <DIV><FONT size=4>代码:</FONT></DIV><PRE><FONT size=4> </FONT><INPUT id=bar value=#{foo.bar} jsfc="h:inputText"></PRE></DIV> <P><FONT size=4>  在未来的一D|间内QFacelets会被开发者所采用Q或怼影响JSF未来的版本?BR><BR>  </FONT><FONT color=#800080 size=4>和JSF比较QTapestry在表现层斚wZHTML代码,可被标准览器所览Q这正是它在表现层上的优势所在?BR></FONT></P></DD><img src ="http://www.aygfsteel.com/vaga/aggbug/19010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/vaga/" target="_blank">vaga</a> 2005-11-09 16:56 <a href="http://www.aygfsteel.com/vaga/articles/19010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[摘] JSF VS Tapestry 全面比较 Q一Q?/title><link>http://www.aygfsteel.com/vaga/articles/19009.html</link><dc:creator>vaga</dc:creator><author>vaga</author><pubDate>Wed, 09 Nov 2005 08:54:00 GMT</pubDate><guid>http://www.aygfsteel.com/vaga/articles/19009.html</guid><wfw:comment>http://www.aygfsteel.com/vaga/comments/19009.html</wfw:comment><comments>http://www.aygfsteel.com/vaga/articles/19009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/vaga/comments/commentRss/19009.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/vaga/services/trackbacks/19009.html</trackback:ping><description><![CDATA[<div class="wmqeeuq" id=OutBox> <div class="wmqeeuq" id=listMainArea> <div class="wmqeeuq" id=listSimpleNav><FONT size=4>JSF VS Tapestry 全面比较Q一Q?</FONT></DIV> <DL class=ReadArticle> <DD class=ArticleInfo><FONT size=4>2005.11.09 </FONT> <DD class=ArticleContent> <P><STRONG><FONT size=4>作者:<EM>   by Phil Zoio</EM><BR>译Q?nbsp;  BlueCrystal<BR>来自Q?nbsp;  </FONT></STRONG><A target=_blank><STRONG><FONT color=#000066 size=4>http://www.theserverside.com/articles/article.tss?l=JSFTapestry</FONT></STRONG></A></P> <P><FONT size=4>  目前应用很广泛而且也很成熟的Struts应用开发框Ӟ在未来几q里会逐渐淡出Q其ZAction(action-based)的开发模型也被z跃的javaC֌所推崇的新的开发模型所替代Q对于java开源社区来_q求完美是很多h的理惟뀂在2000q初诞生的Struts以及其他cM?MVC(Model View Controler)框架主要都是以操作ؓ中心Q且都是无状态的开发模型,而现在,Zlg(component-based)和事仉?event- driven)的开发模型逐渐行hQ在很多时候都成了Struts的有利竞争者,q其中来自jcp的jsr127-JavaServer Faces(JSF)以及来自apache的Tapestry是其中的g者?BR><BR>  在这文章中Q我们将把这两种框架JSF和Tapestryq行详细的对比。我们的比较涉及到两种框架的设计、运行环境以及如何开发。比较的目的在于让读者了解这两种框架各自的优~点Q以便于在自q目中,Ҏ实际情况Q选择合适的框架。该文章的内容基于JSF1.1和Tapestry3.0.3 (在个别地方由于需要会谈到Tapestry4.0)?BR><BR><BR>  JSF和Tapestry?BR>    <BR>  JSF源于JCP(Java Community Process)的JSR127规范。Sun公司自己同时也对该规范提供了一个实玎ͼ目前的版本是1.1Q而且该项目的设计者之一正是Struts的作?Craig McClanahan。另外一个JSF的实玎ͼ是Apache的一个项目MyFaces。目前,几个L的java开发工具厂商都在其java ide中提供了对jsf的支持,比如Sun、Oracle、IBM、Borland{,而且JSF的后l版本JSF1.2也将成ؓJ2EE5.0的一个组成部分?BR>    <BR>  Tapestry最初于2000q在SourceForge注册Q来自于Apple WebObjectsQ随后,?003q成为Apache的一个项目。与JSF不同的是QTapestryq不是某一个jsr规范的实玎ͼ它仅仅是一个开源项目,当前版本?.0.3?.0版本预计也将在后面的一D|间内推出?BR>  JSF和Tapestry作ؓMVC框架Q在一些基本特性上是非常类似的Q?BR></FONT></P> <UL> <LI><FONT size=4>    它们都让开发者不再直接与Servlet API打交道,而是让开发者在一个更高的抽象层上思考问题; </FONT> <LI><FONT size=4>    它们都将web面上的昄元素l定C个java对象的某个属性上Q这些属性可能是字符丌Ӏ数字、日期或者其他类型,q且p对象来维护其状态。用户在面上的交互行ؓQ比如用鼠标点击一个按钮或者链接)都直接映ؓjavacM的一个事件处理方法; </FONT> <LI><FONT size=4>    两种框架都支持组件式的开发方式,q且开发的lg可被其他开发者重用。两U框枉自带一个标准组件库Q提供web开发的常见通用功能?</FONT></LI></UL> <P><FONT size=4>  在下面的章节里面Q我们将会看见这两个框架在各自的实现方式上是有很大区别的。对于大多数E序员来_Z两种框架做开发,是非常不同的两U体验?/FONT></P> <P><FONT size=4>  <STRONG>Sidebar: 例子E序</STRONG><BR>  在下面本文提供了一个例子程序,该程序的代码大部分都在q片文章中做l的描述。这个程序主要就是一个管理个人假期的工具Q它的主要功能包括:<BR>  * 一个home界面Q?列出所有登记的假期Q包括假期开始时间、天C及一下描qC息;<BR>  * 一个detail界面Q用于浏览某一登记假期的详l信息;<BR>  * 一个new界面Q用于添加一个假期信息?BR><BR>  下面q幅囑ֱCZ该程序的M程和功能:<BR><IMG onmouseover="if(this.alt) this.style.cursor='hand';" src="http://www.theserverside.com/articles/content/JSFTapestry/app.jpg" width=400 border=0><BR><BR>  你可以从下列地址下蝲该程序基于不同框架的源代码:<BR>  </FONT><A target=_blank><FONT color=#000066 size=4>JSF version</FONT></A><BR><FONT size=4>  </FONT><A target=_blank><FONT color=#000066 size=4>Tapestry version</FONT></A><BR></P></DD></DL></DIV></DIV><img src ="http://www.aygfsteel.com/vaga/aggbug/19009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/vaga/" target="_blank">vaga</a> 2005-11-09 16:54 <a href="http://www.aygfsteel.com/vaga/articles/19009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̩</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">Ϣ</a>| <a href="http://" target="_blank">ڰ</a>| <a href="http://" target="_blank">ͺ</a>| <a href="http://" target="_blank">˼</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɣֲ</a>| <a href="http://" target="_blank">ǭ</a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank">ǹ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">ͩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">γ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ƶ</a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӽ</a>| <a href="http://" target="_blank">¹</a>| <a href="http://" target="_blank">κ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>