﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-LiuTing</title><link>http://www.blogjava.net/LiuTing/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 05:59:32 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 05:59:32 GMT</pubDate><ttl>60</ttl><item><title>关于appfuse的探讨</title><link>http://www.blogjava.net/LiuTing/archive/2007/06/07/122748.html</link><dc:creator>LiuTing</dc:creator><author>LiuTing</author><pubDate>Thu, 07 Jun 2007 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/LiuTing/archive/2007/06/07/122748.html</guid><wfw:comment>http://www.blogjava.net/LiuTing/comments/122748.html</wfw:comment><comments>http://www.blogjava.net/LiuTing/archive/2007/06/07/122748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/LiuTing/comments/commentRss/122748.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/LiuTing/services/trackbacks/122748.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目在紧张的生活中很快就要结束了,一直以来,都是由于工作的繁忙,没有时间去写自己的blog.这段时间终于可以稍微闲下来了,觉得应该把这一阶段的工作总结一下了,但是拿起键盘,思绪却有些散乱,想写的很多,却也不知道怎么来写,还是慢慢来吧.<br>&nbsp;&nbsp;&nbsp;首先说一下整体框架appfuse，它是集成了当今最流行的web应用框架的更高层次的web开发框架．也可以说是一个web开发的基本平台，它将当前最流行的一些技术，比如<span style="FONT-SIZE: 12pt">hibernate,spring,struts,DBUnit,ant,log4j,xdoclet,sitemesh,velocity,jstl,webwork,等等都集成了进来，在国内能够将这些都应用进来的并不多见．<br><br>待续．．．．</span></p>
<img src ="http://www.blogjava.net/LiuTing/aggbug/122748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LiuTing/" target="_blank">LiuTing</a> 2007-06-07 23:56 <a href="http://www.blogjava.net/LiuTing/archive/2007/06/07/122748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS常见函数</title><link>http://www.blogjava.net/LiuTing/archive/2007/05/29/120743.html</link><dc:creator>LiuTing</dc:creator><author>LiuTing</author><pubDate>Tue, 29 May 2007 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/LiuTing/archive/2007/05/29/120743.html</guid><wfw:comment>http://www.blogjava.net/LiuTing/comments/120743.html</wfw:comment><comments>http://www.blogjava.net/LiuTing/archive/2007/05/29/120743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/LiuTing/comments/commentRss/120743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/LiuTing/services/trackbacks/120743.html</trackback:ping><description><![CDATA[1.常规函数&nbsp;&nbsp; <br>　　javascript常规函数包括以下9个函数：&nbsp;&nbsp; <br>　　(1)alert函数：显示一个警告对话框，包括一个OK按钮。&nbsp;&nbsp; <br>　　(2)confirm函数：显示一个确认对话框，包括OK、Cancel按钮。&nbsp;&nbsp; <br>　　(3)escape函数：将字符转换成Unicode码。&nbsp;&nbsp; <br>　　(4)eval函数：计算表达式的结果。&nbsp;&nbsp; <br>　　(5)isNaN函数：测试是(true)否(false)不是一个数字。&nbsp;&nbsp; <br>　　(6)parseFloat函数：将字符串转换成符点数字形式。&nbsp;&nbsp; <br>　　(7)parseInt函数：将符串转换成整数数字形式(可指定几进制)。&nbsp;&nbsp; <br>　　(8)prompt函数：显示一个输入对话框，提示等待用户输入。例如：&nbsp;&nbsp; <br>　　(9)unescape函数：解码由escape函数编码的字符。&nbsp;&nbsp; <br>　　2.数组函数&nbsp;&nbsp; <br>　　javascript数组函数包括以下4个函数：&nbsp;&nbsp; <br>　　(1)join函数：转换并连接数组中的所有元素为一个字符串。例:&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>　　　　function JoinDemo()&nbsp;&nbsp; <br>　　　　{&nbsp;&nbsp; <br>　　　　　var a, b;&nbsp;&nbsp; <br>　　　　　a = new Array(0,1,2,3,4);&nbsp;&nbsp; <br>　　　　　b = a.join("-");//分隔符&nbsp;&nbsp; <br>　　　　　return(b);//返回的b=="0-1-2-3-4"&nbsp;&nbsp; <br>　　　　}&nbsp;&nbsp;&nbsp; <br>　&nbsp;&nbsp; <br>　(2)langth函数：返回数组的长度。例：&nbsp;&nbsp; <br>　　　　&nbsp;&nbsp;&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function LengthDemo()&nbsp;&nbsp; <br>　　　　{&nbsp;&nbsp; <br>　　　　　var a, l;&nbsp;&nbsp; <br>　　　　　a = new Array(0,1,2,3,4);&nbsp;&nbsp; <br>　　　　　l = a.length;&nbsp;&nbsp; <br>　　　　　return(l);//l==5&nbsp;&nbsp; <br>　　　　}&nbsp;&nbsp;&nbsp; <br>&nbsp; <br>　　(3)reverse函数：将数组元素顺序颠倒。例：&nbsp;&nbsp; <br>　　　&nbsp;&nbsp;&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function ReverseDemo()&nbsp;&nbsp; <br>　　　{&nbsp;&nbsp; <br>　　　　var a, l;&nbsp;&nbsp; <br>　　　　a = new Array(0,1,2,3,4);&nbsp;&nbsp; <br>　　　　l = a.reverse();&nbsp;&nbsp; <br>　　　　return(l);&nbsp;&nbsp; <br>　　　}&nbsp;&nbsp;&nbsp; <br>　　(4)sort函数：将数组元素重新排序。例：&nbsp;&nbsp; <br>　　　　&nbsp;&nbsp;&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function SortDemo()&nbsp;&nbsp; <br>　　　　{&nbsp;&nbsp; <br>　　　　　var a, l;&nbsp;&nbsp; <br>　　　　　a = new Array("X" ,"y" ,"d", "Z", "v","m","r");&nbsp;&nbsp; <br>　　　　　l = a.sort();&nbsp;&nbsp; <br>　　　　　return(l);&nbsp;&nbsp; <br>　　　　}&nbsp;&nbsp;&nbsp; <br>　　3.日期函数&nbsp;&nbsp; <br>　　javascript日期函数包括以下20个函数：&nbsp;&nbsp; <br>　　(1)getDate函数：返回日期的&#8220;日&#8221;部分，值为1～31。例：&nbsp;&nbsp; <br>　　　&nbsp;&nbsp;&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function DateDemo()&nbsp;&nbsp; <br>　　　{&nbsp;&nbsp; <br>　　　　var d, s = "Today's date is: ";&nbsp;&nbsp; <br>　　　　d = new Date();&nbsp;&nbsp; <br>　　　　s += (d.getMonth() + 1) + "/";&nbsp;&nbsp; <br>　　　　s += d.getDate() + "/";&nbsp;&nbsp; <br>　　　　s += d.getYear();&nbsp;&nbsp; <br>　　　　return(s);&nbsp;&nbsp; <br>　　　}&nbsp;&nbsp;&nbsp; <br>　　(2)getDay函数：返回星期几，值为0～6，其中0表示星期日，1表示星期一，...，6表示星期六。例：&nbsp;&nbsp; <br>　　　&nbsp;&nbsp;&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function DateDemo()&nbsp;&nbsp; <br>　　　{&nbsp;&nbsp; <br>　　　　var d, day, x, s = "Today is: ";&nbsp;&nbsp; <br>　　　　var x = new Array("Sunday", "Monday", "Tuesday");&nbsp;&nbsp; <br>　　　　var x = x.concat("Wednesday","Thursday", "Friday");&nbsp;&nbsp; <br>　　　　var x = x.concat("Saturday");&nbsp;&nbsp; <br>　　　　d = new Date();&nbsp;&nbsp; <br>　　　　day = d.getDay();&nbsp;&nbsp; <br>　　　　return(s += x[day]);&nbsp;&nbsp; <br>　　　}&nbsp;&nbsp;&nbsp; <br>　　(3)getHouse函数：返回日期的&#8220;小时&#8221;部分，值为0～23。例。&nbsp;&nbsp; <br>　　　&nbsp;&nbsp;&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function TimeDemo()&nbsp;&nbsp; <br>　　　{&nbsp;&nbsp; <br>　　　　var d, s = "The current local time is: ";&nbsp;&nbsp; <br>　　　　var c = ":";&nbsp;&nbsp; <br>　　　　d = new Date();&nbsp;&nbsp; <br>　　　　s += d.getHours() + c;&nbsp;&nbsp; <br>　　　　s += d.getMinutes() + c;&nbsp;&nbsp; <br>　　　　s += d.getSeconds() + c;&nbsp;&nbsp; <br>　　　　s += d.getMilliseconds();&nbsp;&nbsp; <br>　　　　return(s);&nbsp;&nbsp; <br>　　　}&nbsp;&nbsp;&nbsp; <br>　　(4)getMinutes函数：返回日期的&#8220;分钟&#8221;部分，值为0～59。见上例。&nbsp;&nbsp; <br>　　(5)getMonth函数：返回日期的&#8220;月&#8221;部分，值为0～11。其中0表示1月，2表示3月，...，11表示12月。见前面的例子。&nbsp;&nbsp; <br>　　(6)getSeconds函数：返回日期的&#8220;秒&#8221;部分，值为0～59。见前面的例子。&nbsp;&nbsp; <br>　　(7)getTime函数：返回系统时间。&nbsp;&nbsp; <br>　　　&nbsp;&nbsp;&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function GetTimeTest()&nbsp;&nbsp; <br>　　　{&nbsp;&nbsp; <br>　　　　var d, s, t;&nbsp;&nbsp; <br>　　　　var MinMilli = 1000 * 60;&nbsp;&nbsp; <br>　　　　var HrMilli = MinMilli * 60;&nbsp;&nbsp; <br>　　　　var DyMilli = HrMilli * 24;&nbsp;&nbsp; <br>　　　　d = new Date();&nbsp;&nbsp; <br>　　　　t = d.getTime();&nbsp;&nbsp; <br>　　　　s = "It's been "&nbsp; <br>　　　　s += Math.round(t / DyMilli) + " days since 1/1/70";&nbsp;&nbsp; <br>　　　　return(s);&nbsp;&nbsp; <br>　　　}&nbsp;&nbsp;&nbsp; <br>　　(8)getTimezoneOffset函数：返回此地区的时差(当地时间与GMT格林威治标准时间的地区时差)，单位为分钟。&nbsp;&nbsp; <br>　　　&nbsp;&nbsp;&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function TZDemo()&nbsp;&nbsp; <br>　　　{&nbsp;&nbsp; <br>　　　　var d, tz, s = "The current local time is ";&nbsp;&nbsp; <br>　　　　d = new Date();&nbsp;&nbsp; <br>　　　　tz = d.getTimezoneOffset();&nbsp;&nbsp; <br>&nbsp; <br>　　　　if (tz 的链接点的名称，另一个函数link设定的URL地址。&nbsp;&nbsp; <br>　　(2)big函数：将字体加到一号，与...标签结果相同。&nbsp;&nbsp; <br>　　(3)blink函数：使字符串闪烁，与...标签结果相同。&nbsp;&nbsp; <br>　　(4)bold函数：使字体加粗，与...标签结果相同。&nbsp;&nbsp; <br>　　(5)charAt函数：返回字符串中指定的某个字符。&nbsp;&nbsp; <br>　　(6)fixed函数：将字体设定为固定宽度字体，与...标签结果相同。&nbsp;&nbsp; <br>　　(7)fontcolor函数：设定字体颜色，与标签结果相同。&nbsp;&nbsp; <br>　　(8)fontsize函数：设定字体大小，与标签结果相同。&nbsp;&nbsp; <br>　　(9)indexOf函数：返回字符串中第一个查找到的下标index，从左边开始查找。&nbsp;&nbsp; <br>　　(10)italics函数：使字体成为斜体字，与...标签结果相同。&nbsp;&nbsp; <br>　　(11)lastIndexOf函数：返回字符串中第一个查找到的下标index，从右边开始查找。&nbsp;&nbsp; <br>　　(12)length函数：返回字符串的长度。(不用带括号)&nbsp;&nbsp; <br>　　(13)link函数：产生一个超级链接，相当于设定的URL地址。&nbsp;&nbsp; <br>　　(14)small函数：将字体减小一号，与...标签结果相同。&nbsp;&nbsp; <br>　　(15)strike函数：在文本的中间加一条横线，与...标签结果相同。&nbsp;&nbsp; <br>　　(16)sub函数：显示字符串为下标字(subscript)。&nbsp;&nbsp; <br>　　(17)substring函数：返回字符串中指定的几个字符。&nbsp;&nbsp; <br>　　(18)sup函数：显示字符串为上标字(superscript)。&nbsp;&nbsp; <br>　　(19)toLowerCase函数：将字符串转换为小写。&nbsp;&nbsp; <br>　　(20)toUpperCase函数：将字符串转换为大写。&nbsp;&nbsp; <br>&nbsp; <br>//校验是否全由数字组成&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function isDigit(s)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>var patrn=/^[0-9]{1,20}$/;&nbsp;&nbsp; <br>if (!patrn.exec(s)) return false&nbsp; <br>return true&nbsp; <br>}&nbsp;&nbsp; <br>&nbsp; <br>//校验登录名：只能输入5-20个以字母开头、可带数字、&#8220;_&#8221;、&#8220;.&#8221;的字串&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function isRegisterUserName(s)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/;&nbsp;&nbsp; <br>if (!patrn.exec(s)) return false&nbsp; <br>return true&nbsp; <br>}&nbsp;&nbsp; <br>&nbsp; <br>//校验用户姓名：只能输入1-30个以字母开头的字串&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function isTrueName(s)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>var patrn=/^[a-zA-Z]{1,30}$/;&nbsp;&nbsp; <br>if (!patrn.exec(s)) return false&nbsp; <br>return true&nbsp; <br>}&nbsp;&nbsp; <br>&nbsp; <br>//校验密码：只能输入6-20个字母、数字、下划线&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function isPasswd(s)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>var patrn=/^(\w){6,20}$/;&nbsp;&nbsp; <br>if (!patrn.exec(s)) return false&nbsp; <br>return true&nbsp; <br>}&nbsp;&nbsp; <br>&nbsp; <br>//校验普通电话、传真号码：可以&#8220;+&#8221;开头，除数字外，可含有&#8220;-&#8221;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function isTel(s)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>//var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/;&nbsp;&nbsp; <br>var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;&nbsp;&nbsp; <br>if (!patrn.exec(s)) return false&nbsp; <br>return true&nbsp; <br>}&nbsp;&nbsp; <br>&nbsp; <br>//校验手机号码：必须以数字开头，除数字外，可含有&#8220;-&#8221;&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function isMobil(s)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;&nbsp;&nbsp; <br>if (!patrn.exec(s)) return false&nbsp; <br>return true&nbsp; <br>}&nbsp;&nbsp; <br>&nbsp; <br>//校验邮政编码&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function isPostalCode(s)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>//var patrn=/^[a-zA-Z0-9]{3,12}$/;&nbsp;&nbsp; <br>var patrn=/^[a-zA-Z0-9 ]{3,12}$/;&nbsp;&nbsp; <br>if (!patrn.exec(s)) return false&nbsp; <br>return true&nbsp; <br>}&nbsp;&nbsp; <br>&nbsp; <br>//校验搜索关键字&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function isSearch(s)&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>var patrn=/^[^`~!@#$%^&amp;*()+=|\\\][\]\{\}:;\'\,.&lt;&gt;/?]{1}[^`~!@$%^&amp;()+=|\\\][\]\{\}:;\'\,.&lt;&gt;?]{0,19}$/;&nbsp;&nbsp; <br>if (!patrn.exec(s)) return false&nbsp; <br>return true&nbsp; <br>}&nbsp;&nbsp; <br>&nbsp; <br>&nbsp;程序代码&nbsp;&nbsp; <br>function isIP(s) //by zergling&nbsp;&nbsp; <br>{&nbsp;&nbsp; <br>var patrn=/^[0-9.]{1,20}$/;&nbsp;&nbsp; <br>if (!patrn.exec(s)) return false&nbsp; <br>return true&nbsp; <br>}&nbsp;&nbsp; <br>
<img src ="http://www.blogjava.net/LiuTing/aggbug/120743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LiuTing/" target="_blank">LiuTing</a> 2007-05-29 18:03 <a href="http://www.blogjava.net/LiuTing/archive/2007/05/29/120743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DISPALYTAG的用法</title><link>http://www.blogjava.net/LiuTing/archive/2007/05/25/119921.html</link><dc:creator>LiuTing</dc:creator><author>LiuTing</author><pubDate>Fri, 25 May 2007 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/LiuTing/archive/2007/05/25/119921.html</guid><wfw:comment>http://www.blogjava.net/LiuTing/comments/119921.html</wfw:comment><comments>http://www.blogjava.net/LiuTing/archive/2007/05/25/119921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/LiuTing/comments/commentRss/119921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/LiuTing/services/trackbacks/119921.html</trackback:ping><description><![CDATA[1)&nbsp;Caption指标题<br>2)&nbsp;name：数据源<br>3)&nbsp;defaultsort：排序列，一般不需要<br>4)&nbsp;defaultorder：排序方式<br>5)&nbsp;class：表格显示的样式<br>6)&nbsp;varTotals：需要统计(总计)<br>7)&nbsp;decorator="totals"：表示使用指定的decorator。现在仅在同时使用小计、合计时用到，自己也可以定制。<br>8)&nbsp;&lt;display:column 部分：<br>&nbsp;&nbsp;property指数据中的列名<br>&nbsp;&nbsp;title指显示的标题<br>&nbsp;&nbsp;format指数据的格式化样式，<br>&nbsp;&nbsp;total表示该字段是否需要作统计。<br>&nbsp;&nbsp;style="width:20%"可以设置宽度。<br>&nbsp;&nbsp;也可以用<br>&nbsp;&nbsp;&lt;display:column title="请假时间"&gt;<br>&nbsp;&nbsp;&lt;fmt:formatDate value="${currentRowObject.QJSJ}" pattern="yyyy-MM-dd"/&gt;<br>&nbsp;&nbsp;&lt;/display:column&gt;表现。<br>&nbsp;&nbsp;group="1"表示进行group的字段。<br>9)&nbsp;在表格中建立一个连接：<br>&nbsp;&nbsp;&lt;display:column title="部别"&gt;<br>&nbsp;&nbsp;&lt;a href="&lt;c:out value="${pageContext.request.contextPath}"/&gt;<br>&nbsp;&nbsp;/holidayDefaultSearchStatView.do?type=<br>&nbsp;&nbsp;&lt;c:out value="${currentRowObject.CJDM}"/&gt;&amp;SYD=<br>&nbsp;&nbsp;&lt;c:out value="${currentRowObject.DWDM}"/&gt;" target="_blank"&gt;<br>&nbsp;&nbsp;&lt;c:out value="${currentRowObject.DWMC}"/&gt;<br>&nbsp;&nbsp;&lt;/a&gt;<br>&nbsp;&nbsp;&lt;/display:column&gt;<br>10)&nbsp;由于该tag只有合计时，没有合计那一列，所以实现的时候以&lt;display:footer&gt;实现。<br>&nbsp;&nbsp;可以通过totalMap对象获取合计的数据，如totalMap.colomn1获取合计的第一列数值。<br>11)&nbsp;标题头不显示&lt;display:setProperty name="basic.show.header" value="false" /&gt;<br>12)&nbsp;自己定制表头：&lt;display:caption&gt;<br>&nbsp;&nbsp;&nbsp;使用decorator：<br>&nbsp;&nbsp;&nbsp;&lt;jsp:scriptlet&gt;<br>&nbsp;&nbsp;&nbsp;org.displaytag.decorator.TotalTableDecorator totals = <br>&nbsp;&nbsp;&nbsp;new org.displaytag.decorator.TotalTableDecorator();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totals.setTotalLabel("合计");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totals.setSubtotalLabel("小计");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageContext.setAttribute("totals", totals);<br>&nbsp;&nbsp;&nbsp;&lt;/jsp:scriptlet&gt;
<div>实例：<br>&lt;display:caption&gt;这是表标题&lt;/display:caption&gt;<br>&nbsp;&lt;display:table <br>&nbsp;&nbsp;name="${model.rowToColumnStatResult}" defaultsort="1" <br>&nbsp;&nbsp;class="simple" defaultorder="ascending" varTotals="totalMap"&gt;<br>&nbsp;&nbsp;&lt;display:column property="GCWZ" title="部门"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;c:forEach items="${model.YList.YList}" var="yColumn"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;c:forEach items="${model.rowToColumnStatResult[0]}" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var="mapEntry"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;c:if test="${mapEntry.key == yColumn}"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;th&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;display:column property="${mapEntry.key}" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title="${mapEntry.key}" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;format="{0,number,####.##}" total="true"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/th&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/c:if&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/c:forEach&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/c:forEach&gt;<br>&nbsp;&nbsp;&lt;display:column property="小计" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title="小计" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;format="{0,number,####.##}" total="true"/&gt;<br>&nbsp;&lt;display:footer&gt;<br>&nbsp;&lt;tr&gt;<br>&nbsp;&nbsp;&lt;td&gt;总计&lt;/td&gt;<br>&nbsp;&nbsp;&lt;c:forEach items="${model.YList.YColumn}" var="yColumn"&gt;<br>&nbsp;&nbsp;&lt;td&gt;&lt;fmt:formatNumber value="${totalMap[yColumn]}"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern="####.##"/&gt;<br>&nbsp;&nbsp;&lt;/td&gt;<br>&nbsp;&nbsp;&lt;/c:forEach&gt;<br>&nbsp;&lt;/tr&gt;<br>&nbsp;&lt;/display:footer&gt;<br>&lt;/display:table&gt;</div>
<div>&nbsp;</div>
<div><br>另外一个例子：<br>&lt;display:table name="${model.statResult}" class="simple"<br>&nbsp;varTotals="totalMap"&gt;<br>&nbsp;&lt;display:column property="XMMC" title="项目名称" /&gt;<br>&nbsp;&lt;display:column property="KSRQ" title="开始日期" /&gt;<br>&nbsp;&lt;display:column property="FZRXM" title="负责人姓名" /&gt;<br>&nbsp;&lt;display:column property="GKDW" title="挂靠单位" /&gt;<br>&nbsp;&lt;display:column property="JFLY" title="经费来源" /&gt;<br>&nbsp;&lt;display:column property="XMZJF" title="项目总经费" total="true" /&gt;<br>&nbsp;&lt;display:column property="DNDKJF" title="当年到款经费" total="true"/&gt;<br>&nbsp;&lt;display:footer&gt;<br>&nbsp;&nbsp;&lt;tr&gt;&lt;td colspan="5"&gt;总计&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&lt;td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;fmt:formatNumber value="${totalMap.column6}"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern="####.####" /&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&lt;td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;fmt:formatNumber value="${totalMap.column7}"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern="####.####" /&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/td&gt;<br>&nbsp;&nbsp;&lt;/tr&gt;<br>&nbsp;&lt;/display:footer&gt;<br>&lt;/display:table&gt;</div>
<div>总计某一列的方法：<br>${totalMap.column?}&nbsp;&nbsp;&nbsp; ?为该列号<br>colspan="5"：表示这个单元格占5个单元格</div>
<div>项目名称 开始日期&nbsp; 负责人姓名 挂靠单位 经费来源 项目总经费 当年到款经费 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 531&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 400 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 151&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br>总计 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 682&nbsp;&nbsp;&nbsp;&nbsp; 500&nbsp; </div>
<img src ="http://www.blogjava.net/LiuTing/aggbug/119921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LiuTing/" target="_blank">LiuTing</a> 2007-05-25 10:42 <a href="http://www.blogjava.net/LiuTing/archive/2007/05/25/119921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWRUtils API 使用方法</title><link>http://www.blogjava.net/LiuTing/archive/2007/05/20/118676.html</link><dc:creator>LiuTing</dc:creator><author>LiuTing</author><pubDate>Sun, 20 May 2007 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/LiuTing/archive/2007/05/20/118676.html</guid><wfw:comment>http://www.blogjava.net/LiuTing/comments/118676.html</wfw:comment><comments>http://www.blogjava.net/LiuTing/archive/2007/05/20/118676.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/LiuTing/comments/commentRss/118676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/LiuTing/services/trackbacks/118676.html</trackback:ping><description><![CDATA[<a>$("precloneNode1suf") 取得该对象;<br><br>DWRUtil.selectRange("selectRangeBasic", 5, 15) 选中selectRangeBasic文本框里面从第五个字符到第15个字符之间的字符.<br><br>DWRUtil._getSelection("selectRangeBasic") 得到selectRangeBasic文本框里选中的字符.<br><br>var arrayFive = [ 'One', 'Two', 'Three', 'Four', 'Five' ];<br>DWRUtil.addOptions('addOptionsBasic', arrayFive); 将数组添加到下拉菜单里面去;<br><br>DWRUtil.getValue('addOptionsBasic') 得到 addOptionsBasic 对象的值;<br>DWRUtil.getValue("precloneNode1Inner1suf", { textContent:true }); 后面加个参数,在 precloneNode1Inner1suf元素为"UL" 时,它返回了元素里面得值,也就是说去掉了HTML标签部分.<br><br>DWRUtil.getText('addOptionsBasic') 得到下拉框 addOptionsBasic 显示的文本;<br><br>var arrayObject = [<br>{ name:'One', value:'1' },<br>{ name:'Two', value:'2' },<br>{ name:'Three', value:'3' },<br>{ name:'Four', value:'4' },<br>{ name:'Five', value:'5' }<br>];<br>DWRUtil.addOptions('addOptionsObject1', arrayObject, "name"); 将数组添加到下拉菜单里面去;后面的参数是确定那个是给用户显示的文本,同时也是值;<br><br>DWRUtil.addOptions('addOptionsObject1', arrayObject, "name","value"); 同上,不过后面参数是: 3=文本;4=值;<br><br>var map = { one:1, two:2, three:3, four:4, five:5 };<br>DWRUtil.addOptions('addOptionsMap1', map); 同上, one 是值;1 是文本;<br>DWRUtil.addOptions('addOptionsMap1', map,true); 同上, 1 是值;one 是文本;<br><br>-------------------------------------------------------------------------------------<br>&lt;ul id="removeItems"&gt;<br>&lt;li&gt;One&lt;/li&gt;&lt;li&gt;Two&lt;/li&gt;&lt;li&gt;Three&lt;/li&gt;&lt;li&gt;Four&lt;/li&gt;&lt;li&gt;Five&lt;/li&gt;<br>&lt;/ul&gt;<br><br>如果是列表显示,如上;则上面所有方法和select 下拉框使用一样;<br>-------------------------------------------------------------------------------------<br>DWRUtil.cloneNode('cloneNode1', { idPrefix:'pre', idSuffix:'suf' });克隆一个节点,参数一为要克隆的节点的id,第二个参数是在克隆的节点id前面加pre,后面加suf.(注意:如果该节点有子节点的话,子节点的名字也一样加)<br><br>DWRUtil.addRows(id, array, cellfuncs, [options]);<br>原理:<br><br>for each member in array<br>for each function in cellfuncs<br>create cell from cellfunc(array[i])<br>循环数组,循环函数,建立单元调用函数;(顺序决定)<br><br>例如:<br>DWRUtil.addRows('addRowsBasic', arrayFive, [<br>function(data) { return data; },<br>function(data) { return data.toUpperCase(); },<br>function(data) {<br>var input = document.createElement("input");<br>input.setAttribute("type", "button");<br>input.setAttribute("value", "DOM Test");<br>input.setAttribute("onclick", "alert('" + data + "');");<br>return input;<br>},<br>function(data) { return "&lt;input type='button' value='innerHTML Test' onclick='alert(\"" + data + "\");'&gt;"; }<br>]);<br><br>高级部分:<br>第四个参数为对单元的高级操作,主要下面的两个方法;<br>function defaultRowCreator(options) {<br>return document.createElement("tr");<br>};<br><br>function defaultCellCreator(options) {<br>return document.createElement("td");<br>};<br><br>例子:<br>DWRUtil.addRows( "demo2",[ 'Africa', 'America', 'Asia', 'Australasia', 'Europe' ] , cellFuncs, {<br>rowCreator:function(options) {<br>var row = document.createElement("tr");<br>var index = options.rowIndex * 50;<br>row.style.color = "rgb(" + index + ",0,0)";<br>return row;<br>},<br>cellCreator:function(options) {<br>var td = document.createElement("td");<br>var index = 255 - (options.rowIndex * 50);<br>td.style.backgroundColor = "rgb(" + index + ",255,255)";<br>td.style.fontWeight = "bold";<br>return td;<br>}<br>});<br><br>其中 options 参数的属性可用的为:(没试过,自己试试吧)<br><br>rowData: the element value from the array (the same for all cells in a row) <br>rowIndex: the key (if map) or index (if array) from the collection <br>rowNum: The row number counting from 0 in this section (so if you are using tbody, it counts rows in the tbody and not the whole table) <br>data: The 'computed' data value for the cell (cellCreators only) <br>cellNum: The cell number that we are altering counting from 0 (cellCreators only) <br><br><br>DWRUtil.setValues(); 批量设置值;<br>var settings = {<br>setValuesDiv:"setValuesDiv",<br>setValuesSpan:"setValuesSpan",<br>setValuesSelect:"two",<br>setValuesText:"setValuesText",<br>setValuesPassword:"AB",<br>setValuesTextarea:"setValuesTextarea",<br>setValuesButton1:"B1-Two",<br>setValuesButton2:"B2-Two",<br>setValuesRadio1:true,<br>setValuesRadio2:false,<br>setValuesRadio3:"one",<br>setValuesRadio4:"two",<br>setValuesCheckbox1:true,<br>setValuesCheckbox2:false<br>};<br>DWRUtil.setValues(settings);<br><br>DWRUtil.getValues(empty);批量获取值;<br>var empty = {<br>setValuesDiv:null,<br>setValuesSpan:null,<br>setValuesSelect:null,<br>setValuesText:null,<br>setValuesPassword:null,<br>setValuesTextarea:null,<br>setValuesButton1:null,<br>setValuesButton2:null,<br>setValuesRadio1:null,<br>setValuesRadio2:null,<br>setValuesRadio3:null,<br>setValuesRadio4:null,<br>setValuesCheckbox1:null,<br>setValuesCheckbox2:null<br>};<br>DWRUtil.getValues(empty);<br><br>DWRUtil.useLoadingMessage("Ping");//类似gmail那个样子,在右上角显示加载"ping";可用自定样式,具体查询;</a><a href="http://getahead.ltd.uk/dwr/browser/util/useloadingmessage" target=_blank><u><font color=#0000ff>http://getahead.ltd.uk/dwr/browser/util/useloadingmessage</font></u></a><br><br>DWRUtil.toDescriptiveString("id",数字);弹出调试信息,数字为0,1,2.一级比一级高.<br><br>DWRUtil.onReturn(event, submitFunction);一般在form表单里面,防止在文本框上按回车就提交表单.<br>例如:<br>&lt;input type="text"<br>onkeypress="DWRUtil.onReturn(event, submitFunction)"/&gt;<br>&lt;input type="button" onclick="submitFunction()"/&gt; 
<img src ="http://www.blogjava.net/LiuTing/aggbug/118676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LiuTing/" target="_blank">LiuTing</a> 2007-05-20 12:46 <a href="http://www.blogjava.net/LiuTing/archive/2007/05/20/118676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR框架实现Ajax</title><link>http://www.blogjava.net/LiuTing/archive/2007/05/20/118675.html</link><dc:creator>LiuTing</dc:creator><author>LiuTing</author><pubDate>Sun, 20 May 2007 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/LiuTing/archive/2007/05/20/118675.html</guid><wfw:comment>http://www.blogjava.net/LiuTing/comments/118675.html</wfw:comment><comments>http://www.blogjava.net/LiuTing/archive/2007/05/20/118675.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/LiuTing/comments/commentRss/118675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/LiuTing/services/trackbacks/118675.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ajax是时下比较流行的一种web界面设计新思路,其核心思想是从浏览器获取XMLHttp对象与服务器端进行交互. DWR（Direct&nbsp;Web&nbsp;Remoting）就是实现了这种Ajax技术的一种web框架. 最近做的项目中我也将它用上了,感觉很是方便,比如动态生成javascript代码,隐藏的http协议,java代码和javascript交互的是javascript的对象(或字符串).&nbsp; 下面是我整理的文档.<br>&nbsp; DWR主要由两部门组成。javascript与web服务器通信并更新web页；运行在web服务器的Servlet处理请求并把响应发回浏览器。<br><br>&nbsp;&nbsp; 1&nbsp; .&nbsp;&nbsp;配置web.xml<br>&lt;servlet&gt; <br>&nbsp; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br>&nbsp; &lt;servlet-<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">class</span>&gt;uk.<span style="COLOR: rgb(0,0,0)">ltd</span>.<span style="COLOR: rgb(0,0,0)">getahead</span>.<span style="COLOR: rgb(0,0,0)">dwr</span>.<span style="COLOR: rgb(0,0,0)">DWRServlet</span>&lt;/servlet-<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">class</span>&gt; <br>&lt;/servlet&gt; <br>&lt;servlet-mapping&gt; <br>&nbsp; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br>&nbsp; &lt;url-pattern&gt;/dwr<span style="COLOR: rgb(102,102,255)">/*&lt;/url-pattern&gt; <br>&lt;/servlet-mapping&gt;<br></span><br>&nbsp; 2&nbsp;&nbsp;&nbsp; 当我们想看dwr自动生成的测试页时,可在java代码<br>servlet中加 <br>&lt;init-param&gt; <br>&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt; <br>&nbsp; &lt;param-value&gt;<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">true</span>&lt;/param-value&gt; <br>&lt;/init-param&gt;<br><br><span class=postbody>这个参数DWR默认是false.如果选择true.我们可以通过url <a href="http://localhost:port/app/dwr" target=_blank><font color=#366900>http://localhost:port/app/dwr</font></a> ,你就可以看到你部署的每个DWR class。并且可以测试java代码的每个方法是否运行正常。为了安全考虑，在正式环境下你一定把这个参数设为false.<br></span><br>3&nbsp; log信息配置<br><br>我喜欢用log4j输出日志,那么在log4j.properties下加，log4j.logger.uk.ltd.getahead.dwr = debug。这样可以看DWR的调试日志。 <br><br>4&nbsp; 配置dwr.xml (和web.xml同目录)<br>&nbsp; <br>&lt;create creator="new" javascript="JDate"&gt; <br>&lt;param name="class" value="java.util.Date"/&gt; <br>&lt;/create&gt; </p>
<p>这里的多数元素都是可选的 - 你真正必须知道的是指定一个creator和一个javascript名字。</p>
<p><strong>creator属性</strong> 是必须的 - 它用来指定使用那种创造器。</p>
<p>默认情况下DWR1.1有8种创造器。它们是：</p>
<ul>
    <li><a href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#new"><u><font color=#800080>new</font></u></a>: 用Java的new关键字创造对象。
    <li><a title="None Creator on Creators" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#none"><u><font color=#800080>none</font></u></a>: 它不创建对象，看下面的原因。 (v1.1+)
    <li><a title="Scripted Creator" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#scripted"><u><font color=#800080>scripted</font></u></a>: 通过BSF使用脚本语言创建对象，例如BeanShell或Groovy。
    <li><a title="Spring Integration" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#spring"><u><font color=#800080>spring</font></u></a>: 通过Spring框架访问Bean。
    <li><a title="JSF Integration" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#JSF"><u><font color=#800080>jsf</font></u></a>: 使用JSF的Bean。 (v1.1+)
    <li><a title="Struts Integration" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#Struts"><u><font color=#800080>struts</font></u></a>: 使用Struts的FormBean。 (v1.1+)
    <li><a title="Beehive Integration" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#pageflow"><u><font color=#800080>pageflow</font></u></a>: 访问Beehive或Weblogic的PageFlow。 (v1.1+) </li>
