optimisticlockexception 手机进水怎么处理理

966,690 六月 独立访问用户
语言 & 开发
架构 & 设计
文化 & 方法
您目前处于:
Web开发必知的八种隔离级别
Web开发必知的八种隔离级别
James Leigh
注意:,500+CTO技聚重新定义技术领导力!
相关厂商内容
相关赞助商
更全的优惠信息,更多的免费活动,更丰富的线上课程,!
下面列出的隔离级别是用来帮助Web开发人员更好的理解他们编程模型中放置的约束,帮助系统架构师和开发人员共同讨论如何在保持必要的数据完整性的同时选择最有效的隔离级别。它们按照最少隔离(未提交读)到最多隔离(串行化)的顺序列出。
1、未提交读(Read Uncommitted)
未提交读隔离级别需要事务间很少的隔离。每一个读操作都能看到事务中等待的写操作(脏读)。然而已经提交的写操作必须要有一个串行顺序来防止脏写。悲观机制会阻塞有冲突的写操作直到其他写操作已经被提交或已经回滚。乐观机制不会锁住这些操作,它会允许所有的操作都通过。如果一个连接进行了回滚,那么接下来修改同一块数据的其他操作也会被回滚。在这种级别中,共享缓冲可以不加验证的进行使用。这种隔离级别最好在不需要事务(比如只读的数据集),或者事务只在独占数据库时才修改的情况下使用。
例子:一个只在离线情况下更新的档案数据库,或者不在事务中使用的审核/登陆(audit/logging)表。
2、已提交读(Read Committed)
已提交读可以读取系统中任何已经提交的状态,并且可以不加验证(混合状态)的进行缓冲,只需当前连接中发生的改变能够反映到结果中即可。悲观机制将其实现为单调视图。乐观事务则隔离存储所有的改动,使得它们直到提交后才可用。读已提交使用一个非常乐观的机制,它推迟写入所有的变化直到事务被提交为止。这种形式的乐观隔离可以在不阻塞读操作的情况下实现复杂的写入操作,并且它没有验证模式。共享缓冲只能在已提交的状态中使用。这种隔离级别最好在结果可以使用旧值,且事务只能用于写入操作的情况下使用。
例子:一个不必显示当前最新帖子的在线论坛,且它的帖子间数据不相冲突。
3、单调视图(Monotonic View )
单调视图是对读已提交的一个扩展,它其中的事务在执行时会观察数据库中一个单调上升的状态。在这种级别中,如果有明显的写入事务,那么悲观事务会在读入操作中被阻塞。乐观事务会像在读已提交中一样操作,隔离保存所有的改动,并且会验证它们的缓冲以确保其仍然合法。这种级别可以定期地同步数据库副本,且最好在不需要事务或者仅存在写操作事务的情况下使用。
例子:一个仅能由一个人来修改的用户偏好表。
4、快照读取(Snapshot Reads)
快照读取扩展了单调视图,它可以保证查询结果都能反映到数据库一致的快照中。悲观机制会在读操作时阻碍其他影响结果的写入操作。乐观机制则允许其他的写入操作,并通知读取事务某部分已经发生改变并进行回滚。想要实现一个乐观机制,必须在读操作结束之前验证是否有什么并行的写入操作修改了结果,如果有的话,那么结果可能会重做或回滚。这个检验过程可能只是简单的检查同一张表中是否出现了写入操作,或者只是检查改动的查询结果。乐观隔离级别可以很轻松地检测出冲突,并且在允许并发读入操作的过程中,支持写入操作。这种级别只要能够读取到快照,便可以定期地同步数据库副本。最好在写入操作很少,不想与读入操作冲突,且查询结果需要一致性的时候使用这种隔离级别。
例子::一个查询比修改频繁,且只保留最新值的货币换位表或者查询表。
5、游标稳定性(Cursor Stability)
游标稳定性隔离扩展了读已提交,并且是许多关系型数据默认的隔离级别。在这种隔离级别中,悲观事务如果在一个单独的语句中执行的话,必须得指定它将修改的记录。这通常可以在"SELECT"查询后附加“FOR UPDATE”关键字来实现。在这种情况下,其他冲突的读写悲观事务都将被阻塞直到该事务结束为止。乐观事务会跟踪提交时被验证的所有修改记录/实体的版本号。这是一种很流行的乐观隔离级别,因此被所有的主流对象关系映射库支持。在Java持久性API中,可以使用FLUSH_ON_COMMIT(尽管查询可能不影响本地改动)来接近达到这种级别,且如果检测到冲突的话,可以抛出OptimisticLockException 异常。这种隔离也同样可以用在HTTP头域的If-Match或者 If-Unmodified-Since中,它可以用来在更新前对比上一个资源的版本或者时间戳。这种级别最好在实体由外部信息(不从数据库中读取)更改,或者改动不会彼此覆盖的情况下使用。
例子:一个共享的公司目录或者一个wiki。
6、可重复读取(Repeatable Read)
可重复读取级别扩展了游标稳定性,它保证事务内的任何数据在事务过程中都不会被修改或者移除。悲观事务需要读取所有记录上的锁,并阻塞其他服务来修改这些记录。乐观事务则会跟踪所有的记录或者实体,并检查它们是否在提交时被修改过。这种级别最好在实体状态能够影响其他实体,或者事务由读写操作构成的情况下使用。
例子:一个订单跟踪数据库,它从一个实体中读取值并用它来计算其他的实体值。
7、快照隔离(Snapshot Isolation)
快照隔离扩展了快照读取和可重复读取,它保证事务中所有进行的读操作都能看到数据库中一致的快照。事务执行的的任何读操作都会有相同的结果,而不管它们在事务中执行的早晚。这和可重复读取不同,因为快照隔离能够防止幻读(查询结果不断变化)。许多关系型数据库采用多版本并发控制(也可以叫做 SERIALIZABLE)来支持这种级别,实现方法是通过锁和冲突检测的组合。在这种级别中,考虑到它可能与悲观机制或者乐观机制相冲突,因此事务一定要做好回滚的准备。悲观机制会通过锁住资源来尝试减少冲突的机会,但是必须在事务提交后将这些改动合并。乐观机制也会使用多版本并发控制,但是它不会阻塞其他可能产生潜在冲突操作的事务,反而是将冲突的事务进行回滚。这种级别的隔离最好在事务可以读取和修改多个记录的情况下使用。
例子:一个基于系统状态规则的工作流系统。
8、可串行性(Serializability)
串行性是快照隔离的扩展,它要求所有的事务都必须一个接着一个的出现,就好比它们被串行化过一样。悲观机制需要锁住所有评估过的查询,以防止写入操作影响这些结果。而乐观机制则跟踪所有评估过的查询,并在事务结束时使用一个后向验证或前向验证的模式来检查是否有并行写入操作影响了并行读入操作,如果有的话,它会将冲突事务外的所有事务进行回滚。在这种隔离级别中,任何提交事务都不会改变系统的表征状态。最好在需要完整数据一致性的情况下使用这个级别的隔离。
例子:一个进行范围查询来计算新值的账目系统。
下面是本文提到的隔离级别的汇总表,它可以帮助你找到最适合你应用程序的级别。
事务在不同隔离级别中可能的冲突类型:
游标稳定性
可重复读取
不同隔离级别的最佳前提:
乐观冲突模式
不能并发读写
没有冲突检测
单调的读/写
必须被验证
没有冲突检测
必须被验证
对比读入与修改内容
一致性读入
游标稳定性
对比修改的实体版本
可重复读取
对比读入的实体版本
必须被验证
对比读入的实体版本
必须被验证
对比查询与修改内容
完善数据一致性
数据一致性在数据库应用程序中至关重要-它允许开发者在分布式环境下使用数据。尽管强一致性级别如可串行性提供了一个简单的编程模型,但是它们会导致开销 过大,操作阻塞或者事务回滚,这对于很多应用程序来说都是不必要的。如果有其他问题的话,可以使用更加适当的隔离级别来帮助开发人员和系统架构师,让他们 在保持性能和开销平衡的前提下更好的理解数据一致性的需求。
查看英文原文:。
感谢对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至。也欢迎大家加入到中与我们的编辑和其他读者朋友交流。
Author Contacted
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
不想多说什么
Zhang Gavin
文章质量相当的高
很多术语不是很清楚
.com gaotianpu
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
赞助商链接
InfoQ每周精要
通过个性化定制的新闻邮件、RSS Feeds和InfoQ业界邮件通知,保持您对感兴趣的社区内容的时刻关注。
架构 & 设计
文化 & 方法
<及所有内容,版权所有 &#169;
C4Media Inc.
服务器由 提供, 我们最信赖的ISP伙伴。
北京创新网媒广告有限公司
京ICP备号-7
注意:如果要修改您的邮箱,我们将会发送确认邮件到您原来的邮箱。
使用现有的公司名称
修改公司名称为:
公司性质:
使用现有的公司性质
修改公司性质为:
使用现有的公司规模
修改公司规模为:
使用现在的国家
使用现在的省份
Subscribe to our newsletter?
Subscribe to our industry email notices?Chapter&5.&&#20107;&#20214;&#12289;&#25318;&#25130;&#22120;&#21644;&#24322;&#24120;&#22788;&#29702;Chapter&5.&&#20107;&#20214;&#12289;&#25318;&#25130;&#22120;&#21644;&#24322;&#24120;&#22788;&#29702;
&#20004;&#20010;&#26356;&#28145;&#20837;&#30340;&#27010;&#24565;&#34917;&#20805;&#20102;&#19978;&#19979;&#25991;&#32452;&#20214;&#27169;&#22411;&#65292;&#36825;&#20004;&#20010;&#27010;&#24565;&#25512;&#21160;&#20102;&#26497;&#31471;&#26494;&#32806;&#21512;&#36825;&#19968;Seam&#24212;&#29992;&#31243;&#24207;&#30340;&#29420;&#29305;&#29305;&#24615;&#12290;
&#31532;&#19968;&#20010;&#26159;&#24378;&#26377;&#21147;&#30340;&#20107;&#20214;&#27169;&#22411;&#65292;&#20107;&#20214;&#21487;&#20197;&#36890;&#36807;&#31867;&#20284;JSF&#32465;&#23450;&#34920;&#36798;&#24335;&#30340;&#26041;&#27861;&#26144;&#23556;&#21040;&#20107;&#20214;&#30417;&#21548;&#22120;&#12290;
&#31532;&#20108;&#20010;&#26159;&#26222;&#36941;&#20351;&#29992;&#27880;&#35299;&#21644;&#25318;&#25130;&#22120;&#65292;&#36825;&#20351;&#25105;&#20204;&#24635;&#33021;&#36328;&#36234;&#24335;&#22320;&#20999;&#20837;&#21040;&#21040;&#23454;&#29616;&#19994;&#21153;&#36923;&#36753;&#30340;&#32452;&#20214;&#12290;
5.1.&Seam&#20107;&#20214;
Seam&#32452;&#20214;&#27169;&#22411;&#26159;&#20026;&#20351;&#29992; &#20107;&#20214;&#39537;&#21160;&#30340;&#24212;&#29992;&#31243;&#24207; &#32780;&#24320;&#21457;&#30340;&#65292;&#29305;&#21035;&#26159;&#22312;&#19968;&#20010;&#32454;&#31890;&#24230;&#30340;&#20107;&#20214;&#27169;&#22411;&#37324;&#36827;&#34892;&#32454;&#31890;&#24230;&#30340;&#26494;&#32806;&#21512;&#32452;&#20214;&#30340;&#24320;&#21457;&#12290;
Seam&#30340;&#20107;&#20214;&#26377;&#20960;&#31181;&#31867;&#22411;&#65292;&#22823;&#37096;&#20998;&#26159;&#25105;&#20204;&#24050;&#32463;&#35265;&#36807;&#30340;&#65306;
JSF&#20107;&#20214;jBPM&#30340;&#29366;&#24577;&#36716;&#31227;&#20107;&#20214;Seam&#39029;&#38754;&#21160;&#20316;Seam&#32452;&#20214;&#39537;&#21160;&#20107;&#20214;Seam&#19978;&#19979;&#25991;&#20107;&#20214;
&#25152;&#26377;&#36825;&#20123;&#19981;&#21516;&#31181;&#31867;&#30340;&#20107;&#20214;&#37117;&#36890;&#36807;&#32465;&#23450;&#20102;&#34920;&#36798;&#24335;&#30340;JSF EL&#26041;&#27861;&#26144;&#23556;&#21040;Seam&#32452;&#20214;&#21435;&#12290;JSF&#20107;&#20214;&#26159;&#22312;JSF&#27169;&#26495;&#20013;&#23450;&#20041;&#30340;&#65306;
&h:commandButton value="Click me!" action="#{helloWorld.sayHello}"/&
&#23545;&#20110;jBPM&#30340;&#36716;&#25442;&#20107;&#20214;&#65292;&#26159;&#22312;jBPM&#36807;&#31243;&#23450;&#20041;&#25110;&#39029;&#38754;&#27969;&#23450;&#20041;&#20013;&#25351;&#23450;&#30340;&#65306;
&start-page name="hello" view-id="/hello.jsp"&
&transition to="hello"&
&action expression="#{helloWorld.sayHello}"/&
&/transition&
&/start-page&
&#20320;&#21487;&#20197;&#22312;&#20854;&#20182;&#22320;&#26041;&#25214;&#21040;&#26356;&#22810;&#20851;&#20110;JSF&#20107;&#20214;&#21644;jBPM&#20107;&#20214;&#30340;&#20449;&#24687;&#12290;&#25105;&#20204;&#29616;&#22312;&#20027;&#35201;&#20851;&#27880;&#30001;Seam&#23450;&#20041;&#30340;&#20004;&#31181;&#26032;&#22686;&#31867;&#22411;&#30340;&#20107;&#20214;&#19978;&#12290;
5.1.1.&&#39029;&#38754;&#21160;&#20316;
Seam&#30340;&#39029;&#38754;&#21160;&#20316;&#26159;&#25351;&#23601;&#22312;&#25105;&#20204;&#28210;&#26579;&#39029;&#38754;&#20043;&#21069;&#21457;&#29983;&#30340;&#20107;&#20214;&#12290;&#25105;&#20204;&#22312; WEB-INF/pages.xml &#20013;&#22768;&#26126;&#39029;&#38754;&#21160;&#20316;&#12290;
&#25105;&#20204;&#21487;&#20197;&#20026;&#20219;&#20309;&#19968;&#20010;&#29305;&#27530;&#30340;JSF&#35270;&#22270;id&#23450;&#20041;&#19968;&#20010;&#39029;&#38754;&#21160;&#20316;&#65306;
&page view-id="/hello.jsp" action="#{helloWorld.sayHello}"/&
&#25110;&#32773;&#65292;&#25105;&#20204;&#21487;&#20197;&#20351;&#29992;&#19968;&#20010;&#36890;&#37197;&#31526; * &#20316;&#20026; view-id &#30340;&#21518;&#32512;&#26469;&#25351;&#23450;&#19968;&#20010;&#21160;&#20316;&#65292;&#24212;&#29992;&#21040;&#25152;&#26377;&#31526;&#21512;&#35813;&#27169;&#24335;&#30340;&#35270;&#22270;ID&#20013;&#65306;
&page view-id="/hello/*" action="#{helloWorld.sayHello}"/&
&#22914;&#26524;&#22810;&#36890;&#37197;&#31526;&#30340;&#39029;&#38754;&#21160;&#20316;&#21305;&#37197;&#24403;&#21069;&#30340;view-id&#65292;Seam&#23558;&#25353;&#29031;&#20174;&#26368;&#36890;&#29992;&#21040;&#26368;&#29305;&#27530;&#30340;&#39034;&#24207;&#26469;&#35843;&#29992;&#25152;&#26377;&#30340;&#21160;&#20316;&#12290;
&#39029;&#38754;&#21160;&#20316;&#26041;&#27861;&#21487;&#20197;&#36820;&#22238;&#19968;&#20010;JSF&#30340;&#32467;&#26524;&#12290;&#22914;&#26524;&#36825;&#20010;&#32467;&#26524;&#38750;&#31354;&#65292;Seam&#23558;&#29992;&#23450;&#20041;&#22909;&#30340;&#23548;&#33322;&#35268;&#21017;&#23548;&#33322;&#21040;&#19968;&#20010;&#35270;&#22270;&#20013;&#21435;&#12290;
&#27492;&#22806;&#65292;&#22312;&#20803;&#32032; &page& &#37324;&#25552;&#21040;&#30340;&#35270;&#22270;id&#19981;&#38656;&#35201;&#23545;&#24212;&#19968;&#20010;&#30495;&#23454;&#30340;JSP&#25110;Facelets&#39029;&#38754;&#65281;
&#22240;&#27492;&#65292;&#25105;&#20204;&#21487;&#20197;&#20877;&#29983;&#20256;&#32479;&#30340;&#38754;&#21521;&#21160;&#20316;&#30340;&#26694;&#26550;&#30340;&#21151;&#33021;&#65292;&#23601;&#20687;Struts&#25110;WebWork&#20351;&#29992;&#39029;&#38754;&#21160;&#20316;&#37027;&#26679;&#12290;&#20363;&#22914;&#65306;
TODO: translate struts action into page action
&#22914;&#26524;&#20320;&#24819;&#35201;&#24212;non-faces&#30340;&#35831;&#27714;&#20570;&#28857;&#22797;&#26434;&#30340;&#20107;&#24773;&#65288;&#20363;&#22914;HTTP GET&#35831;&#27714;&#65289;&#65292;&#36825;&#23601;&#38750;&#24120;&#26377;&#29992;&#12290;
&#23545;&#20110;&#22810;&#39029;&#38754;&#25110;&#32773;&#26465;&#20214;&#39029;&#38754;&#30340;&#21160;&#20316;&#65292;&#21487;&#20197;&#20351;&#29992; &action& &#26631;&#31614;&#25351;&#23450;&#65306;
&page view-id="/hello.jsp"&
&action execute="#{helloWorld.sayHello}" if="#{not validation.failed}"/&
&action execute="#{hitCount.increment}"/&
&/pages&5.1.1.1.&&#39029;&#38754;&#21442;&#25968;
&#19968;&#20010;JSF faces&#35831;&#27714;&#65288;&#34920;&#21333;&#25552;&#20132;&#65289;&#21516;&#26102;&#23553;&#35013;&#20102;&#19968;&#20010;&#8220;&#21160;&#20316;action&#8221;&#65288;&#19968;&#20010;&#26041;&#27861;&#32465;&#23450;&#65289;&#21644;&#8220;&#22810;&#20010;&#21442;&#25968;parameters&#8221;&#65288;&#36755;&#20837;&#20540;&#32465;&#23450;&#65289;&#12290;&#19968;&#20010;&#39029;&#38754;&#21160;&#20316;&#20063;&#21487;&#33021;&#38656;&#35201;&#21442;&#25968;&#65281;
&#30001;&#20110;GET&#35831;&#27714;&#26159;&#21487;&#20197;&#20570;&#26631;&#35760;&#30340;&#65292;&#39029;&#38754;&#21442;&#25968;&#26159;&#20316;&#20026;&#20154;&#31867;&#26131;&#35835;&#30340;&#35831;&#27714;&#21442;&#25968;&#26469;&#20256;&#36882;&#30340;&#12290;&#65288;&#19981;&#20687;JSF form&#30340;&#36755;&#20837;&#65292;&#20160;&#20040;&#37117;&#26377;&#23601;&#26159;&#19981;&#20855;&#26377;&#21487;&#35835;&#24615;&#65281;&#65289;
&#20320;&#21487;&#20197;&#20351;&#29992;&#39029;&#38754;&#21442;&#25968;&#65292;&#24102;&#19981;&#24102;&#21160;&#20316;&#26041;&#27861;&#37117;&#21487;&#20197;&#12290;
5.1.1.1.1.&&#23558;&#35831;&#27714;&#21442;&#25968;&#26144;&#23556;&#21040;&#27169;&#22411;
Seam&#35753;&#25105;&#20204;&#25552;&#20379;&#19968;&#20010;&#20540;&#32465;&#23450;&#65292;&#26469;&#23558;&#19968;&#20010;&#24050;&#21629;&#21517;&#30340;&#35831;&#27714;&#21442;&#25968;&#26144;&#23556;&#25104;&#19968;&#20010;&#27169;&#22411;&#23545;&#35937;&#30340;&#23646;&#24615;&#12290;
&page view-id="/hello.jsp" action="#{helloWorld.sayHello}"&
&param name="firstName" value="#{person.firstName}"/&
&param name="lastName" value="#{person.lastName}"/&
&param& &#30340;&#22768;&#26126;&#26159;&#21452;&#21521;&#30340;&#65292;&#23601;&#20687;&#19968;&#20010;JSF&#36755;&#20837;&#30340;&#20540;&#32465;&#23450;&#65306;
&#24403;&#35270;&#22270;id&#30340;&#19968;&#20010;non-faces(GET)&#35831;&#27714;&#21457;&#29983;&#26102;&#65292;Seam&#22312;&#25191;&#34892;&#20102;&#30456;&#24212;&#30340;&#31867;&#22411;&#36716;&#21464;&#20043;&#21518;&#65292;&#23601;&#22312;&#27169;&#22411;&#23545;&#35937;&#19978;&#35774;&#32622;&#24050;&#21629;&#21517;&#30340;&#35831;&#27714;&#21442;&#25968;&#30340;&#20540;&#12290;
&#20219;&#20309; &s:link& &#25110; &s:button& &#36879;&#26126;&#22320;&#25110;&#32773;&#35828;&#33258;&#21160;&#22320;&#21253;&#25324;request&#24102;&#26377;&#30340;&#21442;&#25968;&#12290;
&#21442;&#25968;&#30340;&#20540;&#30001;&#28210;&#26579;&#38454;&#27573;&#65288;&#24403; &s:link& &#34987;&#28210;&#26579;&#65289;&#30340;&#32465;&#23450;&#20540;&#26469;&#20915;&#23450;&#12290;
&#20351;&#29992; &redirect/& &#21040;&#35270;&#22270;id&#30340;&#20219;&#20309;&#23548;&#33322;&#35268;&#21017;&#24456;&#26126;&#26174;&#26159;&#21547;&#26377;&#35831;&#27714;&#21442;&#25968;&#12290;
&#21442;&#25968;&#30340;&#20540;&#30001;&#35843;&#29992;&#24212;&#29992;&#31243;&#24207;&#38454;&#27573;&#32467;&#26463;&#26102;&#30340;&#20540;&#32465;&#23450;&#22823;&#23567;&#26469;&#20915;&#23450;&#12290;
&#36825;&#20010;&#20540;&#24456;&#26126;&#26174;&#26159;&#30001;&#24102;&#26377;&#35270;&#22270;id&#30340;&#34987;&#25552;&#20132;&#30340;&#20219;&#20309;JSF&#39029;&#38754;&#20256;&#25773;&#30340;&#12290;
&#36825;&#24847;&#21619;&#30528;&#35270;&#22270;&#21442;&#25968;&#34920;&#29616;&#24471;&#23601;&#20687;faces&#35831;&#27714;&#30340; PAGE &#33539;&#22260;&#20869;&#19978;&#19979;&#25991;&#21464;&#37327;&#19968;&#26679;&#12290;
&#26368;&#29702;&#24819;&#30340;&#24773;&#24418;&#26159; &#26080;&#35770; &#25105;&#20204;&#20174;&#20160;&#20040;&#39029;&#38754;&#21040; /hello.jsp
&#65288;&#25110;&#32773;&#20174;/hello.jsp&#22238;&#21040;/hello.jsp&#65289;&#65292;
&#22312;&#20540;&#32465;&#23450;&#20013;&#34987;&#24341;&#29992;&#30340;&#27169;&#22411;&#23646;&#24615;&#30340;&#20540;&#37117;&#24212;&#35813;&#34987;&#8220;&#35760;&#20303;&#8221;&#65292;&#32780;&#19981;&#38656;&#35201;&#23545;&#35805;&#26469;&#23384;&#20648;&#65288;&#25110;&#32773;&#20854;&#20182;&#30340;&#26381;&#21153;&#22120;&#31471;&#29366;&#24577;&#26469;&#23384;&#20648;&#65289;&#12290;
5.1.1.1.2.&&#20256;&#25773;&#35831;&#27714;&#21442;&#25968;
&#22914;&#26524;&#21482;&#26159;&#25351;&#23450; name &#23646;&#24615;&#65292;&#37027;&#20040;&#35831;&#27714;&#21442;&#25968;&#23601;&#20250;&#21033;&#29992; PAGE &#36827;&#34892;&#19978;&#19979;&#25991;&#20256;&#25773;&#65288;&#23427;&#27809;&#26377;&#34987;&#26144;&#23556;&#25104;&#27169;&#22411;&#23646;&#24615;&#65289;&#12290;
&page view-id="/hello.jsp" action="#{helloWorld.sayHello}"&
&param name="firstName" /&
&param name="lastName" /&
&#22914;&#26524;&#20320;&#24819;&#35201;&#24314;&#31435;&#22810;&#23618;&#30340;&#22797;&#26434;CRUD&#39029;&#38754;&#65292;&#39029;&#38754;&#21442;&#25968;&#30340;&#20256;&#36882;&#23588;&#20854;&#26377;&#29992;&#12290;&#20320;&#21487;&#20197;&#29992;&#23427;&#8220;&#35760;&#20303;&#8221;&#20320;&#21069;&#38754;&#21040;&#36807;&#30340;&#39029;&#38754;&#65288;&#20363;&#22914;&#24403;&#25353;&#20102;&#20445;&#23384;&#25353;&#38062;&#26102;&#65289;&#21644;&#27491;&#22312;&#32534;&#36753;&#30340;&#23454;&#20307;&#12290;
&#24456;&#26126;&#26174;&#65292;&#22914;&#26524;&#21442;&#25968;&#26159;&#35270;&#22270;&#30340;&#39029;&#38754;&#21442;&#25968;&#30340;&#35805;&#65292;&#20219;&#20309; &s:link& &#25110;&#32773; &s:button& &#37117;&#20250;&#20256;&#25773;&#35831;&#27714;&#21442;&#25968;&#12290;
&#36825;&#20010;&#20540;&#24456;&#26126;&#26174;&#26159;&#30001;&#24102;&#26377;&#25351;&#23450;&#35270;&#22270;id&#30340;&#39029;&#38754;&#30340;&#20219;&#20309;jsf&#39029;&#38754;&#34920;&#21333;&#25552;&#20132;&#20256;&#25773;&#30340;&#12290;
&#65288;&#36825;&#24847;&#21619;&#30528;&#35270;&#22270;&#21442;&#25968;&#34920;&#29616;&#24471;&#23601;&#20687;faces&#35831;&#27714;&#30340;PAGE&#33539;&#22260;&#20869;&#35270;&#22270;&#21442;&#25968;&#19968;&#26679;&#12290;&#65289;
&#25152;&#26377;&#36825;&#20123;&#21548;&#36215;&#26469;&#24456;&#22797;&#26434;&#65292;&#20320;&#21487;&#33021;&#20250;&#24819;&#36825;&#20040;&#19968;&#20010;&#22806;&#26469;&#30340;&#26500;&#36896;&#26159;&#21542;&#30495;&#30340;&#20540;&#24471;&#21435;&#21162;&#21147;&#12290;&#23454;&#38469;&#19978;&#65292;&#19968;&#26086;&#20320;&#8220;&#25484;&#25569;&#20102;&#23427;&#8221;&#65292;&#26377;&#36825;&#31181;&#24819;&#27861;&#38750;&#24120;&#33258;&#28982;&#12290;
&#29702;&#35299;&#36825;&#20123;&#36164;&#26009;&#26174;&#28982;&#38656;&#35201;&#33457;&#36153;&#26102;&#38388;&#30340;&#12290;&#39029;&#38754;&#21442;&#25968;&#26159;&#36328;&#36234;non-faces&#35831;&#27714;&#26469;&#20256;&#25773;&#29366;&#24577;&#30340;&#26368;&#20248;&#38597;&#26041;&#24335;&#12290;
&#23545;&#20110;&#29992;&#21487;&#26631;&#35760;&#30340;&#32467;&#26524;&#39029;&#65292;&#25628;&#32034;&#23631;&#24149;&#30340;&#38382;&#39064;&#23588;&#20854;&#26377;&#25928;&#65292;&#22312;&#36825;&#31181;&#24773;&#20917;&#19979;&#65292;&#25105;&#20204;&#21916;&#27426;&#21487;&#20197;&#20889;&#24212;&#29992;&#31243;&#24207;&#20195;&#30721;&#12289;&#29992;&#21516;&#19968;&#27573;&#20195;&#30721;&#26469;&#22788;&#29702;POST&#21644;GET&#35831;&#27714;&#12290;
&#39029;&#38754;&#21442;&#25968;&#28040;&#38500;&#20102;&#35270;&#22270;&#23450;&#20041;&#20013;&#35831;&#27714;&#21442;&#25968;&#30340;&#37325;&#22797;&#28165;&#21333;&#65292;&#24182;&#20351;&#24471;&#37325;&#23450;&#21521;&#26356;&#23481;&#26131;&#29992;&#20195;&#30721;&#23454;&#29616;&#12290;
5.1.1.1.3.&&#36716;&#25442;&#21644;&#39564;&#35777;
&#20320;&#21487;&#20197;&#20026;&#22797;&#26434;&#30340;&#27169;&#22411;&#23646;&#24615;&#25351;&#23450;&#19968;&#20010;JSF&#36716;&#25442;&#22120;:
&page view-id="/calculator.jsp" action="#{calculator.calculate}"&
&param name="x" value="#{calculator.lhs}"/&
&param name="y" value="#{calculator.rhs}"/&
&param name="op" converterId="com.my.calculator.OperatorConverter" value="#{calculator.op}"/&
&#25110;&#32773;&#65306;
&page view-id="/calculator.jsp" action="#{calculator.calculate}"&
&param name="x" value="#{calculator.lhs}"/&
&param name="y" value="#{calculator.rhs}"/&
&param name="op" converter="#{operatorConverter}" value="#{calculator.op}"/&
JSF&#39564;&#35777;&#22120;&#21644; required="true" &#20063;&#21487;&#20197;&#36825;&#26679;&#29992;&#65306;
&page view-id="/blog.xhtml"&
&param name="date"
value="#{blog.date}"
validatorId="com.my.blog.PastDate"
required="true"/&
&#25110;&#32773;&#65306;
&page view-id="/blog.xhtml"&
&param name="date"
value="#{blog.date}"
validator="#{pastDateValidator}"
required="true"/&
&#26356;&#22909;&#30340;&#26041;&#24335;&#65292;&#22522;&#20110;&#27169;&#22411;&#30340;Hibernate&#39564;&#35777;&#22120;&#27880;&#35299;&#20250;&#33258;&#21160;&#34987;&#35782;&#21035;&#21644;&#39564;&#35777;&#12290;
&#24403;&#31867;&#22411;&#36716;&#25442;&#25110;&#32773;&#39564;&#35777;&#22833;&#36133;&#21518;&#65292;&#19968;&#20010;&#20840;&#23616;&#30340; FacesMessage &#23601;&#20250;&#34987;&#28155;&#21152;&#21040; FacesContext &#20013;&#12290;
5.1.1.2.&&#23548;&#33322;
&#20320;&#21487;&#20197;&#20351;&#29992;&#22312;Seam&#24212;&#29992;&#31243;&#24207;&#30340; faces-config.xml &#20013;&#23450;&#20041;&#30340;&#26631;&#20934;JSF&#23548;&#33322;&#35268;&#21017;&#12290;&#28982;&#32780;&#65292;JSF&#23548;&#33322;&#35268;&#21017;&#20063;&#26377;&#35768;&#22810;&#28902;&#20154;&#30340;&#38480;&#21046;&#65306;
&#22312;&#37325;&#23450;&#21521;&#26102;&#65292;&#19981;&#21487;&#33021;&#25351;&#23450;&#19968;&#20010;&#23558;&#35201;&#20351;&#29992;&#30340;&#35831;&#27714;&#21442;&#25968;&#12290;
&#19981;&#21487;&#33021;&#30001;&#19968;&#20010;&#35268;&#21017;&#26469;&#24320;&#22987;&#25110;&#32773;&#32467;&#26463;&#23545;&#35805;&#12290;
&#36890;&#36807;&#32473;&#21160;&#20316;&#26041;&#27861;&#27714;&#21462;&#36820;&#22238;&#20540;&#26469;&#36816;&#20316;&#35268;&#21017;&#65307;&#19981;&#21487;&#33021;&#21435;&#32473;&#19968;&#20010;&#20219;&#24847;&#30340;EL&#34920;&#36798;&#24335;&#21462;&#20540;&#12290;
&#26356;&#28145;&#23618;&#27425;&#30340;&#38382;&#39064;&#22312;&#20110;&#8221;&#31649;&#29702;&#8220;&#36923;&#36753;&#22312; pages.xml &#21644; faces-config.xml &#20043;&#38388;&#26159;&#20998;&#25955;&#30340;&#12290;
&#26368;&#22909;&#26159;&#25226;&#36825;&#31181;&#36923;&#36753;&#32479;&#19968;&#36827; pages.xml &#20013;&#12290;
&#36825;&#20010;JSF&#23548;&#33322;&#35268;&#21017;&#65306;
&navigation-rule&
&from-view-id&/editDocument.xhtml&/from-view-id&
&navigation-case&
&from-action&#{documentEditor.update}&/from-action&
&from-outcome&success&/from-outcome&
&to-view-id&/viewDocument.xhtml&/to-view-id&
&redirect/&
&/navigation-case&
&/navigation-rule&
&#21487;&#20197;&#37325;&#20889;&#22914;&#19979;&#65306;
&page view-id="/editDocument.xhtml"&
&navigation from-action="#{documentEditor.update}"&
&rule if-outcome="success"&
&redirect view-id="/viewDocument.xhtml"/&
&/navigation&
&#22914;&#26524;&#25105;&#20204;&#19981;&#24517;&#29992;&#23383;&#31526;&#31867;&#22411;&#30340;&#36820;&#22238;&#20540;&#65288;JSF&#30340;&#32467;&#26524;&#65289;&#26469;&#27745;&#26579; DocumentEditor &#32452;&#20214;&#30340;&#35805;&#20250;&#26356;&#22909;&#12290;
&#22240;&#27492;Seam&#20801;&#35768;&#25105;&#20204;&#20889;&#25104;&#65306;
&page view-id="/editDocument.xhtml"&
&navigation from-action="#{documentEditor.update}"
evaluate="#{documentEditor.errors.size}"&
&rule if-outcome="0"&
&redirect view-id="/viewDocument.xhtml"/&
&/navigation&
&#25110;&#32773;&#29978;&#33267;&#21487;&#20197;&#20889;&#25104;&#65306;
&page view-id="/editDocument.xhtml"&
&navigation from-action="#{documentEditor.update}"&
&rule if="#{documentEditor.errors.empty}"&
&redirect view-id="/viewDocument.xhtml"/&
&/navigation&
&#31532;&#19968;&#31181;&#24418;&#24335;&#35745;&#31639;&#19968;&#20010;&#20540;&#32465;&#23450;&#65292;&#26469;&#30830;&#23450;&#35201;&#34987;&#21518;&#38754;&#30340;&#19968;&#31995;&#21015;&#23548;&#33322;&#35268;&#21017;&#25152;&#20351;&#29992;&#30340;&#32467;&#26524;&#20540;&#12290;
&#31532;&#20108;&#31181;&#26041;&#27861;&#24573;&#30053;&#32467;&#26524;&#65292;&#24182;&#20026;&#27599;&#20010;&#21487;&#33021;&#30340;&#35268;&#21017;&#26469;&#35745;&#31639;&#20540;&#32465;&#23450;&#12290;
&#24403;&#28982;&#65292;&#24403;&#19968;&#20010;&#26356;&#26032;&#25104;&#21151;&#65292;&#25105;&#20204;&#21487;&#33021;&#24819;&#35201;&#32467;&#26463;&#24403;&#21069;&#30340;&#23545;&#35805;&#12290;&#25105;&#20204;&#21487;&#20197;&#36825;&#26679;&#20570;&#65306;
&page view-id="/editDocument.xhtml"&
&navigation from-action="#{documentEditor.update}"&
&rule if="#{documentEditor.errors.empty}"&
&end-conversation/&
&redirect view-id="/viewDocument.xhtml"/&
&/navigation&
&#30001;&#20110;&#25105;&#20204;&#32456;&#27490;&#20102;&#20250;&#35805;&#65292;&#21518;&#38754;&#30340;&#20219;&#20309;&#35831;&#27714;&#37117;&#26080;&#27861;&#30693;&#36947;&#25105;&#20204;&#23545;&#21738;&#20010;&#25991;&#26723;&#24863;&#20852;&#36259;&#12290;
&#25105;&#20204;&#21487;&#20197;&#23558;&#25991;&#26723;id&#20316;&#20026;&#19968;&#20010;&#35831;&#27714;&#21442;&#25968;&#20256;&#36882;&#65292;&#36825;&#26679;&#20063;&#20351;&#24471;&#35270;&#22270;&#21464;&#25104;&#26159;&#21487;&#26631;&#35760;&#30340;&#65306;
&page view-id="/editDocument.xhtml"&
&navigation from-action="#{documentEditor.update}"&
&rule if="#{documentEditor.errors.empty}"&
&end-conversation/&
&redirect view-id="/viewDocument.xhtml"&
&param name="documentId" value="#{documentEditor.documentId}"/&
&/redirect&
&/navigation&
&#22312;JSF&#20013;&#65292;null&#26159;&#19968;&#20010;&#29305;&#27530;&#30340;&#32467;&#26524;&#12290;&#32467;&#26524;null&#34987;&#35299;&#37322;&#25104;&#8220;&#37325;&#26032;&#26174;&#31034;&#39029;&#38754;&#8221;&#12290;
&#19979;&#38754;&#30340;&#23548;&#33322;&#35268;&#21017;&#31526;&#21512;&#20219;&#20309;&#38750;null&#30340;&#32467;&#26524;&#65292;&#32780; &#19981;&#31526;&#21512; null&#30340;&#32467;&#26524;&#65306;
&page view-id="/editDocument.xhtml"&
&navigation from-action="#{documentEditor.update}"&
&render view-id="/viewDocument.xhtml"/&
&/navigation&
&#22914;&#26524;&#32467;&#26524;&#20986;&#29616;null&#65292;&#20320;&#36824;&#24819;&#25191;&#34892;&#23548;&#33322;&#65292;&#23601;&#20351;&#29992;&#19979;&#38754;&#30340;&#24418;&#24335;&#65306;
&page view-id="/editDocument.xhtml"&
&navigation from-action="#{documentEditor.update}"&
&render view-id="/viewDocument.xhtml"/&
&/navigation&
view-id&#21487;&#20197;&#20316;&#20026;&#19968;&#20010;JSF EL&#34920;&#36798;&#24335;&#25552;&#20379;&#65306;
&page view-id="/editDocument.xhtml"&
&navigation if-outcome="success"&
&redirect view-id="/#{userAgent}/displayDocument.xhtml"/&
&/navigation&
&/page&5.1.1.3.&&#23548;&#33322;&#30340;&#23450;&#20041;&#12289;&#39029;&#38754;&#21160;&#20316;&#21644;&#21442;&#25968;&#30340;&#32454;&#31890;&#24230;&#25991;&#20214;
&#22914;&#26524;&#20320;&#26377;&#24456;&#22810;&#19981;&#21516;&#30340;&#39029;&#38754;&#21160;&#20316;&#21644;&#39029;&#38754;&#21442;&#25968;&#65292;&#25110;&#32773;&#29978;&#33267;&#26159;&#24456;&#22810;&#23548;&#33322;&#35268;&#21017;&#65292;&#20320;&#23601;&#20250;&#24456;&#24819;&#25226;&#36825;&#20123;&#22768;&#26126;&#20998;&#24320;&#25918;&#21040;&#22810;&#20010;&#25991;&#20214;&#20013;&#21435;&#12290;
&#20320;&#21487;&#20197;&#22312;&#19968;&#20010;&#21517;&#20026; calc/calculator.page.xml &#30340;&#36164;&#28304;&#20013;&#65292;&#20026;&#19968;&#20010;&#26377;&#30528;&#35270;&#22270;id /calc/calculator.jsp &#30340;&#39029;&#38754;&#23450;&#20041;&#21160;&#20316;&#21644;&#21442;&#25968;&#12290;
&#36825;&#20010;&#20363;&#23376;&#20013;&#30340;&#26681;&#20803;&#32032;&#26159; &page& &#20803;&#32032;&#65292;&#38544;&#21547;&#30528;&#35270;&#22270;id&#65306;
&page action="#{calculator.calculate}"&
&param name="x" value="#{calculator.lhs}"/&
&param name="y" value="#{calculator.rhs}"/&
&param name="op" converter="#{operatorConverter}" value="#{calculator.op}"/&
&/page&5.1.2.&&#32452;&#20214;&#39537;&#21160;&#30340;&#20107;&#20214;
Seam&#32452;&#20214;&#21487;&#20197;&#36890;&#36807;&#26041;&#27861;&#38388;&#31616;&#21333;&#30340;&#35843;&#29992;&#30456;&#20114;&#24433;&#21709;&#12290;&#29366;&#24577;&#32452;&#20214;&#29978;&#33267;&#23454;&#29616; Observer/Observable &#27169;&#24335;&#12290;
&#20294;&#22312;&#32452;&#20214;&#30452;&#25509;&#35843;&#29992;&#24444;&#27492;&#26041;&#27861;&#30340;&#26102;&#20505;&#65292;&#20026;&#20102;&#20351;&#32452;&#20214;&#22312;&#19968;&#20010;&#27604;&#21487;&#33021;&#23384;&#22312;&#30340;&#26356;&#21152;&#26494;&#32806;&#21512;&#30340;&#26041;&#24335;&#19979;&#30456;&#20114;&#20316;&#29992;&#65292;Seam&#25552;&#20379;&#20102; &#32452;&#20214;&#39537;&#21160;&#20107;&#20214;&#12290;
&#25105;&#20204;&#22312; components.xml &#37324;&#25351;&#23450;&#20102;&#20107;&#20214;&#30417;&#21548;&#22120;&#65288;&#35266;&#23519;&#32773;&#65289;&#12290;
&components&
&event type="hello"&
&action execute="#{helloListener.sayHelloBack}"/&
&action execute="#{logger.logHello}"/&
&/components&
&#22312;&#36825;&#37324;&#65292;event type &#26159;&#20219;&#24847;&#30340;&#23383;&#31526;&#20018;&#12290;
&#20107;&#20214;&#21457;&#29983;&#26102;&#65292;&#35813;&#20107;&#20214;&#24050;&#32463;&#27880;&#20876;&#36807;&#30340;&#21160;&#20316;&#23558;&#25353;&#29031;&#23427;&#20204;&#22312; components.xml &#20013;&#20986;&#29616;&#30340;&#39034;&#24207;&#34987;&#20381;&#27425;&#35843;&#29992;&#12290;
&#32452;&#20214;&#22914;&#20309;&#21457;&#36215;&#20107;&#20214;&#65311;Seam&#20026;&#27492;&#25552;&#20379;&#20102;&#19968;&#20010;&#20869;&#32622;&#30340;&#32452;&#20214;&#12290;
@Name("helloWorld")
public class HelloWorld {
public void sayHello() {
FacesMessages.instance().add("Hello World!");
Events.instance().raiseEvent("hello");
&#25110;&#32773;&#20320;&#21487;&#20197;&#20351;&#29992;&#27880;&#35299;&#12290;
@Name("helloWorld")
public class HelloWorld {
@RaiseEvent("hello")
public void sayHello() {
FacesMessages.instance().add("Hello World!");
&#27880;&#24847;&#36825;&#20010;&#20107;&#20214;&#20135;&#29983;&#22120;&#27809;&#26377;&#20381;&#36182;&#20219;&#20309;&#20107;&#20214;&#28040;&#36153;&#32773;&#12290;&#20107;&#20214;&#30417;&#21548;&#22120;&#29616;&#22312;&#21487;&#20197;&#23436;&#20840;&#19981;&#20381;&#36182;&#20110;&#20135;&#29983;&#22120;&#32780;&#23454;&#29616;&#65306;
@Name("helloListener")
public class HelloListener {
public void sayHelloBack() {
FacesMessages.instance().add("Hello to you too!");
&#19978;&#36848;&#22312; components.xml&#20013;&#23450;&#20041;&#30340;&#26041;&#27861;&#32465;&#23450;&#20851;&#24515;&#25226;&#20107;&#20214;&#26144;&#23556;&#21040;&#28040;&#36153;&#32773;&#21435;&#12290;
&#22914;&#26524;&#20320;&#19981;&#21916;&#27426; components.xml &#25991;&#20214;&#20013;&#30340;&#37027;&#19968;&#22871;&#65292;&#21487;&#20197;&#29992;&#27880;&#35299;&#26469;&#26367;&#20195;&#65306;
@Name("helloListener")
public class HelloListener {
@Observer("hello")
public void sayHelloBack() {
FacesMessages.instance().add("Hello to you too!");
&#20320;&#21487;&#33021;&#24819;&#30693;&#36947;&#20026;&#20160;&#20040;&#22312;&#36825;&#20010;&#35752;&#35770;&#20013;&#27809;&#26377;&#25552;&#21040;&#20851;&#20110;&#20219;&#20309;&#20107;&#20214;&#23545;&#35937;&#30340;&#19996;&#35199;&#12290;
&#22312;Seam&#20013;&#65292;&#23545;&#20107;&#20214;&#23545;&#35937;&#32780;&#35328;&#65292;&#19981;&#38656;&#35201;&#22312;&#20107;&#20214;&#29983;&#20135;&#32773;&#21644;&#30417;&#21548;&#22120;&#20043;&#38388;&#20256;&#25773;&#29366;&#24577;&#12290;
&#29366;&#24577;&#20445;&#30041;&#22312;Seam&#19978;&#19979;&#25991;&#20013;&#65292;&#22312;&#32452;&#20214;&#20043;&#38388;&#20849;&#20139;&#12290;&#28982;&#32780;&#65292;&#22914;&#26524;&#20320;&#30495;&#24819;&#20256;&#36882;&#20107;&#20214;&#23545;&#35937;&#65292;&#20320;&#21487;&#20197;&#65306;
@Name("helloWorld")
public class HelloWorld {
public void sayHello() {
FacesMessages.instance().add("Hello World, my name is #0.", name);
Events.instance().raiseEvent("hello", name);
}@Name("helloListener")
public class HelloListener {
@Observer("hello")
public void sayHelloBack(String name) {
FacesMessages.instance().add("Hello #0!", name);
}5.1.3.&&#19978;&#19979;&#25991;&#20107;&#20214;
Seam&#23450;&#20041;&#20102;&#35768;&#22810;&#20869;&#32622;&#20107;&#20214;&#65292;&#24212;&#29992;&#31243;&#24207;&#21487;&#20197;&#29992;&#23427;&#20204;&#26469;&#36827;&#34892;&#29305;&#27530;&#31867;&#22411;&#30340;&#26694;&#26550;&#38598;&#25104;&#12290;&#36825;&#20123;&#20107;&#20214;&#26159;&#65306;
org.jboss.seam.validationFailed &#8212; JSF&#39564;&#35777;&#22833;&#36133;&#26102;&#34987;&#35843;&#29992;org.jboss.seam.noConversation &#8212; &#27809;&#26377;&#38271;&#26102;&#38388;&#36816;&#34892;&#30340;&#23545;&#35805;&#22312;&#36816;&#34892;&#25110;&#32773;&#38271;&#26102;&#38388;&#36816;&#34892;&#30340;&#23545;&#35805;&#34987;&#35831;&#27714;&#26102;&#35843;&#29992;org.jboss.seam.preSetVariable.&name& &#8212; &#35774;&#32622;&#19978;&#19979;&#25991;&#21464;&#37327; &name& &#26102;&#35843;&#29992;org.jboss.seam.postSetVariable.&name& &#8212; &#35774;&#32622;&#19978;&#19979;&#25991;&#21464;&#37327; &name& &#26102;&#35843;&#29992;org.jboss.seam.preRemoveVariable.&name& &#8212; &#26410;&#35774;&#32622;&#19978;&#19979;&#25991;&#21464;&#37327; &name& &#26102;&#35843;&#29992;org.jboss.seam.postRemoveVariable.&name& &#8212; &#26410;&#35774;&#32622;&#19978;&#19979;&#25991;&#21464;&#37327; &name& &#26102;&#35843;&#29992;org.jboss.seam.preDestroyContext.&SCOPE& &#8212; &#22312; &SCOPE& &#19978;&#19979;&#25991;&#34987;&#38144;&#27585;&#20043;&#21069;&#35843;&#29992;org.jboss.seam.postDestroyContext.&SCOPE& &#8212; &#22312; &SCOPE& &#19978;&#19979;&#25991;&#34987;&#38144;&#27585;&#20043;&#21518;&#35843;&#29992;org.jboss.seam.beginConversation &#8212; &#24403;&#19968;&#20010;&#38271;&#26102;&#38388;&#36816;&#34892;&#30340;&#23545;&#35805;&#24320;&#22987;&#30340;&#26102;&#20505;&#35843;&#29992;org.jboss.seam.endConversation &#8212; &#24403;&#19968;&#20010;&#38271;&#26102;&#38388;&#36816;&#34892;&#30340;&#23545;&#35805;&#32467;&#26463;&#30340;&#26102;&#20505;&#35843;&#29992;org.jboss.seam.beginPageflow.&name& &#8212; &#22312;&#39029;&#38754;&#27969; &name& &#24320;&#22987;&#26102;&#35843;&#29992;org.jboss.seam.endPageflow.&name& &#8212; &#22312;&#39029;&#38754;&#27969; &name& &#32467;&#26463;&#26102;&#35843;&#29992;org.jboss.seam.createProcess.&name& &#8212; &#22312;&#21019;&#24314;&#36827;&#31243; &name& &#26102;&#35843;&#29992;org.jboss.seam.endProcess.&name& &#8212; &#22312;&#36827;&#31243; &name& &#32467;&#26463;&#26102;&#35843;&#29992;org.jboss.seam.initProcess.&name& &#8212; &#22312;&#36827;&#31243; &name& &#19982;&#23545;&#35805;&#30456;&#20851;&#32852;&#26102;&#35843;&#29992;org.jboss.seam.initTask.&name& &#8212; &#22312;&#20219;&#21153; &name& &#19982;&#23545;&#35805;&#30456;&#20851;&#32852;&#26102;&#35843;&#29992;org.jboss.seam.startTask.&name& &#8212; &#22312;&#20219;&#21153; &name& &#24320;&#22987;&#26102;&#35843;&#29992;org.jboss.seam.endTask.&name& &#8212; &#22312;&#32467;&#26463;&#20219;&#21153; &name& &#26102;&#35843;&#29992;org.jboss.seam.postCreate.&name& &#8212; &#22312;&#21019;&#24314;&#32452;&#20214; &name& &#26102;&#35843;&#29992;org.jboss.seam.preDestroy.&name& &#8212; &#22312;&#38144;&#27585;&#32452;&#20214; &name& &#26102;&#35843;&#29992;org.jboss.seam.beforePhase &#8212; &#22312;&#24320;&#22987;&#19968;&#20010;JSF&#38454;&#27573;&#20043;&#21069;&#35843;&#29992;org.jboss.seam.afterPhase &#8212;
&#22312;&#19968;&#20010;JSF&#38454;&#27573;&#32467;&#26463;&#20043;&#21518;&#35843;&#29992;org.jboss.seam.postInitialization &#8212; &#24403;Seam&#34987;&#21021;&#22987;&#21270;&#24182;&#21551;&#21160;&#25152;&#26377;&#32452;&#20214;&#26102;&#34987;&#35843;&#29992;org.jboss.seam.postAuthenticate.&name& &#8212; &#29992;&#25143;&#35748;&#35777;&#20043;&#21518;&#35843;&#29992;org.jboss.seam.preAuthenticate.&name& &#8212; &#22312;&#23581;&#35797;&#35748;&#35777;&#29992;&#25143;&#20043;&#21069;&#35843;&#29992;org.jboss.seam.notLoggedIn &#8212; &#22312;&#19981;&#38656;&#35201;&#35748;&#35777;&#29992;&#25143;&#21644;&#38656;&#35201;&#35748;&#35777;&#30340;&#26102;&#20505;&#35843;&#29992;org.jboss.seam.rememberMe &#8212; &#24403;Seam&#23433;&#20840;&#22312;cookie&#20013;&#21457;&#29616;&#29992;&#25143;&#21517;&#26102;&#21457;&#29983;org.jboss.seam.exceptionHandled.&type& &#8212; &#22312;Seam&#22788;&#29702;&#26410;&#34987;&#25429;&#25417;&#30340;&#24322;&#24120;&#26102;&#34987;&#35843;&#29992;org.jboss.seam.exceptionHandled &#8212; &#22312;Seam&#22788;&#29702;&#26410;&#34987;&#25429;&#25417;&#30340;&#24322;&#24120;&#26102;&#34987;&#35843;&#29992;org.jboss.seam.exceptionNotHandled &#8212; &#22312;&#27809;&#26377;&#26410;&#34987;&#25429;&#25417;&#24322;&#24120;&#30340;&#22788;&#29702;&#22120;&#26102;&#34987;&#35843;&#29992;org.jboss.seam.afterTransactionSuccess &#8212; &#24403;&#20107;&#21153;&#22312;Seam Application Framework&#20013;&#25104;&#21151;&#26102;&#35843;&#29992;org.jboss.seam.afterTransactionSuccess.&name& &#8212; &#24403;&#31649;&#29702;&#20855;&#21517; &name& &#23454;&#20307;&#30340;&#20107;&#21153;&#22312;Seam Application Framework&#20013;&#25104;&#21151;&#26102;&#35843;&#29992;
&#12288;&#12288;Seam&#32452;&#20214;&#21487;&#20197;&#29992;&#23427;&#20204;&#35266;&#23519;&#20219;&#20309;&#20854;&#20182;&#32452;&#20214;&#39537;&#21160;&#20107;&#20214;&#30340;&#21516;&#26679;&#26041;&#24335;&#26469;&#35266;&#23519;&#36825;&#20123;&#20107;&#20214;&#20013;&#30340;&#20219;&#20309;&#19968;&#31181;&#12290;
5.2.&Seam &#25318;&#25130;&#22120;
EJB 3.0&#20026;&#20250;&#35805;Bean&#32452;&#20214;&#24341;&#20837;&#20102;&#19968;&#20010;&#26631;&#20934;&#30340;&#25318;&#25130;&#22120;&#27169;&#22411;&#12290;
&#35201;&#24448;Bean&#37324;&#28155;&#21152;&#25318;&#25130;&#22120;&#65292;&#20320;&#38656;&#35201;&#20889;&#19968;&#20010;&#31867;&#65292;&#35813;&#31867;&#26377;&#19968;&#20010;&#34987;&#27880;&#35299;&#36807;&#30340;&#26041;&#27861; @AroundInvoke&#65292;&#24182;&#29992; @Interceptors &#26469;&#27880;&#35299;&#36825;&#20010;Bean&#20197;&#25351;&#23450;&#25318;&#25130;&#22120;&#31867;&#30340;&#21517;&#31216;&#12290;
&#20363;&#22914;&#65292;&#19979;&#38754;&#30340;&#25318;&#25130;&#22120;&#26816;&#26597;&#29992;&#25143;&#26159;&#21542;&#22312;&#20801;&#35768;&#35843;&#29992;&#21160;&#20316;&#30417;&#21548;&#22120;&#26041;&#27861;&#20043;&#21069;&#30331;&#24405;&#65306;
public class LoggedInInterceptor {
@AroundInvoke
public Object checkLoggedIn(InvocationContext invocation) throws Exception {
boolean isLoggedIn = Contexts.getSessionContext().get("loggedIn")!=
if (isLoggedIn) {
//the user is already logged in
return invocation.proceed();
//the user is not logged in, fwd to login page
return "login";
&#35201;&#25226;&#36825;&#20010;&#25318;&#25130;&#22120;&#24212;&#29992;&#21040;&#19968;&#20010;&#20316;&#20026;&#21160;&#20316;&#30417;&#21548;&#22120;&#30340;&#20250;&#35805;Bean&#19978;&#65292;&#25105;&#20204;&#24517;&#39035;&#27880;&#35299;&#36825;&#20010;&#20250;&#35805;Bean @Interceptors(LoggedInInterceptor.class)&#12290;
&#36825;&#20010;&#27880;&#35299;&#26377;&#28857;&#19985;&#38475;&#12290;&#22312;EJB 3.0&#20013;&#65292;Seam&#36890;&#36807;&#20801;&#35768;&#23558; @Interceptors &#20316;&#20026;&#20803;&#27880;&#35299;&#20351;&#29992;&#65292;&#32780;&#20381;&#36182;&#20110;&#25318;&#25130;&#22120;&#26694;&#26550;&#12290;
&#22312;&#25105;&#20204;&#30340;&#20363;&#23376;&#20013;&#65292;&#23558;&#21019;&#24314;&#19968;&#20010; @LoggedIn &#27880;&#35299;&#65292;&#22914;&#19979;&#25152;&#31034;&#65306;
@Target(TYPE)
@Retention(RUNTIME)
@Interceptors(LoggedInInterceptor.class)
public @interface LoggedIn {}
&#29616;&#22312;&#65292;&#25105;&#20204;&#21487;&#20197;&#31616;&#21333;&#22320;&#29992; @LoggedIn &#26469;&#27880;&#35299;&#25105;&#20204;&#30340;&#21160;&#20316;&#30417;&#21548;&#22120;Bean&#20197;&#24212;&#29992;&#25318;&#25130;&#22120;&#12290;
@Stateless
@Name("changePasswordAction")
@Interceptors(SeamInterceptor.class)
public class ChangePasswordAction implements ChangePassword {
public String changePassword() { ... }
&#22914;&#26524;&#25318;&#25130;&#22120;&#30340;&#39034;&#24207;&#24456;&#37325;&#35201;&#65288;&#36890;&#24120;&#26159;&#36825;&#26679;&#65289;&#65292;&#20320;&#21487;&#20197;&#23558; @Interceptor &#27880;&#35299;&#28155;&#21152;&#21040;&#20320;&#30340;&#25318;&#25130;&#22120;&#31867;&#65292;&#26469;&#25351;&#23450;&#25318;&#25130;&#22120;&#30340;&#37096;&#20998;&#39034;&#24207;
@Interceptor(around={BijectionInterceptor.class,
ValidationInterceptor.class,
ConversationInterceptor.class},
within=RemoveInterceptor.class)
public class LoggedInInterceptor
&#20320;&#29978;&#33267;&#21487;&#20197;&#26377;&#19968;&#20010;&#8220;&#23458;&#25143;&#31471;&#8221;&#30340;&#25318;&#25130;&#22120;&#65292;&#36816;&#34892;&#20851;&#20110;&#20219;&#20309;EJB3&#30340;&#20869;&#32622;&#21151;&#33021;&#65306;
@Interceptor(type=CLIENT)
public class LoggedInInterceptor
EJB&#25318;&#25130;&#22120;&#26159;&#26377;&#29366;&#24577;&#30340;&#65292;&#26377;&#30528;&#21644;&#23427;&#20204;&#25152;&#25318;&#25130;&#32452;&#20214;&#30456;&#21516;&#30340;&#29983;&#21629;&#21608;&#26399;&#12290;
&#23545;&#21738;&#20123;&#19981;&#38656;&#35201;&#32500;&#25252;&#29366;&#24577;&#30340;&#25318;&#25130;&#22120;&#32780;&#35328;&#65292;Seam&#36890;&#36807;&#25351;&#23450; @Interceptor(stateless=true) &#35753;&#20320;&#33719;&#24471;&#24615;&#33021;&#20248;&#21270;&#12290;
Seam&#30340;&#24456;&#22810;&#21151;&#33021;&#26159;&#20316;&#20026;&#19968;&#22871;&#20869;&#32622;&#30340;Seam&#25318;&#25130;&#22120;&#26469;&#23454;&#29616;&#30340;&#65292;&#21253;&#25324;&#21069;&#38754;&#20363;&#23376;&#37324;&#25552;&#21040;&#30340;&#25318;&#25130;&#22120;&#12290;
&#20320;&#27809;&#26377;&#24517;&#35201;&#36890;&#36807;&#27880;&#35299;&#20320;&#30340;&#32452;&#20214;&#26469;&#26126;&#30830;&#25351;&#23450;&#36825;&#20123;&#25318;&#25130;&#22120;&#65307;&#23427;&#20204;&#20026;&#25152;&#26377;&#30340;&#21487;&#27880;&#35299;Seam&#32452;&#20214;&#32780;&#23384;&#22312;&#12290;
&#20320;&#29978;&#33267;&#21487;&#20197;&#22312;JavaBean&#32452;&#20214;&#20013;&#20351;&#29992;Seam&#25318;&#25130;&#22120;&#65292;&#19981;&#20165;&#20165;&#21482;&#26377;EJB3 Bean&#33021;&#29992;&#23427;&#20204;&#65281;
EJB&#23450;&#20041;&#25318;&#25130;&#22120;&#65292;&#19981;&#20165;&#20026;&#20102;&#19994;&#21153;&#26041;&#27861;&#65288;&#29992;@AroundInvoke&#65289;&#65292;&#20063;&#20026;&#20102;&#29983;&#21629;&#21608;&#26399;&#26041;&#27861;
@PostConstruct&#65292;@PreDestroy&#65292;@PrePassivate &#21644; @PostActive&#12290;
Seam&#25903;&#25345;&#32452;&#20214;&#21644;&#25318;&#25130;&#22120;&#20013;&#25152;&#26377;&#36825;&#20123;&#29983;&#21629;&#21608;&#26399;&#26041;&#27861;&#65292;&#19981;&#20165;&#20165;&#25903;&#25345;EJB3 Bean&#65292;&#20063;&#25903;&#25345;JavaBean&#32452;&#20214;&#65288;&#38500;&#20102;@PreDestroy &#23545;JavaBean&#32452;&#20214;&#32780;&#35328;&#27809;&#26377;&#24847;&#20041;&#20043;&#22806;&#65289;&#12290;
5.3.&&#31649;&#29702;&#24322;&#24120;
JSF&#22312;&#24322;&#24120;&#22788;&#29702;&#26041;&#38754;&#30340;&#33021;&#21147;&#26377;&#38480;&#24471;&#20196;&#20154;&#21507;&#24778;&#12290;
&#20316;&#20026;&#35299;&#20915;&#36825;&#20010;&#38382;&#39064;&#30340;&#37096;&#20998;&#26435;&#23452;&#20043;&#35745;&#65292;Seam&#35753;&#20320;&#23450;&#20041;&#22914;&#20309;&#36890;&#36807;&#27880;&#35299;&#36825;&#20010;&#24322;&#24120;&#31867;&#26469;&#22788;&#29702;&#24322;&#24120;&#30340;&#29305;&#27530;&#31867;&#65292;&#25110;&#32773;&#22312;XML&#25991;&#20214;&#20013;&#22768;&#26126;&#36825;&#20010;&#24322;&#24120;&#31867;&#12290;
&#36825;&#20010;&#24037;&#20855;&#26159;&#24819;&#35201;&#21644;EJB3.0&#26631;&#20934;&#30340; @ApplicationException &#30340;&#27880;&#35299;&#32452;&#21512;&#22312;&#19968;&#36215;&#65292;&#36825;&#20010;&#27880;&#35299;&#25351;&#23450;&#20102;&#36825;&#20010;&#24322;&#24120;&#26159;&#21542;&#24212;&#35813;&#23548;&#33268;&#19968;&#20010;&#20107;&#21153;&#22238;&#28378;&#12290;
5.3.1.&&#24322;&#24120;&#21644;&#20107;&#21153;
EJB&#25351;&#23450;&#20102;&#23450;&#20041;&#33391;&#22909;&#30340;&#35268;&#21017;&#65292;&#29992;&#20197;&#25511;&#21046;&#24322;&#24120;&#26159;&#21542;&#31435;&#21363;&#26631;&#35760;&#24403;&#21069;&#30340;&#20107;&#21153;&#65292;&#20197;&#20415;&#22312;&#36825;&#20010;Bean&#30340;&#19994;&#21153;&#26041;&#27861;&#25243;&#20986;&#19968;&#20010;&#24322;&#24120;&#26102;&#22238;&#28378;&#65306;
&#31995;&#32479;&#24322;&#24120; &#24635;&#26159;&#23548;&#33268;&#19968;&#20010;&#20107;&#21153;&#22238;&#28378;&#65292;&#24212;&#29992;&#31243;&#24207;&#24322;&#24120; &#40664;&#35748;&#26159;&#19981;&#23548;&#33268;&#20107;&#21153;&#22238;&#28378;&#30340;&#65292;&#20294;&#26159;&#22914;&#26524;&#25351;&#23450;&#20102; @ApplicationException(rollback=true)&#65292;&#21017;&#20250;&#23548;&#33268;&#20107;&#29289;&#22238;&#28378;&#12290;
&#65288;&#24212;&#29992;&#31243;&#24207;&#24322;&#24120;&#26159;&#20219;&#20309;checked&#24322;&#24120;&#65292;&#25110;&#32773;&#20219;&#20309;&#29992; @ApplicationException &#27880;&#35299;&#36807;&#30340;unchecked&#30340;&#24322;&#24120;&#12290;&#31995;&#32479;&#24322;&#24120;&#26159;&#20219;&#20309;&#27809;&#26377;&#29992; @ApplicationException &#27880;&#35299;&#36807;&#30340;unchecked&#24322;&#24120;&#65289;&#12290;
&#27880;&#24847;&#65306;&#22312;&#26631;&#35760;&#20107;&#21153;&#22238;&#28378;&#21644;&#23454;&#38469;&#30340;&#22238;&#28378;&#20004;&#32773;&#20043;&#38388;&#26377;&#19968;&#28857;&#19981;&#21516;&#12290;
&#24322;&#24120;&#35268;&#21017;&#35828;&#65292;&#21482;&#26377;&#34987;&#26631;&#35760;&#36807;&#30340;&#20107;&#21153;&#24212;&#35813;&#22238;&#28378;&#65292;&#20294;&#26159;&#22312;&#24322;&#24120;&#25243;&#20986;&#20043;&#21518;&#65292;&#20107;&#21153;&#20173;&#28982;&#21487;&#20197;&#26159;&#26377;&#25928;&#30340;&#12290;
Seam&#23545;Seam JavaBean&#32452;&#20214;&#20063;&#24212;&#29992;EJB 3.0 &#24322;&#24120;&#22238;&#28378;&#35268;&#21017;&#12290;
&#20294;&#26159;&#65292;&#36825;&#20123;&#35268;&#21017;&#20165;&#20165;&#24212;&#29992;&#20110;Seam&#32452;&#20214;&#23618;&#12290;&#27809;&#26377;&#25429;&#25417;&#21040;&#30340;&#24322;&#24120;&#20256;&#25773;&#21040;Seam&#32452;&#20214;&#23618;&#20043;&#22806;&#65292;&#25110;&#26159;&#20256;&#25773;&#21040;JSF&#23618;&#20043;&#22806;&#24590;&#20040;&#21150;&#65311;
&#24681;&#65292;&#35753;&#19968;&#20010;&#24748;&#31354;&#25671;&#25670;&#30340;&#20107;&#21153;&#22788;&#20110;&#25171;&#24320;&#29366;&#24577;&#26159;&#19981;&#23545;&#30340;&#65292;&#24403;&#24322;&#24120;&#21457;&#29983;&#65292;&#32780;&#20320;&#21448;&#27809;&#26377;&#22312;Seam&#32452;&#20214;&#23618;&#25429;&#25417;&#21040;&#23427;&#26102;&#65292;Seam&#20250;&#22238;&#28378;&#20219;&#20309;&#27963;&#21160;&#30340;&#20107;&#21153;&#12290;
5.3.2.&&#28608;&#27963;Seam&#24322;&#24120;&#22788;&#29702;
&#35201;&#28608;&#27963;Seam&#30340;&#24322;&#24120;&#22788;&#29702;&#65292;&#38656;&#35201;&#30830;&#20445;&#24050;&#32463;&#22312; web.xml &#20013;&#22768;&#26126;&#20102;&#20027;&#35201;&#30340;Servlet&#36807;&#28388;&#22120;:
&filter-name&Seam Filter&/filter-name&
&filter-class&org.jboss.seam.servlet.SeamFilter&/filter-class&
&filter-mapping&
&filter-name&Seam Filter&/filter-name&
&url-pattern&*.seam&/url-pattern&
&/filter-mapping&
&#22914;&#26524;&#20320;&#24819;&#28608;&#27963;&#24322;&#24120;&#22788;&#29702;&#22120;&#65292;&#36824;&#38656;&#35201;&#31105;&#29992; web.xml &#20013;Facelets&#30340;&#24320;&#21457;&#27169;&#24335;&#65292;&#21644; components.xml &#20013;&#30340;&#35843;&#35797;&#27169;&#24335;&#12290;
5.3.3.&&#20351;&#29992;&#27880;&#35299;&#22788;&#29702;&#24322;&#24120;
&#27599;&#24403;&#24322;&#24120;&#20256;&#25773;&#21040;Seam&#32452;&#20214;&#23618;&#20043;&#22806;&#26102;&#65292;&#19979;&#21015;&#24322;&#24120;&#37117;&#20250;&#23548;&#33268;&#19968;&#20010;HTTP 404&#38169;&#35823;&#12290;
&#25243;&#20986;&#24322;&#24120;&#26102;&#65292;&#23427;&#24182;&#19981;&#31435;&#21363;&#22238;&#28378;&#24403;&#21069;&#20107;&#21153;&#65292;&#20294;&#26159;&#22914;&#26524;&#36825;&#20010;&#24322;&#24120;&#27809;&#26377;&#34987;&#20854;&#20182;&#30340;Seam&#32452;&#20214;&#25429;&#25417;&#21040;&#65292;&#24403;&#21069;&#20107;&#21153;&#23558;&#34987;&#22238;&#28378;&#12290;
@HttpError(errorCode=404)
public class ApplicationException extends Exception { ... }
&#27599;&#24403;&#24322;&#24120;&#20256;&#25773;&#21040;Seam&#32452;&#20214;&#23618;&#20043;&#22806;&#26102;&#65292;&#36825;&#20010;&#24322;&#24120;&#20250;&#23548;&#33268;&#27983;&#35272;&#22120;&#30340;&#37325;&#23450;&#21521;&#12290;&#23427;&#20063;&#21516;&#26102;&#32467;&#26463;&#24403;&#21069;&#30340;&#23545;&#35805;&#65292;&#23548;&#33268;&#24403;&#21069;&#20107;&#21153;&#31435;&#21363;&#22238;&#28378;&#12290;
@Redirect(viewId="/failure.xhtml", end=true)
@ApplicationException(rollback=true)
public class UnrecoverableApplicationException extends RuntimeException { ... }
&#27880;&#24847;&#65306;&#23545;&#20110;&#37027;&#20123;&#22312;JSF&#29983;&#21629;&#21608;&#26399;&#30340;&#28210;&#26579;&#38454;&#27573;&#21457;&#29983;&#30340;&#24322;&#24120;&#32780;&#35328;&#65292;@Redirect &#26080;&#25928;&#12290;
&#20320;&#20063;&#21487;&#20197;&#29992;EL&#25351;&#23450; viewId &#26469;&#37325;&#23450;&#21521;&#12290;
&#24403;&#24322;&#24120;&#20256;&#25773;&#21040;Seam&#32452;&#20214;&#23618;&#20043;&#22806;&#26102;&#65292;&#36825;&#20010;&#24322;&#24120;&#23548;&#33268;&#19968;&#20010;&#37325;&#23450;&#21521;&#65292;&#24182;&#32473;&#29992;&#25143;&#19968;&#26465;&#28040;&#24687;&#12290;&#23427;&#20063;&#31435;&#21363;&#22238;&#28378;&#24403;&#21069;&#20107;&#21153;&#12290;
@Redirect(viewId="/error.xhtml", message="Unexpected error")
public class SystemException extends RuntimeException { ... }5.3.4.&&#29992;XML&#22788;&#29702;&#24322;&#24120;
&#32771;&#34385;&#21040;&#19981;&#33021;&#23545;&#25105;&#20204;&#24863;&#20852;&#36259;&#30340;&#25152;&#26377;&#24322;&#24120;&#31867;&#28155;&#21152;&#27880;&#35299;&#65292;Seam&#20063;&#20801;&#35768;&#25105;&#20204;&#22312; pages.xml &#20013;&#25351;&#23450;&#36825;&#20010;&#21151;&#33021;&#12290;
&exception class="javax.persistence.EntityNotFoundException"&
&http-error error-code="404"/&
&/exception&
&exception class="javax.persistence.PersistenceException"&
&end-conversation/&
&redirect view-id="/error.xhtml"&
&message&&#25968;&#25454;&#24211;&#35775;&#38382;&#22833;&#36133; Database access failed&/message&
&/redirect&
&/exception&
&exception&
&end-conversation/&
&redirect view-id="/error.xhtml"&
&message&&#24847;&#22806;&#30340;&#22833;&#36133; Unexpected failure&/message&
&/redirect&
&/exception&
&#26368;&#21518;&#19968;&#20010; &exception& &#22768;&#26126;&#27809;&#26377;&#25351;&#23450;&#31867;&#65292;&#23427;&#25429;&#25417;&#25152;&#26377;&#30340;&#37027;&#20123;&#27809;&#26377;&#36890;&#36807;&#27880;&#35299;&#25110;&#22312; pages.xml &#20013;&#29305;&#21035;&#25351;&#23450;&#30340;&#20219;&#20309;&#24322;&#24120;&#12290;
&#20320;&#20063;&#21487;&#20197;&#36890;&#36807;EL&#25351;&#23450; view-id &#26469;&#37325;&#23450;&#21521;&#12290;
&#20320;&#20063;&#21487;&#20197;&#36890;&#36807;EL&#35775;&#38382;&#22788;&#29702;&#21518;&#30340;&#24322;&#24120;&#23454;&#20363;&#65292;Seam&#25226;&#23427;&#25918;&#22312;&#23545;&#35805;&#19978;&#19979;&#25991;&#20013;&#65292;&#27604;&#22914;&#35775;&#38382;&#24322;&#24120;&#30340;&#28040;&#24687;&#12290;
throw new AuthorizationException("You are not allowed to do this!");
&exception class="org.jboss.seam.security.AuthorizationException"&
&end-conversation/&
&redirect view-id="/error.xhtml"&
&message severity="WARN"&#{org.jboss.seam.handledException.message}&/message&
&/redirect&
&/exception&
org.jboss.seam.handledException &#20445;&#23384;&#30528;&#23454;&#38469;&#19978;&#30001;&#24322;&#24120;&#22788;&#29702;&#22120;&#22788;&#29702;&#30340;&#23884;&#22871;&#24322;&#24120;&#12290;
&#26368;&#22806;&#23618;&#30340;&#65288;&#21253;&#35013;&#22120;&#65289;&#24322;&#24120;&#20063;&#21487;&#20197;&#35775;&#38382;&#65292;&#22914; org.jboss.seam.exception&#12290;
5.3.5.&&#19968;&#20123;&#24120;&#35265;&#30340;&#24322;&#24120;
&#22914;&#26524;&#20320;&#27491;&#22312;&#20351;&#29992;JPA&#65306;
&exception class="javax.persistence.EntityNotFoundException"&
&redirect view-id="/error.xhtml"&
&message&Not found&/message&
&/redirect&
&/exception&
&exception class="javax.persistence.OptimisticLockException"&
&end-conversation/&
&redirect view-id="/error.xhtml"&
&message&&#21478;&#19968;&#20010;&#29992;&#25143;&#20462;&#25913;&#20102;&#30456;&#21516;&#30340;&#25968;&#25454;&#65292;&#35831;&#37325;&#35797; Another user changed the same data, please try again&/message&
&/redirect&
&/exception&
&#22914;&#26524;&#20320;&#27491;&#22312;&#20351;&#29992;Seam&#24212;&#29992;&#26694;&#26550;&#65306;
&exception class="org.jboss.seam.framework.EntityNotFoundException"&
&redirect view-id="/error.xhtml"&
&message&Not found&/message&
&/redirect&
&/exception&
&#22914;&#26524;&#20320;&#27491;&#22312;&#20351;&#29992;Seam&#23433;&#20840;&#65306;
&exception class="org.jboss.seam.security.AuthorizationException"&
&redirect&
&message&You don't have permission to do this&/message&
&/redirect&
&/exception&
&exception class="org.jboss.seam.security.NotLoggedInException"&
&redirect view-id="/login.xhtml"&
&message&Please log in first&/message&
&/redirect&
&/exception&
&#37027;&#20040;&#65292;&#23545;&#20110;JSF&#65306;
&exception class="javax.faces.application.ViewExpiredException"&
&redirect view-id="/error.xhtml"&
&message&&#24744;&#30340;&#20250;&#35805;&#24050;&#32463;&#36229;&#26102;&#65292;&#35831;&#37325;&#35797; Your session has timed out, please try again&/message&
&/redirect&
&/exception&
&#22914;&#26524;&#29992;&#25143;&#20250;&#35805;&#36807;&#26399;&#24182;&#19988;&#36820;&#22238;&#21040;&#21407;&#26469;&#30340;&#39029;&#38754;&#65292;&#23601;&#20250;&#25243;&#20986; ViewExpiredException &#24322;&#24120;&#12290;
&#22914;&#26524;&#20320;&#22312;&#19968;&#20010;&#23545;&#35805;&#37324;&#38754;&#65292;no-conversation-view-id &#21644; conversation-required &#21487;&#20197;&#35753;&#20320;&#26356;&#32454;&#31890;&#24230;&#22320;&#25511;&#21046;&#20250;&#35805;&#36229;&#26399;&#12290;

我要回帖

更多关于 违章停车怎么处理 的文章

 

随机推荐