??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久无码精品亚洲日韩蜜桃,亚洲无人区码一二三码区别图片,国产精品亚洲专区在线观看http://www.tkk7.com/LiuTing/zh-cnWed, 14 May 2025 13:35:00 GMTWed, 14 May 2025 13:35:00 GMT60关于appfuse的探?/title><link>http://www.tkk7.com/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.tkk7.com/LiuTing/archive/2007/06/07/122748.html</guid><wfw:comment>http://www.tkk7.com/LiuTing/comments/122748.html</wfw:comment><comments>http://www.tkk7.com/LiuTing/archive/2007/06/07/122748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/LiuTing/comments/commentRss/122748.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/LiuTing/services/trackbacks/122748.html</trackback:ping><description><![CDATA[<p>      目在紧张的生活中很快就要结束了,一直以?都是׃工作的繁?没有旉d自己的blog.q段旉l于可以E微闲下来了,觉得应该把这一阶段的工作ȝ一下了,但是拿v键盘,思A却有些散?惛_的很?却也不知道怎么来写,q是慢慢来吧.<br>   首先说一下整体框架appfuseQ它是集成了当今最行的web应用框架的更高层ơ的web开发框Ӟ也可以说是一个web开发的基本q_Q它当前最行的一些技术,比如<span style="FONT-SIZE: 12pt">hibernate,spring,struts,DBUnit,ant,log4j,xdoclet,sitemesh,velocity,jstl,webwork,{等都集成了q来Q在国内能够这些都应用q来的ƈ不多见.<br><br>待箋Q.Q.</span></p> <img src ="http://www.tkk7.com/LiuTing/aggbug/122748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/LiuTing/" target="_blank">LiuTing</a> 2007-06-07 23:56 <a href="http://www.tkk7.com/LiuTing/archive/2007/06/07/122748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JS常见函数http://www.tkk7.com/LiuTing/archive/2007/05/29/120743.htmlLiuTingLiuTingTue, 29 May 2007 10:03:00 GMThttp://www.tkk7.com/LiuTing/archive/2007/05/29/120743.htmlhttp://www.tkk7.com/LiuTing/comments/120743.htmlhttp://www.tkk7.com/LiuTing/archive/2007/05/29/120743.html#Feedback0http://www.tkk7.com/LiuTing/comments/commentRss/120743.htmlhttp://www.tkk7.com/LiuTing/services/trackbacks/120743.html  javascript常规函数包括以下9个函敎ͼ  
  (1)alert函数Q显CZ个警告对话框Q包括一个OK按钮?nbsp; 
  (2)confirm函数Q显CZ个确认对话框Q包括OK、Cancel按钮?nbsp; 
  (3)escape函数Q将字符转换成Unicode码?nbsp; 
  (4)eval函数Q计表辑ּ的结果?nbsp; 
  (5)isNaN函数Q测试是(true)?false)不是一个数字?nbsp; 
  (6)parseFloat函数Q将字符串{换成W点数字形式?nbsp; 
  (7)parseInt函数Q将W串转换成整数数字Ş?可指定几q制)?nbsp; 
  (8)prompt函数Q显CZ个输入对话框Q提C等待用戯入。例如:  
  (9)unescape函数Q解码由escape函数~码的字W?nbsp; 
  2.数组函数  
  javascript数组函数包括以下4个函敎ͼ  
  (1)join函数Q{换ƈq接数组中的所有元素ؓ一个字W串。例:  
 
 E序代码  
    function JoinDemo()  
    {  
     var a, b;  
     a = new Array(0,1,2,3,4);  
     b = a.join("-");//分隔W?nbsp; 
     return(b);//q回的b=="0-1-2-3-4"  
    }   
   
 (2)langth函数Q返回数l的长度。例Q?nbsp; 
       
 E序代码  
function LengthDemo()  
    {  
     var a, l;  
     a = new Array(0,1,2,3,4);  
     l = a.length;  
     return(l);//l==5  
    }   
 
  (3)reverse函数Q将数组元素序颠倒。例Q?nbsp; 
      
 E序代码  
function ReverseDemo()  
   {  
    var a, l;  
    a = new Array(0,1,2,3,4);  
    l = a.reverse();  
    return(l);  
   }   
  (4)sort函数Q将数组元素重新排序。例Q?nbsp; 
       
 E序代码  
function SortDemo()  
    {  
     var a, l;  
     a = new Array("X" ,"y" ,"d", "Z", "v","m","r");  
     l = a.sort();  
     return(l);  
    }   
  3.日期函数  
  javascript日期函数包括以下20个函敎ͼ  
  (1)getDate函数Q返回日期的“?#8221;部分Qgؓ1?1。例Q?nbsp; 
      
 E序代码  
function DateDemo()  
   {  
    var d, s = "Today's date is: ";  
    d = new Date();  
    s += (d.getMonth() + 1) + "/";  
    s += d.getDate() + "/";  
    s += d.getYear();  
    return(s);  
   }   
  (2)getDay函数Q返回星期几Qgؓ0?Q其?表示星期日,1表示星期一Q?..Q?表示星期六。例Q?nbsp; 
      
 E序代码  
function DateDemo()  
   {  
    var d, day, x, s = "Today is: ";  
    var x = new Array("Sunday", "Monday", "Tuesday");  
    var x = x.concat("Wednesday","Thursday", "Friday");  
    var x = x.concat("Saturday");  
    d = new Date();  
    day = d.getDay();  
    return(s += x[day]);  
   }   
  (3)getHouse函数Q返回日期的“时”部分Qgؓ0?3。例?nbsp; 
      
 E序代码  
function TimeDemo()  
   {  
    var d, s = "The current local time is: ";  
    var c = ":";  
    d = new Date();  
    s += d.getHours() + c;  
    s += d.getMinutes() + c;  
    s += d.getSeconds() + c;  
    s += d.getMilliseconds();  
    return(s);  
   }   
  (4)getMinutes函数Q返回日期的“分钟”部分Qgؓ0?9。见上例?nbsp; 
  (5)getMonth函数Q返回日期的“?#8221;部分Qgؓ0?1。其?表示1月,2表示3月,...Q?1表示12月。见前面的例子?nbsp; 
  (6)getSeconds函数Q返回日期的“U?#8221;部分Qgؓ0?9。见前面的例子?nbsp; 
  (7)getTime函数Q返回系l时间?nbsp; 
      
 E序代码  
function GetTimeTest()  
   {  
    var d, s, t;  
    var MinMilli = 1000 * 60;  
    var HrMilli = MinMilli * 60;  
    var DyMilli = HrMilli * 24;  
    d = new Date();  
    t = d.getTime();  
    s = "It's been " 
    s += Math.round(t / DyMilli) + " days since 1/1/70";  
    return(s);  
   }   
  (8)getTimezoneOffset函数Q返回此地区的时?当地旉与GMT格林威治标准旉的地区时?Q单位ؓ分钟?nbsp; 
      
 E序代码  
function TZDemo()  
   {  
    var d, tz, s = "The current local time is ";  
    d = new Date();  
    tz = d.getTimezoneOffset();  
 
    if (tz 的链接点的名Uͼ另一个函数link讑֮的URL地址?nbsp; 
  (2)big函数Q将字体加到一P?..标签l果相同?nbsp; 
  (3)blink函数Q字符串闪烁,?..标签l果相同?nbsp; 
  (4)bold函数Q字体加粗Q与...标签l果相同?nbsp; 
  (5)charAt函数Q返回字W串中指定的某个字符?nbsp; 
  (6)fixed函数Q将字体讑֮为固定宽度字体,?..标签l果相同?nbsp; 
  (7)fontcolor函数Q设定字体颜Ԍ与标{果相同?nbsp; 
  (8)fontsize函数Q设定字体大,与标{果相同?nbsp; 
  (9)indexOf函数Q返回字W串中第一个查扑ֈ的下标indexQ从左边开始查找?nbsp; 
  (10)italics函数Q字体成ؓ斜体字,?..标签l果相同?nbsp; 
  (11)lastIndexOf函数Q返回字W串中第一个查扑ֈ的下标indexQ从双开始查找?nbsp; 
  (12)length函数Q返回字W串的长度?不用带括?  
  (13)link函数Q生一个超U链接,相当于设定的URL地址?nbsp; 
  (14)small函数Q将字体减小一P?..标签l果相同?nbsp; 
  (15)strike函数Q在文本的中间加一条横U,?..标签l果相同?nbsp; 
  (16)sub函数Q显C字W串Z标字(subscript)?nbsp; 
  (17)substring函数Q返回字W串中指定的几个字符?nbsp; 
  (18)sup函数Q显C字W串Z标字(superscript)?nbsp; 
  (19)toLowerCase函数Q将字符串{换ؓ写?nbsp; 
  (20)toUpperCase函数Q将字符串{换ؓ大写?nbsp; 
 
//校验是否全由数字l成  
 
 E序代码  
function isDigit(s)  
{  
var patrn=/^[0-9]{1,20}$/;  
if (!patrn.exec(s)) return false 
return true 
}  
 
//校验d名:只能输入5-20个以字母开头、可带数字?#8220;_”?#8220;.”的字?nbsp; 
 
 E序代码  
function isRegisterUserName(s)  
{  
var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/;  
if (!patrn.exec(s)) return false 
return true 
}  
 
//校验用户姓名Q只能输?-30个以字母开头的字串  
 
 E序代码  
function isTrueName(s)  
{  
var patrn=/^[a-zA-Z]{1,30}$/;  
if (!patrn.exec(s)) return false 
return true 
}  
 
//校验密码Q只能输?-20个字母、数字、下划线  
 
 E序代码  
function isPasswd(s)  
{  
var patrn=/^(\w){6,20}$/;  
if (!patrn.exec(s)) return false 
return true 
}  
 
//校验普通电话、传真号码:可以“+”开_除数字外Q可含有“-”  
 
 E序代码  
function isTel(s)  
{  
//var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/;  
var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;  
if (!patrn.exec(s)) return false 
return true 
}  
 
//校验手机LQ必M数字开_除数字外Q可含有“-”  
 
 E序代码  
function isMobil(s)  
{  
var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;  
if (!patrn.exec(s)) return false 
return true 
}  
 
//校验邮政~码  
 
 E序代码  
function isPostalCode(s)  
{  
//var patrn=/^[a-zA-Z0-9]{3,12}$/;  
var patrn=/^[a-zA-Z0-9 ]{3,12}$/;  
if (!patrn.exec(s)) return false 
return true 
}  
 
//校验搜烦关键?nbsp; 
 
 E序代码  
function isSearch(s)  
{  
var patrn=/^[^`~!@#$%^&*()+=|\\\][\]\{\}:;\'\,.<>/?]{1}[^`~!@$%^&()+=|\\\][\]\{\}:;\'\,.<>?]{0,19}$/;  
if (!patrn.exec(s)) return false 
return true 
}  
 
 E序代码  
function isIP(s) //by zergling  
{  
var patrn=/^[0-9.]{1,20}$/;  
if (!patrn.exec(s)) return false 
return true 
}  


LiuTing 2007-05-29 18:03 发表评论
]]>
DISPALYTAG的用?/title><link>http://www.tkk7.com/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.tkk7.com/LiuTing/archive/2007/05/25/119921.html</guid><wfw:comment>http://www.tkk7.com/LiuTing/comments/119921.html</wfw:comment><comments>http://www.tkk7.com/LiuTing/archive/2007/05/25/119921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/LiuTing/comments/commentRss/119921.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/LiuTing/services/trackbacks/119921.html</trackback:ping><description><![CDATA[1) Caption指标?br>2) nameQ数据源<br>3) defaultsortQ排序列Q一般不需?br>4) defaultorderQ排序方?br>5) classQ表格显C的样式<br>6) varTotalsQ需要统?总计)<br>7) decorator="totals"Q表CZ用指定的decorator。现在仅在同时用小计、合计时用到Q自׃可以定制?br>8) <display:column 部分Q?br>  property指数据中的列?br>  title指显C的标题<br>  format指数据的格式化样式,<br>  total表示该字D|否需要作l计?br>  style="width:20%"可以讄宽度?br>  也可以用<br>  <display:column title="请假旉"><br>  <fmt:formatDate value="${currentRowObject.QJSJ}" pattern="yyyy-MM-dd"/><br>  </display:column>表现?br>  group="1"表示q行group的字Dc?br>9) 在表g建立一个连接:<br>  <display:column title="部别"><br>  <a href="<c:out value="${pageContext.request.contextPath}"/><br>  /holidayDefaultSearchStatView.do?type=<br>  <c:out value="${currentRowObject.CJDM}"/>&SYD=<br>  <c:out value="${currentRowObject.DWDM}"/>" target="_blank"><br>  <c:out value="${currentRowObject.DWMC}"/><br>  </a><br>  </display:column><br>10) ׃该tag只有合计Ӟ没有合计那一列,所以实现的时候以<display:footer>实现?br>  可以通过totalMap对象获取合计的数据,如totalMap.colomn1获取合计的第一列数倹{?br>11) 标题头不昄<display:setProperty name="basic.show.header" value="false" /><br>12) 自己定制表头Q?lt;display:caption><br>   使用decoratorQ?br>   <jsp:scriptlet><br>   org.displaytag.decorator.TotalTableDecorator totals = <br>   new org.displaytag.decorator.TotalTableDecorator();<br>       totals.setTotalLabel("合计");<br>       totals.setSubtotalLabel("计");<br>       pageContext.setAttribute("totals", totals);<br>   </jsp:scriptlet> <div>实例Q?br><display:caption>q是表标?lt;/display:caption><br> <display:table <br>  name="${model.rowToColumnStatResult}" defaultsort="1" <br>  class="simple" defaultorder="ascending" varTotals="totalMap"><br>  <display:column property="GCWZ" title="部门"/><br>   <c:forEach items="${model.YList.YList}" var="yColumn"><br>   <c:forEach items="${model.rowToColumnStatResult[0]}" <br>      var="mapEntry"><br>    <c:if test="${mapEntry.key == yColumn}"><br>     <th><br>       <display:column property="${mapEntry.key}" <br>       title="${mapEntry.key}" <br>       format="{0,number,####.##}" total="true"/><br>     </th><br>    </c:if><br>   </c:forEach><br>   </c:forEach><br>  <display:column property="计" <br>      title="计" <br>      format="{0,number,####.##}" total="true"/><br> <display:footer><br> <tr><br>  <td>总计</td><br>  <c:forEach items="${model.YList.YColumn}" var="yColumn"><br>  <td><fmt:formatNumber value="${totalMap[yColumn]}"<br>        pattern="####.##"/><br>  </td><br>  </c:forEach><br> </tr><br> </display:footer><br></display:table></div> <div> </div> <div><br>另外一个例子:<br><display:table name="${model.statResult}" class="simple"<br> varTotals="totalMap"><br> <display:column property="XMMC" title="目名称" /><br> <display:column property="KSRQ" title="开始日? /><br> <display:column property="FZRXM" title="负责人姓? /><br> <display:column property="GKDW" title="挂靠单位" /><br> <display:column property="JFLY" title="l费来源" /><br> <display:column property="XMZJF" title="目ȝ? total="true" /><br> <display:column property="DNDKJF" title="当年到款l费" total="true"/><br> <display:footer><br>  <tr><td colspan="5">总计</td><br>   <td><br>    <fmt:formatNumber value="${totalMap.column6}"<br>     pattern="####.####" /><br>   </td><br>   <td><br>    <fmt:formatNumber value="${totalMap.column7}"<br>     pattern="####.####" /><br>   </td><br>  </tr><br> </display:footer><br></display:table></div> <div>总计某一列的ҎQ?br>${totalMap.column?}    ?列号<br>colspan="5"Q表C个单元格?个单元格</div> <div>目名称 开始日?nbsp; 负责人姓?挂靠单位 l费来源 目ȝ?当年到款l费 <br>                                                   531      400 <br>                                                   151       10 <br>Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?br>总计                              682     500  </div> <img src ="http://www.tkk7.com/LiuTing/aggbug/119921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/LiuTing/" target="_blank">LiuTing</a> 2007-05-25 10:42 <a href="http://www.tkk7.com/LiuTing/archive/2007/05/25/119921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWRUtils API 使用Ҏhttp://www.tkk7.com/LiuTing/archive/2007/05/20/118676.htmlLiuTingLiuTingSun, 20 May 2007 04:46:00 GMThttp://www.tkk7.com/LiuTing/archive/2007/05/20/118676.htmlhttp://www.tkk7.com/LiuTing/comments/118676.htmlhttp://www.tkk7.com/LiuTing/archive/2007/05/20/118676.html#Feedback1http://www.tkk7.com/LiuTing/comments/commentRss/118676.htmlhttp://www.tkk7.com/LiuTing/services/trackbacks/118676.html$("precloneNode1suf") 取得该对?

DWRUtil.selectRange("selectRangeBasic", 5, 15) 选中selectRangeBasic文本框里面从W五个字W到W?5个字W之间的字符.

DWRUtil._getSelection("selectRangeBasic") 得到selectRangeBasic文本框里选中的字W?

var arrayFive = [ 'One', 'Two', 'Three', 'Four', 'Five' ];
DWRUtil.addOptions('addOptionsBasic', arrayFive); 数l添加到下拉菜单里面?

DWRUtil.getValue('addOptionsBasic') 得到 addOptionsBasic 对象的?
DWRUtil.getValue("precloneNode1Inner1suf", { textContent:true }); 后面加个参数,?precloneNode1Inner1suf元素?UL" ?它返回了元素里面得?也就是说L了HTML标签部分.

DWRUtil.getText('addOptionsBasic') 得到下拉?addOptionsBasic 昄的文?

var arrayObject = [
{ name:'One', value:'1' },
{ name:'Two', value:'2' },
{ name:'Three', value:'3' },
{ name:'Four', value:'4' },
{ name:'Five', value:'5' }
];
DWRUtil.addOptions('addOptionsObject1', arrayObject, "name"); 数l添加到下拉菜单里面?后面的参数是定那个是给用户昄的文?同时也是?

DWRUtil.addOptions('addOptionsObject1', arrayObject, "name","value"); 同上,不过后面参数? 3=文本;4=?

var map = { one:1, two:2, three:3, four:4, five:5 };
DWRUtil.addOptions('addOptionsMap1', map); 同上, one 是?1 是文?
DWRUtil.addOptions('addOptionsMap1', map,true); 同上, 1 是?one 是文?

-------------------------------------------------------------------------------------
<ul id="removeItems">
<li>One</li><li>Two</li><li>Three</li><li>Four</li><li>Five</li>
</ul>

如果是列表显C?如上;则上面所有方法和select 下拉框用一?
-------------------------------------------------------------------------------------
DWRUtil.cloneNode('cloneNode1', { idPrefix:'pre', idSuffix:'suf' });克隆一个节?参数一克隆的节点的id,W二个参数是在克隆的节点id前面加pre,后面加suf.(注意:如果该节Ҏ子节点的?子节点的名字也一样加)

DWRUtil.addRows(id, array, cellfuncs, [options]);
原理:

for each member in array
for each function in cellfuncs
create cell from cellfunc(array[i])
循环数组,循环函数,建立单元调用函数;(序军_)

例如:
DWRUtil.addRows('addRowsBasic', arrayFive, [
function(data) { return data; },
function(data) { return data.toUpperCase(); },
function(data) {
var input = document.createElement("input");
input.setAttribute("type", "button");
input.setAttribute("value", "DOM Test");
input.setAttribute("onclick", "alert('" + data + "');");
return input;
},
function(data) { return "<input type='button' value='innerHTML Test' onclick='alert(\"" + data + "\");'>"; }
]);

高部分:
W四个参Cؓ对单元的高操作,主要下面的两个方?
function defaultRowCreator(options) {
return document.createElement("tr");
};

function defaultCellCreator(options) {
return document.createElement("td");
};

例子:
DWRUtil.addRows( "demo2",[ 'Africa', 'America', 'Asia', 'Australasia', 'Europe' ] , cellFuncs, {
rowCreator:function(options) {
var row = document.createElement("tr");
var index = options.rowIndex * 50;
row.style.color = "rgb(" + index + ",0,0)";
return row;
},
cellCreator:function(options) {
var td = document.createElement("td");
var index = 255 - (options.rowIndex * 50);
td.style.backgroundColor = "rgb(" + index + ",255,255)";
td.style.fontWeight = "bold";
return td;
}
});

其中 options 参数的属性可用的?(没试q?自己试试?

rowData: the element value from the array (the same for all cells in a row)
rowIndex: the key (if map) or index (if array) from the collection
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)
data: The 'computed' data value for the cell (cellCreators only)
cellNum: The cell number that we are altering counting from 0 (cellCreators only)


DWRUtil.setValues(); 扚w讄?
var settings = {
setValuesDiv:"setValuesDiv",
setValuesSpan:"setValuesSpan",
setValuesSelect:"two",
setValuesText:"setValuesText",
setValuesPassword:"AB",
setValuesTextarea:"setValuesTextarea",
setValuesButton1:"B1-Two",
setValuesButton2:"B2-Two",
setValuesRadio1:true,
setValuesRadio2:false,
setValuesRadio3:"one",
setValuesRadio4:"two",
setValuesCheckbox1:true,
setValuesCheckbox2:false
};
DWRUtil.setValues(settings);

DWRUtil.getValues(empty);扚w获取?
var empty = {
setValuesDiv:null,
setValuesSpan:null,
setValuesSelect:null,
setValuesText:null,
setValuesPassword:null,
setValuesTextarea:null,
setValuesButton1:null,
setValuesButton2:null,
setValuesRadio1:null,
setValuesRadio2:null,
setValuesRadio3:null,
setValuesRadio4:null,
setValuesCheckbox1:null,
setValuesCheckbox2:null
};
DWRUtil.getValues(empty);

DWRUtil.useLoadingMessage("Ping");//cMgmail那个样子,在右上角昄加蝲"ping";可用自定样式,具体查询;http://getahead.ltd.uk/dwr/browser/util/useloadingmessage

DWRUtil.toDescriptiveString("id",数字);弹出调试信息,数字?,1,2.一U比一U高.

DWRUtil.onReturn(event, submitFunction);一般在form表单里面,防止在文本框上按回R提交表?
例如:
<input type="text"
onkeypress="DWRUtil.onReturn(event, submitFunction)"/>
<input type="button" onclick="submitFunction()"/>

LiuTing 2007-05-20 12:46 发表评论
]]>
DWR框架实现Ajaxhttp://www.tkk7.com/LiuTing/archive/2007/05/20/118675.htmlLiuTingLiuTingSun, 20 May 2007 04:45:00 GMThttp://www.tkk7.com/LiuTing/archive/2007/05/20/118675.htmlhttp://www.tkk7.com/LiuTing/comments/118675.htmlhttp://www.tkk7.com/LiuTing/archive/2007/05/20/118675.html#Feedback4http://www.tkk7.com/LiuTing/comments/commentRss/118675.htmlhttp://www.tkk7.com/LiuTing/services/trackbacks/118675.html      Ajax是时下比较流行的一Uweb界面设计新思\,其核心思想是从览器获取XMLHttp对象与服务器端进行交? DWRQDirect Web RemotingQ就是实Cq种Ajax技术的一Uweb框架. 最q做的项目中我也它用上?感觉很是方便,比如动态生成javascript代码,隐藏的http协议,java代码和javascript交互的是javascript的对?或字W串).  下面是我整理的文?
  DWR主要׃部门l成。javascript与web服务器通信q更新web;q行在web服务器的Servlet处理hq把响应发回览器?br>
   1  .  配置web.xml
<servlet>
  <servlet-name>dwr-invoker</servlet-name>
  <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>dwr-invoker</servlet-name>
  <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

  2    当我们想看dwr自动生成的测试页?可在java代码
servlet中加
<init-param>
  <param-name>debug</param-name>
  <param-value>true</param-value>
</init-param>

q个参数DWR默认是false.如果选择true.我们可以通过url http://localhost:port/app/dwr ,你就可以看到你部|的每个DWR class。ƈ且可以测试java代码的每个方法是否运行正常。ؓ了安全考虑Q在正式环境下你一定把q个参数设ؓfalse.

3  log信息配置

我喜Ƣ用log4j输出日志,那么在log4j.properties下加Qlog4j.logger.uk.ltd.getahead.dwr = debug。这样可以看DWR的调试日志?

4  配置dwr.xml (和web.xml同目?
 
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>

q里的多数元素都是可选的 - 你真正必ȝ道的是指定一个creator和一个javascript名字?/p>

creator属?/strong> 是必ȝ - 它用来指定用那U创造器?/p>

默认情况下DWR1.1?U创造器。它们是Q?/p>

  • new: 用Java的new关键字创造对象?
  • none: 它不创徏对象Q看下面的原因?(v1.1+)
  • scripted: 通过BSF使用脚本语言创徏对象Q例如BeanShell或Groovy?
  • spring: 通过Spring框架讉KBean?
  • jsf: 使用JSF的Bean?(v1.1+)
  • struts: 使用Struts的FormBean?(v1.1+)
  • pageflow: 讉KBeehive或Weblogic的PageFlow?(v1.1+)

javascript属?/strong> 用于指定览器中q个被创造出来的对象的名字。你不能使用Javascript的关键字?/p>

scope属?/strong> 非常cMservlet规范中的scope?它允怽指定q个bean在什么生命范围。选项?application", "session", "request" ?page"。这些值对于Servlet和JSP开发者来说应该相当熟悉了?/p>

scope属性是可选的。默认是"page"。如果要使用"session"需要cookies。当前的DWR不支持ULR重写?/p>

param元素 被用来指定创造器的其他参敎ͼ每种构造器各有不同。例如,"new"创造器需要知道要创徏的对象类型是什么。每一个创造器的参数在各自的文档中能找到。请查看上面的链接?/p>

include和exclude元素 允许创造器来限制类中方法的讉K。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗C默认的讉K{略?拒绝"Q如果是exclude列表则暗C默认的讉K{略?允许"?/p>


5 dwr.jar下蝲后放lib?br>
源码析

dwr的设计很象webwork2的设?隐藏http协议,扩展性,兼容性及强?/p>

通过研究uk.ltd.getahead.dwr.DWRServletq个servlet来研I下dwr到底是如何工作的?br>
<servlet>
  <servlet-name>dwr-invoker</servlet-name>
  <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>dwr-invoker</servlet-name>
  <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

q样/dwr/*下的所有的h都是p个servlet来处?到底生理了什么呢,我们q是以例子来说明?

1 web服务器启动,DWRServlet init()Ҏ调用Qinit主要做了以下工作?
讄日志U别、实例化DWR用到的单例类Q这些类在jvm中只有一个实例对象)、读去配|文Ӟ包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xmlQ?br>2 h处理
DWRServlet.doGet, doPostҎ都调用processor.handle(req, resp)Ҏ处理。Processor对象在init()Ҏ中已l初始化了?nbsp;

代码
public void handle(HttpServletRequest req, HttpServletResponse resp)  
        throws IOException  
    {  
        String pathinfo = req.getPathInfo();  
        if(pathinfo == null || pathinfo.length() == 0 || pathinfo.equals("/"))  
        {  
            resp.sendRedirect(req.getContextPath() + req.getServletPath() + '/' + "index.html");  
        } else 
        if(pathinfo != null && pathinfo.equalsIgnoreCase("/index.html"))  
        {  
            doIndex(req, resp);  
        } else 
        if(pathinfo != null && pathinfo.startsWith("/test/"))  
        {  
            doTest(req, resp);  
        } else 
        if(pathinfo != null && pathinfo.equalsIgnoreCase("/engine.js"))  
        {  
            doFile(resp, "engine.js", "text/javascript");  
        } else 
        if(pathinfo != null && pathinfo.equalsIgnoreCase("/util.js"))  
        {  
            doFile(resp, "util.js", "text/javascript");  
        } else 
        if(pathinfo != null && pathinfo.equalsIgnoreCase("/deprecated.js"))  
        {  
            doFile(resp, "deprecated.js", "text/javascript");  
        } else 
        if(pathinfo != null && pathinfo.startsWith("/interface/"))  
        {  
            doInterface(req, resp);  
        } else 
        if(pathinfo != null && pathinfo.startsWith("/exec"))  
        {  
            doExec(req, resp);  
        } else 
        {  
            log.warn("Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/");  
            resp.sendError(404);  
        }  
    } 

dwr/*处理的请求也p几种?br>
Q?Qdwr/index.htmlQdwr/test/q种只能在debug模式下用,调试用?
dwr/engine.jsQdwr/util.jsQdwr/deprecated.js当这个请求到达,从dwr.jar包中d文g,响应回去。(重复h有缓存)
Q?Q当dwr/interface/q种h到来Q(例如我们在index.html中的 <script type='text/javascript' src='dwr/interface/JDate.js'></script>QDWR做一件伟大的事。把我们在WEB-INF/dwr.xml中的
<create creator="new" javascript="JDate">
<param name="class" value="java.util.Date"/>
</create>
java.util.Date转化为javascript函数?
http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧?
l节也比较简单,通过java反射Q把Ҏ都写成javascript特定的方法。(我觉得这些{换可以放到缓存里Q下ơ调用没必要再生成一遍,不知道作者ؓ什么没q样做)?
Q?Qdwr/exec
javascript调用Ҏ时发送这U请求,可能是XMLHttpRequest或IFrame发送?
当然Qjavascript调用的方法签名与java代码一_包括参数Q还有javascript的回调方法也传到了服务器端,在服务器端很Ҏ实现。回调方法的java的执行结?q回cM <script>callMethod(l果)<script>的javascript字符?在浏览器执行。哈Q一切就q么单,巧妙?br>
我这里还有DWR中文文档. http://www.tkk7.com/Files/LiuTing/DWR中文文档.rar







LiuTing 2007-05-20 12:45 发表评论
]]>
Acegi工作程http://www.tkk7.com/LiuTing/archive/2007/05/20/118674.htmlLiuTingLiuTingSun, 20 May 2007 04:44:00 GMThttp://www.tkk7.com/LiuTing/archive/2007/05/20/118674.htmlhttp://www.tkk7.com/LiuTing/comments/118674.htmlhttp://www.tkk7.com/LiuTing/archive/2007/05/20/118674.html#Feedback1http://www.tkk7.com/LiuTing/comments/commentRss/118674.htmlhttp://www.tkk7.com/LiuTing/services/trackbacks/118674.htmlM一个安全系l都包括authentication和authorization两部分,Acegi相同?/span>

W一部分Qauthentication

1、acegi通过AuthenticationProcessingFilter拦截loginh获取Principal和Credential信息Q通俗一点就是用户名和密码)Q?/span>

2、验证用户名密码Q由q个Filter调用认证理器AuthenticatiomManagerq行验证?/span>

AuthenticatiomManager本nq不具备验证的功能,它相当与是一个验证控制器Q由它来理验证的过E及方式。AuthenticatiomManager是通过调用provider来进行验证的Q一个manager中可以具有多个providerQ但只要有一个provider验证通过Qmanagerp为验证成功?/span>

q部分要明白三点Q一Qprovider是可以配|进ȝQ因为acegi是基于spring的;二是AuthenticatiomManager是可以被重写的,你可以将managerҎ你自己希望的控制器;三,好好利用eventQ这是标准的observer模式。acegi中的设计模式研究在以后的脓子中讨论?/span>

3、providerq行验证?/span>

provider是真正的验证模块Qƈ且决定了验证的模式。provider目前acegi提供了dao、jaasQcasQx509Qldap{几U验证方式,q些验证方式的具体内容可以查阅acegi的文档。provider验证通过后将Authentication对象q回?/span>

4、AuthenticationProcessingFilter对象保存到ContextHolder中。Authentication部分l束?/span>

W二部分Qauthorization

1、用h交请求,拦截器FilterSecurityInterceptor拦截hQ拦截器是一个Filter.

2 、鉴权,拦截器调用AccessDecisionManagerq行鉴权?/span>

AccessDecisionManager是通过投票的方式来军_是否有权限访问资源。所谓投就要包括投的参与者和投票的策略?/span>

投票的参与者decisionVotersQ这是AccessDecisionManager的一个属性。decisionVoter能从某一个角度决定用h否能讉K资源Q例如RoleVoter来判断用L角色是否有权限访问资源,MaxuserVoter来决定某个资源的讉K用户数是否已l达C最大值等?/span>

投票{略。投的{略是通过不同的AccessDecisionManager来实现的Q例如acegi提供的AffirmativeBased对象Q这个对象的{略是只要有一个投通过全体通过。UnanimousBased对象的策略是必须全体投票通过才能通过。但在大多数情况下acegi提供的AccessDecisionManager不能满我们的要求,q就需要我们去实现AccessDecisionManager接口Q去定制适合自己目的策略?/span>

3、投。投对象必d现AccessDecisionVoter接口。投对象关注的是某一斚w的决定权Q如果投通过则VoteҎ来完成的。voteҎ必须q回一个int型的数据代表投票l果Q它们是AccessDecisionVoter的三个静态成员属性:ACCESS_ABSTAIN,QACCESS_DENIED和ACCESS_GRANTEDQ它们分别是弃权Q否军_赞成?/span>
 

安全拦截?/span>

  拦截器如何工?br>  MethodInvocation拦截?br>  FilterInvocation拦截?/h5>

认证

  认证h
  认证理?br>  Authentication Provider

授权

  Access Decision Manager
  Voting Decision Manager
  授权理推荐

ContextHolder的用h?/span>

  用户接口目标
  HTTP会话认证
  HTTP Basic认证


LiuTing 2007-05-20 12:44 发表评论
]]>
使用Acegi时获取用户信息的几个函数http://www.tkk7.com/LiuTing/archive/2007/05/20/118673.htmlLiuTingLiuTingSun, 20 May 2007 04:43:00 GMThttp://www.tkk7.com/LiuTing/archive/2007/05/20/118673.htmlhttp://www.tkk7.com/LiuTing/comments/118673.htmlhttp://www.tkk7.com/LiuTing/archive/2007/05/20/118673.html#Feedback0http://www.tkk7.com/LiuTing/comments/commentRss/118673.htmlhttp://www.tkk7.com/LiuTing/services/trackbacks/118673.html1 /**
 2    * 取得当前用户?br> 3    *  @return
 4     */

 5    public   static  String getUsername() {
 6     Context context = ContextHolder.getContext();
 7      if (context != null ) {
 8        if (context  instanceof  SecureContext) {
 9         SecureContext sc = (SecureContext)context;
10         Authentication auth = sc.getAuthentication();
11          if (auth != null ) {
12           Object principal = auth.getPrincipal();
13            if (principal  instanceof  UserDetails)  {
14              return  ((UserDetails)principal).getUsername();
15           }
else {
16              return  principal.toString();
17           }

18         }

19       }

20     }

21      return   null ;
22   }

23    /**
24    * 取得当前用户密码
25    *  @return
26     */

27    public   static  String getPassword() {
28     Context context = ContextHolder.getContext();
29      if (context != null ) {
30        if (context  instanceof  SecureContext) {
31         SecureContext sc = (SecureContext)context;
32         Authentication auth = sc.getAuthentication();
33          if (auth != null ) {
34           Object principal = auth.getPrincipal();
35            if (principal  instanceof  UserDetails)  {
36              return  ((UserDetails)principal).getPassword();
37           }
else {
38              return   null ;
39           }

40         }

41       }

42     }

43      return   null ;
44   }

45    /**   */ /**
46    * 取得当前用户session id
47    *  @return  sessionid or null
48     */

49    public   static  String getSessionID() {
50     Context context = ContextHolder.getContext();
51      if (context != null ) {
52        if (context  instanceof  SecureContext) {
53         SecureContext sc = (SecureContext)context;
54         Authentication auth = sc.getAuthentication();
55          if (auth != null ) {
56           Object details = auth.getDetails();
57            if (details  instanceof  WebAuthenticationDetails)  {
58              return  ((WebAuthenticationDetails)details).getSessionId();
59           }
else {
60              return   null ;
61           }

62         }

63       }

64     }

65      return   null ;
66   }



LiuTing 2007-05-20 12:43 发表评论
]]>
Acegi使用2http://www.tkk7.com/LiuTing/archive/2007/05/20/118671.htmlLiuTingLiuTingSun, 20 May 2007 04:42:00 GMThttp://www.tkk7.com/LiuTing/archive/2007/05/20/118671.htmlhttp://www.tkk7.com/LiuTing/comments/118671.htmlhttp://www.tkk7.com/LiuTing/archive/2007/05/20/118671.html#Feedback0http://www.tkk7.com/LiuTing/comments/commentRss/118671.htmlhttp://www.tkk7.com/LiuTing/services/trackbacks/118671.html程说完了,接下对上面提到的问题解释一下:

引用

先用URL拦截的方式去对付大多数的情况Q然后少数URL搞不定的再加一个接口,让Action自己d别。这L两个拦截器对Actionq行拦截Q如果Action实现了hasPermission接口Q那么就交给Action自己判断Q如果Action没有该接口,查扑ֆ部的URL和权限的对照表来判断?

 

q个情况比较复杂Q因为是要对Actionq行调用Q所以要看用的web框架来定夺。是用不同Web框架要是用不同的Web框架拦截器。所以恐怕acegi力不从心Q挺多在filter里面配置一下是否要是用Action自n校验。但是想法很好,赞?/p>

 

引用

你怎么把信息有效的传递给Web层和其他的Facade层进行用户友好性的提示处理Q?

 

acegi校验p|的时候会抛出AuthenticationException异常Q然后放在session里面Q?
在错误{向页面可以这h?

代码
<%= ((AuthenticationException) session.getAttribute(AbstractProcessingFilter.ACEGI_SECURITY_LAST_EXCEPTION_KEY)).getMessage() %>    
<%= session.getAttribute(AuthenticationProcessingFilter.ACEGI_SECURITY_LAST_USERNAME_KEY) %>    
<%= session.getAttribute(SecurityEnforcementFilter.ACEGI_SECURITY_ACCESS_DENIED_EXCEPTION_KEY) %> 

不过q么用实在太隄了,晕了。可以自qtag来搞?

 

 

引用

很多pȝ需要根据权限不同,生成不同的UIlg(例如理员的菜单和普通用戯单就肯定不一?Q这也需要在Web层的Viewq行控制?

acegi对View的处理就是用tag,原来的acegi好像没有什么tagQ简直是烂,现在有了tagQ说一下是用的ҎQ但是说实话他的tag实在是不够强?

 

老版的web.xml

代码
1<taglib>   
2  <taglib-uri>http://acegisecurity.sf.net/authz</taglib-uri>   
3  <taglib-location>/WEB-INF/authz.tld</taglib-location>   
4</taglib>  

在页面中使用
代码
1<authz:authorize ifAllGranted="ROLE_SUPERVISOR">   
2<td>   
3<HREF="del.htm?id=<c:out value="/${contact.id}"/>">Del</A>   
4</td>   
5</authz:authorize>  

ifAllGranted是说所有的权限都有Q用','分割权限
可以替换成ifAnyGranted: ifNotGranted:

 

 

代码
1<authz:authentication operation="username"/>   

 

q个是用来显CZ的权限信息的?/p>

 

代码
1<authz:acl domainObject="${contact}" hasPermission="16,1">   
2<td><HREF="<c:url value="del.htm"><c:param name="contactId"   
3value="${contact.id}"/></c:url>">Del</A></td>   
4</authz:acl>  


LiuTing 2007-05-20 12:42 发表评论
]]>
Acegi使用1 http://www.tkk7.com/LiuTing/archive/2007/05/20/118670.htmlLiuTingLiuTingSun, 20 May 2007 04:41:00 GMThttp://www.tkk7.com/LiuTing/archive/2007/05/20/118670.htmlhttp://www.tkk7.com/LiuTing/comments/118670.htmlhttp://www.tkk7.com/LiuTing/archive/2007/05/20/118670.html#Feedback0http://www.tkk7.com/LiuTing/comments/commentRss/118670.htmlhttp://www.tkk7.com/LiuTing/services/trackbacks/118670.html首先要配|一个filterQ这个filter用一个代理bean写在了spring里面Q其实根正常的filter没有M区别?

代码
1<bean id="securityEnforcementFilter"   
2    class="org.acegisecurity.intercept.web.SecurityEnforcementFilter">   
3    <property name="filterSecurityInterceptor">   
4        <ref local="filterInvocationInterceptor" />   
5    </property>   
6    <property name="authenticationEntryPoint">   
7        <ref local="authenticationProcessingFilterEntryPoint" />   
8    </property>   
9</bean>  

 

"filterInvocationInterceptor" 是一个拦截器Q说是拦截器Q其实就是在filter里面执行一下他的拦截方法,q里可没有什么aop.
authenticationEntryPoint 交验p|的时候{到的地方Qؓ什么说是地方,因ؓ通过配置可以转到其它的url甚至其它的协议下(http 转到 https{等)
 
代码
 1<bean id="authenticationProcessingFilterEntryPoint"   
 2    class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">   
 3    <property name="loginFormUrl">   
 4        <value>/error.security</value>   
 5    </property>   
 6    <property name="forceHttps">   
 7        <value>false</value>   
 8    </property>   
 9</bean>  
10

 

q个是p|的时候{到的地方Q我们可以配|url和是否用https

 

代码
 1<bean id="filterInvocationInterceptor"   
 2    class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">   
 3    <property name="authenticationManager">   
 4        <ref bean="authenticationManager" />   
 5    </property>   
 6    <property name="accessDecisionManager">   
 7        <ref local="httpRequestAccessDecisionManager" />   
 8    </property>   
 9    <property name="objectDefinitionSource">   
10        <value>   
11            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON    
12            PATTERN_TYPE_APACHE_ANT    
13            /index.jsp=ROLE_ANONYMOUS,ROLE_USER    
14            /j_acegi_switch_user=ROLE_SUPERVISOR   
15            /login.security=ROLE_ANONYMOUS,ROLE_USER                /test.do=ROLE_CODER   
16            /**.do*=ROLE_USER    
17        </value>   
18    </property>   
19</bean>  

 

q个是前面提到的拦截器。简单解释一下:
authenticationManager 在acegi里面的主要作用就是管理维护用L权限角色{信息,比方说想要用LROLEp在这里面拿了。里面配|了多种全县的来源,可以从DAO里面?是数据库里?Q可以是cookies里面的,也可以是匿名的权限,每种权限都以一UProvider的Ş式提供:

代码
 1<bean id="authenticationManager"   
 2    class="org.acegisecurity.providers.ProviderManager">   
 3    <property name="providers">   
 4        <list>   
 5            <ref local="daoAuthenticationProvider" />   
 6            <ref local="anonymousAuthenticationProvider" />   
 7            <ref local="rememberMeAuthenticationProvider" />   
 8        </list>   
 9    </property>   
10</bean>

 

objectDefinitionSource在acegi里面是配置权限信息Q说明哪一个url需要什么权限才能访问,acegi默认?lt;value>来表C,其实q正是acegi的不之处,q好能够补救。我来说明一下:
我们知道在spring里面<value>标签比较ҎQspring首先扑ֈq个属性的cdQ然后把value里面的内容以String的类型取出来(Spring做了一下包装,为TypedString)。然后根据这个属性的cd找他的EditerQ然后用Editer来处理String为需要的cd。但是我们不希望用String来表达urlQ很明显url里面?׃会玩了。我们可以把q个信息写到数据库里面,然后dQ这里面不说了以前有一位高手已l解释过了?/p>

接下来就是httpRequestAccessDecisionManager了,AccessDecisionManager在acegi里面是决{者,是Ҏ你所拥有的权限和讉KURL需要的权限来决定你到底能不能访问?/p>

 

代码
 1<bean id="httpRequestAccessDecisionManager"   
 2    class="org.acegisecurity.vote.AffirmativeBased">   
 3    <property name="allowIfAllAbstainDecisions">   
 4        <value>false</value>   
 5    </property>   
 6    <property name="decisionVoters">   
 7        <list>   
 8            <ref bean="roleVoter" />   
 9        </list>   
10    </property>   
11</bean>  

 

决策者里面是投票者,q个上面已经解释q了Q一个投者校验一U权限。整个流E已l说完了?/p>



LiuTing 2007-05-20 12:41 发表评论
]]>
Eclipse报表插gbirt http://www.tkk7.com/LiuTing/archive/2007/05/20/118668.htmlLiuTingLiuTingSun, 20 May 2007 04:40:00 GMThttp://www.tkk7.com/LiuTing/archive/2007/05/20/118668.htmlhttp://www.tkk7.com/LiuTing/comments/118668.htmlhttp://www.tkk7.com/LiuTing/archive/2007/05/20/118668.html#Feedback1http://www.tkk7.com/LiuTing/comments/commentRss/118668.htmlhttp://www.tkk7.com/LiuTing/services/trackbacks/118668.html 

1. BIRT 概述

BIRT是一?span>Eclipse-based开放源代码报表pȝ。它主要是用在基?span>Java?span>J2EE?span>Web应用E序上?span>BIRT主要׃部分l成Q一个是ZEclipse的报表设计和一个可以加C应用服务的运行期lg?span>BIRT同时也提供一个图形报表制作引擎?/span>

    使用BIRTQ能制作出多样化的报表到你的应用中。比如:列表 lists ,图表 charts,混合报表 Compound ReportsQ交叉表Q二l表Q?span>CrosstabsQ二l报表目前在BIRT 2.1.1 q未实现Q但在以后的版本中将会实现此功能Q?/span>

2. BIRT的安?/span>

2.1>birt的安?br>
Eclipse 3.1
支持 BIRT 2.0

Eclipse 3.2 支持 BIRT 2.1

 

目前我用的版本?span>BIRT 2.1.1Q?span>BIRT的安装有很多的方法?/span>

Ҏ一Q?/span>

?span>Eclipse的官方网?span>http://download.eclipse.org/birt/downloadsM?span> BIRT 插gQ?span>birt-report-designer-all-in-one-2_1_1Q,解压后,它就是一个拥?span> BIRT插g?span>Eclipse。如果你已经安装?span>Eclipse,那么把下载的文g夹的内容拷到所对应?span> Eclipse 的文件夹里(plugins?span>features两个目录Q,之后的第一ơ启动是通过DOSq入?span>Eclipse目录Q启?span> Eclipse -clean 命oQ此命o是清?span> Eclipse ~存里的记录q启?span>Eclipse。这也是最单的安装BIRTҎ?/span>

 

Ҏ二:

    BIRT 2.1开始,可以?span> Eclipse 里直接下载?span>[帮助]à[软g更新]à[查找q安?span>]

 

Ҏ三:

    如果你的 Eclipse 已经安装或者不想用方法一安装Q可以进行分别安装的Ҏ?span>EMF, GEF ?span> BIRT 都是需要通过 Eclipse download page下蝲的。请注意以下的配|要求:

  • BIRT 2.0.2
  • Eclipse 3.1
  • GEF 3.1.
  • EMF 2.1.
  • JRE 1.4.2/JRE 1.5.
  • BIRT 2.1/2.1.1
  • Eclipse 3.2.
  • GEF 3.2.
  • EMF 2.2.
  • JRE 1.4.2/JRE 1.5.
  • BIRT 2.2M4 and higher
  • Eclipse 3.3.
  • GEF 3.3.
  • EMF 2.3.
  • JRE 1.5.

GEFQ图形编辑框Ӟ是一个通过 BIRT UI 使用?span>Eclipse 插g

EMFQ用来制作图表的框架

具体的安装和配置请参?Eclipse官方|站 q里我还推荐一?span>BIRT 2.0.1的安装视?/span> 希望对大家有所帮助?/span>

注意Q?/span>iTextAsian.jar 是ؓ了支持用PDF输出时亚zh的字体?span>prototype.js 是安?span> BIRT 2.0.2 或者更早的版本使用的,目前版本不需要了?/span>

提示Q?/span>我个Z用的是方法一Q首先安装比较方便,其次如果使用Ҏ二,?span>Eclipse [帮助]à[帮助内容] 里没有关?span> BIRT 的帮助文档,q样对学习不是很方便?/span>

 2.2    birt版本升

1Q?span>删除?plugins 目录下的所有以 org.eclipse.birt 开头的文g?br>
2Q?/span>
按照上面的方法一q行安装?/span>

3Q?/span>重新启动 Eclipse -clean

 2.3  语言包安?/p>

    目前 BIRT?st1:chsdate Year="1899" Month="12" Day="30" IsLunarDate="False" IsROCDate="False" w:st="on">2.1.1 已经有中文语a包。下载完毕以后把对应的目?span> copy 到对应的 Eclipse 目录下,然后 Eclipse -clean 启动?/span>

  

3. BIRT应用

    在这里我提供了一?“BIRT中文教程”Q在Eclipse官方|站也有它的演示视频Q?span>Customers.rptdesign 是做好的报表?/span>

 

JDBC Drivers

    以上例子介绍的是使用“CZ数据?#8221;的数据源Q在大多数情况下我们使用的是自己?span>JDBC driverQ下面介l连?span> Oracle 数据库?/span>

    打开 Eclipse 后进?span> [H口]à[打开透视?span>]à[报表设计]Q新建项?span> [文g]à[新徏]à[]Q选择“业务和报表工?#8221;à“报表目”Qv目名。新建的目上,右键 新徏报表Q给报表起名字,报表的后~名是 .rptdesign

    [数据?span>]à[新徏数据?span>]Q选择“JDBC数据?#8221;Q别忘了l数据源起名字)Q?#8220;理驱动E序”à“d”Q把所需要的数据?span> jar 包添加进来。选择oracle.jdbc.driver.OracleDriver ( v1.0)Q写上正的数据?span> URLQ用户名Q密码,点击“试q接”Q显C?q接成功?/span>

 

报表的种cL很多Q具体的制作q程参?span>[帮助]à[帮助内容]

 

提示Q?/span>交叉表即二维报表在目?span>BIRT 2.1.1 q未实现Q但在以后的版本中正在计划实现此功能?strong>

 

4. BIRT部v

BIRT 2.1.1所对应使用的部|工hbirt-runtime-2_1_1Q可以到 Eclipse 官方|站下蝲?/span>

 
4.1. tomcat 部v

我用的版本?span> tomcat 5.5Q步骤如下:

1)      mail.jar activation.jar拷到Tomcat 5.5\common\lib

2)      iTextAsian.jar itext-1.3.jar拷到

WebViewerExample\WEB-INF\platform\plugins\com.lowagie.itext\lib

3)      q接数据库的包拷?/span>

WebViewerExample\WEB-INF\platform\plugins\org.eclipse.birt.report.data.oda.jdbc_2.1.1.v20060922-1058\drivers

4)      WebViewerExample整个目录copy ?Tomcat 5.5\webapps?span>,可以更改文g夹名?/span>

5)      完成的报表可以直接复制到根目录下Q也可以新徏文g夹目录?/span>

 

现在BIRT支持两种览报表模式Q?span>frameset是支持显C分늚Q采?span>Ajax技术?span>run暂不支持昄分页Q直接输?span>HTML。比较一下它们的区别Q如下:

http://localhost:8080/WebViewerExample/frameset?__report=Customers.rptdesign

http://localhost:8080/WebViewerExample/run?__report=Customers.rptdesign

注意Q?/span>

a)      问号后面的是双下划线

b)      以上报表是放在根目录下,如果是放在自己新建的目录比如 myreport ?span>URL应是Q?/span>

http://localhost:8080/WebViewerExample/run?__report=myreport/Customers.rptdesign

 
4.2. Weblogic Server 部v

我用的版本?span> Weblogic Server 9.2Q它?BEA WebLogic 产品的一部分?span>BEA WebLogic Server 是一个功能丰富、基于标准的现成的企?span> J2EE应用服务器?/span>

Weblogic Server 有很多的域组成,medrec ?wl_server 是其中自带的域,也可以自己创建新的域。域中可以包含许多服务器Q在服务器中可以部v许多的应用程序。域有一个默认的服务器,它是理服务器。每个域中的理服务器是唯一的,其他创徏的服务器叫受服务器?/span>

Weblogic Server 的安装就不多做介l了Q主要介l它的配|和部v。下面介l一下新建域和部|的步骤Q?/span>

1)      q行开?span> -> E序 -> BEA Products -> Tools -> Configuration Wizard

2)      选择 Create a new WebLogic domainQ?span>Next?/span>

3)      ?span> Select Domain Source 界面保持默认Q?span>Next?/span>

4)      ?span> User name 处输入用户名Q如 userQ?span>password 输入密码Q如12345678Q密码要?span> 8 位)Q?span>Next?/span>

5)      ?span> Configure Server Start Mode and JDK 界面中保持默认,?span> JDK 选择的是“Sun SDK 1.5.0_04 @ C:\BEA\jdk150_04Q注意这里若选择“Other JDK”配置?span> SDK 1.5.0_04 更高的版本,服务器启动时会出现异常Q所以最好保持默认,然后 Next?/span>

6)      ?span> Customize Environment and Services Settings 界面中默认ؓ NoQ?span>Next?/span>

7)      ?span> Domain name 处输?span> mydomainQ点?span> Create?/span>

8)      完成后点?span> Done 关闭 Configuration Wizard 对话框?/span>

9)      q行开?span> -> E序 -> BEA Products -> User Projects -> mydomain -> Start Admin Server for Weblogic Server DomainQ启动创建域的服务器。如果最后显C?<Server started in RUNNING mode> 则说明服务器启动成功?/span>

10) 在地址栏输?http://localhost:7001/console q入理控制収ͼ输入刚才的用户名和密码。点?更改中心 ?span>[锁定q编?span>]Q域l构 中的[部v]Q点?span>[安装]。找C要部|的应用E序Q之后都为默认,最后点完成。在更改面上点?span>[保存]Q?a name=startstop1208193__startstop1208210>完成所需的更改后Q单?更改中心 中的[ȀzL?/span>]?strong>注意Q?/strong>只有点击?span>[ȀzL?/span>]后才真正保存了更攏V某些在理控制C所做的更改在激zd立即生效。有些更攚w要重新启动此更改影响到的服务器或模块。后面的q些更改UCؓ非动态更攏V非动态更改在理控制C由此警告图标表示Q?span> 如果寚w动态配|设|进行了~辑Q则只有在重新启动服务器之后Q所有对动态配|设|所q行的编辑才会生效?/span>

11) 点击 域结?中的[部v]Q启动刚才部|的应用E序?/span>

12) 在地址栏中输入 http://localhost:7001/部vE序名在web中显C应用程序?/span>

 

    BIRT的部|方法基本和上面步骤相同Q注意一点,在部|前?/span>

commons-logging.jar 拷入 WebViewerExample 中的 lib 包中Q否则最后显CZ报错?/span>

 

    Weblogic Server 的部|方法有很多Q?/span>weblogic.Deployer、管理控制台?span>WLST {等。刚才介l的理控制台的部vQ它是一个可视化的界面,用v来比较方ѝ?/span>

 

推荐Q?/span>在这里推荐用一U应用程序的目录理ҎQ新建目录结构如下:

C:myApplication

app

plan

你的应用程序放入此目录

部v完后会再此目录下自动?/span>plan.xml文g

用此目录有利于很好的理配置文g?/span>

 

关于 Weblogic 的更多详l资料,我这里推荐几个比较好的官方学习网站:

www.bea.com.cn          bea的品网?/span>

edocs.bea.com.cn       bea的比较系l的学习|站

dev2dev.bea.com.cn      一般介l?span>bea的最新技术,动态等的网?br> 
4.3. web外观昄

    部v好的报表面昄样式是固定的Q在多数情况下我们都希望修改外观Q下面将Ҏ做简单介l?/span>

Webcontent是主要文件夹Q?/span>

1)      Webcontent中的ajax目录Q完成了?span>web上显C的报表分页的功能?/span>

2)      Styles目录中的style.css是整个报表在web上显C的外观Q包括工h颜色Q字体。文件注释很清楚Q具体修改可以参见注释?/span>

3)      pages目录pages/control/ NavigationbarFragment.jsp 分页那一条工h?span> JSP pages/control/ ToolbarFragment.jsp 工具按纽JSPQ可以修改以保留自己惌使用的功能按U?span>pages/control/ ProgressBarFragment.jsp 它是昄刚开始读取报表时Q显C条的样式?/span>

4)      Layout目录 FramesetFragment.jsp 可以修改报表标题?/span>

 

?WEB-INF/web.xml文g中,BIRT_VIEW_REPORT_ROOT 是配|报表\径的属性,如果没有配置则是默认路径Q?span>$tomcat$\webapps\birt

    目前?span>web上显C的所有的都是英文。项目有一个资源文Ӟ打包?span>lib/viewservlets.jar中,…/…/resource/messages.properties文g中。显CZ文的解决Ҏ是,?span>unicode转换器把要显C的中文事先转换好,然后替换资源文g中的英文?/span>

 

5. BIRTȝ

BIRT是目前比较常用也是比较方便,效率较高的报表制作工兗当然其发展旉不长Q所以还有很多的~陷和未完善的地方,之后的版本也在不断改q,因此我也会一直跟t它的技术发展,不断更新我的文档?/span>



LiuTing 2007-05-20 12:40 发表评论
]]>
վ֩ģ壺 ޹Ʒ˾ƷС˵ | auƵӰԺ| ղƷһ| ˳Ƶx8x8| Ļۺ| | Ƶ߹ۿƵ | һƴɫëƬ| ֻӲˬƬ| þúݺѹۿ2020| ޲͵V͵Vɫ| ëƬѹۿƵ| þùѾƷ| ޾Ʒtvþþþþþþþ| ۺϾþ| ޹˾þþƷ| ߹ۿѲavƬ| ɫAVպ߹ۿ| ˳77777վ| ʹA18Ƭ| Ʒ߹ۿ| պɫպƵվ | ҹ߲| þۺɫһ| һ| ƷԴѹۿ| ޴һ| ɫĻAV| ëɫëƬѹۿ| 99þ99þѾƷС˵| øƵ| ҹAVһ| ˬָ߳ëƬ| 5555߲Ѳ| ޾ƷóƬAV߲| av츾߲| Ů糱ëƬѲ| С߿Ƭ˳Ӿ| ޹ۺ| ŷ޸| С˵ ͼƬ |