</ul>
<p><strong>javascript属性</strong> 用于指定浏览器中这个被创造出来的对象的名字。你不能使用Javascript的关键字。</p>
<p><strong>scope属性</strong> 非常类似servlet规范中的scope。 它允许你指定这个bean在什么生命范围。选项有"application", "session", "request" 和"page"。这些值对于Servlet和JSP开发者来说应该相当熟悉了。</p>
<p>scope属性是可选的。默认是"page"。如果要使用"session"需要cookies。当前的DWR不支持ULR重写。</p>
<p><strong>param元素</strong> 被用来指定创造器的其他参数，每种构造器各有不同。例如，"new"创造器需要知道要创建的对象类型是什么。每一个创造器的参数在各自的文档中能找到。请查看上面的链接。</p>
<p><strong>include和exclude元素</strong> 允许创造器来限制类中方法的访问。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗示默认的访问策略是"拒绝"；如果是exclude列表则暗示默认的访问策略是"允许"。</p>
<p><br>5 dwr.jar下载后放lib下<br><br>源码浅析<br><br>dwr的设计很象webwork2的设计,隐藏http协议,扩展性，兼容性及强。</p>
<p>通过研究uk.ltd.getahead.dwr.DWRServlet这个servlet来研究下dwr到底是如何工作的。<br><br>&lt;servlet&gt; <br>&nbsp; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br>&nbsp; &lt;servlet-<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">class</span>&gt;uk.<span style="COLOR: rgb(0,0,0)">ltd</span>.<span style="COLOR: rgb(0,0,0)">getahead</span>.<span style="COLOR: rgb(0,0,0)">dwr</span>.<span style="COLOR: rgb(0,0,0)">DWRServlet</span>&lt;/servlet-<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">class</span>&gt; <br>&lt;/servlet&gt; <br>&lt;servlet-mapping&gt; <br>&nbsp; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br>&nbsp; &lt;url-pattern&gt;/dwr<span style="COLOR: rgb(102,102,255)">/*&lt;/url-pattern&gt; <br>&lt;/servlet-mapping&gt;<br></span><br><font color=#6666ff>这样/dwr/*下的所有的请求都是由这个servlet来处理,到底生理了什么呢,我们还是以例子来说明吧.<br><br><font color=#000000>1 web服务器启动，DWRServlet init()方法调用，init主要做了以下工作。 <br>设置日志级别、实例化DWR用到的单例类（这些类在jvm中只有一个实例对象）、读去配置文件（包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xml）。<br>2 请求处理<br>DWRServlet.doGet, doPost方法都调用processor.handle(req, resp)方法处理。Processor对象在init()方法中已经初始化了。&nbsp;<br><br>代码<br>public void handle(HttpServletRequest req, HttpServletResponse resp)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String pathinfo = req.getPathInfo();&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo == null || pathinfo.length() == 0 || pathinfo.equals("/"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resp.sendRedirect(req.getContextPath() + req.getServletPath() + '/' + "index.html");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.equalsIgnoreCase("/index.html"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doIndex(req, resp);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.startsWith("/test/"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doTest(req, resp);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.equalsIgnoreCase("/engine.js"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doFile(resp, "engine.js", "text/javascript");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.equalsIgnoreCase("/util.js"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doFile(resp, "util.js", "text/javascript");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.equalsIgnoreCase("/deprecated.js"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doFile(resp, "deprecated.js", "text/javascript");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.startsWith("/interface/"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doInterface(req, resp);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.startsWith("/exec"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doExec(req, resp);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.warn("Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resp.sendError(404);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp; <br><br>dwr/*处理的请求也就这几种。<br><br>（1）dwr/index.html，dwr/test/这种只能在debug模式下使用，调试用。 <br>dwr/engine.js，dwr/util.js，dwr/deprecated.js当这个请求到达，从dwr.jar包中读取文件流，响应回去。（重复请求有缓存） <br>（2）当dwr/interface/这种请求到来，（例如我们在index.html中的 &lt;script type='text/javascript' src='dwr/interface/JDate.js'&gt;&lt;/script&gt;）DWR做一件伟大的事。把我们在WEB-INF/dwr.xml中的 <br>&lt;create creator="new" javascript="JDate"&gt; <br>&lt;param name="class" value="java.util.Date"/&gt; <br>&lt;/create&gt; <br>java.util.Date转化为javascript函数。 <br>http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。 <br>细节也比较简单，通过java反射，把方法都写成javascript特定的方法。（我觉得这些转换可以放到缓存里，下次调用没必要再生成一遍，不知道作者为什么没这样做）。 <br>（3）dwr/exec <br>javascript调用方法时发送这种请求，可能是XMLHttpRequest或IFrame发送。 <br>当然，javascript调用的方法签名与java代码一致，包括参数，还有javascript的回调方法也传到了服务器端，在服务器端很容易实现。回调方法的java的执行结果 返回类似 &lt;script&gt;callMethod(结果)&lt;script&gt;的javascript字符串,在浏览器执行。哈，一切就这么简单，巧妙。<br><br>我这里还有DWR中文文档.&nbsp;<a href="http://www.blogjava.net/Files/LiuTing/DWR">http://www.blogjava.net/Files/LiuTing/DWR</a>中文文档.rar</font><br><br></font><br><br><br></p>
<img src ="http://www.blogjava.net/LiuTing/aggbug/118675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LiuTing/" target="_blank">LiuTing</a> 2007-05-20 12:45 <a href="http://www.blogjava.net/LiuTing/archive/2007/05/20/118675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi工作流程</title><link>http://www.blogjava.net/LiuTing/archive/2007/05/20/118674.html</link><dc:creator>LiuTing</dc:creator><author>LiuTing</author><pubDate>Sun, 20 May 2007 04:44:00 GMT</pubDate><guid>http://www.blogjava.net/LiuTing/archive/2007/05/20/118674.html</guid><wfw:comment>http://www.blogjava.net/LiuTing/comments/118674.html</wfw:comment><comments>http://www.blogjava.net/LiuTing/archive/2007/05/20/118674.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/LiuTing/comments/commentRss/118674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/LiuTing/services/trackbacks/118674.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 10pt">任何一个安全系统都包括authentication和authorization两部分，Acegi相同。</span> </p>
<p><span style="FONT-SIZE: 10pt"><strong>第一部分：authentication</strong> </span></p>
<p><span style="FONT-SIZE: 10pt">1、acegi通过AuthenticationProcessingFilter拦截login请求获取Principal和Credential信息（通俗一点就是用户名和密码）；</span> </p>
<p><span style="FONT-SIZE: 10pt">2、验证用户名密码，由这个Filter调用认证管理器AuthenticatiomManager进行验证。</span> </p>
<p><span style="FONT-SIZE: 10pt">AuthenticatiomManager本身并不具备验证的功能，它相当与是一个验证控制器，由它来管理验证的过程及方式。AuthenticatiomManager是通过调用provider来进行验证的，一个manager中可以具有多个provider，但只要有一个provider验证通过，manager就认为验证成功。</span> </p>
<p><span style="FONT-SIZE: 10pt">这部分要明白三点：一，provider是可以配置进去的，因为acegi是基于spring的；二是AuthenticatiomManager是可以被重写的，你可以将manager改成你自己希望的控制器；三，好好利用event，这是标准的observer模式。acegi中的设计模式研究将在以后的贴子中讨论。</span> </p>
<p><span style="FONT-SIZE: 10pt">3、provider进行验证。</span> </p>
<p><span style="FONT-SIZE: 10pt">provider是真正的验证模块，并且决定了验证的模式。provider目前acegi提供了dao、jaas，cas，x509，ldap等几种验证方式，这些验证方式的具体内容可以查阅acegi的文档。provider验证通过后将Authentication对象返回。</span> </p>
<p><span style="FONT-SIZE: 10pt">4、AuthenticationProcessingFilter将对象保存到ContextHolder中。Authentication部分结束。</span> </p>
<p><span style="FONT-SIZE: 10pt"><strong>第二部分：authorization</strong> </span></p>
<p><span style="FONT-SIZE: 10pt">1、用户提交请求，拦截器FilterSecurityInterceptor拦截请求，拦截器是一个Filter.</span> </p>
<p><span style="FONT-SIZE: 10pt">2&nbsp;、鉴权，拦截器调用AccessDecisionManager进行鉴权。</span> </p>
<p><span style="FONT-SIZE: 10pt">AccessDecisionManager是通过投票的方式来决定是否有权限访问资源。所谓投票就要包括投票的参与者和投票的策略。</span> </p>
<p><span style="FONT-SIZE: 10pt">投票的参与者decisionVoters，这是AccessDecisionManager的一个属性。decisionVoter能从某一个角度决定用户是否能访问资源，例如RoleVoter来判断用户的角色是否有权限访问资源，MaxuserVoter来决定某个资源的访问用户数是否已经达到了最大值等。</span> </p>
<p><span style="FONT-SIZE: 10pt">投票策略。投票的策略是通过不同的AccessDecisionManager来实现的，例如acegi提供的AffirmativeBased对象，这个对象的策略就是只要有一个投票通过就全体通过。UnanimousBased对象的策略是必须全体投票通过才能通过。但在大多数情况下acegi提供的AccessDecisionManager不能满足我们的要求，这就需要我们去实现AccessDecisionManager接口，去定制适合自己项目的策略。</span> </p>
<div><span style="FONT-SIZE: 10pt">3、投票。投票对象必须实现AccessDecisionVoter接口。投票对象关注的是某一方面的决定权，如果投票通过则Vote方法来完成的。vote方法必须返回一个int型的数据代表投票结果，它们是AccessDecisionVoter的三个静态成员属性：ACCESS_ABSTAIN,，ACCESS_DENIED和ACCESS_GRANTED，它们分别是弃权，否决和赞成。</span> </div>
<div><span style="FONT-SIZE: 10pt"></span>&nbsp;</div>
<div><span style="FONT-SIZE: 10pt">
<h4><span style="FONT-SIZE: 10pt">安全拦截器</span> </h4>
<h5>&nbsp; 拦截器如何工作<br>&nbsp; MethodInvocation拦截器<br>&nbsp; FilterInvocation拦截器</h5>
<h4><span style="FONT-SIZE: 10pt">认证</span> </h4>
<h5>&nbsp; 认证请求<br>&nbsp; 认证管理器<br>&nbsp; Authentication Provider</h5>
<h4><span style="FONT-SIZE: 10pt">授权</span> </h4>
<h5>&nbsp; Access Decision Manager<br>&nbsp; Voting Decision Manager<br>&nbsp; 授权管理推荐</h5>
<h4><span style="FONT-SIZE: 10pt">ContextHolder的用户接口</span> </h4>
<h5>&nbsp; 用户接口目标<br>&nbsp; HTTP会话认证<br>&nbsp; HTTP Basic认证</h5>
</span></div>
<img src ="http://www.blogjava.net/LiuTing/aggbug/118674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LiuTing/" target="_blank">LiuTing</a> 2007-05-20 12:44 <a href="http://www.blogjava.net/LiuTing/archive/2007/05/20/118674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Acegi时获取用户信息的几个函数</title><link>http://www.blogjava.net/LiuTing/archive/2007/05/20/118673.html</link><dc:creator>LiuTing</dc:creator><author>LiuTing</author><pubDate>Sun, 20 May 2007 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/LiuTing/archive/2007/05/20/118673.html</guid><wfw:comment>http://www.blogjava.net/LiuTing/comments/118673.html</wfw:comment><comments>http://www.blogjava.net/LiuTing/archive/2007/05/20/118673.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/LiuTing/comments/commentRss/118673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/LiuTing/services/trackbacks/118673.html</trackback:ping><description><![CDATA[<font color=#008080>1</font> <img id=Codehighlighter1_0_34_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_34_Open_Text.style.display='none'; Codehighlighter1_0_34_Closed_Image.style.display='inline'; Codehighlighter1_0_34_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_0_34_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_34_Closed_Text.style.display='none'; Codehighlighter1_0_34_Open_Image.style.display='inline'; Codehighlighter1_0_34_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top> <span id=Codehighlighter1_0_34_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span> <span id=Codehighlighter1_0_34_Open_Text><span style="COLOR: #008000">/**</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;2</span> <span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;取得当前用户名<br></span><span style="COLOR: #008080">&nbsp;3</span> <span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;</span> <span style="COLOR: #808080">@return</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;4</span> <span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">*/</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span> <span style="COLOR: #000000"><img id=Codehighlighter1_72_583_Open_Image onclick="this.style.display='none'; Codehighlighter1_72_583_Open_Text.style.display='none'; Codehighlighter1_72_583_Closed_Image.style.display='inline'; Codehighlighter1_72_583_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_72_583_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_72_583_Closed_Text.style.display='none'; Codehighlighter1_72_583_Open_Image.style.display='inline'; Codehighlighter1_72_583_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000">&nbsp;String&nbsp;getUsername()</span> <span id=Codehighlighter1_72_583_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_72_583_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;6</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;context</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">ContextHolder.getContext();<br></span><span style="COLOR: #008080">&nbsp;7</span> <span style="COLOR: #000000"><img id=Codehighlighter1_143_562_Open_Image onclick="this.style.display='none'; Codehighlighter1_143_562_Open_Text.style.display='none'; Codehighlighter1_143_562_Closed_Image.style.display='inline'; Codehighlighter1_143_562_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_143_562_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_143_562_Closed_Text.style.display='none'; Codehighlighter1_143_562_Open_Image.style.display='inline'; Codehighlighter1_143_562_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(context</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">)</span> <span id=Codehighlighter1_143_562_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_143_562_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;8</span> <span style="COLOR: #000000"><img id=Codehighlighter1_187_556_Open_Image onclick="this.style.display='none'; Codehighlighter1_187_556_Open_Text.style.display='none'; Codehighlighter1_187_556_Closed_Image.style.display='inline'; Codehighlighter1_187_556_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_187_556_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_187_556_Closed_Text.style.display='none'; Codehighlighter1_187_556_Open_Image.style.display='inline'; Codehighlighter1_187_556_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(context&nbsp;</span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000">&nbsp;SecureContext)</span> <span id=Codehighlighter1_187_556_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_187_556_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;9</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecureContext&nbsp;sc</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">(SecureContext)context;<br></span><span style="COLOR: #008080">10</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Authentication&nbsp;auth</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">sc.getAuthentication();<br></span><span style="COLOR: #008080">11</span> <span style="COLOR: #000000"><img id=Codehighlighter1_312_548_Open_Image onclick="this.style.display='none'; Codehighlighter1_312_548_Open_Text.style.display='none'; Codehighlighter1_312_548_Closed_Image.style.display='inline'; Codehighlighter1_312_548_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_312_548_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_312_548_Closed_Text.style.display='none'; Codehighlighter1_312_548_Open_Image.style.display='inline'; Codehighlighter1_312_548_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(auth</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">)</span> <span id=Codehighlighter1_312_548_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_312_548_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">12</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;principal</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">auth.getPrincipal();<br></span><span style="COLOR: #008080">13</span> <span style="COLOR: #000000"><img id=Codehighlighter1_409_480_Open_Image onclick="this.style.display='none'; Codehighlighter1_409_480_Open_Text.style.display='none'; Codehighlighter1_409_480_Closed_Image.style.display='inline'; Codehighlighter1_409_480_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_409_480_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_409_480_Closed_Text.style.display='none'; Codehighlighter1_409_480_Open_Image.style.display='inline'; Codehighlighter1_409_480_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(principal&nbsp;</span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000">&nbsp;UserDetails)&nbsp;</span> <span id=Codehighlighter1_409_480_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_409_480_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">14</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;((UserDetails)principal).getUsername();<br></span><span style="COLOR: #008080">15</span> <span style="COLOR: #000000"><img id=Codehighlighter1_485_538_Open_Image onclick="this.style.display='none'; Codehighlighter1_485_538_Open_Text.style.display='none'; Codehighlighter1_485_538_Closed_Image.style.display='inline'; Codehighlighter1_485_538_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_485_538_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_485_538_Closed_Text.style.display='none'; Codehighlighter1_485_538_Open_Image.style.display='inline'; Codehighlighter1_485_538_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #0000ff">else</span> <span id=Codehighlighter1_485_538_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_485_538_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">16</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;principal.toString();<br></span><span style="COLOR: #008080">17</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">18</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">19</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">20</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">21</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">22</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">23</span> <span style="COLOR: #000000"><img id=Codehighlighter1_587_622_Open_Image onclick="this.style.display='none'; Codehighlighter1_587_622_Open_Text.style.display='none'; Codehighlighter1_587_622_Closed_Image.style.display='inline'; Codehighlighter1_587_622_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_587_622_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_587_622_Closed_Text.style.display='none'; Codehighlighter1_587_622_Open_Image.style.display='inline'; Codehighlighter1_587_622_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span> <span id=Codehighlighter1_587_622_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span> <span id=Codehighlighter1_587_622_Open_Text><span style="COLOR: #008000">/**</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #008080">24</span> <span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;取得当前用户密码<br></span><span style="COLOR: #008080">25</span> <span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;</span> <span style="COLOR: #808080">@return</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #008080">26</span> <span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">*/</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">27</span> <span style="COLOR: #000000"><img id=Codehighlighter1_660_1155_Open_Image onclick="this.style.display='none'; Codehighlighter1_660_1155_Open_Text.style.display='none'; Codehighlighter1_660_1155_Closed_Image.style.display='inline'; Codehighlighter1_660_1155_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_660_1155_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_660_1155_Closed_Text.style.display='none'; Codehighlighter1_660_1155_Open_Image.style.display='inline'; Codehighlighter1_660_1155_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000">&nbsp;String&nbsp;getPassword()</span> <span id=Codehighlighter1_660_1155_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_660_1155_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">28</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;context</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">ContextHolder.getContext();<br></span><span style="COLOR: #008080">29</span> <span style="COLOR: #000000"><img id=Codehighlighter1_731_1134_Open_Image onclick="this.style.display='none'; Codehighlighter1_731_1134_Open_Text.style.display='none'; Codehighlighter1_731_1134_Closed_Image.style.display='inline'; Codehighlighter1_731_1134_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_731_1134_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_731_1134_Closed_Text.style.display='none'; Codehighlighter1_731_1134_Open_Image.style.display='inline'; Codehighlighter1_731_1134_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(context</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">)</span> <span id=Codehighlighter1_731_1134_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_731_1134_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">30</span> <span style="COLOR: #000000"><img id=Codehighlighter1_775_1128_Open_Image onclick="this.style.display='none'; Codehighlighter1_775_1128_Open_Text.style.display='none'; Codehighlighter1_775_1128_Closed_Image.style.display='inline'; Codehighlighter1_775_1128_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_775_1128_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_775_1128_Closed_Text.style.display='none'; Codehighlighter1_775_1128_Open_Image.style.display='inline'; Codehighlighter1_775_1128_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(context&nbsp;</span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000">&nbsp;SecureContext)</span> <span id=Codehighlighter1_775_1128_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_775_1128_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">31</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecureContext&nbsp;sc</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">(SecureContext)context;<br></span><span style="COLOR: #008080">32</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Authentication&nbsp;auth</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">sc.getAuthentication();<br></span><span style="COLOR: #008080">33</span> <span style="COLOR: #000000"><img id=Codehighlighter1_900_1120_Open_Image onclick="this.style.display='none'; Codehighlighter1_900_1120_Open_Text.style.display='none'; Codehighlighter1_900_1120_Closed_Image.style.display='inline'; Codehighlighter1_900_1120_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_900_1120_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_900_1120_Closed_Text.style.display='none'; Codehighlighter1_900_1120_Open_Image.style.display='inline'; Codehighlighter1_900_1120_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(auth</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">)</span> <span id=Codehighlighter1_900_1120_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_900_1120_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">34</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;principal</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">auth.getPrincipal();<br></span><span style="COLOR: #008080">35</span> <span style="COLOR: #000000"><img id=Codehighlighter1_997_1068_Open_Image onclick="this.style.display='none'; Codehighlighter1_997_1068_Open_Text.style.display='none'; Codehighlighter1_997_1068_Closed_Image.style.display='inline'; Codehighlighter1_997_1068_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_997_1068_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_997_1068_Closed_Text.style.display='none'; Codehighlighter1_997_1068_Open_Image.style.display='inline'; Codehighlighter1_997_1068_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(principal&nbsp;</span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000">&nbsp;UserDetails)&nbsp;</span> <span id=Codehighlighter1_997_1068_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_997_1068_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">36</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;((UserDetails)principal).getPassword();<br></span><span style="COLOR: #008080">37</span> <span style="COLOR: #000000"><img id=Codehighlighter1_1073_1110_Open_Image onclick="this.style.display='none'; Codehighlighter1_1073_1110_Open_Text.style.display='none'; Codehighlighter1_1073_1110_Closed_Image.style.display='inline'; Codehighlighter1_1073_1110_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_1073_1110_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1073_1110_Closed_Text.style.display='none'; Codehighlighter1_1073_1110_Open_Image.style.display='inline'; Codehighlighter1_1073_1110_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #0000ff">else</span> <span id=Codehighlighter1_1073_1110_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_1073_1110_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">38</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">39</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">40</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">41</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">42</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">43</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">44</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">45</span> <span style="COLOR: #000000"><img id=Codehighlighter1_1159_1164_Open_Image onclick="this.style.display='none'; Codehighlighter1_1159_1164_Open_Text.style.display='none'; Codehighlighter1_1159_1164_Closed_Image.style.display='inline'; Codehighlighter1_1159_1164_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_1159_1164_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1159_1164_Closed_Text.style.display='none'; Codehighlighter1_1159_1164_Open_Image.style.display='inline'; Codehighlighter1_1159_1164_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span> <span id=Codehighlighter1_1159_1164_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span> <span id=Codehighlighter1_1159_1164_Open_Text><span style="COLOR: #008000">/**</span> <span style="COLOR: #008000">&nbsp;</span> <span style="COLOR: #008000">*/</span> </span><span id=Codehighlighter1_1165_1226_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span> <span id=Codehighlighter1_1165_1226_Open_Text><span style="COLOR: #008000">/**</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #008080">46</span> <span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;取得当前用户ｓｅｓｓｉｏｎ　ｉｄ<br></span><span style="COLOR: #008080">47</span> <span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;*&nbsp;</span> <span style="COLOR: #808080">@return</span> <span style="COLOR: #008000">&nbsp;sessionid&nbsp;or&nbsp;null<br></span><span style="COLOR: #008080">48</span> <span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">*/</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">49</span> <span style="COLOR: #000000"><img id=Codehighlighter1_1265_1779_Open_Image onclick="this.style.display='none'; Codehighlighter1_1265_1779_Open_Text.style.display='none'; Codehighlighter1_1265_1779_Closed_Image.style.display='inline'; Codehighlighter1_1265_1779_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_1265_1779_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1265_1779_Closed_Text.style.display='none'; Codehighlighter1_1265_1779_Open_Image.style.display='inline'; Codehighlighter1_1265_1779_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000">&nbsp;String&nbsp;getSessionID()</span> <span id=Codehighlighter1_1265_1779_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_1265_1779_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">50</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;context</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">ContextHolder.getContext();<br></span><span style="COLOR: #008080">51</span> <span style="COLOR: #000000"><img id=Codehighlighter1_1336_1758_Open_Image onclick="this.style.display='none'; Codehighlighter1_1336_1758_Open_Text.style.display='none'; Codehighlighter1_1336_1758_Closed_Image.style.display='inline'; Codehighlighter1_1336_1758_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_1336_1758_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1336_1758_Closed_Text.style.display='none'; Codehighlighter1_1336_1758_Open_Image.style.display='inline'; Codehighlighter1_1336_1758_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(context</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">)</span> <span id=Codehighlighter1_1336_1758_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_1336_1758_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">52</span> <span style="COLOR: #000000"><img id=Codehighlighter1_1380_1752_Open_Image onclick="this.style.display='none'; Codehighlighter1_1380_1752_Open_Text.style.display='none'; Codehighlighter1_1380_1752_Closed_Image.style.display='inline'; Codehighlighter1_1380_1752_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_1380_1752_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1380_1752_Closed_Text.style.display='none'; Codehighlighter1_1380_1752_Open_Image.style.display='inline'; Codehighlighter1_1380_1752_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(context&nbsp;</span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000">&nbsp;SecureContext)</span> <span id=Codehighlighter1_1380_1752_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_1380_1752_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">53</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecureContext&nbsp;sc</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">(SecureContext)context;<br></span><span style="COLOR: #008080">54</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Authentication&nbsp;auth</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">sc.getAuthentication();<br></span><span style="COLOR: #008080">55</span> <span style="COLOR: #000000"><img id=Codehighlighter1_1505_1744_Open_Image onclick="this.style.display='none'; Codehighlighter1_1505_1744_Open_Text.style.display='none'; Codehighlighter1_1505_1744_Closed_Image.style.display='inline'; Codehighlighter1_1505_1744_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_1505_1744_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1505_1744_Closed_Text.style.display='none'; Codehighlighter1_1505_1744_Open_Image.style.display='inline'; Codehighlighter1_1505_1744_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(auth</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">)</span> <span id=Codehighlighter1_1505_1744_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_1505_1744_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">56</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;details</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">auth.getDetails();<br></span><span style="COLOR: #008080">57</span> <span style="COLOR: #000000"><img id=Codehighlighter1_1609_1692_Open_Image onclick="this.style.display='none'; Codehighlighter1_1609_1692_Open_Text.style.display='none'; Codehighlighter1_1609_1692_Closed_Image.style.display='inline'; Codehighlighter1_1609_1692_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_1609_1692_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1609_1692_Closed_Text.style.display='none'; Codehighlighter1_1609_1692_Open_Image.style.display='inline'; Codehighlighter1_1609_1692_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(details&nbsp;</span> <span style="COLOR: #0000ff">instanceof</span> <span style="COLOR: #000000">&nbsp;WebAuthenticationDetails)&nbsp;</span> <span id=Codehighlighter1_1609_1692_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_1609_1692_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">58</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;((WebAuthenticationDetails)details).getSessionId();<br></span><span style="COLOR: #008080">59</span> <span style="COLOR: #000000"><img id=Codehighlighter1_1697_1734_Open_Image onclick="this.style.display='none'; Codehighlighter1_1697_1734_Open_Text.style.display='none'; Codehighlighter1_1697_1734_Closed_Image.style.display='inline'; Codehighlighter1_1697_1734_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top> <img id=Codehighlighter1_1697_1734_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1697_1734_Closed_Text.style.display='none'; Codehighlighter1_1697_1734_Open_Image.style.display='inline'; Codehighlighter1_1697_1734_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #0000ff">else</span> <span id=Codehighlighter1_1697_1734_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_1697_1734_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">60</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">61</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">62</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">63</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">64</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">65</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">66</span> <span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000"><br></span>
<img src ="http://www.blogjava.net/LiuTing/aggbug/118673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LiuTing/" target="_blank">LiuTing</a> 2007-05-20 12:43 <a href="http://www.blogjava.net/LiuTing/archive/2007/05/20/118673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi使用2</title><link>http://www.blogjava.net/LiuTing/archive/2007/05/20/118671.html</link><dc:creator>LiuTing</dc:creator><author>LiuTing</author><pubDate>Sun, 20 May 2007 04:42:00 GMT</pubDate><guid>http://www.blogjava.net/LiuTing/archive/2007/05/20/118671.html</guid><wfw:comment>http://www.blogjava.net/LiuTing/comments/118671.html</wfw:comment><comments>http://www.blogjava.net/LiuTing/archive/2007/05/20/118671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/LiuTing/comments/commentRss/118671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/LiuTing/services/trackbacks/118671.html</trackback:ping><description><![CDATA[<p>流程说完了，接下对上面提到的问题解释一下： <br></p>
<div class=quote_title>引用</div>
<div class=quote_div><br>先使用URL拦截的方式去对付大多数的情况，然后少数URL搞不定的再加一个接口，让Action自己去判别。这样用两个拦截器对Action进行拦截，如果Action实现了hasPermission接口，那么就交给Action自己判断，如果Action没有该接口，就查找内部的URL和权限的对照表来判断。 <br></div>
<p>&nbsp;</p>
<p>这个情况比较复杂，因为是要对Action进行调用，所以要看使用的web框架来定夺。是用不同Web框架要是用不同的Web框架拦截器。所以恐怕acegi力不从心，挺多在filter里面配置一下是否要是用Action自身校验。但是想法很好，赞。</p>
<p>&nbsp;</p>
<div class=quote_title>引用</div>
<div class=quote_div><br>你怎么把信息有效的传递给Web层和其他的Facade层进行用户友好性的提示处理？ <br></div>
<p>&nbsp;</p>
<p>acegi校验失败的时候会抛出AuthenticationException异常，然后放在session里面， <br>在错误转向页面可以这样是用 <br></p>
<div class=code_title>代码
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;((AuthenticationException)&nbsp;session.getAttribute(AbstractProcessingFilter.ACEGI_SECURITY_LAST_EXCEPTION_KEY)).getMessage()&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;session.getAttribute(AuthenticationProcessingFilter.ACEGI_SECURITY_LAST_USERNAME_KEY)&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;session.getAttribute(SecurityEnforcementFilter.ACEGI_SECURITY_ACCESS_DENIED_EXCEPTION_KEY)&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000">&nbsp;</span></div>
</div>
<br>不过这么用实在太难看了，晕了。可以自己用tag来搞定
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class=quote_title>引用</div>
<div class=quote_div><br>很多系统需要根据权限不同，生成不同的UI组件(例如管理员的菜单和普通用户菜单就肯定不一样)，这也需要在Web层的View进行控制。 <br></div>
<br>acegi对View的处理就是使用tag,原来的acegi好像没有什么tag，简直是烂，现在有了tag，说一下是用的方法，但是说实话他的tag实在是不够强。
<p>&nbsp;</p>
<p>老版的web.xml <br></p>
<div class=code_title>代码
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">taglib</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">taglib-uri</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">http://acegisecurity.sf.net/authz</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">taglib-uri</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">taglib-location</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/WEB-INF/authz.tld</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">taglib-location</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">taglib</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;</span></div>
</div>
<br>在页面中使用 <br>
<div class=code_title>代码
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">authz:authorize&nbsp;</span><span style="COLOR: #ff0000">ifAllGranted</span><span style="COLOR: #0000ff">="ROLE_SUPERVISOR"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">td</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">A&nbsp;</span><span style="COLOR: #ff0000">HREF</span><span style="COLOR: #0000ff">="del.htm?id=&lt;c:out&nbsp;value="</span><span style="COLOR: #ff0000">/${contact.id}"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">"&gt;Del</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">A</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">td</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">authz:authorize</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;</span></div>
</div>
<br>ifAllGranted是说所有的权限都有，用','分割权限 <br>可以替换成ifAnyGranted: ifNotGranted:
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class=code_title>代码
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">authz:authentication&nbsp;</span><span style="COLOR: #ff0000">operation</span><span style="COLOR: #0000ff">="username"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span></div>
</div>
<p>&nbsp;</p>
<p>这个是用来显示你的权限信息的。</p>
<p>&nbsp;</p>
<div class=code_title>代码
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">authz:acl&nbsp;</span><span style="COLOR: #ff0000">domainObject</span><span style="COLOR: #0000ff">="${contact}"</span><span style="COLOR: #ff0000">&nbsp;hasPermission</span><span style="COLOR: #0000ff">="16,1"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">td</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">A&nbsp;</span><span style="COLOR: #ff0000">HREF</span><span style="COLOR: #0000ff">="&lt;c:url&nbsp;value="</span><span style="COLOR: #ff0000">del.htm"</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">c:param&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="contactId"</span><span style="COLOR: #ff0000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>value</span><span style="COLOR: #0000ff">="${contact.id}"</span><span style="COLOR: #0000ff">/&gt;&lt;/</span><span style="COLOR: #800000">c:url</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">"&gt;Del</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">A</span><span style="COLOR: #0000ff">&gt;&lt;/</span><span style="COLOR: #800000">td</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">authz:acl</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;</span></div>
</div>
<img src ="http://www.blogjava.net/LiuTing/aggbug/118671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LiuTing/" target="_blank">LiuTing</a> 2007-05-20 12:42 <a href="http://www.blogjava.net/LiuTing/archive/2007/05/20/118671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi使用1 </title><link>http://www.blogjava.net/LiuTing/archive/2007/05/20/118670.html</link><dc:creator>LiuTing</dc:creator><author>LiuTing</author><pubDate>Sun, 20 May 2007 04:41:00 GMT</pubDate><guid>http://www.blogjava.net/LiuTing/archive/2007/05/20/118670.html</guid><wfw:comment>http://www.blogjava.net/LiuTing/comments/118670.html</wfw:comment><comments>http://www.blogjava.net/LiuTing/archive/2007/05/20/118670.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/LiuTing/comments/commentRss/118670.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/LiuTing/services/trackbacks/118670.html</trackback:ping><description><![CDATA[<p>首先要配置一个filter，这个filter用一个代理bean写在了spring里面，其实根正常的filter没有任何区别。 <br></p>
<div class=code_title>代码
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="securityEnforcementFilter"</span><span style="COLOR: #ff0000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="COLOR: #0000ff">="org.acegisecurity.intercept.web.SecurityEnforcementFilter"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="filterSecurityInterceptor"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref&nbsp;</span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="filterInvocationInterceptor"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="authenticationEntryPoint"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref&nbsp;</span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="authenticationProcessingFilterEntryPoint"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;</span></div>
</div>
<p>&nbsp;</p>
<div>"filterInvocationInterceptor" 是一个拦截器，说是拦截器，其实就是在filter里面执行一下他的拦截方法，这里可没有什么aop. <br>authenticationEntryPoint 交验失败的时候转到的地方，为什么说是地方，因为通过配置可以转到其它的url甚至其它的协议下(http 转到 https等等)</div>
<div>&nbsp;</div>
<div>
<div class=code_title>代码
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="authenticationProcessingFilterEntryPoint"</span><span style="COLOR: #ff0000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="COLOR: #0000ff">="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="loginFormUrl"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/error.security</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="forceHttps"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">false</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
</div>
<p>&nbsp;</p>
<p>这个就是失败的时候转到的地方，我们可以配置url和是否使用https</p>
<p>&nbsp;</p>
<div class=code_title>代码
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="filterInvocationInterceptor"</span><span style="COLOR: #ff0000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="COLOR: #0000ff">="org.acegisecurity.intercept.web.FilterSecurityInterceptor"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="authenticationManager"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref&nbsp;</span><span style="COLOR: #ff0000">bean</span><span style="COLOR: #0000ff">="authenticationManager"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="accessDecisionManager"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref&nbsp;</span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="httpRequestAccessDecisionManager"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="objectDefinitionSource"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PATTERN_TYPE_APACHE_ANT&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/index.jsp=ROLE_ANONYMOUS,ROLE_USER&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/j_acegi_switch_user=ROLE_SUPERVISOR&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/login.security=ROLE_ANONYMOUS,ROLE_USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/test.do=ROLE_CODER&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**.do*=ROLE_USER&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;</span></div>
</div>
<p>&nbsp;</p>
<p>这个就是前面提到的拦截器。简单解释一下： <br>authenticationManager 在acegi里面的主要作用就是管理维护用户的权限角色等信息，比方说想要用户的ROLE就要在这里面拿了。里面配置了多种全县的来源，可以从DAO里面来(就是数据库里面)，可以是cookies里面的，也可以是匿名的权限，每种权限都以一种Provider的形式提供： <br></p>
<div class=code_title>代码
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="authenticationManager"</span><span style="COLOR: #ff0000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="COLOR: #0000ff">="org.acegisecurity.providers.ProviderManager"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="providers"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref&nbsp;</span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="daoAuthenticationProvider"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref&nbsp;</span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="anonymousAuthenticationProvider"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref&nbsp;</span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="rememberMeAuthenticationProvider"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span></div>
</div>
<p>&nbsp;</p>
<p>objectDefinitionSource在acegi里面就是配置权限信息，说明哪一个url需要什么权限才能访问，acegi默认用&lt;value&gt;来表示，其实这正是acegi的不足之处，还好能够补救。我来说明一下： <br>我们知道在spring里面&lt;value&gt;标签比较特殊，spring首先找到这个属性的类型，然后把value里面的内容以String的类型取出来(Spring做了一下包装，为TypedString)。然后根据这个属性的类型找他的Editer，然后用Editer来处理String为需要的类型。但是我们不希望用String来表达url，很明显url里面有=就不会玩了。我们可以把这个信息写到数据库里面，然后读取，这里面不说了以前有一位高手已经解释过了。</p>
<p>接下来就是httpRequestAccessDecisionManager了，AccessDecisionManager在acegi里面是决策者，就是根据你所拥有的权限和访问URL需要的权限来决定你到底能不能访问。</p>
<p>&nbsp;</p>
<div class=code_title>代码
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="httpRequestAccessDecisionManager"</span><span style="COLOR: #ff0000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #ff0000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="COLOR: #0000ff">="org.acegisecurity.vote.AffirmativeBased"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="allowIfAllAbstainDecisions"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">false</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="decisionVoters"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref&nbsp;</span><span style="COLOR: #ff0000">bean</span><span style="COLOR: #0000ff">="roleVoter"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;</span></div>
</div>
<p>&nbsp;</p>
<p>决策者里面是投票者，这个上面已经解释过了，一个投票者校验一种权限。整个流程已经说完了。</p>
</div>
<img src ="http://www.blogjava.net/LiuTing/aggbug/118670.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LiuTing/" target="_blank">LiuTing</a> 2007-05-20 12:41 <a href="http://www.blogjava.net/LiuTing/archive/2007/05/20/118670.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse报表插件birt </title><link>http://www.blogjava.net/LiuTing/archive/2007/05/20/118668.html</link><dc:creator>LiuTing</dc:creator><author>LiuTing</author><pubDate>Sun, 20 May 2007 04:40:00 GMT</pubDate><guid>http://www.blogjava.net/LiuTing/archive/2007/05/20/118668.html</guid><wfw:comment>http://www.blogjava.net/LiuTing/comments/118668.html</wfw:comment><comments>http://www.blogjava.net/LiuTing/archive/2007/05/20/118668.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/LiuTing/comments/commentRss/118668.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/LiuTing/services/trackbacks/118668.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt">&nbsp; </p>
<h1><span><span>1.&nbsp;</span></span><span>BIRT </span><span>概述</span></h1>
<p><span>BIRT</span><span>是一个<span>Eclipse-based</span>开放源代码报表系统。它主要是用在基于<span>Java</span>与<span>J2EE</span>的<span>Web</span>应用程序上。<span>BIRT</span>主要由两部分组成：一个是基于<span>Eclipse</span>的报表设计和一个可以加到你应用服务的运行期组件。<span>BIRT</span>同时也提供一个图形报表制作引擎。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>使用<span>BIRT</span>，能制作出多样化的报表到你的应用中。比如：列表<span> lists ,</span>图表<span> charts,</span>混合报表 </span><span>Compound Reports</span><span>，交叉表（二维表）<span>Crosstabs</span>（二维报表目前在<span>BIRT <st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">2.1.1</st1:chsdate> </span>还未实现，但在以后的版本中将会实现此功能）。</span></p>
<h1><span><span>2.&nbsp;</span></span><span>BIRT</span><span>的安装</span></h1>
<p><span>2.1&gt;birt的安装<br><br>Eclipse 3.1 </span><span>支持<span> BIRT 2.0</span></span></p>
<p><span>Eclipse 3.2 </span><span>支持<span> BIRT 2.1</span></span></p>
<p>&nbsp;</p>
<p><span>目前我使用的版本是<span>BIRT <st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">2.1.1</st1:chsdate></span>，<span>BIRT</span>的安装有很多的方法。</span></p>
<p><strong><span>方法一：</span></strong></p>
<p><span>到<span>Eclipse</span>的官方网站<span><a href="http://download.eclipse.org/birt/downloads">http://download.eclipse.org/birt/downloads</a></span>去下载<span> BIRT </span>插件（<span>birt-report-designer-all-in-one-2_1_1</span>），解压后，它就是一个拥有<span> BIRT</span>插件的<span>Eclipse</span>。如果你已经安装了<span>Eclipse,</span>那么把下载的文件夹的内容拷到所对应的<span> Eclipse </span>的文件夹里（<span>plugins</span>和<span>features</span>两个目录），之后的第一次启动是通过<span>DOS</span>进入到<span>Eclipse</span>目录，启动<span> Eclipse -clean </span>命令，此命令是清除<span> Eclipse </span>缓存里的记录并启动<span>Eclipse</span>。这也是最简单的安装<span>BIRT</span>方法。</span></p>
<p>&nbsp;</p>
<p><strong><span>方法二：</span></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>BIRT 2.1</span><span>开始，可以在<span> Eclipse </span>里直接下载。<span>[</span>帮助<span>]</span></span><span><span>&#224;</span></span><span>[</span><span>软件更新<span>]</span></span><span><span>&#224;</span></span><span>[</span><span>查找并安装<span>]</span></span></p>
<p>&nbsp;</p>
<p><strong><span>方法三：</span></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>如果你的<span> Eclipse </span>已经安装或者不想使用方法一安装，可以进行分别安装的方法。<span>EMF, GEF </span>和<span> BIRT </span>都是需要通过 <span><a href="http://www.eclipse.org/downloads/index.php">Eclipse download page</a></span>下载的。请注意以下的配置要求：</span></p>
<ul type=disc>
    <li><strong><span>BIRT <st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">2.0.2</st1:chsdate></span></strong><span> </span>
    <li><span>Eclipse 3.1 </span>
    <li><span>GEF 3.1. </span>
    <li><span>EMF 2.1. </span>
    <li><span>JRE <st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">1.4.2</st1:chsdate>/JRE 1.5. </span></li>
