﻿<?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-我的Blog我做主^_^-文章分类-OPEN SOURCE</title><link>http://www.blogjava.net/wyz191/category/18596.html</link><description>走向一条通往JAVA的不归路...</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:45:47 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:45:47 GMT</pubDate><ttl>60</ttl><item><title>Extremecomponents</title><link>http://www.blogjava.net/wyz191/articles/100429.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Fri, 23 Feb 2007 15:07:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/100429.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/100429.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/100429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/100429.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/100429.html</trackback:ping><description><![CDATA[
		<p>0.概述</p>
		<p>    Home Page:<a href="http://www.extremecomponents.org/">http://www.extremecomponents.org</a></p>
		<p>     Extreme Table是最功能强大而又容易配置,扩展,自定义的Table 控件。</p>
		<p>     最紧要的功能包括排序, 分页, 导出Excel, pdf和汇总。</p>
		<p>     springside的best 示例代码在: listBook.jsp和listOrder.jsp.</p>
		<p>基础读物: </p>
		<p>     1. <a href="http://extremecomponents.org/wiki/index.php/Main_Page" target="_blank">ExtremeTable自带的文档</a> .</p>
		<p>     2.<a href="http://extremecomponents.org/wiki/index.php/Simplified_Chinese" target="_blank">Luck翻译的ExtremeTable官方文档中文版</a>   </p>
		<h2>1. 安装</h2>
		<h3>1.1 安装原始版本</h3>
		<p>     1. 从<a href="http://www.extremecomponents.org/">http://www.extremecomponents.org</a> 下载最新版</p>
		<p>     2.把extremecomponents.jar 放入web-inf/lib</p>
		<p>     3.根据minum, 导出excel 或 导出pdf的需要，把/lib下的jar copy到web-inf/lib</p>
		<p>     4.把images里的图片放入web的任意目录</p>
		<p>     5.把css文件放到web的任意目录</p>
		<p>     6.在/source/org/extremecomponents/table/core目录找到extremetable.properties文件,把它复制到WEB-INF/classes里面并进行修改.</p>
		<p>     7.修改web.xml (见2)。</p>
		<h3> 0.2 复制SpringSide的样式</h3>
		<p>     1.Copy springside的Table Head的图，查。</p>
		<p>     2.将springside中的修改版extremecomponents.css文件放入任意目录</p>
		<p>     3.把/src/resource/extremetable.properties 复制到对应目录</p>
		<h3>0.3 使用Compact View很重要</h3>
		<p>     默认的式样不符合大家的审美，幸亏还有Compact View和css设置，让我们可以敬谢不敏它号称非常方便的HtmlView子类扩展。</p>
		<p>    1. 在全局设置里</p>
		<pre> 