</ul>
<ul type=disc>
    <li><strong><span>BIRT 2.1/<st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">2.1.1</st1:chsdate></span></strong><span> </span>
    <li><span>Eclipse 3.2. </span>
    <li><span>GEF 3.2. </span>
    <li><span>EMF 2.2. </span>
    <li><span>JRE <st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">1.4.2</st1:chsdate>/JRE 1.5. </span></li>
</ul>
<ul type=disc>
    <li><strong><span>BIRT <st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="2.2" UnitName="m">2.2M</st1:chmetcnv>4 and higher</span></strong><span> </span>
    <li><span>Eclipse 3.3. </span>
    <li><span>GEF 3.3. </span>
    <li><span>EMF 2.3. </span>
    <li><span>JRE 1.5. </span></li>
</ul>
<p><span>GEF</span><span>：图形编辑框架，是一个通过<span> BIRT UI </span>使用的<span>Eclipse </span>插件</span></p>
<p><span>EMF</span><span>：用来制作图表的框架</span></p>
<p><span>具体的安装和配置请参考 <span><a href="http://www.eclipse.org/birt/phoenix/build">Eclipse<span><span>官方网站</span></span></a> </span>这里我还推荐一个<span><a href="http://download.eclipse.org/birt/downloads/examples/installing/installing.html">BIRT 2.0.1<span><span>的安装视频</span></span></a> </span>希望对大家有所帮助。</span></p>
<p><strong><span>注意：</span></strong><span>iTextAsian.jar </span><span>是为了支持用<span>PDF</span>输出时亚洲人的字体。<span>prototype.js </span>是安装<span> BIRT <st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">2.0.2</st1:chsdate> </span>或者更早的版本使用的，目前版本不需要了。</span></p>
<p><strong><span>提示：</span></strong><span>我个人使用的是方法一，首先安装比较方便，其次如果使用方法二，在<span>Eclipse [</span>帮助<span>]</span></span><span><span>&#224;</span></span><span>[</span><span>帮助内容<span>] </span>里没有关于<span> BIRT </span>的帮助文档，这样对学习不是很方便。</span></p>
<p>&nbsp;2.2&nbsp;&nbsp;&nbsp; birt版本升级</p>
<p>1．<span>删除在 <span>plugins </span>目录下的所有以 <span>org.eclipse.birt </span>开头的文件。<br></span><span><span><br>2．</span></span><span>按照上面的方法一进行安装。</span></p>
<p><span><span>3．</span></span><span>重新启动<span> Eclipse -clean</span></span></p>
<p>&nbsp;2.3&nbsp; 语言包安装</p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>目前<span> BIRT</span>的<st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on"><span>2.1.1</span></st1:chsdate><span> </span>已经有中文语言包。下载完毕以后把对应的目录<span> copy </span>到对应的<span> Eclipse </span>目录下，然后<span> Eclipse -clean </span>启动。</span></p>
<p>&nbsp;&nbsp;</p>
<h1><span><span>3.&nbsp;</span></span><span>BIRT</span><span>应用</span></h1>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>在这里我提供了一个 &#8220;<span>BIRT</span>中文教程&#8221;，在<span>Eclipse</span>官方网站也有它的演示视频，<span><a href="http://download.eclipse.org/birt/downloads/examples/reports/2.1/tutorial/tutorial.html">Customers.rptdesign</a> </span>是做好的报表。</span></p>
<p><strong>&nbsp;</strong></p>
<p><strong><span>JDBC Drivers</span></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>以上例子介绍的是使用&#8220;示例数据库&#8221;的数据源，在大多数情况下我们使用的是自己的<span>JDBC driver</span>，下面介绍连接<span> Oracle </span>数据库。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>打开<span> Eclipse </span>后进入<span> [</span>窗口<span>]</span></span><span><span>&#224;</span></span><span>[</span><span>打开透视图<span>]</span></span><span><span>&#224;</span></span><span>[</span><span>报表设计<span>]</span>，新建项目<span> [</span>文件<span>]</span></span><span><span>&#224;</span></span><span>[</span><span>新建<span>]</span></span><span><span>&#224;</span></span><span>[</span><span>项目<span>]</span>，选择&#8220;业务智能和报表工具&#8221;</span><span><span>&#224;</span></span><span>&#8220;报表项目&#8221;，起项目名。新建的项目上，右键 新建报表，给报表起名字，报表的后缀名是 <span>.rptdesign</span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>[</span><span>数据源<span>]</span></span><span><span>&#224;</span></span><span>[</span><span>新建数据源<span>]</span>，选择&#8220;<span>JDBC</span>数据源&#8221;（别忘了给数据源起名字），&#8220;管理驱动程序&#8221;</span><span><span>&#224;</span></span><span>&#8220;添加&#8221;，把所需要的数据库<span> jar </span>包添加进来。选择<span>oracle.jdbc.driver.OracleDriver ( v1.0)</span>，写上正确的数据库<span> URL</span>，用户名，密码，点击&#8220;测试连接&#8221;，显示 连接成功。</span></p>
<p>&nbsp;</p>
<p><span>报表的种类有很多，具体的制作过程参考<span>[</span>帮助<span>]</span></span><span><span>&#224;</span></span><span>[</span><span>帮助内容<span>]</span></span></p>
<p>&nbsp;</p>
<p><strong><span>提示：</span></strong><span>交叉表即二维报表在目前<span>BIRT <st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">2.1.1</st1:chsdate> </span>还未实现，但在以后的版本中正在计划实现此功能。<strong></strong></span></p>
<p>&nbsp;</p>
<h1><span><span>4.&nbsp;</span></span><span>BIRT</span><span>部署</span></h1>
<p><span>BIRT <st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">2.1.1</st1:chsdate></span><span>所对应使用的部署工具是<span>birt-runtime-2_1_1</span>，可以到<span> Eclipse </span>官方网站下载。</span></p>
<p>&nbsp;<br><span><span>4.1.<span> </span></span></span><span>tomcat </span><span>部署</span></p>
<p><span>我使用的版本是<span> tomcat 5.5</span>，步骤如下：</span></p>
<p><span><span>1)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>mail.jar&nbsp;activation.jar</span><span>拷到<span>Tomcat 5.5\common\lib</span></span></p>
<p><span><span>2)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>iTextAsian.jar&nbsp;itext-1.3.jar</span><span>拷到</span></p>
<p><span>WebViewerExample\WEB-INF\platform\plugins\com.lowagie.itext\lib</span></p>
<p><span><span>3)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>连接数据库的包拷到</span></p>
<p><span>WebViewerExample\WEB-INF\platform\plugins\org.eclipse.birt.report.data.oda.jdbc_<st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">2.1.1</st1:chsdate>.v20060922-1058\drivers</span></p>
<p><span><span>4)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>WebViewerExample</span><span>整个目录<span>copy </span>到 <span>Tomcat 5.5\webapps</span>下<span>,</span>可以更改文件夹名。</span></p>
<p><span><span>5)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>完成的报表可以直接复制到根目录下，也可以新建文件夹目录。</span></p>
<p>&nbsp;</p>
<p><span>现在<span>BIRT</span>支持两种浏览报表模式，<span>frameset</span>是支持显示分页的，采用<span>Ajax</span>技术。<span>run</span>暂不支持显示分页，直接输出<span>HTML</span>流。比较一下它们的区别，如下：</span></p>
<p><span>http://localhost:8080/WebViewerExample/frameset?__report=Customers.rptdesign</span></p>
<p><span>http://localhost:8080/WebViewerExample/run?__report=Customers.rptdesign</span></p>
<p><strong><span>注意：</span></strong></p>
<p><span><span>a)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>问号后面的是双下划线</span></p>
<p><span><span>b)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>以上报表是放在根目录下，如果是放在自己新建的目录比如<span> myreport </span>下<span>URL</span>应是：</span></p>
<p><span>http://localhost:8080/WebViewerExample/run?__report=myreport/Customers.rptdesign</span></p>
<p>&nbsp;<br><span><span>4.2.<span> </span></span></span><span>Weblogic Server </span><span>部署</span></p>
<p><span>我使用的版本是<span> Weblogic Server 9.2</span>，它是 </span><span>BEA WebLogic </span><span>产品的一部分。<span>BEA WebLogic Server </span>是一个功能丰富、基于标准的</span><span>现成的企业<span> J2EE</span></span><span>应用服务器。</span></p>
<p><span>Weblogic Server </span><span>有很多的域组成，</span><code><span>medrec </span></code><code><span>和 <span>wl_server </span>是其中自带的域，也可以自己创建新的域。域中可以包含许多服务器，在服务器中可以部署许多的应用程序。域有一个默认的服务器，它是管理服务器。每个域中的管理服务器是唯一的，其他创建的服务器叫受管服务器。</span></code></p>
<p><span>Weblogic Server </span><span>的安装就不多做介绍了，主要介绍它的配置和部署。下面介绍一下新建域和部署的步骤：</span></p>
<p><span><span>1)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>运行开始<span> -&gt; </span>程序<span> -&gt; BEA Products -&gt; Tools -&gt; Configuration Wizard</span></span></p>
<p><span><span>2)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>选择<span> Create a new WebLogic domain</span>，<span>Next</span>。</span></p>
<p><span><span>3)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>在<span> Select Domain Source </span>界面保持默认，<span>Next</span>。</span></p>
<p><span><span>4)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>在<span> User name </span>处输入用户名，如<span> user</span>，<span>password </span>输入密码，如<span>12345678</span>（密码要求<span> 8 </span>位），<span>Next</span>。</span></p>
<p><span><span>5)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>在<span> Configure Server Start Mode and JDK </span>界面中保持默认，即<span> JDK </span>选择的是&#8220;<span>Sun SDK <st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">1.5.0</st1:chsdate>_04 @ C:\BEA\jdk150_<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="4" UnitName="&#8221;">04<span><span>&#8221;</span></span></st1:chmetcnv><span>，注意这里若选择&#8220;Other JDK</span></span>&#8221;配置比<span> SDK 1.5.0_04 </span>更高的版本，服务器启动时将会出现异常，所以最好保持默认，然后<span> Next</span>。</span></p>
<p><span><span>6)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>在<span> Customize Environment and Services Settings </span>界面中默认为<span> No</span>，<span>Next</span>。</span></p>
<p><span><span>7)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>在<span> Domain name </span>处输入<span> mydomain</span>，点击<span> Create</span>。</span></p>
<p><span><span>8)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>完成后点击<span> Done </span>关闭<span> Configuration Wizard </span>对话框。</span></p>
<p><span><span>9)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>运行开始<span> -&gt; </span>程序<span> -&gt; BEA Products -&gt; User Projects -&gt; mydomain -&gt; Start Admin Server for Weblogic Server Domain</span>，启动创建域的服务器。如果最后显示 <span>&lt;Server started in RUNNING mode&gt; </span>则说明服务器启动成功。</span></p>
<p><span><span>10)&nbsp;</span></span><span>在地址栏输入 <span>http://localhost:7001/console </span>进入管理控制台，输入刚才的用户名和密码。点击 更改中心 的<span>[</span>锁定并编辑<span>]</span>，域结构 中的<span>[</span>部署<span>]</span>，点击<span>[</span>安装<span>]</span>。找到你要部署的应用程序，之后都为默认，最后点完成。在更改页面上点击<span>[</span>保存<span>]</span>，<a name=startstop1208193__startstop1208210></a>完成所需的更改后，单击 更改中心 中的<span>[</span><span>激活更改</span><span>]</span>。<strong>注意：</strong>只有点击了<span>[</span><span>激活更改</span><span>]</span>后才真正保存了更改。某些在管理控制台中所做的更改在激活后立即生效。有些更改需要重新启动此更改影响到的服务器或模块。后面的这些更改称为非动态更改。非动态更改在管理控制台中由此警告图标表示：<span> </span>如果对非动态配置设置进行了编辑，则只有在重新启动服务器之后，所有对动态配置设置所进行的编辑才会生效。</span></p>
<p><span><span>11)&nbsp;</span></span><span>点击 域结构 中的<span>[</span>部署<span>]</span>，启动刚才部署的应用程序。</span></p>
<p><span><span>12)&nbsp;</span></span><span>在地址栏中输入 <span>http://localhost:7001/</span>部署程序名在<span>web</span>中显示应用程序。</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>BIRT</span><span>的部署方法基本和上面步骤相同，注意一点，在部署前将</span></p>
<p><span>commons-logging.jar </span><span>拷入 <span>WebViewerExample </span>中的<span> lib </span>包中，否则最后显示会报错。</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>Weblogic Server </span><span>的部署方法有很多，</span><span>weblogic.Deployer</span><span>、管理控制台、<span>WLST </span>等等。刚才介绍的管理控制台的部署，它是一个可视化的界面，用起来比较方便。</span></p>
<p>&nbsp;</p>
<p><strong><span>推荐：</span></strong><span>在这里推荐使用一种应用程序的目录管理方法，新建目录结构如下：</span></p>
<p><span>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>C:myApplication</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>app</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>plan</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>将你的应用程序放入此目录</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td>
            <div>
            <p><span>部署完后将会再此目录下自动产生</span><span>plan.xml</span><span>文件</span></p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</span></p>