table.view.html=org.extremecomponents.table.view.CompactView</pre>
		<p>    2.把images里/table/compact/*.gif copy 到 /table</p>
		<h2>2.全局属性配置</h2>
		<p>   ExtremeTable支持在properties文件里方便的统一配置丰富的全局属性</p>
		<p>  在/source/org/extremecomponents/table/core目录找到extremetable.properties文件,把它复制到WEB-INF/classes里面.</p>
		<p> 在web.xml里面增加</p>
		<pre>   &lt;context-param&gt;<br />        &lt;param-name&gt;extremecomponentsPreferencesLocation&lt;/param-name&gt;<br />        &lt;param-value&gt;/extremetable.properties&lt;/param-value&gt;<br />   &lt;/context-param&gt;</pre>
		<p>一般只写需要修改的文件:</p>
		<pre>table.filterable=false<br />table.imagePath=/images/table/*.gif<br />table.locale=zh_CN<br />table.view.html=org.extremecomponents.table.view.CompactView<br />row.highlightRow=true<br />column.format.date=yyyy-MM-dd<br />column.format.currency=###,###,###,###,#00.00<br /></pre>
		<h2>3.导出Excel</h2>
		<p>    注意Excel 导出的Tag已改为，且官方版不支持中文文件名。</p>
		<pre>    &lt;ec:exportXls fileName="BookList.xls" tooltip="导出 Excel"/&gt;</pre>
		<p>在web.xml必须加入：</p>
		<pre>    &lt;filter&gt;<br />        &lt;filter-name&gt;eXtremeExport&lt;/filter-name&gt;<br />        &lt;filter-class&gt;org.extremecomponents.table.filter.ExportFilter&lt;/filter-class&gt;<br />    &lt;/filter&gt;<br />    &lt;filter-mapping&gt;<br />        &lt;filter-name&gt;eXtremeExport&lt;/filter-name&gt;<br />        &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />    &lt;/filter-mapping&gt;<br /></pre>
		<p>     ExtremeTable导出的一项重要特性是可以根据不同的View导出不同的列.</p>
		<p>     比如html管理界面可能只列出订单几个最重要的列，而导出excel时则需要导出所有的列。</p>
		<pre>&lt;ec:column property="orderdate" title="订单日期"  cell="date" format="yyyy-MM-dd"  viewsDenied= "html"/&gt;</pre>
		<p>又比如有些操作按纽的列只想在html出现,excel里不想出现：</p>
		<pre>&lt;ec:column property="orderdate" title="订单日期" viewAllowed= "html"/&gt;</pre>
		<p>     以上订单日期列在html view看不到，而excel,pdf view可以见到.</p>
		<p>    而"编辑图标"，"选择Checkbox"这些管理界面上的列，也可以设置不export到pdf,excel view</p>
		<h2>4.其他要点<br /></h2>
		<h3>4.1. 使用排序功能时,如果property为嵌套属性时,需要设置alias</h3>
		<p>          因为javascript的关系.</p>
		<pre>&lt;ec:column property="customer.name" title="客户名称" alias="customer"/&gt;</pre>
		<h3>4.2. Date Cell与NumberCell 和RowCountCell</h3>
		<p>     在全局属性定义:</p>
		<p>
		</p>
		<pre> column.format.date= yyyy-MM-dd
column.format.currency= ￥###,###,#00.00</pre>
		<pre>&lt;ec:column property="totalprice" title="总金额" cell="currency" width="80" /&gt;<br />&lt;ec:column property="shipdate" title="发货日期"  cell="date" width= "80"/&gt;<br />&lt;e</pre>
		<p>其中RowCountCell用于显示序号。</p>
		<h3>4.3. 汇总</h3>
		<p>在column中加入两个cac属性，就会自动在table的底端显示汇总</p>
		<p>
		</p>
		<pre>&lt;ec:column property="totalprice" title="总金额" cell="number" format="###,###,##0.00" calc="total" calcTitle= "汇总:"/&gt;</pre>
		<h3>4.4 i18N</h3>
		<p>在Web.xml里面指定i18N的Properties文件</p>
		<pre>&lt;context-param&gt;<br />  &lt;param-name&gt;extremecomponentsMessagesLocation&lt;/param-name&gt;<br />  &lt;param-value&gt;messages&lt;/param-value&gt;<br />&lt;/context-param&gt;</pre>
		<pre>&lt;ec:column property="name" title="book.name"/&gt;</pre>
		<h3>4.5数据库分页</h3>
		<p> EC默认从数据库中查找所有记录然后由它来分页，如果查询结果较大，可以考虑使用数据库端分页的方案。</p>
		<p> 此时，EC会使用Limit对象向Controller传递PageNo,PageSize,OrderBy等分页信息。而服务端将向EC返回总记录数和当前页的内容，具体请参看 BookController。</p>
		<h3>4.6不显示导出excel及分页</h3>
		<p>最快的方式是设置table的showStatusBar= false</p>
		<pre>&lt;ec:table  items= "order.orderItems"var="item" action=""   showStatusBar= "false"&gt;</pre>
		<h3>    4.7ImagePath</h3>
		<p>  旧版EC包括其文档都在每个table tag里定义ImagePath, 新版已经可以自动插入ContextPath,只需在properties文件定义table.imagePath=/images/table/*.gif即可</p>
		<h2>5.自定义及扩展</h2>
		<p>   ExtremeTable比Display Tag的i一个就是良好的自定义和扩展能力，不用千人一面。<br />   不过，人总是懒的，虽然扩展子类很容易，但能不扩展就还是不可扩展了。幸亏用Compact View再改改CSS一般就能达到要求。</p>
		<h3> 5.1. 良好的CSS定义</h3>
		<p>         ExtremeTable 的CSS定义非常严谨, 并且提供很多个层次的修改方式:</p>
		<p>         1.直接修改css文件, 可以把table view改成任意样式</p>
		<p>         2.修改全局属性, 改变某种元素对应的css class名</p>
		<pre>table.styleClass=tableRegion</pre>
		<p>         3.在某个页面的row,column tag中定义class</p>
		<pre> &lt;ec:row style="" or styleClass=""/&gt;</pre>
		<p>        SpringSide采用层次1, 直接修改extremecomponents.css为合适的样式</p>
		<h3>5.2方便的&lt;tr&gt;&lt;td&gt;属性扩展</h3>
		<p>        row与column已提供了丰富的普通属性与 javascript属性如onClick(), 如果属性仍然未够,可自行扩展&lt;row&gt;与&lt;column&gt;tag ，并通过全局属性指定新的子类名。</p>
		<p>   为了方便大家在子类扩展属性, extreme Table提供了专门的回调函数与Util函数如</p>
		<pre>public void addColumnAttributes(Column column) {
   column.addAttribute("customAttributeOne", customAttributeOne);<br />}   

        
</pre>
		<p>详细请看手册,Table, Row,Column都提供相同的扩展:<br /><a href="http://extremecomponents.org/wiki/index.php/Column#Extended_Attributes">http://extremecomponents.org/wiki/index.php/Column#Extended_Attributes</a></p>
		<p>如果不是Extremetable的特别支持, 普通taglib class要扩展属性的话:<br />        1.定义真正的Java属性,setter,getter<br />        2. tld文件中声明新的属性 <br />        3.重载输出函数将新属性打印出来</p>
		<h3>5.3 扩展HTMLView,cell 等显示组件</h3>
		<p>     Extreme Table在这些类的扩展上放便很多，但这个版本里我还没有进行尝试，就不写了。请自行参考官方文档:<a href="http://extremecomponents.org/wiki/index.php/Html_View_Tutorial">http://extremecomponents.org/wiki/index.php/Html_View_Tutorial</a> .</p>
		<p>
				<a href="http://www.springside.org.cn/docs/reference/ExtremeTable.htm">http://www.springside.org.cn/docs/reference/ExtremeTable.htm</a>
		</p>
<img src ="http://www.blogjava.net/wyz191/aggbug/100429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-02-23 23:07 <a href="http://www.blogjava.net/wyz191/articles/100429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jfreechart  API</title><link>http://www.blogjava.net/wyz191/articles/98486.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Wed, 07 Feb 2007 01:10:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/98486.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/98486.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/98486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/98486.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/98486.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<font color="#0000ff" size="4">JFreeChart类：</font>
						<br />void setAntiAlias(boolean flag)    字体模糊边界<br />void setBackgroundImage(Image image)   背景图片<br />void setBackgroundImageAlignment(int alignment)  背景图片对齐方式（参数常量在org.jfree.ui.Align类中定义）<br />void setBackgroundImageAlpha(float alpha)  背景图片透明度（0.0～1.0）<br />void setBackgroundPaint(Paint paint)   背景色<br />void setBorderPaint(Paint paint)   边界线条颜色<br />void setBorderStroke(Stroke stroke)   边界线条笔触<br />void setBorderVisible(boolean visible)   边界线条是否可见</p>
				<p>-----------------------------------------------------------------------------------------------------------</p>
				<p>
						<font color="#0000ff" size="4">TextTitle类：</font>
						<br />void setFont(Font font)     标题字体<br />void setPaint(Paint paint)    标题字体颜色<br />void setText(String text)    标题内容</p>
				<p>-----------------------------------------------------------------------------------------------------------</p>
				<p>
						<font color="#0000ff" size="4">StandardLegend(Legend)类：</font>
						<br />void setBackgroundPaint(Paint paint)   图示背景色<br />void setTitle(String title)    图示标题内容<br />void setTitleFont(Font font)    图示标题字体<br />void setBoundingBoxArcWidth(int arcWidth)  图示边界圆角宽<br />void setBoundingBoxArcHeight(int arcHeight)  图示边界圆角高<br />void setOutlinePaint(Paint paint)   图示边界线条颜色<br />void setOutlineStroke(Stroke stroke)   图示边界线条笔触<br />void setDisplaySeriesLines(boolean flag)  图示项是否显示横线（折线图有效）<br />void setDisplaySeriesShapes(boolean flag)  图示项是否显示形状（折线图有效）<br />void setItemFont(Font font)    图示项字体<br />void setItemPaint(Paint paint)    图示项字体颜色<br />void setAnchor(int anchor)    图示在图表中的显示位置（参数常量在Legend类中定义）</p>
				<p>-----------------------------------------------------------------------------------------------------------</p>
				<p>
						<font color="#0000ff" size="4">Axis类：</font>
						<br />void setVisible(boolean flag)    坐标轴是否可见<br />void setAxisLinePaint(Paint paint)   坐标轴线条颜色（3D轴无效）<br />void setAxisLineStroke(Stroke stroke)   坐标轴线条笔触（3D轴无效）<br />void setAxisLineVisible(boolean visible)  坐标轴线条是否可见（3D轴无效）<br />void setFixedDimension(double dimension)  （用于复合表中对多坐标轴的设置）<br />void setLabel(String label)    坐标轴标题<br />void setLabelFont(Font font)    坐标轴标题字体<br />void setLabelPaint(Paint paint)    坐标轴标题颜色<br />void setLabelAngle(double angle)`   坐标轴标题旋转角度（纵坐标可以旋转）<br />void setTickLabelFont(Font font)   坐标轴标尺值字体<br />void setTickLabelPaint(Paint paint)   坐标轴标尺值颜色<br />void setTickLabelsVisible(boolean flag)   坐标轴标尺值是否显示<br />void setTickMarkPaint(Paint paint)   坐标轴标尺颜色<br />void setTickMarkStroke(Stroke stroke)   坐标轴标尺笔触<br />void setTickMarksVisible(boolean flag)   坐标轴标尺是否显示</p>
				<p>
						<font color="#ff9900" size="2">
								<font color="#ff6600">ValueAxis(Axis)类：</font>
								<br />
						</font>void setAutoRange(boolean auto)    自动设置数据轴数据范围<br />void setAutoRangeMinimumSize(double size)  自动设置数据轴数据范围时数据范围的最小跨度<br />void setAutoTickUnitSelection(boolean flag)  数据轴的数据标签是否自动确定（默认为true）<br />void setFixedAutoRange(double length)   数据轴固定数据范围（设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围）<br />void setInverted(boolean flag)    数据轴是否反向（默认为false）<br />void setLowerMargin(double margin)   数据轴下（左）边距<br />void setUpperMargin(double margin)   数据轴上（右）边距<br />void setLowerBound(double min)    数据轴上的显示最小值<br />void setUpperBound(double max)    数据轴上的显示最大值<br />void setPositiveArrowVisible(boolean visible)  是否显示正向箭头（3D轴无效）<br />void setNegativeArrowVisible(boolean visible)  是否显示反向箭头（3D轴无效）<br />void setVerticalTickLabels(boolean flag)  数据轴数据标签是否旋转到垂直<br />void setStandardTickUnits(TickUnitSource source) 数据轴的数据标签（可以只显示整数标签，需要将AutoTickUnitSelection设false）</p>
				<p>
						<font color="#ff6600" size="2">NumberAxis(ValueAxis)类：</font>
						<br />void setAutoRangeIncludesZero(boolean flag)  是否强制在自动选择的数据范围中包含0<br />void setAutoRangeStickyZero(boolean flag)  是否强制在整个数据轴中包含0，即使0不在数据范围中<br />void setNumberFormatOverride(NumberFormat formatter) 数据轴数据标签的显示格式<br />void setTickUnit(NumberTickUnit unit)   数据轴的数据标签（需要将AutoTickUnitSelection设false）</p>
				<p>
						<font color="#ff6600" size="2">DateAxis(ValueAxis)类：</font>
						<br />void setMaximumDate(Date maximumDate)   日期轴上的最小日期<br />void setMinimumDate(Date minimumDate)   日期轴上的最大日期<br />void setRange(Date lower,Date upper)   日期轴范围<br />void setDateFormatOverride(DateFormat formatter) 日期轴日期标签的显示格式<br />void setTickUnit(DateTickUnit unit)   日期轴的日期标签（需要将AutoTickUnitSelection设false）<br />void setTickMarkPosition(DateTickMarkPosition position) 日期标签位置（参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义）</p>
				<p>
						<font color="#ff6600" size="2">CategoryAxis(Axis)类：</font>
						<br />void setCategoryMargin(double margin)   分类轴边距<br />void setLowerMargin(double margin)   分类轴下（左）边距<br />void setUpperMargin(double margin)   分类轴上（右）边距<br />void setVerticalCategoryLabels(boolean flag)  分类轴标题是否旋转到垂直<br />void setMaxCategoryLabelWidthRatio(float ratio)  分类轴分类标签的最大宽度</p>
				<p>-----------------------------------------------------------------------------------------------------------</p>
				<p>
						<font color="#0000ff" size="4">Plot类：<br /></font>void setBackgroundImage(Image image)   数据区的背景图片<br />void setBackgroundImageAlignment(int alignment)  数据区的背景图片对齐方式（参数常量在org.jfree.ui.Align类中定义）<br />void setBackgroundPaint(Paint paint)   数据区的背景图片背景色<br />void setBackgroundAlpha(float alpha)   数据区的背景透明度（0.0～1.0）<br />void setForegroundAlpha(float alpha)   数据区的前景透明度（0.0～1.0）<br />void setDataAreaRatio(double ratio)   数据区占整个图表区的百分比<br />void setOutLinePaint(Paint paint)   数据区的边界线条颜色<br />void setOutLineStroke(Stroke stroke)   数据区的边界线条笔触<br />void setNoDataMessage(String message)   没有数据时显示的消息<br />void setNoDataMessageFont(Font font)   没有数据时显示的消息字体<br />void setNoDataMessagePaint(Paint paint)   没有数据时显示的消息颜色</p>
				<p>
						<font color="#ff6600" size="2">CategoryPlot(Plot)类：<br /></font>void setDataset(CategoryDataset dataset)  数据区的2维数据表<br />void setColumnRenderingOrder(SortOrder order)  数据分类的排序方式<br />void setAxisOffset(Spacer offset)   坐标轴到数据区的间距<br />void setOrientation(PlotOrientation orientation) 数据区的方向（PlotOrientation.HORIZONTAL或PlotOrientation.VERTICAL）<br />void setDomainAxis(CategoryAxis axis)   数据区的分类轴<br />void setDomainAxisLocation(AxisLocation location) 分类轴的位置（参数常量在org.jfree.chart.axis.AxisLocation类中定义）<br />void setDomainGridlinesVisible(boolean visible)  分类轴网格是否可见<br />void setDomainGridlinePaint(Paint paint)  分类轴网格线条颜色<br />void setDomainGridlineStroke(Stroke stroke)  分类轴网格线条笔触<br />void setRangeAxis(ValueAxis axis)   数据区的数据轴<br />void setRangeAxisLocation(AxisLocation location) 数据轴的位置（参数常量在org.jfree.chart.axis.AxisLocation类中定义）<br />void setRangeGridlinesVisible(boolean visible)  数据轴网格是否可见<br />void setRangeGridlinePaint(Paint paint)   数据轴网格线条颜色<br />void setRangeGridlineStroke(Stroke stroke)  数据轴网格线条笔触<br />void setRenderer(CategoryItemRenderer renderer)  数据区的表示者（详见Renderer组）<br />void addAnnotation(CategoryAnnotation annotation) 给数据区加一个注释<br />void addRangeMarker(Marker marker,Layer layer)  给数据区加一个数值范围区域</p>
				<p>
						<font color="#ff6600" size="2">PiePlot(Plot)类：</font>
						<br />void setDataset(PieDataset dataset)   数据区的1维数据表<br />void setIgnoreNullValues(boolean flag)   忽略无值的分类<br />void setCircular(boolean flag)    饼图是否一定是正圆<br />void setStartAngle(double angle)   饼图的初始角度<br />void setDirection(Rotation direction)   饼图的旋转方向<br />void setExplodePercent(int section,double percent) 抽取的那块（1维数据表的分类下标）以及抽取出来的距离（0.0～1.0），3D饼图无效<br />void setLabelBackgroundPaint(Paint paint)  分类标签的底色<br />void setLabelFont(Font font)    分类标签的字体<br />void setLabelPaint(Paint paint)    分类标签的字体颜色<br />void setLabelLinkMargin(double margin)   分类标签与图的连接线边距<br />void setLabelLinkPaint(Paint paint)   分类标签与图的连接线颜色<br />void setLabelLinkStroke(Stroke stroke)   分类标签与图的连接线笔触<br />void setLabelOutlinePaint(Paint paint)   分类标签边框颜色<br />void setLabelOutlineStroke(Paint paint)   分类标签边框笔触<br />void setLabelShadowPaint(Paint paint)   分类标签阴影颜色<br />void setMaximumLabelWidth(double width)   分类标签的最大长度（0.0～1.0）<br />void setPieIndex(int index)    饼图的索引（复合饼图中用到）<br />void setSectionOutlinePaint(int section,Paint paint) 指定分类饼的边框颜色<br />void setSectionOutlineStroke(int section,Stroke stroke) 指定分类饼的边框笔触<br />void setSectionPaint(int section,Paint paint)  指定分类饼的颜色<br />void setShadowPaint(Paint paint)   饼图的阴影颜色<br />void setShadowXOffset(double offset)   饼图的阴影相对图的水平偏移<br />void setShadowYOffset(double offset)   饼图的阴影相对图的垂直偏移<br />void setLabelGenerator(PieSectionLabelGenerator generator) 分类标签的格式，设置成null则整个标签包括连接线都不显示<br />void setToolTipGenerator(PieToolTipGenerator generator)  MAP中鼠标移上的显示格式<br />void setURLGenerator(PieURLGenerator generator)   MAP中钻取链接格式</p>
				<p>
						<font color="#ff6600" size="2">PiePlot3D(PiePlot)类：</font>
						<br />void setDepthFactor(double factor)   3D饼图的Z轴高度（0.0～1.0）</p>
				<p>
						<font color="#ff6600" size="2">MultiplePiePlot(Plot)类：</font>
						<br />void setLimit(double limit)    每个饼图之间的数据关联（详细比较复杂）   <br />void setPieChart(JFreeChart pieChart)   每个饼图的显示方式（见JFreeChart类个PiePlot类）</p>
				<p>-----------------------------------------------------------------------------------------------------------</p>
				<p>
						<font color="#ff0000" size="4">
								<font color="#0000ff">AbstractRenderer类：</font>
								<br />
						</font>void setItemLabelAnchorOffset(double offset)     数据标签的与数据点的偏移<br />void setItemLabelsVisible(boolean visible)     数据标签是否可见<br />void setItemLabelFont(Font font)      数据标签的字体<br />void setItemLabelPaint(Paint paint)      数据标签的字体颜色<br />void setItemLabelPosition(ItemLabelPosition position)    数据标签位置<br />void setPositiveItemLabelPosition(ItemLabelPosition position)   正数标签位置<br />void setNegativeItemLabelPosition(ItemLabelPosition position)   负数标签位置<br />void setOutLinePaint(Paint paint)      图形边框的线条颜色<br />void setOutLineStroke(Stroke stroke)      图形边框的线条笔触<br />void setPaint(Paint paint)       所有分类图形的颜色<br />void setShape(Shape shape)       所有分类图形的形状（如折线图的点）<br />void setStroke(Stroke stroke)       所有分类图形的笔触（如折线图的线）<br />void setSeriesItemLabelsVisible(int series,boolean visible)   指定分类的数据标签是否可见<br />void setSeriesItemLabelFont(int series,Font font)    指定分类的数据标签的字体<br />void setSeriesItemLabelPaint(int series,Paint paint)    指定分类的数据标签的字体颜色<br />void setSeriesItemLabelPosition(int series,ItemLabelPosition position)  数据标签位置<br />void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正数标签位置<br />void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 负数标签位置<br />void setSeriesOutLinePaint(int series,Paint paint)    指定分类的图形边框的线条颜色<br />void setSeriesOutLineStroke(int series,Stroke stroke)    指定分类的图形边框的线条笔触<br />void setSeriesPaint(int series,Paint paint)     指定分类图形的颜色<br />void setSeriesShape(int series,Shape shape)     指定分类图形的形状（如折线图的点）<br />void setSeriesStroke(int series,Stroke stroke)     指定分类图形的笔触（如折线图的线）</p>
				<p>
						<font color="#ff6600" size="2">AbstractCategoryItemRenderer(AbstractRenderer)类：<br /></font>void setLabelGenerator(CategoryLabelGenerator generator)   数据标签的格式<br />void setToolTipGenerator(CategoryToolTipGenerator generator)   MAP中鼠标移上的显示格式<br />void setItemURLGenerator(CategoryURLGenerator generator)   MAP中钻取链接格式<br />void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分类的数据标签的格式<br />void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分类的MAP中鼠标移上的显示格式<br />void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分类的MAP中钻取链接格式</p>
				<p>
						<font color="#ff6600" size="2">BarRenderer(AbstractCategoryItemRenderer)类：</font>
						<br />void setDrawBarOutline(boolean draw)      是否画图形边框<br />void setItemMargin(double percent)      每个BAR之间的间隔<br />void setMaxBarWidth(double percent)      每个BAR的最大宽度<br />void setMinimumBarLength(double min)      最短的BAR长度，避免数值太小而显示不出<br />void setPositiveItemLabelPositionFallback(ItemLabelPosition position)  无法在BAR中显示的正数标签位置<br />void setNegativeItemLabelPositionFallback(ItemLabelPosition position)  无法在BAR中显示的负数标签位置</p>
				<p>
						<font color="#ff6600" size="2">BarRenderer3D(BarRenderer)类：</font>
						<br />void setWallPaint(Paint paint)    3D坐标轴的墙体颜色</p>
				<p>
						<font color="#ff6600" size="2">StackedBarRenderer(BarRenderer)类：<br /></font>没有特殊的设置</p>
				<p>
						<font color="#ff6600" size="2">StackedBarRenderer3D(BarRenderer3D)类：</font>
						<br />没有特殊的设置</p>
				<p>
						<font color="#ff6600" size="2">GroupedStackedBarRenderer(StackedBarRenderer)类：</font>
						<br />void setSeriesToGroupMap(KeyToGroupMap map)  将分类自由的映射成若干个组（KeyToGroupMap.mapKeyToGroup(series,group)）</p>
				<p>
						<font color="#ff6600" size="2">LayeredBarRenderer(BarRenderer)类：</font>
						<br />void setSeriesBarWidth(int series,double width)  设定每个分类的宽度（注意设置不要使某分类被覆盖）</p>
				<p>
						<font color="#ff6600" size="2">WaterfallBarRenderer(BarRenderer)类：</font>
						<br />void setFirstBarPaint(Paint paint)   第一个柱图的颜色<br />void setLastBarPaint(Paint paint)   最后一个柱图的颜色<br />void setPositiveBarPaint(Paint paint)   正值柱图的颜色<br />void setNegativeBarPaint(Paint paint)   负值柱图的颜色</p>
				<p>
						<font color="#ff6600" size="2">IntervalBarRenderer(BarRenderer)类：</font>
						<br />需要传IntervalCategoryDataset作为数据源</p>
				<p>
						<font size="2">
								<font color="#ff6600">GanttBarRenderer(IntervalBarRenderer)类：</font>
								<br />
						</font>void setCompletePaint(Paint paint)   完成进度颜色<br />void setIncompletePaint(Paint paint)   未完成进度颜色<br />void setStartPercent(double percent)   设置进度条在整条中的起始位置（0.0～1.0）<br />void setEndPercent(double percent)   设置进度条在整条中的结束位置（0.0～1.0）</p>
				<p>
						<font color="#ff6600" size="4">
								<font size="2">StatisticBarRenderer(BarRenderer)类：</font>
								<br />
						</font>需要传StatisticCategoryDataset作为数据源</p>
				<p>
						<font color="#ff6600" size="2">LineAndShapeRenderer(AbstractCategoryItemRenderer)类：</font>
						<br />void setDrawLines(boolean draw)    是否折线的数据点之间用线连<br />void setDrawShapes(boolean draw)   是否折线的数据点根据分类使用不同的形状<br />void setShapesFilled(boolean filled)   所有分类是否填充数据点图形<br />void setSeriesShapesFilled(int series,boolean filled) 指定分类是否填充数据点图形<br />void setUseFillPaintForShapeOutline(boolean use) 指定是否填充数据点的Paint也被用于画数据点形状的边框</p>
				<p>
						<font color="#ff6600" size="2">LevelRenderer(AbstractCategoryItemRenderer)类：</font>
						<br />void setItemMargin(double percent)   每个分类之间的间隔<br />void setMaxItemWidth(double percent)   每个分类的最大宽度</p>
				<p>
						<font color="#ff6600" size="2">CategoryStepRenderer(AbstractCategoryItemRenderer)类：</font>
						<br />void setStagger(boolean shouldStagger)   不同分类的图是否交错</p>
				<p>
						<font color="#ff6600" size="2">MinMaxCategoryRenderer(AbstractCategoryItemRenderer)类：</font>
						<br />void setDrawLines(boolean drawLines)   是否在每个分类线间画连接线<br />void setGroupPaint(Paint groupPaint)   一组图形连接线的颜色<br />void setGroupStroke(Stroke groupStroke)   一组图形连接线的笔触<br />void setMaxIcon(Icon maxIcon)    最大值的ICON<br />void setMinIcon(Icon minIcon)    最小值的ICON<br />void setObjectIcon(Icon objectIcon)   所有值的ICON</p>
				<p>
						<font color="#ff6600">
								<font size="2">AreaRender(AbstractCategoryItemRenderer)类</font>：</font>
						<br />没有特殊的设置</p>
				<p>
						<font color="#ff6600" size="2">StackedAreaRender(AreaRender)类：</font>
						<br />没有特殊的设置</p>
				<p>简单的SEVLET配置 </p>
		</div>
		<div id="comText">
				<div id="comments">
						<div class="post">
								<div class="postText">&lt;servlet&gt; <br />&lt;servlet-name&gt;DisplayChart&lt;/servlet-name&gt; <br />&lt;servlet-class&gt;org.jfree.chart.servlet.DisplayChart&lt;/servlet-class&gt; <br />&lt;/servlet&gt; <br />&lt;servlet-mapping&gt; <br />&lt;servlet-name&gt;DisplayChart&lt;/servlet-name&gt; <br />&lt;url-pattern&gt;/servlet/DisplayChart&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt; <br /><br />转自 <a href="http://blog.csdn.net/knight12"><font color="#355ea0">http://blog.csdn.net/knight12</font></a></div>
						</div>
				</div>
		</div>
<img src ="http://www.blogjava.net/wyz191/aggbug/98486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-02-07 09:10 <a href="http://www.blogjava.net/wyz191/articles/98486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jfreechart报表</title><link>http://www.blogjava.net/wyz191/articles/98364.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Tue, 06 Feb 2007 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/98364.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/98364.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/98364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/98364.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/98364.html</trackback:ping><description><![CDATA[一、JFreeChart获取。<br />        JFreeChart是JFreeChart公司在开源网站SourceForge.net上的一个项目，该公司的主要产品有如下：<br />        1、JFreeReport：报表解决工具<br />        2、JFreeChart：Java图形解决方案（Application/Applet/Servlet/Jsp）<br />        3、JCommon：JFreeReport和JFreeChart的公共类库<br />        4、JFreeDesigner：JFreeReport的报表设计工具<br /><br />    我们可以从jfree官方网站上获取最新版本和相关资料（但是jfree的document需要40美金才能获取），<br />    获取地址：<a href="http://www.jfree.org/jfreechart/index.html">http://www.jfree.org/jfreechart/index.html</a>（同时可以获得简明介绍）<br />    我们以当前最新版本：jfreechart_0.9.21.zip为例子进行说明。<br /><br />二、JFreeChart配置安装<br />    1、解压jfreechart_0.9.21.zip到指定位置，其中source是jfreechart的源码，jfreechart-0.9.21-demo.jar<br />       是例子程序（该部分留给大家自己去研究）<br />    2、为了配置成功，我们需要关注的文件有如下三个：jfreechart-0.9.21.jar、lib\jcommon-0.9.6.jar、<br />       lib\gnujaxp.jar<br />    3、如果是Application开发，把上述三个文件拷贝到%JAVA_HOME%\LIB中，同时在环境变量CLASSPATH中加入<br />       如果是WEB开发，以TOMCAT中的一个WEB项目TEST为例子说明：<br />       把上述三个文件拷贝到TEST\WEB-INF\LIB中，然后修改TEST\WEB-INF\web.xml文件，在其中加入如下代码：<br />                <servlet><br />                    <servlet-name>DisplayChart</servlet-name><br />                    <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class><br />                </servlet><br />                <servlet-mapping><br />                    <servlet-name>DisplayChart</servlet-name><br />                    <url-pattern>/servlet/DisplayChart</url-pattern><br />                </servlet-mapping><br />               至此jfreechart的配置就完成了，下面就可以进行jfreechart的开发了。这里值得提出的是jfreechart的类<br />       结构设计前后兼容性不是很好，不同版本的jfreechart中类库结构可能不一样，有时候可能需要查源码。如果<br />       是中文显示的时候可能依据观感需要改变源码的字体，不过我个人觉得这个版本比以前版本要好一些。<br /><br /><strong>三、JFreeChart功能介绍<br /></strong>    JFreeChart目前是最好的java图形解决方案，基本能够解决目前的图形方面的需求，主要包括如下几个方面：<br />    pie charts (2D and 3D)：饼图（平面和立体）<br />    bar charts (regular and stacked, with an optional 3D effect)：柱状图<br />    line and area charts：曲线图<br />    scatter plots and bubble charts<br />    time series, high/low/open/close charts and candle stick charts：时序图<br />    combination charts：复合图<br />    Pareto charts<br />    Gantt charts：甘特图<br />    wind plots, meter charts and symbol charts<br />    wafer map charts<br />    (态图表,饼图(二维和三维) , 柱状图 (水平,垂直),线图,点图,时间变化图,甘特图, 股票行情图,混和图, 温度计图, 刻度图等常用商用图表)<br />    图形可以导出成PNG和JPEG格式，同时还可以与PDF和EXCEL关联<br />    <br />    JFreeChart核心类库介绍：<br />            研究jfreechart源码发现源码的主要由两个大的包组成：org.jfree.chart,org.jfree.data。其中前者主要与图形<br />    本身有关，后者与图形显示的数据有关。具体研究如果大家有兴趣的话可以自己研究，以后有时间我会告诉大家怎么去<br />    研究源码。<br />         核心类主要有：<br />           org.jfree.chart.JFreeChart：图表对象，任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象<br />           org.jfree.data.category.XXXDataSet:数据集对象，用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类<br />           org.jfree.chart.plot.XXXPlot：图表区域对象，基本上这个对象决定着什么样式的图表，创建该对象的时候需要Axis、Renderer以及数据集对象的支持<br />           org.jfree.chart.axis.XXXAxis：用于处理图表的两个轴：纵轴和横轴<br />           org.jfree.chart.render.XXXRender：负责如何显示一个图表对象<br />           org.jfree.chart.urls.XXXURLGenerator:用于生成Web图表中每个项目的鼠标点击链接<br />           XXXXXToolTipGenerator:用于生成图象的帮助提示，不同类型图表对应不同类型的工具提示类<br /><p><span style="FONT-WEIGHT: bold">四、jFreeChart产生图形的流程</span><br />创建一个数据源（dataset）来包含将要在图形中显示的数据<br />创建一个 JFreeChart 对象来代表要显示的图形<br />把图形输出<br />重要的类和接口：<br />org.jfree.data.general.Dataset 所有数据源类都要实现的接口<br />org.jfree.chart.ChartFactory 由它来产生 JFreeChart 对象<br />org.jfree.chart.JFreeChart 所有对图形的调整都是通过它噢！！<br />org.jfree.chart.plot.Plot 通过JFreeChart 对象获得它，然后再通过它对图形外部部分（例：坐标轴）调整<br />注意：它有很多子类，一般都下嗍造型到它的子类！<br />org.jfree.chart.renderer.AbstractRenderer 通过JFreeChart 对象获得它，然后再通过它对图形内部部分<br />（例：折线的类型）调整。同样，针对不同类型的报表图，它有<br />着不同的子类实现！在下面我们简称它为 Renderer<br />下面我们结合不同类型的图形来具体分析这个流程。<br /><br /><span style="FONT-WEIGHT: bold">五、饼图</span><br />饼图的dataset 一般是用PieDataset 接口，具体实现类是 DefaultPieDataset<br />1、创建一个数据源（dataset）：<br />private static PieDataset createDataset()<br />{<br />DefaultPieDataset defaultpiedataset = new DefaultPieDataset(); //注意是DefaultPieDataset！！<br />defaultpiedataset.setValue(”One”, new Double(43.200000000000003D));<br />defaultpiedataset.setValue(”Two”, new Double(10D));<br />defaultpiedataset.setValue(”Three”, new Double(27.5D));<br />defaultpiedataset.setValue(”Four”, new Double(17.5D));<br />return defaultpiedataset;<br />}<br />2、由ChartFactory 产生 JFreeChart 对象<br />private static JFreeChart createChart(PieDataset piedataset)<br />{<br />JFreeChart jfreechart = ChartFactory.createPieChart(”Pie Chart Demo 1″, //图形标题名称<br />piedataset, // dataset<br />true, // legend?<br />true, // tooltips?<br />false); //URLs?<br />PiePlot pieplot = (PiePlot)jfreechart.getPlot(); //通过JFreeChart 对象获得 plot：PiePlot！！<br />pieplot.setNoDataMessage(”No data available”); // 没有数据的时候显示的内容<br />return jfreechart;<br />}<br />一些重要的方法：<br />pieplot.setExplodePercent(0,0.3D) //把Lable 为”One” 的那一块”挖”出来30%<br />3、输出略<br /><br /><span style="FONT-WEIGHT: bold">六、柱状图</span><br />柱状图的dataset 一般是用CatagoryDataset接口(具体实现类是DefaultCategoryDataset),也会用 IntervalXYDataset<br />接口<br />1、创建一个数据源（dataset）：<br />private static CategoryDataset createDataset()<br />{<br />String series1 = “First”;<br />String series2 = “Second”;<br />String series3 = “Third”;<br />String category1 = “Category 1″;<br />String category2 = “Category 2″;<br />String category3 = “Category 3″;<br />String category4 = “Category 4″;<br />String category5 = “Category 5″;<br />DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();<br />defaultcategorydataset.addValue(1.0D, series1, category1);<br />defaultcategorydataset.addValue(4D, series1, category2);<br />defaultcategorydataset.addValue(3D, series1, category3);<br />defaultcategorydataset.addValue(5D, series1, category4);<br />defaultcategorydataset.addValue(5D, series1, category5);<br /><br />defaultcategorydataset.addValue(5D, series2, category1);<br />defaultcategorydataset.addValue(7D, series2, category2);<br />defaultcategorydataset.addValue(6D, series2, category3);<br />defaultcategorydataset.addValue(8D, series2, category4);<br />defaultcategorydataset.addValue(4D, series2, category5);<br /><br />defaultcategorydataset.addValue(4D, series3, category1);<br />defaultcategorydataset.addValue(3D, series3, category2);<br />defaultcategorydataset.addValue(2D, series3, category3);<br />defaultcategorydataset.addValue(3D, series3, category4);<br />defaultcategorydataset.addValue(6D, series3, category5);<br />return defaultcategorydataset;<br />}<br />2、由ChartFactory 产生 JFreeChart 对象<br />private static JFreeChart createChart(CategoryDataset categorydataset)<br />{<br /><font color="#000080"><font color="#0000ff">JFreeChart jfreechart = ChartFactory.createBarChart(<br />"Bar Chart Demo", <font color="#ff0000">//图形标题名称</font><br />"Category",<font color="#ff0000">//domain 轴 Lable这里先简单理解为横坐标Lable好了<br /></font>"Value", <font color="#ff0000">//range 轴 Lable这里也先简单理解为纵坐标Lable好了</font><br />categorydataset, <font color="#ff0000">// dataset</font><br />PlotOrientation.VERTICAL, <font color="#ff0000">//垂直显示</font><br />true, <font color="#ff0000">// legend?<br /></font>true, <font color="#ff0000">// tooltips?</font><br />false); </font><font color="#ff0000">//URLs?</font><br /></font>jfreechart.setBackgroundPaint(Color.white); //设定背景色为白色<br />CategoryPlot categoryplot = jfreechart.getCategoryPlot(); //获得 plot：CategoryPlot！！<br />categoryplot.setBackgroundPaint(Color.lightGray); <font color="#ff0000">//设定图表数据显示部分背景色<br /></font>categoryplot.setDomainGridlinePaint(Color.white); <font color="#ff0000">//横坐标网格线白色</font><br />categoryplot.setDomainGridlinesVisible(true); //可见<br />categoryplot.setRangeGridlinePaint(Color.white); <font color="#ff0000">//纵坐标网格线白色<br /></font><font color="#ff0000">//设置series1与category的显示位置；类似效果图<a href="http://www.chinabs.net/webimages/PieChart7.png">http://www.chinabs.net/webimages/PieChart7.png</a></font><br />categoryplot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);<br />categoryplot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT); <br /><br /><font color="#ff0000">//使纵坐标的最小单位格为整数</font><br />NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();<br />numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());<br /><br />BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); //获得renderer 注意这里是下嗍造型到BarRenderer！！<br /><font color="#ff0000">//显示每个柱的数值，并修改该数值的字体属性;类似效果图<a href="http://www.chinabs.net/webimages/PieChart6.png">http://www.chinabs.net/webimages/PieChart6.png</a><br /></font>barrenderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());<br />barrenderer.setItemLabelFont(new Font("黑体",Font.PLAIN,12));<br />barrenderer.setItemLabelsVisible(true);<br /><br />barrenderer.setDrawBarOutline(false); <font color="#ff0000">// Bar的外轮廓线不画</font><br />GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue,0.0F, 0.0F, new Color(0, 0, 64)); //设定特定颜色<br />GradientPaint gradientpaint1 = new GradientPaint(0.0F, 0.0F, Color.green,0.0F, 0.0F, new Color(0, 64, 0));<br />GradientPaint gradientpaint2 = new GradientPaint(0.0F, 0.0F, Color.red,0.0F, 0.0F, new Color(64, 0, 0));<br />barrenderer.setSeriesPaint(0, gradientpaint); //给series1 Bar设定上面定义的颜色<br />barrenderer.setSeriesPaint(1, gradientpaint1); //给series2 Bar 设定上面定义的颜色<br />barrenderer.setSeriesPaint(2, gradientpaint2); //给series3 Bar 设定上面定义的颜色<br />CategoryAxis categoryaxis = categoryplot.getDomainAxis(); //横轴上的 Lable 45度倾斜<br />categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);<br />return jfreechart;<br />}<br />一些重要的方法：（增加一块标记）<br />IntervalMarker intervalmarker = new IntervalMarker(4.5D, 7.5D);<br />intervalmarker.setLabel("Target Range");<br />intervalmarker.setLabelFont(new Font(”SansSerif”, 2, 11));<br />intervalmarker.setLabelAnchor(RectangleAnchor.LEFT);<br />intervalmarker.setLabelTextAnchor(TextAnchor.CENTER_LEFT);<br />intervalmarker.setPaint(new Color(222, 222, 255, 128));<br />categoryplot.addRangeMarker(intervalmarker, Layer.BACKGROUND);<br /><br /><span style="FONT-WEIGHT: bold">七、折线图</span><br />折线图的dataset 两种CatagoryDataset接口(具体实现类是DefaultCategoryDataset),XYDataset 接口<br />1、CatagoryDataset接口：<br />A、创建一个数据源（dataset）：<br />private static CategoryDataset createDataset()<br />{<br />String series1 = “First”;<br />String series2 = “Second”;<br />String series3 = “Third”;<br />String type1 = “Type 1″;<br />String type2 = “Type 2″;<br />String type3 = “Type 3″;<br />String type4 = “Type 4″;<br />String type5 = “Type 5″;<br />String type6 = “Type 6″;<br />String type7 = “Type 7″;<br />String type8 = “Type 8″;<br />DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();<br />defaultcategorydataset.addValue(1.0D, series1, type1);<br />defaultcategorydataset.addValue(4D, series1, type2);<br />defaultcategorydataset.addValue(3D, series1, type3);<br />defaultcategorydataset.addValue(5D, series1, type4);<br />defaultcategorydataset.addValue(5D, series1, type5);<br />defaultcategorydataset.addValue(7D, series1, type6);<br />defaultcategorydataset.addValue(7D, series1, type7);<br />defaultcategorydataset.addValue(8D, series1, type8);<br /><br />defaultcategorydataset.addValue(5D, series2, type1);<br />defaultcategorydataset.addValue(7D, series2, type2);<br />defaultcategorydataset.addValue(6D, series2, type3);<br />defaultcategorydataset.addValue(8D, series2, type4);<br />defaultcategorydataset.addValue(4D, series2, type5);<br />defaultcategorydataset.addValue(4D, series2, type6);<br />defaultcategorydataset.addValue(2D, series2, type7);<br />defaultcategorydataset.addValue(1.0D, series2, type8);<br /><br />defaultcategorydataset.addValue(4D, series3, type1);<br />defaultcategorydataset.addValue(3D, series3, type2);<br />defaultcategorydataset.addValue(2D, series3, type3);<br />defaultcategorydataset.addValue(3D, series3, type4);<br />defaultcategorydataset.addValue(6D, series3, type5);<br />defaultcategorydataset.addValue(3D, series3, type6);<br />defaultcategorydataset.addValue(4D, series3, type7);<br />defaultcategorydataset.addValue(3D, series3, type8);<br />return defaultcategorydataset;<br />}<br />B、由ChartFactory 产生 JFreeChart 对象 (与上面重复的部分就不再注释）<br />private static JFreeChart createChart(CategoryDataset categorydataset)<br />{<br />JFreeChart jfreechart = ChartFactory.createLineChart(”Line Chart Demo 1″,<br />“Type”,<br />“Value”,<br />categorydataset,<br />PlotOrientation.VERTICAL,<br />true,<br />true,<br />false);<br />jfreechart.setBackgroundPaint(Color.white);<br />CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();<br />categoryplot.setBackgroundPaint(Color.lightGray);<br />categoryplot.setRangeGridlinePaint(Color.white);<br />NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();<br />numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());<br />numberaxis.setAutoRangeIncludesZero(true);<br />//获得renderer 注意这里是下嗍造型到lineandshaperenderer！！<br />LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();<br />lineandshaperenderer.setShapesVisible(true); //series 点（即数据点）可见<br />lineandshaperenderer.setSeriesStroke(0, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {<br />10F, 6F<br />}, 0.0F)); //定义series为”First”的（即series1）点之间的连线 ，这里是虚线，默认是直线<br />lineandshaperenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {<br />6F, 6F<br />}, 0.0F)); //定义series为”Second”的（即series2）点之间的连线<br />lineandshaperenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {<br />2.0F, 6F<br />}, 0.0F)); //定义series为”Third”的（即series3）点之间的连线<br />return jfreechart;<br />}<br />一些重要的方法：<br />lineandshaperenderer.setLineVisible(true) //series 点（即数据点）间有连线可见<br />2、XYDataset 接口：<br />A、创建一个数据源（dataset）：<br />private static XYDataset createDataset()<br />{<br />XYSeries xyseries = new XYSeries(”First”); //先产生XYSeries 对象<br />xyseries.add(1.0D, 1.0D);<br />xyseries.add(2D, 4D);<br />xyseries.add(3D, 3D);<br />xyseries.add(4D, 5D);<br />xyseries.add(5D, 5D);<br />xyseries.add(6D, 7D);<br />xyseries.add(7D, 7D);<br />xyseries.add(8D, 8D);<br /><br />XYSeries xyseries1 = new XYSeries(”Second”);<br />xyseries1.add(1.0D, 5D);<br />xyseries1.add(2D, 7D);<br />xyseries1.add(3D, 6D);<br />xyseries1.add(4D, 8D);<br />xyseries1.add(5D, 4D);<br />xyseries1.add(6D, 4D);<br />xyseries1.add(7D, 2D);<br />xyseries1.add(8D, 1.0D);<br /><br />XYSeries xyseries2 = new XYSeries(”Third”);<br />xyseries2.add(3D, 4D);<br />xyseries2.add(4D, 3D);<br />xyseries2.add(5D, 2D);<br />xyseries2.add(6D, 3D);<br />xyseries2.add(7D, 6D);<br />xyseries2.add(8D, 3D);<br />xyseries2.add(9D, 4D);<br />xyseries2.add(10D, 3D);<br /><br />XYSeriesCollection xyseriescollection = new XYSeriesCollection(); //再用XYSeriesCollection添加入XYSeries 对象<br />xyseriescollection.addSeries(xyseries);<br />xyseriescollection.addSeries(xyseries1);<br />xyseriescollection.addSeries(xyseries2);<br />return xyseriescollection;<br />}<br />B、由ChartFactory 产生 JFreeChart 对象<br />private static JFreeChart createChart(XYDataset xydataset)<br />{<br />JFreeChart jfreechart = ChartFactory.createXYLineChart(”Line Chart Demo 2″,<br />“X”,<br />“Y”,<br />xydataset,<br />PlotOrientation.VERTICAL,<br />true,<br />true,<br />false);<br />jfreechart.setBackgroundPaint(Color.white);<br />XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //获得 plot：XYPlot！！<br />xyplot.setBackgroundPaint(Color.lightGray); //设定图表数据显示部分背景色<br />xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //设定坐标轴与图表数据显示部分距离<br />xyplot.setDomainGridlinePaint(Color.white); //网格线颜色<br />xyplot.setRangeGridlinePaint(Color.white);<br />//获得 renderer 注意这里是XYLineAndShapeRenderer ！！<br />XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();<br />xylineandshaperenderer.setShapesVisible(true); //数据点可见<br />xylineandshaperenderer.setShapesFilled(true); //数据点被填充即不是空心点<br />NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();<br />numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());<br />return jfreechart;<br />}<br />一些重要的方法：<br />XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer();<br />xylineandshaperenderer.setSeriesLinesVisible(0, false); //第一个XYSeries数据点间连线不可见<br />xylineandshaperenderer.setSeriesShapesVisible(1, false); //第二个XYSeries数据点不可见<br />xyplot.setRenderer(xylineandshaperenderer);<br /><br /><span style="FONT-WEIGHT: bold">八、时间序列图</span><br />时间序列图和折线图很相似，不同的是它在 domain轴的数据是时间而不是数字。 时间序列图的dataset 是<br />XYDataset 接口，具体实现类是TimeSeriesCollection ，和上面类似，有TimeSeries 对象，它被添加入<br />TimeSeriesCollection 。<br />1、创建一个数据源（dataset）：<br />private static XYDataset createDataset()<br />{<br />TimeSeries timeseries = new TimeSeries(”L&amp;G European Index Trust”,Month.class);<br />timeseries.add(new Month(2, 2001), 181.8D);//这里用的是Month.class，同样还有Day.class Year.class 等等<br />timeseries.add(new Month(3, 2001), 167.3D);<br />timeseries.add(new Month(4, 2001), 153.8D);<br />timeseries.add(new Month(5, 2001), 167.6D);<br />timeseries.add(new Month(6, 2001), 158.8D);<br />timeseries.add(new Month(7, 2001), 148.3D);<br />timeseries.add(new Month(8, 2001), 153.9D);<br />timeseries.add(new Month(9, 2001), 142.7D);<br />timeseries.add(new Month(10, 2001), 123.2D);<br />timeseries.add(new Month(11, 2001), 131.8D);<br />timeseries.add(new Month(12, 2001), 139.6D);<br />timeseries.add(new Month(1, 2002), 142.9D);<br />timeseries.add(new Month(2, 2002), 138.7D);<br />timeseries.add(new Month(3, 2002), 137.3D);<br />timeseries.add(new Month(4, 2002), 143.9D);<br />timeseries.add(new Month(5, 2002), 139.8D);<br />timeseries.add(new Month(6, 2002), 137D);<br />timeseries.add(new Month(7, 2002), 132.8D);<br /><br />TimeSeries timeseries1 = new TimeSeries(”L&amp;G UK Index Trust”,Month.class);<br />timeseries1.add(new Month(2, 2001), 129.6D);<br />timeseries1.add(new Month(3, 2001), 123.2D);<br />timeseries1.add(new Month(4, 2001), 117.2D);<br />timeseries1.add(new Month(5, 2001), 124.1D);<br />timeseries1.add(new Month(6, 2001), 122.6D);<br />timeseries1.add(new Month(7, 2001), 119.2D);<br />timeseries1.add(new Month(8, 2001), 116.5D);<br />timeseries1.add(new Month(9, 2001), 112.7D);<br />timeseries1.add(new Month(10, 2001), 101.5D);<br />timeseries1.add(new Month(11, 2001), 106.1D);<br />timeseries1.add(new Month(12, 2001), 110.3D);<br />timeseries1.add(new Month(1, 2002), 111.7D);<br />timeseries1.add(new Month(2, 2002), 111D);<br />timeseries1.add(new Month(3, 2002), 109.6D);<br />timeseries1.add(new Month(4, 2002), 113.2D);<br />timeseries1.add(new Month(5, 2002), 111.6D);<br />timeseries1.add(new Month(6, 2002), 108.8D);<br />timeseries1.add(new Month(7, 2002), 101.6D);<br />TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();<br />timeseriescollection.addSeries(timeseries);<br />timeseriescollection.addSeries(timeseries1);<br />timeseriescollection.setDomainIsPointsInTime(true); //domain轴上的刻度点代表的是时间点而不是时间段<br />return timeseriescollection;<br />}<br />2、由ChartFactory 产生 JFreeChart 对象<br />private static JFreeChart createChart(XYDataset xydataset)<br />{<br />JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(”Legal &amp; General Unit Trust Prices”,<br />“Date”,<br />“Price Per Unit”,<br />xydataset,<br />true,<br />true,<br />false);<br />jfreechart.setBackgroundPaint(Color.white);<br />XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //获得 plot : XYPlot!!<br />xyplot.setBackgroundPaint(Color.lightGray);<br />xyplot.setDomainGridlinePaint(Color.white);<br />xyplot.setRangeGridlinePaint(Color.white);<br />xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));<br />xyplot.setDomainCrosshairVisible(true);<br />xyplot.setRangeCrosshairVisible(true);<br />org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer = xyplot.getRenderer();<br />if(xyitemrenderer instanceof XYLineAndShapeRenderer)<br />{<br />XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyitemrenderer;<br />xylineandshaperenderer.setDefaultShapesVisible(true); //数据点可见<br />xylineandshaperenderer.setDefaultShapesFilled(true); //数据点是实心点<br />}<br />DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis(); //对domain 轴上日期显示格式定义<br />dateaxis.setDateFormatOverride(new SimpleDateFormat(”MMM-yyyy”));<br />return jfreechart;<br />}<br />一些重要的方法：<br />A、增加标记线：<br />xyplot.addRangeMarker(new ValueMarker(550D)); //数值轴<br />Quarter quarter = new Quarter(2, 2002);<br />xyplot.addDomainMarker(new ValueMarker(quarter.getMiddleMillisecond())); //时间轴<br />B、数据点的调整<br />XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();<br />xylineandshaperenderer.setDefaultShapesVisible(true); //数据点可见<br />xylineandshaperenderer.setSeriesFillPaint(0, Color.red); //数据点填充为红色<br />xylineandshaperenderer.setSeriesFillPaint(1, Color.white); //数据点填充为白色<br />xylineandshaperenderer.setUseFillPaint(true); //应用<br />C、平均值曲线<br />这个曲线有什么用呢？很简单的例子，这里有一个以半年每天为单位的数据绘制的曲线，我们想看看以月为单位数据<br />的变化，这时就可以用到它了。<br />TimeSeries timeseries = createEURTimeSeries(); //就是以半年每天为单位的数据<br />TimeSeries timeseries1 = MovingAverage.createMovingAverage(timeseries,<br />“30 day moving average”,<br />30, //30天为一个周期<br />30); //最开始的30天跳过<br />TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();<br />timeseriescollection.addSeries(timeseries);<br />timeseriescollection.addSeries(timeseries1);<br />return timeseriescollection;<br /><br /><span style="FONT-WEIGHT: bold">九、总结一下</span><br />dataset plot renderer<br />饼图 PieDataset（DefaultPieDataset） PiePlot ——<br />柱状图 CatagoryDataset（DefaultCategoryDataset） CategoryPlot BarRenderer<br />折线图 CatagoryDataset（DefaultCategoryDataset） CategoryPlot LineAndShapeRenderer<br />XYDataset（XYSeriesCollection） XYPlot XYLineAndShapeRenderer<br />时间序列图 XYDataset （TimeSeriesCollection） XYPlot XYLineAndShapeRenderer<br />这里只是一些常用的方法，具体还是看API<br /><span style="FONT-WEIGHT: bold">十、Item Lable</span><br />这里以柱状图为例说明，具体来说就是在每个柱状上显示它的数据，具体有下面内容：<br />A、使 Item Lable 可见<br />B、调整 Item Lable 的颜色、字体等<br />C、调整 Item Lable 的位置<br />D、定制 Item Lable 的内容<br />1、分配一个 Lable Generator 给 renderer<br />BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer();<br />GategoryLableGenerator generator =new StandardGategoryLableGenerator(<br />“{2}”, new DecimalFormat(”0.00″) //调整显示的数字和字符格式<br />);<br />barrenderer.setLableGenerator(generator);<br />2、使 Item Lable 可见<br />barrenderer.setItemLableVisible(true);<br />3、调整 Item Lable 的颜色、字体等<br />barrenderer.setItemLablePaint(Color.red);<br />barrenderer.setItemLableFont(new Font(”SansSerif”,Font.PLAIN,10));<br />4、调整 Item Lable 的位置<br />这里涉及到一个新的对象 ItemLablePosition , ItemLablePosition的构造函数有两个或四个参数<br />public ItemLabelPosition(ItemLabelAnchor itemLabelAnchor,<br />org.jfree.ui.TextAnchor textAnchor,<br />org.jfree.ui.TextAnchor rotationAnchor,<br />double angle)<br />itemLabelAnchor - Item Lable 的位置 （最重要的！！）<br />textAnchor - Item Lable里包含的正文相对于Item Lable 的位置<br />rotationAnchor - Item Lable里包含的正文旋转的位置<br />angle - 旋转的角度<br />ItemLabelPosition itemlabelposition = new ItemLabelPosition(ItemLabelAnchor.INSIDE12,<br />TextAnchor.CENTER_RIGHT,<br />TextAnchor.CENTER_RIGHT,<br />-1.57D);<br />barrenderer.setPositiveItemLabelPosition(itemlabelposition);<br />这样就可以每个柱状上显示它的数据了，当然可以定制 Item Lable 的内容，比如 Item Lable text 超过100的才显示，这样就需要定制自己的类，它要实现GategoryLableGenerator 接口，实现generateItemLable()方法<br /></p><br /><p><font face="Arial">其他说明：<br />//设置Legend的位置<br />        //((JFreeChart) chart).getLegend().setPosition(RectangleEdge.RIGHT);<br />//设置最高的一个 Item 与图片顶端的距离<br />        plot.getRangeAxis().setUpperMargin(0.15);<br />        //设置最低的一个 Item 与图片底端的距离<br />        plot.getRangeAxis().setLowerMargin(0.15);<br />        //坐标轴字体<br />        plot.getDomainAxis().setLabelFont(new Font("宋体", Font.PLAIN, 12));<br />        //横轴每个分类的字体<br />        plot.getDomainAxis().setTickLabelFont(new Font("宋体", Font.BOLD, 12));<br />        if(labelPositionsUP_45)<br />            plot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_45);</font></p><p><font face="Arial">//柱图列宽度((BarRenderer) plot.getRenderer()).setMaximumBarWidth(barWidth);</font></p><img src ="http://www.blogjava.net/wyz191/aggbug/98364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-02-06 16:42 <a href="http://www.blogjava.net/wyz191/articles/98364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Pager-taglib 分页标签</title><link>http://www.blogjava.net/wyz191/articles/pager-taglib.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Mon, 05 Feb 2007 00:57:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/pager-taglib.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/97914.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/pager-taglib.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/97914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/97914.html</trackback:ping><description><![CDATA[
		<strong>一简介，</strong>
		<br />Pager-taglib，支持多种风格的分页显示。实际上她是一个Jsp标签库，为在JSP上显示分页信息而设计的一套标签，通过这些标签的不同的组合，会形成多种不一样的分页页面，风格各异，她自带的DEMO就有七种左右的分页风格，包括Google的分页风格。而需要订制自已的风格的分页页面也非常简单。 <br />分页方式有两种： <br />一种是从Action中得到一个List，在页面上通过&lt;pg:item&gt;进行自动分页。 <br />第二种是通过把 pageSize,pageNo两参数传给后台进行数据库分页。 
<p>我做两个Demo加以说明对比：</p><p><b>二、准备</b><br />把pager-taglib.jar放到lib目录下(仅此足亦，完全没必要改web.xml什么的，还有官方war包中的东西都可以不要) <br /></p><div class="code_title">代码</div><div class="code_div"><pre><span class="punct">&lt;%@</span><span class="string"> taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg" %&gt;</span></pre></div><p></p><p><b>三，jsp </b>（第一种分页方案由&lt;pg:item&gt;自行分页 ）</p><p></p><div class="code_title">代码</div><div class="code_div"><pre><span class="punct">&lt;%@</span><span class="string"> page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt;
<br />&lt;%</span><span class="punct">@</span><span class="ident">taglib</span><span class="ident">uri</span><span class="punct">="</span><span class="string">/WEB-INF/tld/c.tld</span><span class="punct">"</span><span class="ident">prefix</span><span class="punct">="</span><span class="string">c</span><span class="punct">"%&gt;</span><span class="string"><br />&lt;%@ taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg" %</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">html</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">head</span><span class="punct">&gt;&lt;/</span><span class="regex">head&gt;
<br />&lt;body&gt;
<br />&lt;pg:pager 
<br />url="</span><span class="punct">/</span><span class="constant">PageAction</span><span class="punct">.</span><span class="ident">do</span><span class="punct">"</span><span class="string"><br />index=</span><span class="punct">"</span><span class="ident">half</span><span class="punct">-</span><span class="ident">full</span><span class="punct">"</span><span class="string"><br />maxPageItems = </span><span class="punct">"</span><span class="number">3</span><span class="punct">"</span><span class="string"><br /> 	maxIndexPages=</span><span class="punct">"</span><span class="number">5</span><span class="punct">"</span><span class="string"><br />isOffset = </span><span class="punct">"&lt;%=</span><span class="string">false%&gt;" 
<br />    export </span><span class="punct">=</span><span class="punct">"</span><span class="string">pageOffset,currentPageNumber=pageNumber</span><span class="punct">"</span><br /><span class="ident">scope</span><span class="punct">=</span><span class="punct">"</span><span class="string">request</span><span class="punct">"&gt;</span><br /><br /><span class="punct">&lt;</span><span class="ident">table</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">c</span><span class="symbol">:forEach</span><span class="ident">items</span><span class="punct">="</span><span class="string">${userlist}</span><span class="punct">"</span><span class="ident">var</span><span class="punct">="</span><span class="string">user</span><span class="punct">"&gt;</span><br /><span class="punct">&lt;</span><span class="ident">pg</span><span class="symbol">:item</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">tr</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">td</span><span class="ident">height</span><span class="punct">="</span><span class="string">39</span><span class="punct">"&gt;</span><span class="global">${</span><span class="ident">user</span><span class="punct">.</span><span class="ident">userId</span><span class="punct">}&lt;/</span><span class="regex">td&gt;
<br />      &lt;td height="39"&gt;${user.username}&lt;</span><span class="punct">/</span><span class="ident">td</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">td</span><span class="ident">height</span><span class="punct">="</span><span class="string">39</span><span class="punct">"&gt;</span><span class="global">${</span><span class="ident">user</span><span class="punct">.</span><span class="ident">password</span><span class="punct">}&lt;/</span><span class="regex">td&gt;
<br />     &lt;</span><span class="punct">/</span><span class="ident">tr</span><span class="punct">&gt;</span><br /><span class="punct">&lt;/</span><span class="regex">pg:item&gt;
<br />&lt;</span><span class="punct">/</span><span class="ident">c</span><span class="symbol">:forEach</span><span class="punct">&gt;</span><br /><span class="punct">&lt;/</span><span class="regex">table&gt;  
<br />  &lt;pg:index&gt;
<br />    &lt;center&gt;
<br />    &lt;table border=0 cellpadding=0 width=10% cellspacing=0&gt;
<br />    &lt;tr align=center valign=top&gt;
<br />    &lt;td valign=bottom&gt;&lt;font face=arial,sans-serif
<br />      size=-1&gt;Result Page: &lt;</span><span class="punct">/</span><span class="ident">font</span><span class="punct">&gt;&lt;/</span><span class="regex">td&gt;
<br />    &lt;pg:prev ifnull="true"&gt;
<br />      &lt;% if (pageUrl != null) { %&gt;
<br />        &lt;td align=right&gt;&lt;A HREF="&lt;%= pageUrl %&gt;"&gt;&lt;IMG
<br />          SRC=http:</span><span class="punct">//</span><span class="ident">www</span><span class="punct">.</span><span class="ident">google</span><span class="punct">.</span><span class="ident">com</span><span class="punct">/</span><span class="ident">nav_previous</span><span class="punct">.</span><span class="ident">gif</span><span class="ident">alt</span><span class="punct">="</span><span class="string"></span><span class="punct">"</span><span class="ident">border</span><span class="punct">=</span><span class="number">0</span><span class="punct">&gt;&lt;</span><span class="ident">br</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">b</span><span class="punct">&gt;</span><span class="constant">Previous</span><span class="punct">&lt;/</span><span class="regex">b&gt;&lt;</span><span class="punct">/</span><span class="constant">A</span><span class="punct">&gt;&lt;/</span><span class="regex">td&gt;
<br />      &lt;% } else { %&gt;
<br />        &lt;td&gt;&lt;IMG SRC=http:</span><span class="punct">//</span><span class="ident">www</span><span class="punct">.</span><span class="ident">google</span><span class="punct">.</span><span class="ident">com</span><span class="punct">/</span><span class="ident">nav_first</span><span class="punct">.</span><span class="ident">gif</span><span class="ident">alt</span><span class="punct">="</span><span class="string"></span><span class="punct">"</span><span class="ident">border</span><span class="punct">=</span><span class="number">0</span><span class="punct">&gt;&lt;/</span><span class="regex">td&gt;
<br />      &lt;% } %&gt;
<br />    &lt;</span><span class="punct">/</span><span class="ident">pg</span><span class="symbol">:prev</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">pg</span><span class="symbol">:pages</span><span class="punct">&gt;</span><br /><span class="punct">&lt;%</span><span class="keyword">if</span><span class="punct">(</span><span class="ident">pageNumber</span><span class="punct">==</span><span class="ident">currentPageNumber</span><span class="punct">)</span><span class="punct">{</span><span class="punct">%&gt;</span><span class="string"><br />        &lt;td</span><span class="punct">&gt;&lt;</span><span class="constant">IMG</span><span class="constant">SRC</span><span class="punct">=</span><span class="ident">http</span><span class="punct">:/</span><span class="regex"></span><span class="punct">/</span><span class="ident">www</span><span class="punct">.</span><span class="ident">google</span><span class="punct">.</span><span class="ident">com</span><span class="punct">/</span><span class="ident">nav_current</span><span class="punct">.</span><span class="ident">gif</span><span class="ident">alt</span><span class="punct">="</span><span class="string"></span><span class="punct">"&gt;&lt;</span><span class="ident">br</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">font</span><span class="ident">color</span><span class="punct">=</span><span class="comment">#A90A08&gt;&lt;%=pageNumber%&gt;&lt;/font&gt;&lt;/td&gt;</span><br /><span class="punct">&lt;%</span><span class="punct">}</span><span class="keyword">else</span><span class="punct">{</span><span class="punct">%&gt;</span><span class="string"><br />        &lt;td</span><span class="punct">&gt;&lt;</span><span class="constant">A</span><span class="constant">HREF</span><span class="punct">="</span><span class="string">&lt;%=pageUrl%&gt;</span><span class="punct">"&gt;&lt;</span><span class="constant">IMG</span><br /><span class="constant">SRC</span><span class="punct">=</span><span class="ident">http</span><span class="punct">:/</span><span class="regex"></span><span class="punct">/</span><span class="ident">www</span><span class="punct">.</span><span class="ident">google</span><span class="punct">.</span><span class="ident">com</span><span class="punct">/</span><span class="ident">nav_page</span><span class="punct">.</span><span class="ident">gif</span><span class="ident">alt</span><span class="punct">="</span><span class="string"></span><span class="punct">"</span><span class="ident">border</span><span class="punct">=</span><span class="number">0</span><span class="punct">&gt;&lt;</span><span class="ident">br</span><span class="punct">&gt;</span><br /><span class="punct">&lt;%=</span><span class="string"> pageNumber %&gt;&lt;/A&gt;&lt;/td&gt;
<br />      &lt;% } %&gt;
<br />    &lt;/pg:pages&gt;
<br />    &lt;pg:next ifnull</span><span class="punct">="</span><span class="string">true</span><span class="punct">"&gt;</span><br /><span class="punct">&lt;%</span><span class="keyword">if</span><span class="punct">(</span><span class="ident">pageUrl</span><span class="punct">!=</span><span class="keyword">null</span><span class="punct">)</span><span class="punct">{</span><span class="punct">%&gt;</span><span class="string"><br />        &lt;td</span><span class="punct">&gt;&lt;</span><span class="constant">A</span><span class="constant">HREF</span><span class="punct">="</span><span class="string">&lt;%=pageUrl%&gt;</span><span class="punct">"&gt;&lt;</span><span class="constant">IMG</span><br /><span class="constant">SRC</span><span class="punct">=</span><span class="ident">http</span><span class="punct">:/</span><span class="regex"></span><span class="punct">/</span><span class="ident">www</span><span class="punct">.</span><span class="ident">google</span><span class="punct">.</span><span class="ident">com</span><span class="punct">/</span><span class="ident">nav_next</span><span class="punct">.</span><span class="ident">gif</span><span class="ident">alt</span><span class="punct">="</span><span class="string"></span><span class="punct">"</span><span class="ident">border</span><span class="punct">=</span><span class="number">0</span><span class="punct">&gt;&lt;</span><span class="ident">br</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">b</span><span class="punct">&gt;</span><span class="constant">Next</span><span class="punct">&lt;/</span><span class="regex">b&gt;&lt;</span><span class="punct">/</span><span class="constant">A</span><span class="punct">&gt;&lt;/</span><span class="regex">td&gt;
<br />      &lt;% } else { %&gt;
<br />        &lt;td&gt;&lt;IMG SRC=http:</span><span class="punct">//</span><span class="ident">www</span><span class="punct">.</span><span class="ident">google</span><span class="punct">.</span><span class="ident">com</span><span class="punct">/</span><span class="ident">nav_last</span><span class="punct">.</span><span class="ident">gif</span><span class="ident">alt</span><span class="punct">="</span><span class="string"></span><span class="punct">"</span><span class="ident">border</span><span class="punct">=</span><span class="number">0</span><span class="punct">&gt;&lt;/</span><span class="regex">td&gt;
<br />      &lt;% } %&gt;
<br />    &lt;</span><span class="punct">/</span><span class="ident">pg</span><span class="symbol">:next</span><span class="punct">&gt;</span><br /><span class="punct">&lt;/</span><span class="regex">tr&gt;
<br />    &lt;</span><span class="punct">/</span><span class="ident">table</span><span class="punct">&gt;</span><br /><span class="punct">&lt;/</span><span class="regex">center&gt;
<br />  &lt;</span><span class="punct">/</span><span class="ident">pg</span><span class="symbol">:index</span><span class="punct">&gt;</span><br /><span class="punct">&lt;/</span><span class="regex">pg:pager&gt;
<br />&lt;</span><span class="punct">/</span><span class="ident">body</span><span class="punct">&gt;&lt;/</span><span class="regex">html&gt;</span></pre></div><p></p><p><b>四．标签讲解：从页面里可以看到，这里使用了几个标签</b></p><p>1、&lt;pg:pager&gt;,在这个标签库里就充当着一个领袖的作用，一切子标签都在它里面工作。就以上出现的参数进行解释一下： <br />items：数据的纪录数 <br />maxPageItems：显示最多的纪录数/页 <br />maxIndexPages：显示最多的分页数/次，如设为5的话，则会出现这样的情况 1 2 3 4 5 .或 3 4 5 6 7 这样的形式，其实她自带的DEMO都喜欢把页数展现出来排成一排。 <br />isOffset：与pg:item配套使用 <br />export：这个属性比较重要，文档也对此作好相对长篇幅的说明。这个属性是让标签给你暴露什么变量，当然这些变量是有选择的，如在Pager标签里，可以暴露出来的变量有pageOffset及pageNumber，即页码偏移量及页码。通过这两个变量名，可以在Jsp或Java里面从Request里获得。Export属性接受的值还有表达式，如currentPage=pageNumber表示，把pageNumber的值暴露出来，并赋给一个叫CurrentPage的变量，这个变量将被保存到Request中，在Jsp或Java中可以得到。 <br />scope：咳。还需要讲么？</p><p>2、&lt;pg:param&gt;这个标签很有用，用来设置将要加入到URL的参数。使用Name属性指定即可。在这个Demo中我们还没有用的参数传递，下一个Demo你会看到它的用法。</p><p>3、&lt;pg:index&gt;这个标签说明分页条显示的内容，在这里你可以设置各种风格的分页显示方式，本例是google风格的分页条。 <br />4, &lt;pg:prev&gt; , &lt;pg:pages&gt;,&lt;pg:next&gt;这些标签都是导航标签顾名思义,你一看例子就明白了，我就不用讲了吧。</p><p>五，第二种分页方案 <br />与页面自行分页不同的是还需要给后台传两个参数， <br />一个是pageNo（当前页数） <br />可以在每一个PageUrl后面都加了&amp;pageNo=&lt;%= pageNumber %&gt;。让我们的URL带上页码的参数，这样程序可以拿到页码去查找所需要的数据，你可以去比较一下两Demo的代码。OK，另一个参数是pagesize,这个原本可以在url=”/PageAction.do?pagesize=5来做可是，&lt;pg&gt;标签不支持这样做它给我们提供了另一个传递变量的方法，对了就是我前面标签讲解中所提到过的标&lt;pg:param&gt;</p><p></p><div class="code_title">代码</div><div class="code_div"><pre><span class="punct">&lt;</span><span class="ident">pg</span><span class="symbol">:pager</span><span class="ident">items</span><span class="punct">="</span><span class="string">${totalRows} </span><span class="punct">"</span><span class="ident">url</span><span class="punct">="</span><span class="string">/PageAction.do?pagesize=5</span><span class="punct">"</span></pre></div><br />这样传递参数不对，应该写成： <br /><div class="code_title">代码</div><div class="code_div"><pre><span class="punct">&lt;</span><span class="ident">pg</span><span class="symbol">:pager</span><span class="ident">items</span><span class="punct">="</span><span class="string">${totalRows}</span><span class="punct">"</span><span class="ident">url</span><span class="punct">="</span><span class="string">/PageAction.do</span><span class="punct">"</span><span class="ident">maxIndexPages</span><span class="punct">="</span><span class="string">5</span><span class="punct">"&gt;</span><br /><span class="punct">&lt;</span><span class="ident">pg</span><span class="symbol">:param</span><span class="ident">name</span><span class="punct">="</span><span class="string"> pagesize </span><span class="punct">"</span><span class="ident">value</span><span class="punct">="</span><span class="string">5</span><span class="punct">"</span><span class="punct">/&gt;</span></pre></div>另外由于不需要在页面分页所在&lt;pg:param&gt;要去调 <br />再就是&lt;pg:pager&gt;要有items属性 
<p></p><p>六．以下是Demo代码</p><p></p><div class="code_title">代码</div><div class="code_div"><pre><span class="punct">&lt;</span><span class="ident">pg</span><span class="symbol">:pager</span><br /><span class="ident">items</span><span class="punct">="</span><span class="string">${ totalRows }</span><span class="punct">"</span><br /><span class="ident">url</span><span class="punct">="</span><span class="string">/PageAction.do</span><span class="punct">"</span><br /><span class="ident">index</span><span class="punct">="</span><span class="string">half-full</span><span class="punct">"</span><br /><span class="ident">maxPageItems</span><span class="punct">=</span><span class="punct">"</span><span class="string">5</span><span class="punct">"</span><br /><span class="ident">maxIndexPages</span><span class="punct">="</span><span class="string">10</span><span class="punct">"</span><span class="ident">isOffset</span><span class="punct">=</span><span class="punct">"</span><span class="string">&lt;%=false%&gt;</span><span class="punct">"</span><br /><span class="ident">export</span><span class="punct">=</span><span class="punct">"</span><span class="string">pageOffset,currentPageNumber=pageNumber</span><span class="punct">"</span><br /><span class="ident">scope</span><span class="punct">=</span><span class="punct">"</span><span class="string">request</span><span class="punct">"&gt;</span><br /><span class="punct">&lt;</span><span class="ident">pg</span><span class="symbol">:param</span><span class="ident">name</span><span class="punct">="</span><span class="string">pagesize</span><span class="punct">"</span><span class="ident">value</span><span class="punct">="</span><span class="string">5</span><span class="punct">"</span><span class="punct">/&gt;</span><br /><br /><span class="punct">&lt;</span><span class="ident">table</span><span class="ident">align</span><span class="punct">="</span><span class="string">center</span><span class="punct">"&gt;</span><br /><span class="punct">&lt;</span><span class="ident">c</span><span class="symbol">:forEach</span><span class="ident">items</span><span class="punct">="</span><span class="string">${userlist}</span><span class="punct">"</span><span class="ident">var</span><span class="punct">="</span><span class="string">user</span><span class="punct">"&gt;</span><br /><span class="punct">&lt;!--</span><span class="ident">pg</span><span class="symbol">:item</span><span class="punct">--&gt;</span><br /><span class="punct">&lt;</span><span class="ident">tr</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">td</span><span class="ident">height</span><span class="punct">="</span><span class="string">39</span><span class="punct">"&gt;</span><span class="global">${</span><span class="ident">user</span><span class="punct">.</span><span class="ident">userId</span><span class="punct">}&lt;/</span><span class="regex">td&gt;
<br />      &lt;td height="39"&gt;${user.username}&lt;</span><span class="punct">/</span><span class="ident">td</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">td</span><span class="ident">height</span><span class="punct">="</span><span class="string">39</span><span class="punct">"&gt;</span><span class="global">${</span><span class="ident">user</span><span class="punct">.</span><span class="ident">password</span><span class="punct">}&lt;/</span><span class="regex">td&gt;
<br />     &lt;</span><span class="punct">/</span><span class="ident">tr</span><span class="punct">&gt;</span><br /><span class="punct">&lt;!--/</span><span class="regex">pg:item--&gt;
<br />&lt;</span><span class="punct">/</span><span class="ident">c</span><span class="symbol">:forEach</span><span class="punct">&gt;</span><br /><span class="punct">&lt;/</span><span class="regex">table&gt; 
<br /> &lt;pg:index&gt;
<br />    &lt;center&gt;
<br />    &lt;table border=0 cellpadding=0 width=10% cellspacing=0&gt;
<br />    &lt;tr align=center valign=top&gt;
<br />    &lt;td valign=bottom&gt;&lt;font face=arial,sans-serif
<br />      size=-1&gt;Result Page: &lt;</span><span class="punct">/</span><span class="ident">font</span><span class="punct">&gt;&lt;/</span><span class="regex">td&gt;
<br />    &lt;pg:prev ifnull="true"&gt;
<br />      &lt;% if (pageUrl != null) { %&gt;
<br />        &lt;td align=right&gt;&lt;A HREF="&lt;%=pageUrl%&gt;&amp;pageNo=&lt;%=pageNumber%&gt;"&gt;&lt;IMG
<br />          SRC=http:</span><span class="punct">//</span><span class="ident">www</span><span class="punct">.</span><span class="ident">google</span><span class="punct">.</span><span class="ident">com</span><span class="punct">/</span><span class="ident">nav_previous</span><span class="punct">.</span><span class="ident">gif</span><span class="ident">alt</span><span class="punct">="</span><span class="string"></span><span class="punct">"</span><span class="ident">border</span><span class="punct">=</span><span class="number">0</span><span class="punct">&gt;&lt;</span><span class="ident">br</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">b</span><span class="punct">&gt;</span><span class="constant">Previous</span><span class="punct">&lt;/</span><span class="regex">b&gt;&lt;</span><span class="punct">/</span><span class="constant">A</span><span class="punct">&gt;&lt;/</span><span class="regex">td&gt;
<br />      &lt;% } else { %&gt;
<br />        &lt;td&gt;&lt;IMG SRC=http:</span><span class="punct">//</span><span class="ident">www</span><span class="punct">.</span><span class="ident">google</span><span class="punct">.</span><span class="ident">com</span><span class="punct">/</span><span class="ident">nav_first</span><span class="punct">.</span><span class="ident">gif</span><span class="ident">alt</span><span class="punct">="</span><span class="string"></span><span class="punct">"</span><span class="ident">border</span><span class="punct">=</span><span class="number">0</span><span class="punct">&gt;&lt;/</span><span class="regex">td&gt;
<br />      &lt;% } %&gt;
<br />    &lt;</span><span class="punct">/</span><span class="ident">pg</span><span class="symbol">:prev</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">pg</span><span class="symbol">:pages</span><span class="punct">&gt;</span><br /><span class="punct">&lt;%</span><span class="keyword">if</span><span class="punct">(</span><span class="ident">pageNumber</span><span class="punct">==</span><span class="ident">currentPageNumber</span><span class="punct">)</span><span class="punct">{</span><span class="punct">%&gt;</span><span class="string"><br />        &lt;td</span><span class="punct">&gt;&lt;</span><span class="constant">IMG</span><span class="constant">SRC</span><span class="punct">=</span><span class="ident">http</span><span class="punct">:/</span><span class="regex"></span><span class="punct">/</span><span class="ident">www</span><span class="punct">.</span><span class="ident">google</span><span class="punct">.</span><span class="ident">com</span><span class="punct">/</span><span class="ident">nav_current</span><span class="punct">.</span><span class="ident">gif</span><span class="ident">alt</span><span class="punct">="</span><span class="string"></span><span class="punct">"&gt;&lt;</span><span class="ident">br</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">font</span><span class="ident">color</span><span class="punct">=</span><span class="comment">#A90A08&gt;&lt;%= pageNumber %&gt;&lt;/font&gt;&lt;/td&gt;</span><br /><span class="punct">&lt;%</span><span class="punct">}</span><span class="keyword">else</span><span class="punct">{</span><span class="punct">%&gt;</span><span class="string"><br />        &lt;td</span><span class="punct">&gt;&lt;</span><span class="constant">A</span><span class="constant">HREF</span><span class="punct">="</span><span class="string">&lt;%=pageUrl%&gt;&amp;pageNo=&lt;%=pageNumber%&gt;</span><span class="punct">"&gt;&lt;</span><span class="constant">IMG</span><br /><span class="constant">SRC</span><span class="punct">=</span><span class="ident">http</span><span class="punct">:/</span><span class="regex"></span><span class="punct">/</span><span class="ident">www</span><span class="punct">.</span><span class="ident">google</span><span class="punct">.</span><span class="ident">com</span><span class="punct">/</span><span class="ident">nav_page</span><span class="punct">.</span><span class="ident">gif</span><span class="ident">alt</span><span class="punct">="</span><span class="string"></span><span class="punct">"</span><span class="ident">border</span><span class="punct">=</span><span class="number">0</span><span class="punct">&gt;&lt;</span><span class="ident">br</span><span class="punct">&gt;</span><br /><span class="punct">&lt;%=</span><span class="string">pageNumber%&gt;&lt;/A&gt;&lt;/td&gt;
<br />      &lt;% } %&gt;
<br />    &lt;/pg:pages&gt;
<br />    &lt;pg:next ifnull</span><span class="punct">="</span><span class="string">true</span><span class="punct">"&gt;</span><br /><span class="punct">&lt;%</span><span class="keyword">if</span><span class="punct">(</span><span class="ident">pageUrl</span><span class="punct">!=</span><span class="keyword">null</span><span class="punct">)</span><span class="punct">{</span><span class="punct">%&gt;</span><span class="string"><br />        &lt;td</span><span class="punct">&gt;&lt;</span><span class="constant">A</span><span class="constant">HREF</span><span class="punct">="</span><span class="string">&lt;%=pageUrl%&gt;&amp;pageNo=&lt;%=pageNumber%&gt;</span><span class="punct">"&gt;&lt;</span><span class="constant">IMG</span><br /><span class="constant">SRC</span><span class="punct">=</span><span class="ident">http</span><span class="punct">:/</span><span class="regex"></span><span class="punct">/</span><span class="ident">www</span><span class="punct">.</span><span class="ident">google</span><span class="punct">.</span><span class="ident">com</span><span class="punct">/</span><span class="ident">nav_next</span><span class="punct">.</span><span class="ident">gif</span><span class="ident">alt</span><span class="punct">="</span><span class="string"></span><span class="punct">"</span><span class="ident">border</span><span class="punct">=</span><span class="number">0</span><span class="punct">&gt;&lt;</span><span class="ident">br</span><span class="punct">&gt;</span><br /><span class="punct">&lt;</span><span class="ident">b</span><span class="punct">&gt;</span><span class="constant">Next</span><span class="punct">&lt;/</span><span class="regex">b&gt;&lt;</span><span class="punct">/</span><span class="constant">A</span><span class="punct">&gt;&lt;/</span><span class="regex">td&gt;
<br />      &lt;% } else { %&gt;
<br />        &lt;td&gt;&lt;IMG SRC=http:</span><span class="punct">//</span><span class="ident">www</span><span class="punct">.</span><span class="ident">google</span><span class="punct">.</span><span class="ident">com</span><span class="punct">/</span><span class="ident">nav_last</span><span class="punct">.</span><span class="ident">gif</span><span class="ident">alt</span><span class="punct">="</span><span class="string"></span><span class="punct">"</span><span class="ident">border</span><span class="punct">=</span><span class="number">0</span><span class="punct">&gt;&lt;/</span><span class="regex">td&gt;
<br />      &lt;% } %&gt;
<br />    &lt;</span><span class="punct">/</span><span class="ident">pg</span><span class="symbol">:next</span><span class="punct">&gt;</span><br /><span class="punct">&lt;/</span><span class="regex">tr&gt;
<br />    &lt;</span><span class="punct">/</span><span class="ident">table</span><span class="punct">&gt;</span><br /><span class="punct">&lt;/</span><span class="regex">center&gt;
<br />  &lt;</span><span class="punct">/</span><span class="ident">pg</span><span class="symbol">:index</span><span class="punct">&gt;</span><br /><span class="punct">&lt;/</span><span class="regex">pg:pager&gt;<br /><a href="http://www.javaeye.com/t/25147.html">http://www.javaeye.com/t/25147.html</a></span></pre></div><img src ="http://www.blogjava.net/wyz191/aggbug/97914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-02-05 08:57 <a href="http://www.blogjava.net/wyz191/articles/pager-taglib.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype.js 详解</title><link>http://www.blogjava.net/wyz191/articles/prototype.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Wed, 31 Jan 2007 11:08:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/prototype.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/97048.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/prototype.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/97048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/97048.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1. Programming Guide																		1.1. Prototype是什么?								1.2. 关联文章								1.3. 通用性方法																														1.3.1. 使用 $()方法												1.3.2. 使用$F()方法												1.3.3...&nbsp;&nbsp;<a href='http://www.blogjava.net/wyz191/articles/prototype.html'>阅读全文</a><img src ="http://www.blogjava.net/wyz191/aggbug/97048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-01-31 19:08 <a href="http://www.blogjava.net/wyz191/articles/prototype.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR级联下拉列表</title><link>http://www.blogjava.net/wyz191/articles/90562.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Thu, 28 Dec 2006 10:48:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/90562.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/90562.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/90562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/90562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/90562.html</trackback:ping><description><![CDATA[
		<p>
				<br />
				<font size="2">
						<font size="3">
								<strong>
										<font color="#ff0000">访问数据库的部分：</font>
										<br />
										<br />
										<br />
								</strong>
						</font>
						<font color="#a52a2a">/*<br />  * 获取所有大类的类别列表<br />  */</font>
						<br />public static Map getAccessoriesBigTypeInfoMap(){<br />  <br />  Map map = new HashMap();<br />  List list = new ArrayList();<br />  Session session = SessionFactory.currentSession();<br />  Transaction tx = session.beginTransaction();<br />  <br />  try {<br />   <br />   list = session.createQuery("from AccessoriesTypeInfo where UPID is null or UPID = 0").list();<br />   for(int i=0;i&lt;list.size();i++){<br />            <br />      <font color="#0000ff">//---------这里只能采用这种形式，呵呵，为什么？？请去看ＤＷＲ的文档吧</font><br />    map.put(((AccessoriesTypeInfo)list.get(i)).getId(),((AccessoriesTypeInfo)list.get(i)).getTypename());<br />   }<br />   tx.commit();<br />  } catch (Exception e) {<br />   log.error("AccessoriesTypeInfoDAO.getAccessoriesBigTypeInfoList() failed!!!"+e.getMessage());<br />   if(tx != null) tx.rollback();<br />  }finally{<br />   if(session != null) session.close();<br />  }<br />  return map;<br /> }<br /><br /><font color="#a52a2a">/*<br />  * 获取指定大类下的小类类别列表<br />  *String upid:大类ID<br />  */</font><br />public static Map getAccessoriesSmallTypeInfoMap(String upid){<br />  <br />  Map map = new HashMap();<br />  List list = new ArrayList();<br />  Session session = SessionFactory.currentSession();<br />  Transaction tx = session.beginTransaction();<br />  <br />  try {<br />   <br />   int id = Integer.parseInt(upid);<br />   list = session.createSQLQuery("select {t.*} from AccessoriesTypeInfo t where t.UPID = ?").addEntity("t",AccessoriesTypeInfo.class).setInteger(0,id).list();<br />   for(int i=0;i&lt;list.size();i++){<br />    map.put(((AccessoriesTypeInfo)list.get(i)).getId(),((AccessoriesTypeInfo)list.get(i)).getTypename());<br />   }<br />   tx.commit();<br />  } catch (Exception e) {<br />   log.error("AccessoriesTypeInfoDAO.getAccessoriesBigTypeInfoList() failed!!!"+e.getMessage());<br />   if(tx != null) tx.rollback();<br />  }finally{<br />   if(session != null) session.close();<br />  }<br />  return map;<br /> }<br /><br /><br /><strong><font color="#ff0000" size="3">信息显示页：</font></strong><br /><br /><br />&lt;%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %&gt;<br />&lt;%@ page import="java.util.List"%&gt;</font>
		</p>
		<p>
				<font size="2">&lt;script type='text/javascript' src='/qcbst/dwr/interface/JDate.js'&gt;&lt;/script&gt;<br /> &lt;script type='text/javascript' src='/qcbst/dwr/engine.js'&gt;&lt;/script&gt;<br /> &lt;script type='text/javascript' src='/qcbst/dwr/util.js'&gt;&lt;/script&gt;<br /> &lt;script type='text/javascript' src='/qcbst/dwr/interface/AccessoriesType.js'&gt;&lt;/script&gt;<br />&lt;script type="text/javascript" src="../../js/clearspace.js"&gt;&lt;/script&gt;<br />&lt;script language="javascript"&gt;</font>
		</p>
		<p>
				<font size="2"> function selectAorigin(o){<br />  <br />     var big = document.getElementById("bigcategories");<br />   var small = document.getElementById("smallcategories");<br />   big.length=1;<br />   small.length=1;   <br />   big.options[0].selected=true;<br />   small.options[0].selected=true;<br />   if(o == "0"){<br />  <br />  DWRUtil.removeAllOptions("bigcategories");   <font color="#0000ff">//----------移除下拉列表中的内容</font><br />  DWRUtil.removeAllOptions("smallcategories");<br />  DWRUtil.addOptions("bigcategories",{0:'选择大类'});<font color="#0000ff">//----------设置一个初始化的下拉列表内容<br /></font>  DWRUtil.addOptions("smallcategories",{0:'选择小类'});<br />     big.length=1;<br />    small.length=1;   <br />    big.options[0].selected=true;<br />    small.options[0].selected=true;<br />   }else{<br />         <br />      <font color="#0000ff">//-----------将AccessoriesType.getAccessoriesBigTypeInfoMap()取得的信息给getABigInfo()</font><br />   AccessoriesType.getAccessoriesBigTypeInfoMap(getABigInfo);<br />  }<br /> }<br /> function getABigInfo(d){<br />  <br />  DWRUtil.addOptions("bigcategories",d);<br /> }<br /> <br /> <br /> function selectAbigcategories(brand){</font>
		</p>
		<p>
				<font size="2">   var small = document.getElementById("smallcategories");<br />   small.length=1; <br />   small.options[0].selected=true;<br />  if(brand == "0"){<br />  <br />  small.length=1; <br />   small.options[0].selected=true;<br />  }<br />  AccessoriesType.getAccessoriesSmallTypeInfoMap(getASmallInfo,brand);<br /> }<br /> function getASmallInfo(d){<br /> <br />  DWRUtil.addOptions("smallcategories",d);<br /> }<br /> <br /> function clearAInfo(){<br />  document.getElementById("accessoriesname").value="";<br /> }<br /> &lt;/script&gt;<br />&lt;form id="form1" name="form1" method="post" action="/qcbst/v_viewaccessoriesinfosearch1" style="0 0 0 0" target="_top"&gt;<br />                &lt;table width="150" border="0" cellspacing="5" cellpadding="0"&gt;<br />                  &lt;tr&gt;<br />                    &lt;td height="30" align="center"&gt;&lt;span class="STYLE1"&gt;请在下边进行精确搜索&lt;/span&gt;&lt;/td&gt;<br />                  &lt;/tr&gt;<br />                  &lt;tr&gt;<br />                    &lt;td align="center"&gt;&lt;select name="aarea" onChange="selectAorigin(this.value)"&gt;<br />                        &lt;option value="0" selected&gt;选择区域&lt;/option&gt;<br />                        &lt;option value="国产"&gt;国产&lt;/option&gt;<br />                        &lt;OPTION value="进口"&gt;进口&lt;/OPTION&gt;<br />                      &lt;/select&gt;<br />                    &lt;/td&gt;<br />                  &lt;/tr&gt;<br />                  &lt;tr&gt;<br />                    &lt;td align="center"&gt;&lt;select name="bigcategories" onChange="selectAbigcategories(this.value)"&gt;<br />                        &lt;option value="0" selected&gt;选择大类&lt;/option&gt;<br />                        <br />                      &lt;/select&gt;<br />                    &lt;/td&gt;<br />                  &lt;/tr&gt;<br />                  &lt;tr&gt;<br />                    &lt;td align="center"&gt;&lt;select name="smallcategories"&gt;<br />                        &lt;option value="0" selected&gt;选择小类&lt;/option&gt;<br />                      &lt;/select&gt;<br />                    &lt;/td&gt;<br />                  &lt;/tr&gt;<br />                  &lt;tr&gt;<br />                    &lt;td align="center"&gt;&lt;input name="accessoriesname" type="text" value="    配件名称" size="15" onFocus="clearAInfo()" /&gt;&lt;/td&gt;<br />                  &lt;/tr&gt;<br />                  &lt;tr&gt;<br />                    &lt;td align="center"&gt;&lt;input type="submit" name="Submit" value="开始精确查找" /&gt;&lt;/td&gt;<br />                  &lt;/tr&gt;<br />                &lt;/table&gt;<br />            &lt;/form&gt;<br /><br /><br /><strong><font color="#ff1493" size="3"><font color="#ff0000">WEB-INF下的DWR.XML:</font><br /><br /><br /></font></strong>&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />&lt;!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "</font>
				<a href="http://www.getahead.ltd.uk/dwr/dwr10.dtd">
						<font size="2">http://www.getahead.ltd.uk/dwr/dwr10.dtd</font>
				</a>
				<font size="2">"&gt; <br />&lt;dwr&gt; <br />&lt;allow&gt; <br />&lt;create creator="new" javascript="AccessoriesType"&gt; <br />&lt;param name="class" value="com.lvke.web.qcbst.dao.automobile.AccessoriesTypeInfoDAO"/&gt; <br />&lt;/create&gt; <br />&lt;/allow&gt; <br />&lt;/dwr&gt;<br /><br /></font>
		</p>
<img src ="http://www.blogjava.net/wyz191/aggbug/90562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2006-12-28 18:48 <a href="http://www.blogjava.net/wyz191/articles/90562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr  util.js 的使用</title><link>http://www.blogjava.net/wyz191/articles/90022.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Tue, 26 Dec 2006 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/90022.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/90022.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/90022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/90022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/90022.html</trackback:ping><description><![CDATA[
		<font size="2">
				<span class="title">DWR中的util.js</span>
		</font>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="entrycontent" valign="top">
										<span id="zoom">
												<ol>
														<li>
																<font size="2">$("id") 大概等价于<font face="Courier New">document.getElementById("id") 如果返回结果唯一的话返回该元素的值,不唯一则返回一个数组</font> .另外,如果单独使用util.js的话,可能在IE5以下的浏览器中无法正常使用,需要跟engine.js配合使用. 注意,这里得到的是一个对象,如果需要得到该对象的值的话,需要用innerHTML来取得.或者直接用<font face="Courier New">DWRUtil.getValue</font><font face="Verdana">("elementId")来取值.</font></font>
														</li>
														<li>
																<font size="2">
																		<font face="Courier New">DWRUtil.toDescriptiveString("elementId",debugLevel),这是一个debug用的函数.第一个参数是元素的id,第二个参数是debug等级,可以是0,1,2.随着等级增加,输出信息也会增加.注意这个函数只是一个debug工具,不要对它抱有太大幻想.</font>
																</font>
														</li>
														<li>
																<font size="2">
																		<font face="Courier New">DWRUtil.getText</font>("elementId"),返回一个select下拉菜单中的text值.仅适用于select类型的元素. </font>
														</li>
														<li>
																<font size="2">
																		<font face="Courier New">DWRUtil.getValue</font>("elementId"),返回一个元素的值,This method works for most HTML elements including selects (where the option with a matching value and not text is selected), input elements (including textareas) divs and spans </font>
														</li>
														<li>
																<font size="2">
																		<font face="Courier New">DWRUtil.getValues</font>({ div:null,<br />  textarea:null,<br />  select:null,<br />  text:null,<br />  password:null,<br />  formbutton:null,<br />  button:null<br />}),返回一个对象包含这些元素的值,暂时不知道做什么用的. </font>
														</li>
														<li>
																<font size="2">DWRUtil.onReturn(event, submitFunction) 定义在输入框中按回车的响应,防止执行submit. </font>
														</li>
														<li>
																<font face="Courier New" size="2">DWRUtil.addOptions() 一个重要的方法</font>
														</li>
												</ol>
										</span>
								</td>
						</tr>
				</tbody>
		</table>
		<div class="posted" align="right">
				<font size="2"> </font>
		</div>
		<div class="comments-title">
				<a name="comment">
				</a> </div>
		<div class="comments-body">
				<table width="100%">
						<tbody>
								<tr>
										<td valign="top">
												<font size="2">DWRUtil.getValues({ <br /> div:null,<br /> textarea:null,<br /> select:null,<br /> text:null,<br /> password:null,<br /> formbutton:null,<br /> button:null<br />}）<br /><br />这个函数可以自动取得页面上指定ID的值，并且返回一个，java中可以认识的map(Hashtable或HashMap)值.下面是我测试示例;<br /><br />页面：<br /><br />saveuser.htm<br /><br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;<br />saveUser<br />&lt;/title&gt;<br />&lt;!--dwr/engine.js是dwr的核心引擎脚本处理客户端调用的转换--&gt;<br />&lt;script src="/oblog312/dwr/interface/SaveUserAction.js" type="text/j avascript"&gt;&lt;/script&gt;<br />&lt;script src="/oblog312/dwr/engine.js" type="text/j avascript"&gt;&lt;/script&gt;<br />&lt;!--dwr/util.js包含了工具函数简化页面处理--&gt;<br />&lt;script src="/oblog312/dwr/util.js" type="text/j avascript"&gt;&lt;/script&gt;<br />&lt;script type="text/j avascript"&gt;<br />function saveuser() { <br />   //user = { id:"", firstName:"", lastName:"", birthday:"" };<br />   user = { id:null, firstName:null, lastName:null, birthday:null };<br />   var params = DWRUtil.getValues(user);<br />   alert(params);<br />   SaveUserAction.PutParams(params);<br />   alert("user.id:"+user.id);<br />   alert("user.firstName:"+user.firstName);<br />   alert("user.lastName:"+user.lastName);<br />   alert("user.birthday:"+user.birthday);<br />}<br />function hello(ok) { <br />   alert(ok);<br />}<br />&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body bgcolor="#ffffff"&gt;<br />&lt;form action="" id="userForm" name="userForm" method="POST"&gt;<br />ID:&lt;input type="text" id="id" name="id" /&gt;&lt;br /&gt;<br />姓：&lt;input type="text" id="firstName" name="firstName" /&gt;&lt;br /&gt;<br />名：&lt;input type="text" id="lastName" name="lastName" /&gt;&lt;br /&gt;<br />出生日期：&lt;input type="text" id="birthday" name="birthday" /&gt;&lt;br /&gt;<br />&lt;input type="submit" onclick="saveuser()"/&gt;<br />&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br /><br />action部分(SaveUserAction.java)：<br /><br />package com.action;<br /><br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.action.ActionForm;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import org.apache.struts.action.ActionForward;<br />import com.actionform.SaveUserActionForm;<br />import org.apache.struts.action.Action;<br />import java.util.*;<br /><br />public class SaveUserAction extends Action { <br />   public ActionForward execute(ActionMapping mapping, ActionForm form,<br />                                HttpServletRequest request,<br />                                HttpServletResponse response) { <br />       SaveUserActionForm saveUserActionForm = (SaveUserActionForm) form;<br />       throw new java.lang.UnsupportedOperationException(<br />               "Method $execute() not yet implemented.");<br />    }<br />   <br />   public String PutParams(Hashtable hash,HttpServletRequest request){ <br />       Enumeration hashenum = hash.keys();<br />       while (hashenum.hasMoreElements()) { <br />         String name = (String) hashenum.nextElement();<br />         System.out.println("name:"+name);<br />         String value = (String) hash.get(name);<br />         System.out.println("value:"+value);<br />        }        <br />       return "成功";<br />    }<br />   <br />}<br /><br /><br />重要的dwr.xml配置部分：<br /><br />   &lt;create creator="new" j avascript="SaveUserAction"&gt;<br />     &lt;param name="class" value="/oblog312/com.action.SaveUserAction"/&gt;<br />     &lt;include method="PutParams"/&gt;<br />   &lt;/create&gt;</font>
										</td>
										<td valign="top" align="right" width="55">
												<a href="http://www.gravatar.com/avatar.php?gravatar_id=1bf353b3b141e149c683df39863e3134&amp;default=http%3A%2F%2Fwww.bestunix.net%2Fimg%2Fgravatar.jpg" target="_blank">
														<font size="2">
														</font>
												</a>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<div class="comments-title"> </div>
		<div class="comments-body">
				<table width="100%">
						<tbody>
								<tr>
										<td valign="top">
												<font size="2">DWRUtil.addRows()的用法：<br />DWRUtil.addRows(”items”,items,cellFunctions); <br />第一个items,应该是table的id，第2个items，是远程返回的结果集,cellFunctions,对表格行填充的回调函数一类的。<br /><br />var cellFunctions = [ function(item) { return item.name; },<br />function(item) { return item.description; },<br />function(item) { return item.formattedPrice; },<br />function(item) { var btn = document.createElement(”button”); btn.innerHTML = “Add to cart”; btn.itemId = item.id; btn.onclick = addToCartButtonHandler; return btn; }<br />应该是一个function(item)就代表一列，return的就是传入的结果集的某列的内容。那么这个表格就应该有4列。最后一列是静态的html代码了。不过没研究一下，return回去动静混合的内容，就是一个字串会如何。我猜应该也可以吧。</font>
										</td>
										<td valign="top" align="right" width="55">
												<a href="http://www.gravatar.com/avatar.php?gravatar_id=1bf353b3b141e149c683df39863e3134&amp;default=http%3A%2F%2Fwww.bestunix.net%2Fimg%2Fgravatar.jpg" target="_blank">
														<font size="2">
														</font>
												</a>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<br />
		<div class="comments-title"> </div>
		<div class="comments-body">
				<table width="100%">
						<tbody>
								<tr>
										<td valign="top">
												<font size="2">先简单介绍一下什么是DWR<br /><br />DWR - Direct Web Remoting<br /><br /> ajax是一种提高web站点吸引力和实用性的书写web页面的方法。它从服务器端更新web页面的特殊区域，从而增强用户的交互性。它允许信息在短时间的延迟或不用刷新页面的情况下更新。<br /><br /> DWR减少了开发时间，也减少了一些可能的错误，这些错误是在提供常用的方法函数并消除一些与高交互性web站点有关的重复性代码的时候产生的。<br /><br /> DWR是作为开源软件(ASL verssion 2.0)而可以免费得到的。它凭借它的广阔的库、例子和指南非常易于实现。把它结合到一个现有的站点是非常简单的，同样它也可以简单地与大多数java框架结合。<br /><br /><br /><br />util.js  util.js包含了一些使用的方法，从而帮助你利用j avascript(可能)从服务器端更新你的web数据。<br /><br /> 你可以在DWR之外的地方使用它，因为它并不依赖与DWR而实现。<br /><br /> 它包含四个页面处理函数：getValue[s]()、setValue[s]()作用于除tables、lists和images以外的大多数html元素。getText()作用于select lists。<br /><br /> addRows()和removeAllRows()用于编辑tables。addOptions()和removeAllOptions()用于编辑lists(如：select lists、ul、ol)。<br /><br />$()<br /> $函数(在j avascript中，他的名字是合法的)的思想是从prototype引进的。一般说来，$ = document.getElementById。在以后你花大量时间进行ajax编程的时候，在合适的地方使用这种格式是很有益的。<br /><br /> '$'通过给定的ID在当前HTML页面找到元素，如果多于一个的参数被提交，它就会返回一个包含已找到元素的数组。这个函数从prototype的library中得到的灵感，而且，它还能更好的工作在不同的浏览器中。<br /><br /><br /><br />Generating Lists<br /><br /> DWR的一个功能可以给一个下拉列表(select list)添加选项，只需使用DWRUtil.addOptions()。<br /><br /> 如果你在更新列表之前，希望保留一些选项，你需要写以下一些代码：<br /><br />     var sel = DWRUtil.getValue(id);<br />     DWRUtil.removeAllOptions(id);<br />     DWRUtil.addOptions(id, ...);<br />     DWRUtil.setValue(id, sel);<br /><br /> 如果你想有个初始化选项，如：“please select”，你可以直接使用：<br /><br />     DWRUtil.addOptions(id, ["Please select"]);<br /><br />DWRUtil.addOptions 有5种调用方法：Array: DWRUtil.addOptions(selectid, array) 。selectid为目标ID,array为每一项的text。<br /><br />Array of objects (option text = option value): DWRUtil.addOptions(selectid, data, prop) 用text和value的集合来为每一个数组元素创建一个选项，pro参数指定text和value的值。<br /><br />Array of objects (with differing option text and value): DWRUtil.addOptions(selectid, array, valueprop, textprop) 用text和value的集合来为每一个数组元素创建一个选项，valueprop确定value，textprop确定text。<br /><br />Object: DWRUtil.addOptions(selectid, map, reverse) 为map中每一个属性(property)创建一个选项，属性名作为选项的value，属性的value作为选项的text。这样做看起来是错的，但实际上这种做法的确是正确的。如果reverse参数被设置为true，则属性的value还是被用做选项的value。<br /><br />Map of objects: DWRUtil.addOptions(selectid, map, valueprop, textprop) 为map中的每一个对象创建一个选项，valueprop指定选项的value，textprop指定选项的text。<br /><br /><br /><br />Generating Tables<br /><br />DWRUtil.addRows() 从一个数组(第二个参数)取得值，创建table的每一行。从另一个数组(第三个参数)去得值，为table的每一行创建若干列。<br /><br /><br /><br />DWRUtil.getText(id)<br /><br />可以根据id取得text的值，这个方法只能用于select list<br /><br />DWRUtil.getValue(id)<br /><br />可以根据id取得value，使用这个方法，你不必在意div和select list的不同。<br /><br />DWRUtil.getValues()<br /><br />getValues() is similar to getValue() except that the input is a Javascript object that contains name/value pairs. The names are assumed to be the IDs of HTML elements, and the values are altered to reflect the contents of those IDs. This method does not return the object in question, it alters the value that you pass to it.<br /><br />这个方法和getValue()一样，只是它传入的是一个包含名字和数值的j avascript对象.这个名字就是HTML元素的ID。这个方法不会返回任何对象，它只会将ID的value映射给传入的value。例：<br /><br />function doGetValues() { <br /><br /> var text= "{ <br /> div:null,<br /> textarea:null,<br /> select:null,<br /> text:null,<br /> password:null,<br /> formbutton:null,<br /> button:null<br />}";<br /> var object = objectEval(text);    //j avascript对象<br /> DWRUtil.getValues(object);<br /> var reply = DWRUtil.toDescriptiveString(object, 2);   //toString<br /> reply = reply.replace(/n/g, "&lt;br/&gt;");                        //转意<br /> DWRUtil.setValue("getvaluesret", reply);                     //显示<br />}<br /><br /><br /><br />DWRUtil.onReturn<br /><br />贴一段代码，暂时不理解，用onReturn和不用有什么区别<br /><br />&lt;script&gt;<br />function submitFunction()<br />{ <br />   $("alert").style.display = "inline";<br />   setTimeout("unsubmitFunction();", 1000);<br />}<br />function unsubmitFunction()<br />{ <br />   $("alert").style.display = "none";<br />}<br />&lt;/script&gt;<br /><br />&lt;p&gt;&lt;input type="text" onkeydown="DWRUtil.onReturn(event, submitFunction)"/&gt;<br />&lt;input type="button" onclick="submitFunction()" value="GO"/&gt;<br />&lt;span id="alert" style="display:none; background:#FFFFDD; font-weight:bold;"&gt;submitFunction called&lt;/span&gt;<br />&lt;/p&gt;<br /><br /><br /><br />DWRUtil.selectRange<br /><br />在一个input box里选一个范围<br /><br />DWRUtil.selectRange("sel-test", $("start").value, $("end").value);<br /><br /><br /><br />DWRUtil.setValue(id, value)<br /><br />用ID找到元素，并更新value<br /><br />DWRUtil.setValues()<br /><br />和setValue(id,value)一样，只是它需要的参数是个j avascript对象，如：<br /><br />DWRUtil.setValues({ <br /> div: "new div content",<br /> password: "1234567890"<br />});<br /><br /><br /><br />DWRUtil.toDescriptiveString<br /><br />带debug信息的toString，第一个为将要debug的对象，第二个参数为处理等级。等级如下：<br /><br />0: Single line of debug 单行调试 <br />1: Multi-line debug that does not dig into child objects 不分析子元素的多行调试 <br />2: Multi-line debug that digs into the 2nd layer of child objects 最多分析到第二层子元素的多行调试 <br />And so on. Level 2 and greater probably produce too much output. <br /><br />总结：DWR不但屏蔽了许多client与server交互的重复且复杂的代码，而且还提供了一些常用的方法，一些思想还是从prototype继承而来，并有一定的改进。同时，它也考虑到了与struts、hibernate、spring的结合问题。<br /><br />需要注意的是，DWR是一种把服务器端的java代码通过j avascript直接从浏览器调用的方法(DWR is a way of calling Java code on the server directly from Javascript in the browser.)，而不是一个j avascript的库(Generally speaking DWR is not a generic JavaScript library so it does not attempt to provide fill this need. However this is one of these really useful functions to have around if you are doing Ajax work.)能做到怎么多，已经很难得了。<br /><br />DWR自04年11月草案提出到现在的Version 1.1 beta 3(2005-12-29)，已经更新发布了20多次了，但愿在ajax的发展大路上，能始终看见DWR的身影。<br /></font>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<font size="2">引自:http://www.bestunix.net/index.php</font>
<img src ="http://www.blogjava.net/wyz191/aggbug/90022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2006-12-26 09:13 <a href="http://www.blogjava.net/wyz191/articles/90022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jodd的使用</title><link>http://www.blogjava.net/wyz191/articles/90024.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Tue, 26 Dec 2006 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/90024.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/90024.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/90024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/90024.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/90024.html</trackback:ping><description><![CDATA[
		<p>jodd.jar<br />springside-joddform.jar</p>
		<p>//---------JSP页面<br />&lt;%@ taglib prefix="jodd" uri="<a href="http://www.springside.org.cn/jodd_form&quot;%">http://www.springside.org.cn/jodd_form"%</a>&gt;</p>
		<p>&lt;jodd:form bean="automobile" scope="session"&gt;<br />&lt;/jodd:form&gt;</p>
		<p>//---------后台<br />import jodd.bean.BeanUtil;<br />AutomobileSalesInfo automobile = new AutomobileSalesInfo();<br />BeanUtil.load(automobile, request);<br />   <br />有空完善```</p>
<img src ="http://www.blogjava.net/wyz191/aggbug/90024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2006-12-26 09:13 <a href="http://www.blogjava.net/wyz191/articles/90024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSCache分析 </title><link>http://www.blogjava.net/wyz191/articles/89859.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Mon, 25 Dec 2006 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/89859.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/89859.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/89859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/89859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/89859.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘要 														本文档介绍了如何在														Portlet												应用中使用														OSCache												进行页面内容缓存和对象缓存，分析了														OSCache												的实现原理，并提出了一个用来缓存对象和页面...&nbsp;&nbsp;<a href='http://www.blogjava.net/wyz191/articles/89859.html'>阅读全文</a><img src ="http://www.blogjava.net/wyz191/aggbug/89859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2006-12-25 11:53 <a href="http://www.blogjava.net/wyz191/articles/89859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在线编辑器一:FCKeditor在线编辑器</title><link>http://www.blogjava.net/wyz191/articles/FCKeditor.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Sat, 23 Dec 2006 04:52:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/FCKeditor.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/89651.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/FCKeditor.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/89651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/89651.html</trackback:ping><description><![CDATA[
		<div>
				<h4>
						<font size="2">FCKeditor在线编辑器的使用(jsp:html在线编辑器＝FCKeditor 2.2+FCKeditor.java 2.3 )</font>
				</h4>
				<p>
						<font size="2">引自：jack_booth的BLOG</font>
				</p>
				<p>
						<font size="2">html在线编辑器对于我们作新闻产品之类的程序是很重要的，在网上找录了好了好一段时间，发现FCKeditor,跨平台的，正在进行的jsp项目正需要这款html在线编辑器。试用了一下FCKeditor,根据网上的文章小结一下：<br /><br /><b>1.下载</b><br />FCKeditor.java 2.3 (FCKeditot for java)<br />FCKeditor 2.2 (FCKeditor基本文件)<br />以下是下载地址：<br /></font>
						<a title="http://www.fckeditor.net/download/default.html" href="http://www.fckeditor.net/download/default.html" target="_blank">
								<font color="#666600" size="2">http://www.fckeditor.net/download/default.html</font>
						</a>
						<br />
						<br />
						<font size="2">
								<b>2.建立项目:</b>
								<br />建立项目tomcat/webapps/TestFCKeditor.<br /><br /><b>3.将FCKeditor2.2解压缩</b><br />将FCKeditor2.2解压缩,将整个目录FCKeditor复制到项目的根目录下，<br />目录结构为：tomcat/webapps/TestFCKeditor/FCKeditor<br />然后将FCKeditor-2.3.zip（java）压缩包中\web\WEB-INF\lib\目录下的两个jar文件拷到项目的\WEB-INF\lib\目录下。把其中的src目录下的FCKeditor.tld文件copy到TestFCKedit/FCKeitor/WEB-INF/下<br /><br /><b>4.合并web.xml:</b><br />将FCKeditor-2.3.zip压缩包中\web\WEB-INF\目录下的web.xml文件合并到项目的\WEB-INF\目录下的web.xml文件中。<br /><br /><br /><b>5. 修改合并后的web.xml文件</b><br />修改合并后的web.xml文件，将名为SimpleUploader的Servlet的enabled参数值改为true，<br />以允许上传功能，Connector Servlet的baseDir参数值用于设置上传文件存放的位置。<br />添加标签定义:<br />&lt;taglib&gt;<br />&lt;taglib-uri&gt;/TestFCKeditor&lt;/taglib-uri&gt;<br />&lt;taglib-location&gt;/WEB-INF/FCKeditor.tld&lt;/taglib-location&gt;<br />&lt;/taglib&gt;<br /><br />运行图：<br /></font>
				</p>
				<div style="OVERFLOW-X: auto; WIDTH: 100%">
						<a href="http://www.java3z.com/cwbwebhome/article/article1/images/fckeditor.gif" target="_blank">
								<font size="2">
										<img alt="http://www.java3z.com/cwbwebhome/article/article1/images/fckeditor.gif " src="http://www.java3z.com/cwbwebhome/article/article1/images/fckeditor.gif" />
								</font>
						</a>
				</div>
				<p>
						<br />
						<br />
						<font size="2">
								<b>6. 映射:</b>
								<br />上面文件中两个servlet的映射分别为：/editor/filemanager/browser/default/connectors/jsp/connector<br />和/editor/filemanager/upload/simpleuploader，需要在两个映射前面加上/FCKeditor，<br />即改为/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector和<br />/FCKeditor/editor/filemanager/upload/simpleuploader。<br /><br /><b>7.修改skin文件夹</b><br />进入skin文件夹，如果你想使用fckeditor默认的这种奶黄色，<br />那就把除了default文件夹外的另两个文件夹直接删除.<br /><br /><b>8.删除无用文件</b><br />删除/FCKeditor/目录下除fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xml四个文件以外的所有文件<br />删除目录/editor/_source,<br />删除/editor/filemanager/browser/default/connectors/下的所有文件<br />删除/editor/filemanager/upload/下的所有文件<br />删除/editor/lang/下的除了fcklanguagemanager.js, en.js, zh.js, zh-cn.js四个文件的所有文件<br /><br /><b>9.修改配置：</b><br />打开/FCKeditor/fckconfig.js<br />修改 FCKConfig.DefaultLanguage = 'zh-cn' ;<br />把FCKConfig.LinkBrowserURL等的值替换成以下内容：<br />FCKConfig.LinkBrowserURL<br />= FCKConfig.BasePath + "filemanager/browser/default/browser.html?Connector=connectors/jsp/connector" ;<br /><br />FCKConfig.ImageBrowserURL<br />= FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Image&amp;Connector=connectors/jsp/connector" ;<br /><br />FCKConfig.FlashBrowserURL<br />= FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Flash&amp;Connector=connectors/jsp/connector" ;<br /><br />FCKConfig.LinkUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=File' ;<br />FCKConfig.FlashUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=Flash' ;<br />FCKConfig.ImageUploadURL = FCKConfig.BasePath + 'filemanager/upload/simpleuploader?Type=Image' ;<br /><br /><b>10.其它</b><br />fckconfig.js总配置文件，可用记录本打开，修改后将文件存为utf-8 编码格式。找到：<br /><br />FCKConfig.TabSpaces = 0 ; 改为FCKConfig.TabSpaces = 1 ; 即在编辑器域内可以使用Tab键。<br /><br />如果你的编辑器还用在网站前台的话，比如说用于留言本或是日记回复时，那就不得不考虑安全了，<br />在前台千万不要使用Default的toolbar，要么自定义一下功能，要么就用系统已经定义好的Basic，<br />也就是基本的toolbar，找到：<br />FCKConfig.ToolbarSets["Basic"] = [<br />['Bold','Italic','-','OrderedList','UnorderedList','-',/*'Link',*/'Unlink','-','Style','FontSize','TextColor','BGColor','-',<br />'Smiley','SpecialChar','Replace','Preview'] ] ;<br />这是改过的Basic，把图像功能去掉，把添加链接功能去掉，因为图像和链接和flash和图像按钮添加功能都能让前台<br />页直接访问和上传文件， fckeditor还支持编辑域内的鼠标右键功能。<br /><br />FCKConfig.ContextMenu = ['Generic',/*'Link',*/'Anchor',/*'Image',*/'Flash','Select','Textarea','Checkbox','Radio','TextField','HiddenField',<br />/*'ImageButton',*/'Button','BulletedList','NumberedList','TableCell','Table','Form'] ;<br /><br />这也是改过的把鼠标右键的“链接、图像，FLASH，图像按钮”功能都去掉。<br /><br />　　找到： FCKConfig.FontNames = 'Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;<br />加上几种我们常用的字体<br />FCKConfig.FontNames<br />= '宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;<br /><br /><b>11.添加文件</b><br />添加文件 /TestFCKeditor/test.jsp:<br />&lt;%@ page language="java" import="com.fredck.FCKeditor.*" %&gt;<br />&lt;%@ taglib uri="/TestFCKeditor" prefix="FCK" %&gt;<br />&lt;script type="text/javascript" src="/TestFCKeditor/FCKeditor/fckeditor.js"&gt;&lt;/script&gt;<br /><br />&lt;%--<br />三种方法调用FCKeditor<br />1.FCKeditor自定义标签 (必须加头文件 &lt;%@ taglib uri="/TestFCKeditor" prefix="FCK" %&gt; )<br />2.script脚本语言调用 (必须引用 脚本文件 &lt;script type="text/javascript" src="/TestFCKeditor/FCKeditor/fckeditor.js"&gt;&lt;/script&gt; )<br />3.FCKeditor API 调用 (必须加头文件 &lt;%@ page language="java" import="com.fredck.FCKeditor.*" %&gt; )<br />--%&gt;<br /><br />&lt;%--<br />&lt;form action="show.jsp" method="post" target="_blank"&gt;<br />&lt;FCK:editor id="content" basePath="/TestFCKeditor/FCKeditor/"<br />width="700"<br />height="500"<br />skinPath="/TestFCKeditor/FCKeditor/editor/skins/silver/"<br />toolbarSet = "Default"<br />&gt;<br />input<br />&lt;/FCK:editor&gt;<br />&lt;input type="submit" value="Submit"&gt;<br />&lt;/form&gt;<br />--%&gt;<br /><br />&lt;form action="show.jsp" method="post" target="_blank"&gt;<br />&lt;table border="0" width="700"&gt;&lt;tr&gt;&lt;td&gt;<br />&lt;textarea id="content" name="content" style="WIDTH: 100%; HEIGHT: 400px"&gt;input&lt;/textarea&gt;<br />&lt;script type="text/javascript"&gt;<br />var oFCKeditor = new FCKeditor('content') ;<br />oFCKeditor.BasePath = "/TestFCKeditor/FCKeditor/" ;<br />oFCKeditor.Height = 400;<br />oFCKeditor.ToolbarSet = "Default" ;<br />oFCKeditor.ReplaceTextarea();<br />&lt;/script&gt;<br />&lt;input type="submit" value="Submit"&gt;<br />&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;<br />&lt;/form&gt;<br /><br />&lt;%--<br />&lt;form action="show.jsp" method="post" target="_blank"&gt;<br />&lt;%<br />FCKeditor oFCKeditor ;<br />oFCKeditor = new FCKeditor( request, "content" ) ;<br />oFCKeditor.setBasePath( "/TestFCKeditor/FCKeditor/" ) ;<br />oFCKeditor.setValue( "input" );<br />out.println( oFCKeditor.create() ) ;<br />%&gt;<br />&lt;br&gt;<br />&lt;input type="submit" value="Submit"&gt;<br />&lt;/form&gt;<br />--%&gt;<br /><br />添加文件/TestFCKeditor/show.jsp:<br />&lt;%<br />String content = request.getParameter("content");<br />out.print(content);<br />%&gt;<br /><br /><b>12.测试</b><br />浏览</font>
						<a title="http://localhost:8080/TestFCKeditor/test.jsp" href="http://localhost:8080/TestFCKeditor/test.jsp" target="_blank">
								<font color="#666600" size="2">http://localhost:8080/TestFCKeditor/test.jsp</font>
						</a>
						<br />
						<font size="2">ok!<br /><br />感言：一直用的这个编辑器，只不过是从朋友那边整过来的，呵呵，已经改过的＜FCKeditor简化版＞，感觉非常好，用后，也没有仔细的看，研究它<img height="19" src="http://www.blogjava.net/Emoticons/emembarrassed.gif" width="19" border="0" />．偶发现这一篇文章，感觉不错，抱着学习的态度就引用过来了</font>
				</p>
		</div>
<img src ="http://www.blogjava.net/wyz191/aggbug/89651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2006-12-23 12:52 <a href="http://www.blogjava.net/wyz191/articles/FCKeditor.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSCacher的应用</title><link>http://www.blogjava.net/wyz191/articles/oscache.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Fri, 22 Dec 2006 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/oscache.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/89496.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/oscache.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/89496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/89496.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">OSCache是当前运用最广的缓存方案，JBoss,Hibernate,Spring等都对其有支持，<br />下面简单介绍一下OSCache的配置和使用过程。</font>
		</p>
		<p>
				<font size="2">1.安装过程<br />从</font>
				<a href="http://www.opensymphony.com/oscache/download.html">
						<font size="2">http://www.opensymphony.com/oscache/download.html</font>
				</a>
				<font size="2">下载合适的OSCache版本，<br />我下载的是oscache-2.0.2-full版本。<br />解压缩下载的文件到指定目录</font>
		</p>
		<p>
				<font size="2">从解压缩目录取得oscache.jar 文件放到 /WEB-INF/lib 或相应类库目录 目录中，<br />jar文件名可能含有版本号和该版本的发布日期信息等，如oscache-2.0.2-22Jan04.jar</font>
		</p>
		<p>
				<font size="2">如果你的jdk版本为1.3.x,建议在lib中加入Apache Common Lib 的commons-collections.jar包。<br />如jdk是1.4以上则不必</font>
		</p>
		<p>
				<font size="2">从src或etc目录取得oscache.properties 文件，放入src根目录或发布环境的/WEB-INF/classes 目录<br />如你需要建立磁盘缓存，须修改oscache.properties 中的cache.path信息 (去掉前面的#注释)。<br />win类路径类似为c:\\app\\cache<br />unix类路径类似为/opt/myapp/cache</font>
		</p>
		<p>
				<font size="2">拷贝OSCache标签库文件oscache.tld到/WEB-INF/classes目录。</font>
		</p>
		<p>
				<font size="2">现在你的应用目录类似如下：<br />$WEB_APPLICATION\WEB-INF\lib\oscache.jar<br />$WEB_APPLICATION\WEB-INF\classes\oscache.properties<br />$WEB_APPLICATION\WEB-INF\classes\oscache.tld</font>
		</p>
		<p>
				<br />
				<font size="2">将下列代码加入web.xml文件中<br />&lt;taglib&gt;<br />&lt;taglib-uri&gt;oscache&lt;/taglib-uri&gt;<br />&lt;taglib-location&gt;/WEB-INF/classes/oscache.tld&lt;/taglib-location&gt;<br />&lt;/taglib&gt; </font>
		</p>
		<p>
				<font size="2">为了便于调试日志输出，须加入commons-logging.jar和log4j-1.2.8.jar到当前类库路径中</font>
		</p>
		<p>
				<font size="2">在src目录加入下面两个日志输出配置文件：<br />log4j.properties 文件内容为：<br />log4j.rootLogger=DEBUG,stdout,file</font>
		</p>
		<p>
				<font size="2">log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br />log4j.appender.stdout.layout.ConversionPattern=[start]%d{yyyy/MM/dd/ HH:mm:ss}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n</font>
		</p>
		<p>
				<font size="2">
				</font> </p>
		<p>
				<font size="2">log4j.appender.file=org.apache.log4j.RollingFileAppender<br />log4j.appender.file.File=oscache.log<br />log4j.appender.file.MaxFileSize=100KB<br />log4j.appender.file.MaxBackupIndex=5<br />log4j.appender.file.layout=org.apache.log4j.PatternLayout<br />log4j.appender.file.layout.ConversionPattern=[start]%d{yyyy/MM/dd/ HH:mm:ss}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n</font>
		</p>
		<p>
				<br />
				<font size="2">log4j.logger.org.apache.commons=ERROR<br />log4j.logger.com.opensymphony.oscache.base=INFO</font>
		</p>
		<p>
				<br />
				<font size="2">commons-logging.properties 文件内容为</font>
		</p>
		<p>
				<font size="2">org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog</font>
		</p>
		<p>
				<font size="2">2.oscache.properties 文件配置向导 </font>
		</p>
		<p>
				<font size="2">cache.memory<br />值为true 或 false ，默认为在内存中作缓存，<br />如设置为false，那cache只能缓存到数据库或硬盘中，那cache还有什么意义：）</font>
		</p>
		<p>
				<font size="2">cache.capacity<br />缓存元素个数</font>
		</p>
		<p>
				<font size="2">cache.persistence.class<br />持久化缓存类，如此类打开，则必须设置cache.path信息</font>
		</p>
		<p>
				<font size="2">cache.cluster 相关<br />为集群设置信息。<br />如<br />cache.cluster.multicast.ip为广播IP地址<br />cache.cluster.properties为集群属性</font>
		</p>
		<p>
				<br />
				<font size="2">3.OSCache的基本用法</font>
		</p>
		<p>
				<font size="2">cache1.jsp 内容如下</font>
		</p>
		<p>
				<font size="2">&lt;%@ page import="java.util.*" %&gt;<br />&lt;%@ taglib uri="oscache" prefix="cache" %&gt;</font>
		</p>
		<p>
				<font size="2">&lt;html&gt;<br />&lt;body&gt;</font>
		</p>
		<p>
				<font size="2">没有缓存的日期: &lt;%= new Date() %&gt;&lt;p&gt;<br />&lt;!--自动刷新--&gt;<br />&lt;cache:cache time="30"&gt;<br />每30秒刷新缓存一次的日期: &lt;%= new Date() %&gt; <br />&lt;/cache:cache&gt;<br />&lt;!--手动刷新--&gt;<br />&lt;cache:cache key="testcache"&gt;<br />手动刷新缓存的日期: &lt;%= new Date() %&gt; &lt;p&gt;<br />&lt;/cache:cache&gt;<br />&lt;a href="/cache2.jsp"&gt;手动刷新&lt;/a&gt;</font>
		</p>
		<p>
				<font size="2">&lt;/body&gt;<br />&lt;/html&gt;</font>
		</p>
		<p>
				<font size="2">cache2.jsp 执行手动刷新页面如下<br />&lt;%@ taglib uri="oscache" prefix="cache" %&gt;</font>
		</p>
		<p>
				<font size="2">&lt;html&gt;<br />&lt;body&gt;</font>
		</p>
		<p>
				<font size="2">缓存已刷新...&lt;p&gt;</font>
		</p>
		<p>
				<font size="2">&lt;cache:flush key="testcache" scope="application"/&gt;</font>
		</p>
		<p>
				<font size="2">&lt;a href="/cache1.jsp"&gt;返回&lt;/a&gt;</font>
		</p>
		<p>
				<font size="2">&lt;/body&gt;<br />&lt;/html&gt;</font>
		</p>
		<p>
				<font size="2">OSCache库提供的flush标记能够刷新缓冲内容。我们可以把下面的代码加入到处理用户动作且可能影响这一区域的页面之中：</font>
		</p>
		<p>
				<font size="2">&lt;cache:flush key="testcache" scope="application"/&gt; </font>
		</p>
		<p>
				<font size="2">当用户下次访问它时，testcache缓冲块将被刷新</font>
		</p>
		<p>
				<br />
				<font size="2">你也可以通过下面语句定义Cache的有效范围,如不定义scope,scope默认为Applcation<br />&lt;cache:cache time="30" scope="session"&gt;<br />...<br />&lt;/cache:cache&gt;</font>
		</p>
		<p>
				<font size="2">4. 缓存过滤器 CacheFilter </font>
		</p>
		<p>
				<font size="2">package com.lvke.company.common;</font>
		</p>
		<p>
				<font size="2">import com.opensymphony.oscache.base.Cache;<br />import com.opensymphony.oscache.base.EntryRefreshPolicy;<br />import com.opensymphony.oscache.base.NeedsRefreshException;<br />import com.opensymphony.oscache.web.ServletCacheAdministrator;</font>
		</p>
		<p>
				<font size="2">import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;</font>
		</p>
		<p>
				<font size="2">import java.io.IOException;</font>
		</p>
		<p>
				<font size="2">import javax.servlet.*;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import javax.servlet.jsp.PageContext;<br />import com.opensymphony.oscache.web.filter.CacheHttpServletResponseWrapper;<br />import com.opensymphony.oscache.web.filter.ICacheGroupsProvider;<br />import com.opensymphony.oscache.web.filter.ICacheKeyProvider;<br />import com.opensymphony.oscache.web.filter.ExpiresRefreshPolicy;<br />import com.opensymphony.oscache.web.filter.ResponseContent;</font>
		</p>
		<p>
				<font size="2">public class CacheFilter implements Filter, ICacheKeyProvider, ICacheGroupsProvider {<br />    // Header<br />    public static final String HEADER_LAST_MODIFIED = "Last-Modified";<br />    public static final String HEADER_CONTENT_TYPE = "Content-Type";<br />    public static final String HEADER_CONTENT_ENCODING = "Content-Encoding";<br />    public static final String HEADER_EXPIRES = "Expires";<br />    public static final String HEADER_IF_MODIFIED_SINCE = "If-Modified-Since";<br />    public static final String HEADER_CACHE_CONTROL = "Cache-Control";<br />    public static final String HEADER_ACCEPT_ENCODING = "Accept-Encoding";</font>
		</p>
		<p>
				<font size="2">    // Fragment parameter<br />    public static final int FRAGMENT_AUTODETECT = -1;<br />    public static final int FRAGMENT_NO = 0;<br />    public static final int FRAGMENT_YES = 1;</font>
		</p>
		<p>
				<font size="2">    // No cache parameter<br />    public static final int NOCACHE_OFF = 0;<br />    public static final int NOCACHE_SESSION_ID_IN_URL = 1;</font>
		</p>
		<p>
				<font size="2">    // Last Modified parameter<br />    public static final long LAST_MODIFIED_OFF = 0;<br />    public static final long LAST_MODIFIED_ON = 1;<br />    public static final long LAST_MODIFIED_INITIAL = -1;</font>
		</p>
		<p>
				<font size="2">    // Expires parameter<br />    public static final long EXPIRES_OFF = 0;<br />    public static final long EXPIRES_ON = 1;<br />    public static final long EXPIRES_TIME = -1;</font>
		</p>
		<p>
				<font size="2">    // Cache Control<br />    public static final long MAX_AGE_NO_INIT = Long.MIN_VALUE;<br />    public static final long MAX_AGE_TIME = Long.MAX_VALUE;</font>
		</p>
		<p>
				<font size="2">    // request attribute to avoid reentrance<br />    private final static String REQUEST_FILTERED = "__oscache_filtered";</font>
		</p>
		<p>
				<font size="2">    // the policy for the expires header<br />    private EntryRefreshPolicy expiresRefreshPolicy;</font>
		</p>
		<p>
				<font size="2">    // the logger<br />    private final Log log = LogFactory.getLog(this.getClass());</font>
		</p>
		<p>
				<font size="2">    // filter variables<br />    private FilterConfig config;<br />    private ServletCacheAdministrator admin = null;<br />    private int cacheScope = PageContext.APPLICATION_SCOPE; // filter scope - default is APPLICATION<br />    private int fragment = FRAGMENT_AUTODETECT; // defines if this filter handles fragments of a page - default is auto detect<br />    private int time = 60 * 60; // time before cache should be refreshed - default one hour (in seconds)<br />    private String cron = null; // A cron expression that determines when this cached content will expire - default is null<br />    private int nocache = NOCACHE_OFF; // defines special no cache option for the requests - default is off<br />    private long lastModified = LAST_MODIFIED_INITIAL; // defines if the last-modified-header will be sent - default is intial setting<br />    private long expires = EXPIRES_ON; // defines if the expires-header will be sent - default is on<br />    private long cacheControlMaxAge = -60; // defines which max-age in Cache-Control to be set - default is 60 seconds for max-age<br />    private ICacheKeyProvider cacheKeyProvider = this; // the provider of the cache key - default is the CacheFilter itselfs<br />    private ICacheGroupsProvider cacheGroupsProvider = this; // the provider of the cache groups - default is the CacheFilter itselfs</font>
		</p>
		<p>
				<font size="2">    /**<br />     * Filter clean-up<br />     */<br />    public void destroy() {<br />        //Not much to do...<br />    }</font>
		</p>
		<p>
				<font size="2">    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {<br />        if (log.isInfoEnabled()) {<br />            log.info("&lt;cache&gt;: filter in scope " + cacheScope);<br />        }</font>
		</p>
		<p>
				<font size="2">        // avoid reentrance (CACHE-128) and check if request is cacheable<br />        if (isFilteredBefore(request) || !isCacheable(request)) {<br />            chain.doFilter(request, response);<br />            return;<br />        }<br />        request.setAttribute(REQUEST_FILTERED, Boolean.TRUE);</font>
		</p>
		<p>
				<font size="2">        HttpServletRequest httpRequest = (HttpServletRequest) request;</font>
		</p>
		<p>
				<font size="2">        // checks if the response will be a fragment of a page<br />        boolean fragmentRequest = isFragment(httpRequest);</font>
		</p>
		<p>
				<font size="2">        // avoid useless session creation for application scope pages (CACHE-129)<br />        Cache cache;<br />        if (cacheScope == PageContext.SESSION_SCOPE) {<br />            cache = admin.getSessionScopeCache(httpRequest.getSession(true));<br />        } else {<br />            cache = admin.getAppScopeCache(config.getServletContext());<br />        }</font>
		</p>
		<p>
				<font size="2">        // generate the cache entry key<br />        String key = cacheKeyProvider.createCacheKey(httpRequest, admin, cache);</font>
		</p>
		<p>
				<font size="2">        try {<br />            ResponseContent respContent = (ResponseContent) cache.getFromCache(key, time, cron);</font>
		</p>
		<p>
				<font size="2">            if (log.isInfoEnabled()) {<br />                log.info("&lt;cache&gt;: Using cached entry for " + key);<br />            }</font>
		</p>
		<p>
				<font size="2">            boolean acceptsGZip = false;<br />            if ((!fragmentRequest) &amp;&amp; (lastModified != LAST_MODIFIED_OFF)) {<br />                long clientLastModified = httpRequest.getDateHeader(HEADER_IF_MODIFIED_SINCE); // will return -1 if no header...</font>
		</p>
		<p>
				<font size="2">                // only reply with SC_NOT_MODIFIED<br />                // if the client has already the newest page and the response isn't a fragment in a page<br />                if ((clientLastModified != -1) &amp;&amp; (clientLastModified &gt;= respContent.getLastModified())) {<br />                    ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_NOT_MODIFIED);<br />                    return;<br />                }</font>
		</p>
		<p>
				<font size="2">                acceptsGZip = respContent.isContentGZiped() &amp;&amp; acceptsGZipEncoding(httpRequest);<br />            }</font>
		</p>
		<p>
				<font size="2">            respContent.writeTo(response, fragmentRequest, acceptsGZip);<br />            // acceptsGZip is used for performance reasons above; use the following line for CACHE-49<br />            // respContent.writeTo(response, fragmentRequest, acceptsGZipEncoding(httpRequest));<br />        } catch (NeedsRefreshException nre) {<br />            boolean updateSucceeded = false;</font>
		</p>
		<p>
				<font size="2">            try {<br />                if (log.isInfoEnabled()) {<br />                    log.info("&lt;cache&gt;: New cache entry, cache stale or cache scope flushed for " + key);<br />                }</font>
		</p>
		<p>
				<font size="2">                CacheHttpServletResponseWrapper cacheResponse = new CacheHttpServletResponseWrapper((HttpServletResponse) response, fragmentRequest, time * 1000L, lastModified, expires, cacheControlMaxAge);<br />                chain.doFilter(request, cacheResponse);<br />                cacheResponse.flushBuffer();</font>
		</p>
		<p>
				<font size="2">                // Only cache if the response is cacheable<br />                if (isCacheable(cacheResponse)) {<br />                    // get the cache groups of the content<br />                    String[] groups = cacheGroupsProvider.createCacheGroups(httpRequest, admin, cache);<br />                    // Store as the cache content the result of the response<br />                    cache.putInCache(key, cacheResponse.getContent(), groups, expiresRefreshPolicy, null);<br />                    updateSucceeded = true;<br />                }<br />            } finally {<br />                if (!updateSucceeded) {<br />                    cache.cancelUpdate(key);<br />                }<br />            }<br />        }<br />    }</font>
		</p>
		<p>
				<br />
				<font size="2">    public void init(FilterConfig filterConfig) {<br />        //Get whatever settings we want...<br />        config = filterConfig;<br />        admin = ServletCacheAdministrator.getInstance(config.getServletContext());</font>
		</p>
		<p>
				<font size="2">        // filter parameter time<br />        try {<br />            time = Integer.parseInt(config.getInitParameter("time"));<br />        } catch (Exception e) {<br />            log.info("Could not get init parameter 'time', defaulting to one hour.");<br />        }</font>
		</p>
		<p>
				<font size="2">        // setting the refresh period for this cache filter<br />        expiresRefreshPolicy = new ExpiresRefreshPolicy(time);</font>
		</p>
		<p>
				<font size="2">        // filter parameter scope<br />        try {<br />            String scopeString = config.getInitParameter("scope");</font>
		</p>
		<p>
				<font size="2">            if (scopeString.equals("session")) {<br />                cacheScope = PageContext.SESSION_SCOPE;<br />            } else if (scopeString.equals("application")) {<br />                cacheScope = PageContext.APPLICATION_SCOPE;<br />            } else if (scopeString.equals("request")) {<br />                cacheScope = PageContext.REQUEST_SCOPE;<br />            } else if (scopeString.equals("page")) {<br />                cacheScope = PageContext.PAGE_SCOPE;<br />            }<br />        } catch (Exception e) {<br />            log.info("Could not get init parameter 'scope', defaulting to 'application'.");<br />        }</font>
		</p>
		<p>
				<font size="2">        // filter parameter cron<br />        cron = config.getInitParameter("cron");</font>
		</p>
		<p>
				<font size="2">        // filter parameter fragment<br />        try {<br />            String fragmentString = config.getInitParameter("fragment");</font>
		</p>
		<p>
				<font size="2">            if (fragmentString.equals("no")) {<br />                fragment = FRAGMENT_NO;<br />            } else if (fragmentString.equals("yes")) {<br />                fragment = FRAGMENT_YES;<br />            } else if (fragmentString.equalsIgnoreCase("auto")) {<br />                fragment = FRAGMENT_AUTODETECT;<br />            }<br />        } catch (Exception e) {<br />            log.info("Could not get init parameter 'fragment', defaulting to 'auto detect'.");<br />        }</font>
		</p>
		<p>
				<font size="2">        // filter parameter nocache<br />        try {<br />            String nocacheString = config.getInitParameter("nocache");</font>
		</p>
		<p>
				<font size="2">            if (nocacheString.equals("off")) {<br />                nocache = NOCACHE_OFF;<br />            } else if (nocacheString.equalsIgnoreCase("sessionIdInURL")) {<br />                nocache = NOCACHE_SESSION_ID_IN_URL;<br />            }<br />        } catch (Exception e) {<br />            log.info("Could not get init parameter 'nocache', defaulting to 'off'.");<br />        }</font>
		</p>
		<p>
				<font size="2">        // filter parameter last modified<br />        try {<br />            String lastModifiedString = config.getInitParameter("lastModified");</font>
		</p>
		<p>
				<font size="2">            if (lastModifiedString.equals("off")) {<br />                lastModified = LAST_MODIFIED_OFF;<br />            } else if (lastModifiedString.equals("on")) {<br />                lastModified = LAST_MODIFIED_ON;<br />            } else if (lastModifiedString.equalsIgnoreCase("initial")) {<br />                lastModified = LAST_MODIFIED_INITIAL;<br />            }<br />        } catch (Exception e) {<br />            log.info("Could not get init parameter 'lastModified', defaulting to 'initial'.");<br />        }</font>
		</p>
		<p>
				<font size="2">        // filter parameter expires<br />        try {<br />            String expiresString = config.getInitParameter("expires");</font>
		</p>
		<p>
				<font size="2">            if (expiresString.equals("off")) {<br />                expires = EXPIRES_OFF;<br />            } else if (expiresString.equals("on")) {<br />                expires = EXPIRES_ON;<br />            } else if (expiresString.equalsIgnoreCase("time")) {<br />                expires = EXPIRES_TIME;<br />            }<br />        } catch (Exception e) {<br />            log.info("Could not get init parameter 'expires', defaulting to 'on'.");<br />        }</font>
		</p>
		<p>
				<font size="2">        // filter parameter Cache-Control<br />        try {<br />            String cacheControlMaxAgeString = config.getInitParameter("max-age");</font>
		</p>
		<p>
				<font size="2">            if (cacheControlMaxAgeString.equals("no init")) {<br />                    cacheControlMaxAge = MAX_AGE_NO_INIT;<br />            } else if (cacheControlMaxAgeString.equals("time")) {<br />                    cacheControlMaxAge = MAX_AGE_TIME;<br />            } else {<br />                    cacheControlMaxAge = Long.parseLong(cacheControlMaxAgeString);<br />                    if (cacheControlMaxAge &gt;= 0) {<br />                            // declare the cache control as a constant<br />                            cacheControlMaxAge = - cacheControlMaxAge;<br />                    } else {<br />                    log.warn("Init parameter 'max-age' must be at least a positive integer, defaulting to 'time'. ");<br />                        cacheControlMaxAge = 60;<br />                    }<br />            }<br />        } catch (Exception e) {<br />            log.info("Could not get init parameter 'max-age', defaulting to 'time'.");<br />        }</font>
		</p>
		<p>
				<font size="2">        // filter parameter ICacheKeyProvider<br />        ICacheKeyProvider cacheKeyProvider = (ICacheKeyProvider)instantiateFromInitParam("ICacheKeyProvider", ICacheKeyProvider.class, this.getClass().getName());<br />        if (cacheKeyProvider != null) {<br />            this.cacheKeyProvider = cacheKeyProvider;<br />        }</font>
		</p>
		<p>
				<font size="2">        // filter parameter ICacheGroupsProvider<br />        ICacheGroupsProvider cacheGroupsProvider = (ICacheGroupsProvider)instantiateFromInitParam("ICacheGroupsProvider", ICacheGroupsProvider.class, this.getClass().getName());<br />        if (cacheGroupsProvider != null) {<br />            this.cacheGroupsProvider = cacheGroupsProvider;<br />        }</font>
		</p>
		<p>
				<font size="2">        // filter parameter EntryRefreshPolicy<br />        EntryRefreshPolicy expiresRefreshPolicy = (EntryRefreshPolicy)instantiateFromInitParam("EntryRefreshPolicy", EntryRefreshPolicy.class, this.expiresRefreshPolicy.getClass().getName());<br />        if (expiresRefreshPolicy != null) {<br />            this.expiresRefreshPolicy = expiresRefreshPolicy;<br />        }<br />    }</font>
		</p>
		<p>
				<font size="2">    private Object instantiateFromInitParam(String classInitParam, Class interfaceClass, String defaultClassName) {<br />                String className = config.getInitParameter(classInitParam);<br />                if (className == null) {<br />                        log.info("Could not get init parameter '" + classInitParam + "', defaulting to " + defaultClassName + ".");<br />                        return null;<br />                } else {<br />                        try {<br />                                Class clazz = Class.forName(className);<br />                                if (!interfaceClass.isAssignableFrom(clazz)) {<br />                                        log.error("Specified class '" + className + "' does not implement" + interfaceClass.getName() + ". Using default " + defaultClassName + ".");<br />                                        return null;<br />                                } else {<br />                                        return clazz.newInstance();<br />                                }<br />                        } catch (ClassNotFoundException e) {<br />                                log.error("Class '" + className + "' not found. Defaulting to " + defaultClassName + ".", e);<br />                        } catch (InstantiationException e) {<br />                                log.error("Class '" + className + "' could not be instantiated because it is not a concrete class. Using default class " + defaultClassName + ".", e);<br />                        } catch (IllegalAccessException e) {<br />                                log.error("Class '"+ className+ "' could not be instantiated because it is not public. Using default class " + defaultClassName + ".", e);<br />                        }<br />                        return null;<br />                }<br />        }</font>
		</p>
		<p>
				<br />
				<font size="2">    public String createCacheKey(HttpServletRequest httpRequest, ServletCacheAdministrator scAdmin, Cache cache) {<br />        return scAdmin.generateEntryKey(null, httpRequest, cacheScope);<br />    }</font>
		</p>
		<p>
				<font size="2">    public String[] createCacheGroups(HttpServletRequest httpRequest, ServletCacheAdministrator scAdmin, Cache cache) {<br />        return null;<br />    }</font>
		</p>
		<p>
				<br />
				<font size="2">    protected boolean isFragment(HttpServletRequest request) {<br />        if (fragment == FRAGMENT_AUTODETECT) {<br />            return request.getAttribute("javax.servlet.include.request_uri") != null;<br />        } else {<br />            return (fragment == FRAGMENT_NO) ? false : true;<br />        }<br />    }</font>
		</p>
		<p>
				<font size="2">    protected boolean isFilteredBefore(ServletRequest request) {<br />        return request.getAttribute(REQUEST_FILTERED) != null;<br />    }</font>
		</p>
		<p>
				<font size="2">    protected boolean isCacheable(ServletRequest request) {<br />        // TODO implement CACHE-137 and CACHE-141 here<br />        boolean cachable = request instanceof HttpServletRequest;</font>
		</p>
		<p>
				<font size="2">        if (cachable) {<br />            HttpServletRequest requestHttp = (HttpServletRequest) request;<br />            if (nocache == NOCACHE_SESSION_ID_IN_URL) { // don't cache requests if session id is in the URL<br />                cachable = !requestHttp.isRequestedSessionIdFromURL();<br />            }<br />        }</font>
		</p>
		<p>
				<font size="2">        if (log.isDebugEnabled()) {<br />            log.debug("&lt;cache&gt;: the request " + ((cachable) ? "is" : "is not") + " cachable.");<br />        }</font>
		</p>
		<p>
				<font size="2">        return cachable;<br />    }</font>
		</p>
		<p>
				<font size="2">    protected boolean isCacheable(CacheHttpServletResponseWrapper cacheResponse) {<br />        // TODO implement CACHE-137 and CACHE-141 here<br />        // Only cache if the response was 200<br />        boolean cachable = cacheResponse.getStatus() == HttpServletResponse.SC_OK;</font>
		</p>
		<p>
				<font size="2">        if (log.isDebugEnabled()) {<br />            log.debug("&lt;cache&gt;: the response " + ((cachable) ? "is" : "is not") + " cachable.");<br />        }</font>
		</p>
		<p>
				<font size="2">        return cachable;<br />    }</font>
		</p>
		<p>
				<br />
				<font size="2">    protected boolean acceptsGZipEncoding(HttpServletRequest request) {<br />        String acceptEncoding = request.getHeader(HEADER_ACCEPT_ENCODING);<br />        return  (acceptEncoding != null) &amp;&amp; (acceptEncoding.indexOf("gzip") != -1);<br />    }</font>
		</p>
		<p>
				<font size="2">}</font>
		</p>
		<p>
				<br />
				<font size="2">你可以在web.xml中定义缓存过滤器，定义特定资源的缓存。<br />&lt;filter&gt;<br />&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;time&lt;/param-name&gt;<br />&lt;param-value&gt;60&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;scope&lt;/param-name&gt;<br />&lt;param-value&gt;session&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;/filter&gt;<br />&lt;filter-mapping&gt;<br />&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;<br />上面定义将缓存所有.jsp页面，缓存刷新时间为60秒，缓存作用域为Session</font>
		</p>
		<p>
				<font size="2">
				</font> </p>
		<p>
				<font size="2">注意，CacheFilter只捕获Http头为200的页面请求，即只对无错误请求作缓存，<br />而不对其他请求（如500,404,400）作缓存处理 <br /></font>
		</p>
		<p>
				<font size="2">
						<strong>
								<font style="BACKGROUND-COLOR: #ff0000">OSCache - Tags</font>
						</strong>：</font>
				<a href="http://www.opensymphony.com/oscache/wiki/JSP%20Tags.html">
						<font size="2">http://www.opensymphony.com/oscache/wiki/JSP%20Tags.html</font>
				</a>
				<br />
				<font size="2">  <br />  注：本文引自</font>
				<a href="http://www.zhanglihai.com/">
						<font size="2">http://www.zhanglihai.com/</font>
				</a>
				<br />
				<font size="2">                                                                                                                                                  13:11:20 12-22-2006</font>
		</p>
<img src ="http://www.blogjava.net/wyz191/aggbug/89496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2006-12-22 13:16 <a href="http://www.blogjava.net/wyz191/articles/oscache.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>