<p><span>用此目录有利于很好的管理配置文件。</span></p>
<p>&nbsp;</p>
<p><span>关于<span> Weblogic </span>的更多详细资料，我这里推荐几个比较好的官方学习网站：</span></p>
<p><span><a href="http://www.bea.com.cn/">www.bea.com.cn</a><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>bea</span><span>的产品网站</span></p>
<p><span><a href="http://edocs.bea.com.cn/">edocs.bea.com.cn</a>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>bea</span><span>的比较系统的学习网站</span></p>
<p><span><a href="http://dev2dev.bea.com.cn/">dev2dev.bea.com.cn</a><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>一般介绍<span>bea</span>的最新技术，动态等的网站<br></span>&nbsp;<br><span><span>4.3.<span> </span></span></span><span>web</span><span>外观显示</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>部署好的报表页面显示样式是固定的，在多数情况下我们都希望修改外观，下面将对此做简单介绍。</span></p>
<p><span>Webcontent</span><span>是主要文件夹：</span></p>
<p><span><span>1)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Webcontent</span><span>中的<span>ajax</span>目录，完成了在<span>web</span>上显示的报表分页的功能。</span></p>
<p><span><span>2)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Styles</span><span>目录中的<span>style.css</span>是整个报表在<span>web</span>上显示的外观，包括工具条颜色，字体。文件注释很清楚，具体修改可以参见注释。</span></p>
<p><span><span>3)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>pages</span><span>目录<span>pages/control/</span></span><span> </span><span>NavigationbarFragment.jsp </span><span>分页那一条工具栏的<span> JSP pages/control/</span></span><span> </span><span>ToolbarFragment.jsp </span><span>工具按纽<span>JSP</span>，可以修改以保留自己想要使用的功能按纽。<span>pages/control/ ProgressBarFragment.jsp </span>它是显示刚开始读取报表时，显示条的样式。</span></p>
<p><span><span>4)<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Layout</span><span>目录 <span>FramesetFragment.jsp </span>可以修改报表标题。</span></p>
<p>&nbsp;</p>
<p><span>在 <span>WEB-INF/web.xml</span>文件中，<span>BIRT_VIEW_REPORT_ROOT </span>是配置报表路径的属性，如果没有配置则是默认路径：<span>$tomcat$\webapps\birt</span></span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>目前在<span>web</span>上显示的所有的都是英文。项目有一个资源文件，打包在<span>lib/viewservlets.jar</span>中，<span>&#8230;/&#8230;/resource/messages.properties</span>文件中。显示中文的解决方法是，用<span>unicode</span>转换器把要显示的中文事先转换好，然后替换资源文件中的英文。</span></p>
<p>&nbsp;</p>
<h1><span><span>5.&nbsp;</span></span><span>BIRT</span><span>总结</span></h1>
<p><span>BIRT</span><span>是目前比较常用也是比较方便，效率较高的报表制作工具。当然其发展时间不长，所以还有很多的缺陷和未完善的地方，之后的版本也在不断改进，因此我也将会一直跟踪它的技术发展，不断更新我的文档。</span></p>
<img src ="http://www.blogjava.net/LiuTing/aggbug/118668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LiuTing/" target="_blank">LiuTing</a> 2007-05-20 12:40 <a href="http://www.blogjava.net/LiuTing/archive/2007/05/20/118668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>