??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲男人的天堂久久精品,亚洲成a人片在线观看天堂无码,亚洲熟妇无码AV在线播放http://www.tkk7.com/wyz191/category/18596.html走向一条通往JAVA的不归\...zh-cnWed, 28 Feb 2007 03:45:47 GMTWed, 28 Feb 2007 03:45:47 GMT60Extremecomponentshttp://www.tkk7.com/wyz191/articles/100429.htmljava_蝈蝈java_蝈蝈Fri, 23 Feb 2007 15:07:00 GMThttp://www.tkk7.com/wyz191/articles/100429.htmlhttp://www.tkk7.com/wyz191/comments/100429.htmlhttp://www.tkk7.com/wyz191/articles/100429.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/100429.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/100429.html0.概述

    Home Page:http://www.extremecomponents.org

     Extreme Table是最功能强大而又Ҏ配置,扩展,自定义的Table 控g?/p>

     最紧要的功能包括排? 分页, 导出Excel, pdf和汇怅R?/p>

     springside的best CZ代码? listBook.jsp和listOrder.jsp.

基础ȝ: 

     1. ExtremeTable自带的文?/a> .

     2.Luck译的ExtremeTable官方文档中文?/a>   

1. 安装

1.1 安装原始版本

     1. ?a >http://www.extremecomponents.org 下蝲最新版

     2.把extremecomponents.jar 攑օweb-inf/lib

     3.Ҏminum, 导出excel ?导出pdf的需要,?lib下的jar copy到web-inf/lib

     4.把images里的囄攑օweb的Q意目?/p>

     5.把css文g攑ֈweb的Q意目?/p>

     6.?source/org/extremecomponents/table/core目录扑ֈextremetable.properties文g,把它复制到WEB-INF/classes里面q进行修?

     7.修改web.xml (?)?/p>

 0.2 复制SpringSide的样?/h3>

     1.Copy springside的Table Head的图Q查?/p>

     2.springside中的修改版extremecomponents.css文g攑օL目录

     3.?src/resource/extremetable.properties 复制到对应目?/p>

0.3 使用Compact View很重?/h3>

     默认的式样不W合大家的审,q怺q有Compact View和css讄Q让我们可以敬谢不敏它号U非常方便的HtmlView子类扩展?/p>

    1. 在全局讄?/p>

 
table.view.html=org.extremecomponents.table.view.CompactView

    2.把images?table/compact/*.gif copy ?/table

2.全局属性配|?/h2>

   ExtremeTable支持在properties文g里方便的l一配置丰富的全局属?/p>

  ?source/org/extremecomponents/table/core目录扑ֈextremetable.properties文g,把它复制到WEB-INF/classes里面.

 在web.xml里面增加

   <context-param>
        <param-name>extremecomponentsPreferencesLocation</param-name>
        <param-value>/extremetable.properties</param-value>
   </context-param>

一般只写需要修改的文g:

table.filterable=false
table.imagePath=/images/table/*.gif
table.locale=zh_CN
table.view.html=org.extremecomponents.table.view.CompactView
row.highlightRow=true
column.format.date=yyyy-MM-dd
column.format.currency=###,###,###,###,#00.00

3.导出Excel

    注意Excel 导出的Tag已改为,且官方版不支持中文文件名?/p>

    <ec:exportXls fileName="BookList.xls" tooltip="导出 Excel"/>

在web.xml必须加入Q?/p>

    <filter>
        <filter-name>eXtremeExport</filter-name>
        <filter-class>org.extremecomponents.table.filter.ExportFilter</filter-class>
    </filter>
<filter-mapping>
        <filter-name>eXtremeExport</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

     ExtremeTable导出的一w要特性是可以Ҏ不同的View导出不同的列.

     比如html理界面可能只列单几个最重要的列Q而导出excel时则需要导出所有的列?/p>

<ec:column property="orderdate" title="订单日期"  cell="date" format="yyyy-MM-dd"  viewsDenied= "html"/>

又比如有些操作按U的列只惛_html出现,excel里不惛_玎ͼ

<ec:column property="orderdate" title="订单日期" viewAllowed= "html"/>

     以上订单日期列在html view看不刎ͼ而excel,pdf view可以见到.

    ?~辑图标"Q?选择Checkbox"q些理界面上的列,也可以设|不export到pdf,excel view

4.其他要点

4.1. 使用排序功能?如果property为嵌套属性时,需要设|alias

          因ؓjavascript的关p?

<ec:column property="customer.name" title="客户名称" alias="customer"/>

4.2. Date Cell与NumberCell 和RowCountCell

     在全局属性定?

 column.format.date= yyyy-MM-dd
column.format.currency= K?##,###,#00.00
<ec:column property="totalprice" title="总金? cell="currency" width="80" />
<ec:column property="shipdate" title="发货日期"  cell="date" width= "80"/>
<e

其中RowCountCell用于昄序号?/p>

4.3. 汇?/h3>

在column中加入两个cac属性,׃自动在table的底端显C汇?/p>

<ec:column property="totalprice" title="总金? cell="number" format="###,###,##0.00" calc="total" calcTitle= "汇?"/>

4.4 i18N

在Web.xml里面指定i18N的Properties文g

<context-param>
  <param-name>extremecomponentsMessagesLocation</param-name>
  <param-value>messages</param-value>
</context-param>
<ec:column property="name" title="book.name"/>

4.5数据库分?/h3>

 EC默认从数据库中查找所有记录然后由它来分页Q如果查询结果较大,可以考虑使用数据库端分页的方案?/p>

 此时QEC会用Limit对象向Controller传递PageNo,PageSize,OrderBy{分信息。而服务端向ECq回总记录数和当前页的内容,具体请参?BookController?/p>

4.6不显C导出excel及分?/h3>

最快的方式是设|table的showStatusBar= false

<ec:table  items= "order.orderItems"var="item" action=""   showStatusBar= "false">

    4.7ImagePath

  旧版EC包括其文档都在每个table tag里定义ImagePath, 新版已经可以自动插入ContextPath,只需在properties文g定义table.imagePath=/images/table/*.gif卛_

5.自定义及扩展

   ExtremeTable比Display Tag的i一个就是良好的自定义和扩展能力Q不用千Z面?br />   不过QhL懒的Q虽然扩展子cdҎQ但能不扩展p是不可扩展了。幸亏用Compact View再改改CSS一般就能达到要求?/p>

 5.1. 良好的CSS定义

         ExtremeTable 的CSS定义非常严}, q且提供很多个层ơ的修改方式:

         1.直接修改css文g, 可以把table viewҎL样式

         2.修改全局属? 改变某种元素对应的css class?/p>

table.styleClass=tableRegion

         3.在某个页面的row,column tag中定义class

 <ec:row style="" or styleClass=""/>

        SpringSide采用层次1, 直接修改extremecomponents.css为合适的样式

5.2方便?lt;tr><td>属性扩?/h3>

        row与column已提供了丰富的普通属性与 javascript属性如onClick(), 如果属性仍然未?可自行扩?lt;row>?lt;column>tag Qƈ通过全局属性指定新的子cd?/p>

   Z方便大家在子cL展属? extreme Table提供了专门的回调函数与Util函数?/p>

public void addColumnAttributes(Column column) {
   column.addAttribute("customAttributeOne", customAttributeOne);
}

详细L手册,Table, Row,Column都提供相同的扩展:
http://extremecomponents.org/wiki/index.php/Column#Extended_Attributes

如果不是Extremetable的特别支? 普通taglib class要扩展属性的?
        1.定义真正的Java属?setter,getter
        2. tld文g中声明新的属?
        3.重蝲输出函数新属性打印出?/p>

5.3 扩展HTMLView,cell {显C组?/h3>

     Extreme Table在这些类的扩展上放便很多Q但q个版本里我q没有进行尝试,׃写了。请自行参考官Ҏ?http://extremecomponents.org/wiki/index.php/Html_View_Tutorial .

http://www.springside.org.cn/docs/reference/ExtremeTable.htm



java_蝈蝈 2007-02-23 23:07 发表评论
]]>jfreechart APIhttp://www.tkk7.com/wyz191/articles/98486.htmljava_蝈蝈java_蝈蝈Wed, 07 Feb 2007 01:10:00 GMThttp://www.tkk7.com/wyz191/articles/98486.htmlhttp://www.tkk7.com/wyz191/comments/98486.htmlhttp://www.tkk7.com/wyz191/articles/98486.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/98486.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/98486.html

JFreeChartc:
void setAntiAlias(boolean flag)    字体模糊边界
void setBackgroundImage(Image image)   背景囄
void setBackgroundImageAlignment(int alignment)  背景囄寚w方式Q参数常量在org.jfree.ui.AligncM定义Q?br />void setBackgroundImageAlpha(float alpha)  背景囄透明度(0.0?.0Q?br />void setBackgroundPaint(Paint paint)   背景?br />void setBorderPaint(Paint paint)   边界U条颜色
void setBorderStroke(Stroke stroke)   边界U条W触
void setBorderVisible(boolean visible)   边界U条是否可见

-----------------------------------------------------------------------------------------------------------

TextTitlec:
void setFont(Font font)     标题字体
void setPaint(Paint paint)    标题字体颜色
void setText(String text)    标题内容

-----------------------------------------------------------------------------------------------------------

StandardLegend(Legend)c:
void setBackgroundPaint(Paint paint)   囄背景?br />void setTitle(String title)    囄标题内容
void setTitleFont(Font font)    囄标题字体
void setBoundingBoxArcWidth(int arcWidth)  囄边界圆角?br />void setBoundingBoxArcHeight(int arcHeight)  囄边界圆角?br />void setOutlinePaint(Paint paint)   囄边界U条颜色
void setOutlineStroke(Stroke stroke)   囄边界U条W触
void setDisplaySeriesLines(boolean flag)  囄Ҏ否显C横U(折线图有效)
void setDisplaySeriesShapes(boolean flag)  囄Ҏ否显CŞӞ折线图有效)
void setItemFont(Font font)    囄字?br />void setItemPaint(Paint paint)    囄字体颜?br />void setAnchor(int anchor)    囄在图表中的显CZ|(参数帔R在LegendcM定义Q?/p>

-----------------------------------------------------------------------------------------------------------

Axisc:
void setVisible(boolean flag)    坐标轴是否可?br />void setAxisLinePaint(Paint paint)   坐标轴线条颜Ԍ3D轴无效)
void setAxisLineStroke(Stroke stroke)   坐标轴线条笔触(3D轴无效)
void setAxisLineVisible(boolean visible)  坐标轴线条是否可见(3D轴无效)
void setFixedDimension(double dimension)  Q用于复合表中对多坐标u的设|)
void setLabel(String label)    坐标轴标?br />void setLabelFont(Font font)    坐标轴标题字?br />void setLabelPaint(Paint paint)    坐标轴标题颜?br />void setLabelAngle(double angle)`   坐标轴标题旋转角度(U坐标可以旋转)
void setTickLabelFont(Font font)   坐标轴标值字?br />void setTickLabelPaint(Paint paint)   坐标轴标值颜?br />void setTickLabelsVisible(boolean flag)   坐标轴标值是否显C?br />void setTickMarkPaint(Paint paint)   坐标轴标颜?br />void setTickMarkStroke(Stroke stroke)   坐标轴标笔?br />void setTickMarksVisible(boolean flag)   坐标轴标是否显C?/p>

ValueAxis(Axis)c:
void setAutoRange(boolean auto)    自动讄数据轴数据范?br />void setAutoRangeMinimumSize(double size)  自动讄数据轴数据范围时数据范围的最跨?br />void setAutoTickUnitSelection(boolean flag)  数据轴的数据标签是否自动定Q默认ؓtrueQ?br />void setFixedAutoRange(double length)   数据轴固定数据范_讄100的话是昄MAXVALUE到MAXVALUE-100那段数据范围Q?br />void setInverted(boolean flag)    数据轴是否反向(默认为falseQ?br />void setLowerMargin(double margin)   数据轴下Q左Q边?br />void setUpperMargin(double margin)   数据轴上Q右Q边?br />void setLowerBound(double min)    数据轴上的显C最?br />void setUpperBound(double max)    数据轴上的显C最大?br />void setPositiveArrowVisible(boolean visible)  是否昄正向头Q?D轴无效)
void setNegativeArrowVisible(boolean visible)  是否昄反向头Q?D轴无效)
void setVerticalTickLabels(boolean flag)  数据轴数据标{是否旋转到垂直
void setStandardTickUnits(TickUnitSource source) 数据轴的数据标签Q可以只昄整数标签Q需要将AutoTickUnitSelection设falseQ?/p>

NumberAxis(ValueAxis)c:
void setAutoRangeIncludesZero(boolean flag)  是否强制在自动选择的数据范围中包含0
void setAutoRangeStickyZero(boolean flag)  是否强制在整个数据u中包?Q即?不在数据范围?br />void setNumberFormatOverride(NumberFormat formatter) 数据轴数据标{昄格式
void setTickUnit(NumberTickUnit unit)   数据轴的数据标签Q需要将AutoTickUnitSelection设falseQ?/p>

DateAxis(ValueAxis)c:
void setMaximumDate(Date maximumDate)   日期轴上的最日?br />void setMinimumDate(Date minimumDate)   日期轴上的最大日?br />void setRange(Date lower,Date upper)   日期轴范?br />void setDateFormatOverride(DateFormat formatter) 日期轴日期标{昄格式
void setTickUnit(DateTickUnit unit)   日期轴的日期标签Q需要将AutoTickUnitSelection设falseQ?br />void setTickMarkPosition(DateTickMarkPosition position) 日期标签位置Q参数常量在org.jfree.chart.axis.DateTickMarkPositioncM定义Q?/p>

CategoryAxis(Axis)c:
void setCategoryMargin(double margin)   分类轴边?br />void setLowerMargin(double margin)   分类轴下Q左Q边?br />void setUpperMargin(double margin)   分类轴上Q右Q边?br />void setVerticalCategoryLabels(boolean flag)  分类轴标题是否旋转到垂直
void setMaxCategoryLabelWidthRatio(float ratio)  分类轴分cL{最大宽?/p>

-----------------------------------------------------------------------------------------------------------

Plotc:
void setBackgroundImage(Image image)   数据区的背景囄
void setBackgroundImageAlignment(int alignment)  数据区的背景囄寚w方式Q参数常量在org.jfree.ui.AligncM定义Q?br />void setBackgroundPaint(Paint paint)   数据区的背景囄背景?br />void setBackgroundAlpha(float alpha)   数据区的背景透明度(0.0?.0Q?br />void setForegroundAlpha(float alpha)   数据区的前景透明度(0.0?.0Q?br />void setDataAreaRatio(double ratio)   数据区占整个图表区的癑ֈ?br />void setOutLinePaint(Paint paint)   数据区的边界U条颜色
void setOutLineStroke(Stroke stroke)   数据区的边界U条W触
void setNoDataMessage(String message)   没有数据时显C的消息
void setNoDataMessageFont(Font font)   没有数据时显C的消息字体
void setNoDataMessagePaint(Paint paint)   没有数据时显C的消息颜色

CategoryPlot(Plot)c:
void setDataset(CategoryDataset dataset)  数据区的2l数据表
void setColumnRenderingOrder(SortOrder order)  数据分类的排序方?br />void setAxisOffset(Spacer offset)   坐标轴到数据区的间距
void setOrientation(PlotOrientation orientation) 数据区的方向QPlotOrientation.HORIZONTAL或PlotOrientation.VERTICALQ?br />void setDomainAxis(CategoryAxis axis)   数据区的分类?br />void setDomainAxisLocation(AxisLocation location) 分类轴的位置Q参数常量在org.jfree.chart.axis.AxisLocationcM定义Q?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) 数据轴的位置Q参数常量在org.jfree.chart.axis.AxisLocationcM定义Q?br />void setRangeGridlinesVisible(boolean visible)  数据轴网格是否可?br />void setRangeGridlinePaint(Paint paint)   数据轴网格线条颜?br />void setRangeGridlineStroke(Stroke stroke)  数据轴网格线条笔?br />void setRenderer(CategoryItemRenderer renderer)  数据区的表示者(详见Rendererl)
void addAnnotation(CategoryAnnotation annotation) l数据区加一个注?br />void addRangeMarker(Marker marker,Layer layer)  l数据区加一个数D围区?/p>

PiePlot(Plot)c:
void setDataset(PieDataset dataset)   数据区的1l数据表
void setIgnoreNullValues(boolean flag)   忽略无值的分类
void setCircular(boolean flag)    饼图是否一定是正圆
void setStartAngle(double angle)   饼图的初始角?br />void setDirection(Rotation direction)   饼图的旋转方?br />void setExplodePercent(int section,double percent) 抽取的那块(1l数据表的分cM标)以及抽取出来的距(0.0?.0Q,3D饼图无效
void setLabelBackgroundPaint(Paint paint)  分类标签的底?br />void setLabelFont(Font font)    分类标签的字?br />void setLabelPaint(Paint paint)    分类标签的字体颜?br />void setLabelLinkMargin(double margin)   分类标签与图的连接线边距
void setLabelLinkPaint(Paint paint)   分类标签与图的连接线颜色
void setLabelLinkStroke(Stroke stroke)   分类标签与图的连接线W触
void setLabelOutlinePaint(Paint paint)   分类标签Ҏ颜色
void setLabelOutlineStroke(Paint paint)   分类标签ҎW触
void setLabelShadowPaint(Paint paint)   分类标签阴媄颜色
void setMaximumLabelWidth(double width)   分类标签的最大长度(0.0?.0Q?br />void setPieIndex(int index)    饼图的烦引(复合饼图中用刎ͼ
void setSectionOutlinePaint(int section,Paint paint) 指定分类饼的Ҏ颜色
void setSectionOutlineStroke(int section,Stroke stroke) 指定分类饼的ҎW触
void setSectionPaint(int section,Paint paint)  指定分类饼的颜色
void setShadowPaint(Paint paint)   饼图的阴影颜?br />void setShadowXOffset(double offset)   饼图的阴q对图的水q_U?br />void setShadowYOffset(double offset)   饼图的阴q对图的垂直偏U?br />void setLabelGenerator(PieSectionLabelGenerator generator) 分类标签的格式,讄成null则整个标{֌括连接线都不昄
void setToolTipGenerator(PieToolTipGenerator generator)  MAP中鼠标移上的昄格式
void setURLGenerator(PieURLGenerator generator)   MAP中钻取链接格?/p>

PiePlot3D(PiePlot)c:
void setDepthFactor(double factor)   3D饼图的Z轴高度(0.0?.0Q?/p>

MultiplePiePlot(Plot)c:
void setLimit(double limit)    每个饼图之间的数据关联(详细比较复杂Q ?
void setPieChart(JFreeChart pieChart)   每个饼图的显C方式(见JFreeChartcMPiePlotc)

-----------------------------------------------------------------------------------------------------------

AbstractRendererc:
void setItemLabelAnchorOffset(double offset)     数据标签的与数据点的偏移
void setItemLabelsVisible(boolean visible)     数据标签是否可见
void setItemLabelFont(Font font)      数据标签的字?br />void setItemLabelPaint(Paint paint)      数据标签的字体颜?br />void setItemLabelPosition(ItemLabelPosition position)    数据标签位置
void setPositiveItemLabelPosition(ItemLabelPosition position)   正数标签位置
void setNegativeItemLabelPosition(ItemLabelPosition position)   负数标签位置
void setOutLinePaint(Paint paint)      囑ŞҎ的线条颜?br />void setOutLineStroke(Stroke stroke)      囑ŞҎ的线条笔?br />void setPaint(Paint paint)       所有分cd形的颜色
void setShape(Shape shape)       所有分cd形的形状Q如折线囄点)
void setStroke(Stroke stroke)       所有分cd形的W触Q如折线囄U)
void setSeriesItemLabelsVisible(int series,boolean visible)   指定分类的数据标{是否可?br />void setSeriesItemLabelFont(int series,Font font)    指定分类的数据标{字体
void setSeriesItemLabelPaint(int series,Paint paint)    指定分类的数据标{字体颜色
void setSeriesItemLabelPosition(int series,ItemLabelPosition position)  数据标签位置
void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正数标签位置
void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 负数标签位置
void setSeriesOutLinePaint(int series,Paint paint)    指定分类的图形边框的U条颜色
void setSeriesOutLineStroke(int series,Stroke stroke)    指定分类的图形边框的U条W触
void setSeriesPaint(int series,Paint paint)     指定分类囑Ş的颜?br />void setSeriesShape(int series,Shape shape)     指定分类囑Ş的ŞӞ如折U图的点Q?br />void setSeriesStroke(int series,Stroke stroke)     指定分类囑Ş的笔触(如折U图的线Q?/p>

AbstractCategoryItemRenderer(AbstractRenderer)c:
void setLabelGenerator(CategoryLabelGenerator generator)   数据标签的格?br />void setToolTipGenerator(CategoryToolTipGenerator generator)   MAP中鼠标移上的昄格式
void setItemURLGenerator(CategoryURLGenerator generator)   MAP中钻取链接格?br />void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分类的数据标{格式
void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分类的MAP中鼠标移上的昄格式
void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分类的MAP中钻取链接格?/p>

BarRenderer(AbstractCategoryItemRenderer)c:
void setDrawBarOutline(boolean draw)      是否d形边?br />void setItemMargin(double percent)      每个BAR之间的间?br />void setMaxBarWidth(double percent)      每个BAR的最大宽?br />void setMinimumBarLength(double min)      最短的BAR长度Q避免数值太而显CZ?br />void setPositiveItemLabelPositionFallback(ItemLabelPosition position)  无法在BAR中显C的正数标签位置
void setNegativeItemLabelPositionFallback(ItemLabelPosition position)  无法在BAR中显C的负数标签位置

BarRenderer3D(BarRenderer)c:
void setWallPaint(Paint paint)    3D坐标轴的墙体颜色

StackedBarRenderer(BarRenderer)c:
没有Ҏ的设|?/p>

StackedBarRenderer3D(BarRenderer3D)c:
没有Ҏ的设|?/p>

GroupedStackedBarRenderer(StackedBarRenderer)c:
void setSeriesToGroupMap(KeyToGroupMap map)  分c自q映射成若q个l(KeyToGroupMap.mapKeyToGroup(series,group)Q?/p>

LayeredBarRenderer(BarRenderer)c:
void setSeriesBarWidth(int series,double width)  讑֮每个分类的宽度(注意讄不要使某分类被覆盖)

WaterfallBarRenderer(BarRenderer)c:
void setFirstBarPaint(Paint paint)   W一个柱囄颜色
void setLastBarPaint(Paint paint)   最后一个柱囄颜色
void setPositiveBarPaint(Paint paint)   正值柱囄颜色
void setNegativeBarPaint(Paint paint)   负值柱囄颜色

IntervalBarRenderer(BarRenderer)c:
需要传IntervalCategoryDataset作ؓ数据?/p>

GanttBarRenderer(IntervalBarRenderer)c:
void setCompletePaint(Paint paint)   完成q度颜色
void setIncompletePaint(Paint paint)   未完成进度颜?br />void setStartPercent(double percent)   讄q度条在整条中的起始位置Q?.0?.0Q?br />void setEndPercent(double percent)   讄q度条在整条中的l束位置Q?.0?.0Q?/p>

StatisticBarRenderer(BarRenderer)c:
需要传StatisticCategoryDataset作ؓ数据?/p>

LineAndShapeRenderer(AbstractCategoryItemRenderer)c:
void setDrawLines(boolean draw)    是否折线的数据点之间用线q?br />void setDrawShapes(boolean draw)   是否折线的数据点Ҏ分类使用不同的Ş?br />void setShapesFilled(boolean filled)   所有分cL否填充数据点囑Ş
void setSeriesShapesFilled(int series,boolean filled) 指定分类是否填充数据点图?br />void setUseFillPaintForShapeOutline(boolean use) 指定是否填充数据点的Paint也被用于L据点形状的边?/p>

LevelRenderer(AbstractCategoryItemRenderer)c:
void setItemMargin(double percent)   每个分类之间的间?br />void setMaxItemWidth(double percent)   每个分类的最大宽?/p>

CategoryStepRenderer(AbstractCategoryItemRenderer)c:
void setStagger(boolean shouldStagger)   不同分类的图是否交错

MinMaxCategoryRenderer(AbstractCategoryItemRenderer)c:
void setDrawLines(boolean drawLines)   是否在每个分cȝ间画q接U?br />void setGroupPaint(Paint groupPaint)   一l图形连接线的颜?br />void setGroupStroke(Stroke groupStroke)   一l图形连接线的笔?br />void setMaxIcon(Icon maxIcon)    最大值的ICON
void setMinIcon(Icon minIcon)    最值的ICON
void setObjectIcon(Icon objectIcon)   所有值的ICON

AreaRender(AbstractCategoryItemRenderer)c?/font>Q?/font>
没有Ҏ的设|?/p>

StackedAreaRender(AreaRender)c:
没有Ҏ的设|?/p>

单的SEVLET配置 

<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/servlet/DisplayChart</url-pattern>
</servlet-mapping>

转自 http://blog.csdn.net/knight12


java_蝈蝈 2007-02-07 09:10 发表评论
]]>
jfreechart报表http://www.tkk7.com/wyz191/articles/98364.htmljava_蝈蝈java_蝈蝈Tue, 06 Feb 2007 08:42:00 GMThttp://www.tkk7.com/wyz191/articles/98364.htmlhttp://www.tkk7.com/wyz191/comments/98364.htmlhttp://www.tkk7.com/wyz191/articles/98364.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/98364.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/98364.html        JFreeChart是JFreeChart公司在开源网站SourceForge.net上的一个项目,该公司的主要产品有如下:
        1、JFreeReportQ报表解军_?br />        2、JFreeChartQJava囑Ş解决ҎQApplication/Applet/Servlet/JspQ?br />        3、JCommonQJFreeReport和JFreeChart的公q?br />        4、JFreeDesignerQJFreeReport的报表设计工?br />
    我们可以从jfree官方|站上获取最新版本和相关资料Q但是jfree的document需?0金才能获取Q,
    获取地址Q?a >http://www.jfree.org/jfreechart/index.htmlQ同时可以获得简明介l)
    我们以当前最新版本:jfreechart_0.9.21.zipZ子进行说明?br />
二、JFreeChart配置安装
    1、解压jfreechart_0.9.21.zip到指定位|,其中source是jfreechart的源码,jfreechart-0.9.21-demo.jar
       是例子程序(该部分留l大家自己去研究Q?br />    2、ؓ了配|成功,我们需要关注的文g有如下三个:jfreechart-0.9.21.jar、lib\jcommon-0.9.6.jar?br />       lib\gnujaxp.jar
    3、如果是Application开发,把上qC个文件拷贝到%JAVA_HOME%\LIB中,同时在环境变量CLASSPATH中加?br />       如果是WEB开发,以TOMCAT中的一个WEB目TESTZ子说明:
       把上qC个文件拷贝到TEST\WEB-INF\LIB中,然后修改TEST\WEB-INF\web.xml文gQ在其中加入如下代码Q?br />                
                    DisplayChart
                    org.jfree.chart.servlet.DisplayChart
                

                
                    DisplayChart
                    /servlet/DisplayChart
                

               xjfreechart的配|就完成了,下面可以进行jfreechart的开发了。这里值得提出的是jfreechart的类
       l构设计前后兼容性不是很好,不同版本的jfreechart中类库结构可能不一P有时候可能需要查源码。如?br />       是中文显C的时候可能依据观感需要改变源码的字体Q不q我个h觉得q个版本比以前版本要好一些?br />
三、JFreeChart功能介绍
    JFreeChart目前是最好的java囑Ş解决ҎQ基本能够解决目前的囑Ş斚w的需求,主要包括如下几个斚wQ?br />    pie charts (2D and 3D)Q饼图(q面和立体)
    bar charts (regular and stacked, with an optional 3D effect)Q柱状图
    line and area chartsQ曲U图
    scatter plots and bubble charts
    time series, high/low/open/close charts and candle stick chartsQ时序图
    combination chartsQ复合图
    Pareto charts
    Gantt chartsQ甘特图
    wind plots, meter charts and symbol charts
    wafer map charts
    (态图?饼图(二维和三l? , q图?水^,垂直),U图,点图,旉变化?甘特? 股票行情?混和? 温度计图, d囄常用商用图表)
    囑Ş可以导出成PNG和JPEG格式Q同时还可以与PDF和EXCEL兌
    
    JFreeChart核心cd介绍Q?br />            研究jfreechart源码发现源码的主要由两个大的包组成:org.jfree.chart,org.jfree.data。其中前者主要与囑Ş
    本n有关Q后者与囑Ş昄的数据有兟뀂具体研I如果大家有兴趣的话可以自己研究Q以后有旉我会告诉大家怎么?br />    研究源码?br />         核心cM要有Q?br />           org.jfree.chart.JFreeChartQ图表对象,Mcd的图表的最l表现Ş式都是在该对象进行一些属性的定制。JFreeChart引擎本n提供了一个工厂类用于创徏不同cd的图表对?br />           org.jfree.data.category.XXXDataSet:数据集对象,用于提供昄图表所用的数据。根据不同类型的图表对应着很多cd的数据集对象c?br />           org.jfree.chart.plot.XXXPlotQ图表区域对象,基本上这个对象决定着什么样式的图表Q创对象的时候需要Axis、Renderer以及数据集对象的支持
           org.jfree.chart.axis.XXXAxisQ用于处理图表的两个_Uu和横?br />           org.jfree.chart.render.XXXRenderQ负责如何显CZ个图表对?br />           org.jfree.chart.urls.XXXURLGenerator:用于生成Web图表中每个项目的鼠标点击链接
           XXXXXToolTipGenerator:用于生成图象的帮助提C,不同cd图表对应不同cd的工hC类

四、jFreeChart产生囑Ş的流E?/span>
创徏一个数据源QdatasetQ来包含要在图形中昄的数?br />创徏一?JFreeChart 对象来代表要昄的图?br />把图形输?br />重要的类和接口:
org.jfree.data.general.Dataset 所有数据源c都要实现的接口
org.jfree.chart.ChartFactory 由它来?JFreeChart 对象
org.jfree.chart.JFreeChart 所有对囑Ş的调整都是通过它噢Q!
org.jfree.chart.plot.Plot 通过JFreeChart 对象获得它,然后再通过它对囑Ş外部部分Q例Q坐标uQ调?br />注意Q它有很多子c,一般都下嗍造型到它的子c!
org.jfree.chart.renderer.AbstractRenderer 通过JFreeChart 对象获得它,然后再通过它对囑Ş内部部分
Q例Q折U的cdQ调整。同P针对不同cd的报表图Q它?br />着不同的子cd玎ͼ在下面我们简U它?Renderer
下面我们l合不同cd的图形来具体分析q个程?br />
五、饼?/span>
饼图的dataset 一般是用PieDataset 接口Q具体实现类?DefaultPieDataset
1、创Z个数据源QdatasetQ:
private static PieDataset createDataset()
{
DefaultPieDataset defaultpiedataset = new DefaultPieDataset(); //注意是DefaultPieDatasetQ!
defaultpiedataset.setValue(”One? new Double(43.200000000000003D));
defaultpiedataset.setValue(”Two? new Double(10D));
defaultpiedataset.setValue(”Three? new Double(27.5D));
defaultpiedataset.setValue(”Four? new Double(17.5D));
return defaultpiedataset;
}
2、由ChartFactory 产生 JFreeChart 对象
private static JFreeChart createChart(PieDataset piedataset)
{
JFreeChart jfreechart = ChartFactory.createPieChart(”Pie Chart Demo 1? //囑Ş标题名称
piedataset, // dataset
true, // legend?
true, // tooltips?
false); //URLs?
PiePlot pieplot = (PiePlot)jfreechart.getPlot(); //通过JFreeChart 对象获得 plotQPiePlotQ!
pieplot.setNoDataMessage(”No data available?; // 没有数据的时候显C的内容
return jfreechart;
}
一些重要的ҎQ?br />pieplot.setExplodePercent(0,0.3D) //把Lable 为”One?的那一块”挖”出?0%
3、输出略

六、柱状图
q囄dataset 一般是用CatagoryDataset接口(具体实现cLDefaultCategoryDataset),也会?IntervalXYDataset
接口
1、创Z个数据源QdatasetQ:
private static CategoryDataset createDataset()
{
String series1 = “First?
String series2 = “Second?
String series3 = “Third?
String category1 = “Category 1?
String category2 = “Category 2?
String category3 = “Category 3?
String category4 = “Category 4?
String category5 = “Category 5?
DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
defaultcategorydataset.addValue(1.0D, series1, category1);
defaultcategorydataset.addValue(4D, series1, category2);
defaultcategorydataset.addValue(3D, series1, category3);
defaultcategorydataset.addValue(5D, series1, category4);
defaultcategorydataset.addValue(5D, series1, category5);

defaultcategorydataset.addValue(5D, series2, category1);
defaultcategorydataset.addValue(7D, series2, category2);
defaultcategorydataset.addValue(6D, series2, category3);
defaultcategorydataset.addValue(8D, series2, category4);
defaultcategorydataset.addValue(4D, series2, category5);

defaultcategorydataset.addValue(4D, series3, category1);
defaultcategorydataset.addValue(3D, series3, category2);
defaultcategorydataset.addValue(2D, series3, category3);
defaultcategorydataset.addValue(3D, series3, category4);
defaultcategorydataset.addValue(6D, series3, category5);
return defaultcategorydataset;
}
2、由ChartFactory 产生 JFreeChart 对象
private static JFreeChart createChart(CategoryDataset categorydataset)
{
JFreeChart jfreechart = ChartFactory.createBarChart(
"Bar Chart Demo", //囑Ş标题名称
"Category",//domain ?Lableq里先简单理解ؓ横坐标Lable好了
"Value", //range ?Lableq里也先单理解ؓU坐标Lable好了
categorydataset, // dataset
PlotOrientation.VERTICAL, //垂直昄
true, // legend?
true, // tooltips?
false);
//URLs?
jfreechart.setBackgroundPaint(Color.white); //讑֮背景色ؓ白色
CategoryPlot categoryplot = jfreechart.getCategoryPlot(); //获得 plotQCategoryPlotQ!
categoryplot.setBackgroundPaint(Color.lightGray); //讑֮图表数据昄部分背景?br />categoryplot.setDomainGridlinePaint(Color.white); //横坐标网格线白色
categoryplot.setDomainGridlinesVisible(true); //可见
categoryplot.setRangeGridlinePaint(Color.white); //U坐标网格线白色
//讄series1与category的显CZ|;cM效果?a >http://www.chinabs.net/webimages/PieChart7.png
categoryplot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
categoryplot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);

//使纵坐标的最单位格为整?/font>
NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); //获得renderer 注意q里是下嗍造型到BarRendererQ!
//昄每个q数|q修改该数值的字体属?cM效果?a >http://www.chinabs.net/webimages/PieChart6.png
barrenderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
barrenderer.setItemLabelFont(new Font("黑体",Font.PLAIN,12));
barrenderer.setItemLabelsVisible(true);

barrenderer.setDrawBarOutline(false); // Bar的外轮廓U不?/font>
GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue,0.0F, 0.0F, new Color(0, 0, 64)); //讑֮特定颜色
GradientPaint gradientpaint1 = new GradientPaint(0.0F, 0.0F, Color.green,0.0F, 0.0F, new Color(0, 64, 0));
GradientPaint gradientpaint2 = new GradientPaint(0.0F, 0.0F, Color.red,0.0F, 0.0F, new Color(64, 0, 0));
barrenderer.setSeriesPaint(0, gradientpaint); //lseries1 Bar讑֮上面定义的颜?br />barrenderer.setSeriesPaint(1, gradientpaint1); //lseries2 Bar 讑֮上面定义的颜?br />barrenderer.setSeriesPaint(2, gradientpaint2); //lseries3 Bar 讑֮上面定义的颜?br />CategoryAxis categoryaxis = categoryplot.getDomainAxis(); //横u上的 Lable 45度倾斜
categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
return jfreechart;
}
一些重要的ҎQ(增加一块标讎ͼ
IntervalMarker intervalmarker = new IntervalMarker(4.5D, 7.5D);
intervalmarker.setLabel("Target Range");
intervalmarker.setLabelFont(new Font(”SansSerif? 2, 11));
intervalmarker.setLabelAnchor(RectangleAnchor.LEFT);
intervalmarker.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
intervalmarker.setPaint(new Color(222, 222, 255, 128));
categoryplot.addRangeMarker(intervalmarker, Layer.BACKGROUND);

七、折U图
折线囄dataset 两种CatagoryDataset接口(具体实现cLDefaultCategoryDataset),XYDataset 接口
1、CatagoryDataset接口Q?br />A、创Z个数据源QdatasetQ:
private static CategoryDataset createDataset()
{
String series1 = “First?
String series2 = “Second?
String series3 = “Third?
String type1 = “Type 1?
String type2 = “Type 2?
String type3 = “Type 3?
String type4 = “Type 4?
String type5 = “Type 5?
String type6 = “Type 6?
String type7 = “Type 7?
String type8 = “Type 8?
DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
defaultcategorydataset.addValue(1.0D, series1, type1);
defaultcategorydataset.addValue(4D, series1, type2);
defaultcategorydataset.addValue(3D, series1, type3);
defaultcategorydataset.addValue(5D, series1, type4);
defaultcategorydataset.addValue(5D, series1, type5);
defaultcategorydataset.addValue(7D, series1, type6);
defaultcategorydataset.addValue(7D, series1, type7);
defaultcategorydataset.addValue(8D, series1, type8);

defaultcategorydataset.addValue(5D, series2, type1);
defaultcategorydataset.addValue(7D, series2, type2);
defaultcategorydataset.addValue(6D, series2, type3);
defaultcategorydataset.addValue(8D, series2, type4);
defaultcategorydataset.addValue(4D, series2, type5);
defaultcategorydataset.addValue(4D, series2, type6);
defaultcategorydataset.addValue(2D, series2, type7);
defaultcategorydataset.addValue(1.0D, series2, type8);

defaultcategorydataset.addValue(4D, series3, type1);
defaultcategorydataset.addValue(3D, series3, type2);
defaultcategorydataset.addValue(2D, series3, type3);
defaultcategorydataset.addValue(3D, series3, type4);
defaultcategorydataset.addValue(6D, series3, type5);
defaultcategorydataset.addValue(3D, series3, type6);
defaultcategorydataset.addValue(4D, series3, type7);
defaultcategorydataset.addValue(3D, series3, type8);
return defaultcategorydataset;
}
B、由ChartFactory 产生 JFreeChart 对象 (与上面重复的部分׃再注释)
private static JFreeChart createChart(CategoryDataset categorydataset)
{
JFreeChart jfreechart = ChartFactory.createLineChart(”Line Chart Demo 1?
“Type?
“Value?
categorydataset,
PlotOrientation.VERTICAL,
true,
true,
false);
jfreechart.setBackgroundPaint(Color.white);
CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();
categoryplot.setBackgroundPaint(Color.lightGray);
categoryplot.setRangeGridlinePaint(Color.white);
NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(true);
//获得renderer 注意q里是下嗍造型到lineandshaperendererQ!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();
lineandshaperenderer.setShapesVisible(true); //series 点(x据点Q可?br />lineandshaperenderer.setSeriesStroke(0, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
10F, 6F
}, 0.0F)); //定义series为”First”的Q即series1Q点之间的连U?Q这里是虚线Q默认是直线
lineandshaperenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
6F, 6F
}, 0.0F)); //定义series为”Second”的Q即series2Q点之间的连U?br />lineandshaperenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
2.0F, 6F
}, 0.0F)); //定义series为”Third”的Q即series3Q点之间的连U?br />return jfreechart;
}
一些重要的ҎQ?br />lineandshaperenderer.setLineVisible(true) //series 点(x据点Q间有连U可?br />2、XYDataset 接口Q?br />A、创Z个数据源QdatasetQ:
private static XYDataset createDataset()
{
XYSeries xyseries = new XYSeries(”First?; //先生XYSeries 对象
xyseries.add(1.0D, 1.0D);
xyseries.add(2D, 4D);
xyseries.add(3D, 3D);
xyseries.add(4D, 5D);
xyseries.add(5D, 5D);
xyseries.add(6D, 7D);
xyseries.add(7D, 7D);
xyseries.add(8D, 8D);

XYSeries xyseries1 = new XYSeries(”Second?;
xyseries1.add(1.0D, 5D);
xyseries1.add(2D, 7D);
xyseries1.add(3D, 6D);
xyseries1.add(4D, 8D);
xyseries1.add(5D, 4D);
xyseries1.add(6D, 4D);
xyseries1.add(7D, 2D);
xyseries1.add(8D, 1.0D);

XYSeries xyseries2 = new XYSeries(”Third?;
xyseries2.add(3D, 4D);
xyseries2.add(4D, 3D);
xyseries2.add(5D, 2D);
xyseries2.add(6D, 3D);
xyseries2.add(7D, 6D);
xyseries2.add(8D, 3D);
xyseries2.add(9D, 4D);
xyseries2.add(10D, 3D);

XYSeriesCollection xyseriescollection = new XYSeriesCollection(); //再用XYSeriesCollectiond入XYSeries 对象
xyseriescollection.addSeries(xyseries);
xyseriescollection.addSeries(xyseries1);
xyseriescollection.addSeries(xyseries2);
return xyseriescollection;
}
B、由ChartFactory 产生 JFreeChart 对象
private static JFreeChart createChart(XYDataset xydataset)
{
JFreeChart jfreechart = ChartFactory.createXYLineChart(”Line Chart Demo 2?
“X?
“Y?
xydataset,
PlotOrientation.VERTICAL,
true,
true,
false);
jfreechart.setBackgroundPaint(Color.white);
XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //获得 plotQXYPlotQ!
xyplot.setBackgroundPaint(Color.lightGray); //讑֮图表数据昄部分背景?br />xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //讑֮坐标轴与图表数据昄部分距离
xyplot.setDomainGridlinePaint(Color.white); //|格UK?br />xyplot.setRangeGridlinePaint(Color.white);
//获得 renderer 注意q里是XYLineAndShapeRenderer Q!
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setShapesVisible(true); //数据点可?br />xylineandshaperenderer.setShapesFilled(true); //数据点被填充即不是空心点
NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
return jfreechart;
}
一些重要的ҎQ?br />XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer();
xylineandshaperenderer.setSeriesLinesVisible(0, false); //W一个XYSeries数据炚wq线不可?br />xylineandshaperenderer.setSeriesShapesVisible(1, false); //W二个XYSeries数据点不可见
xyplot.setRenderer(xylineandshaperenderer);

八、时间序列图
旉序列囑֒折线囑־怼Q不同的是它?domain轴的数据是时间而不是数字?旉序列囄dataset ?br />XYDataset 接口Q具体实现类是TimeSeriesCollection Q和上面cMQ有TimeSeries 对象Q它被添加入
TimeSeriesCollection ?br />1、创Z个数据源QdatasetQ:
private static XYDataset createDataset()
{
TimeSeries timeseries = new TimeSeries(”L&G European Index Trust?Month.class);
timeseries.add(new Month(2, 2001), 181.8D);//q里用的是Month.classQ同栯有Day.class Year.class {等
timeseries.add(new Month(3, 2001), 167.3D);
timeseries.add(new Month(4, 2001), 153.8D);
timeseries.add(new Month(5, 2001), 167.6D);
timeseries.add(new Month(6, 2001), 158.8D);
timeseries.add(new Month(7, 2001), 148.3D);
timeseries.add(new Month(8, 2001), 153.9D);
timeseries.add(new Month(9, 2001), 142.7D);
timeseries.add(new Month(10, 2001), 123.2D);
timeseries.add(new Month(11, 2001), 131.8D);
timeseries.add(new Month(12, 2001), 139.6D);
timeseries.add(new Month(1, 2002), 142.9D);
timeseries.add(new Month(2, 2002), 138.7D);
timeseries.add(new Month(3, 2002), 137.3D);
timeseries.add(new Month(4, 2002), 143.9D);
timeseries.add(new Month(5, 2002), 139.8D);
timeseries.add(new Month(6, 2002), 137D);
timeseries.add(new Month(7, 2002), 132.8D);

TimeSeries timeseries1 = new TimeSeries(”L&G UK Index Trust?Month.class);
timeseries1.add(new Month(2, 2001), 129.6D);
timeseries1.add(new Month(3, 2001), 123.2D);
timeseries1.add(new Month(4, 2001), 117.2D);
timeseries1.add(new Month(5, 2001), 124.1D);
timeseries1.add(new Month(6, 2001), 122.6D);
timeseries1.add(new Month(7, 2001), 119.2D);
timeseries1.add(new Month(8, 2001), 116.5D);
timeseries1.add(new Month(9, 2001), 112.7D);
timeseries1.add(new Month(10, 2001), 101.5D);
timeseries1.add(new Month(11, 2001), 106.1D);
timeseries1.add(new Month(12, 2001), 110.3D);
timeseries1.add(new Month(1, 2002), 111.7D);
timeseries1.add(new Month(2, 2002), 111D);
timeseries1.add(new Month(3, 2002), 109.6D);
timeseries1.add(new Month(4, 2002), 113.2D);
timeseries1.add(new Month(5, 2002), 111.6D);
timeseries1.add(new Month(6, 2002), 108.8D);
timeseries1.add(new Month(7, 2002), 101.6D);
TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
timeseriescollection.addSeries(timeseries);
timeseriescollection.addSeries(timeseries1);
timeseriescollection.setDomainIsPointsInTime(true); //domain轴上的刻度点代表的是旉点而不是时间段
return timeseriescollection;
}
2、由ChartFactory 产生 JFreeChart 对象
private static JFreeChart createChart(XYDataset xydataset)
{
JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(”Legal & General Unit Trust Prices?
“Date?
“Price Per Unit?
xydataset,
true,
true,
false);
jfreechart.setBackgroundPaint(Color.white);
XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //获得 plot : XYPlot!!
xyplot.setBackgroundPaint(Color.lightGray);
xyplot.setDomainGridlinePaint(Color.white);
xyplot.setRangeGridlinePaint(Color.white);
xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
xyplot.setDomainCrosshairVisible(true);
xyplot.setRangeCrosshairVisible(true);
org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer = xyplot.getRenderer();
if(xyitemrenderer instanceof XYLineAndShapeRenderer)
{
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyitemrenderer;
xylineandshaperenderer.setDefaultShapesVisible(true); //数据点可?br />xylineandshaperenderer.setDefaultShapesFilled(true); //数据Ҏ实心?br />}
DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis(); //对domain 轴上日期昄格式定义
dateaxis.setDateFormatOverride(new SimpleDateFormat(”MMM-yyyy?);
return jfreechart;
}
一些重要的ҎQ?br />A、增加标记线Q?br />xyplot.addRangeMarker(new ValueMarker(550D)); //数Du
Quarter quarter = new Quarter(2, 2002);
xyplot.addDomainMarker(new ValueMarker(quarter.getMiddleMillisecond())); //旉?br />B、数据点的调?br />XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setDefaultShapesVisible(true); //数据点可?br />xylineandshaperenderer.setSeriesFillPaint(0, Color.red); //数据点填充ؓU色
xylineandshaperenderer.setSeriesFillPaint(1, Color.white); //数据点填充ؓ白色
xylineandshaperenderer.setUseFillPaint(true); //应用
C、^均值曲U?br />q个曲线有什么用呢?很简单的例子Q这里有一个以半年每天为单位的数据l制的曲U,我们想看看以月ؓ单位数据
的变化,q时可以用到它了?br />TimeSeries timeseries = createEURTimeSeries(); //是以半q每天ؓ单位的数?br />TimeSeries timeseries1 = MovingAverage.createMovingAverage(timeseries,
?0 day moving average?
30, //30天ؓ一个周?br />30); //最开始的30天蟩q?br />TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
timeseriescollection.addSeries(timeseries);
timeseriescollection.addSeries(timeseries1);
return timeseriescollection;

九、ȝ一?/span>
dataset plot renderer
饼图 PieDatasetQDefaultPieDatasetQ?PiePlot —?br />q?CatagoryDatasetQDefaultCategoryDatasetQ?CategoryPlot BarRenderer
折线?CatagoryDatasetQDefaultCategoryDatasetQ?CategoryPlot LineAndShapeRenderer
XYDatasetQXYSeriesCollectionQ?XYPlot XYLineAndShapeRenderer
旉序列?XYDataset QTimeSeriesCollectionQ?XYPlot XYLineAndShapeRenderer
q里只是一些常用的ҎQ具体还是看API
十、Item Lable
q里以柱状图Z说明Q具体来说就是在每个q上显C它的数据,具体有下面内容:
A、 Item Lable 可见
B、调?Item Lable 的颜艌Ӏ字体等
C、调?Item Lable 的位|?br />D、定?Item Lable 的内?br />1、分配一?Lable Generator l?renderer
BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer();
GategoryLableGenerator generator =new StandardGategoryLableGenerator(
“{2}? new DecimalFormat(?.00? //调整昄的数字和字符格式
);
barrenderer.setLableGenerator(generator);
2、 Item Lable 可见
barrenderer.setItemLableVisible(true);
3、调?Item Lable 的颜艌Ӏ字体等
barrenderer.setItemLablePaint(Color.red);
barrenderer.setItemLableFont(new Font(”SansSerif?Font.PLAIN,10));
4、调?Item Lable 的位|?br />q里涉及C个新的对?ItemLablePosition , ItemLablePosition的构造函数有两个或四个参?br />public ItemLabelPosition(ItemLabelAnchor itemLabelAnchor,
org.jfree.ui.TextAnchor textAnchor,
org.jfree.ui.TextAnchor rotationAnchor,
double angle)
itemLabelAnchor - Item Lable 的位|?Q最重要的!Q)
textAnchor - Item Lable里包含的正文相对于Item Lable 的位|?br />rotationAnchor - Item Lable里包含的正文旋{的位|?br />angle - 旋{的角?br />ItemLabelPosition itemlabelposition = new ItemLabelPosition(ItemLabelAnchor.INSIDE12,
TextAnchor.CENTER_RIGHT,
TextAnchor.CENTER_RIGHT,
-1.57D);
barrenderer.setPositiveItemLabelPosition(itemlabelposition);
q样可以每个柱状上昄它的数据了,当然可以定制 Item Lable 的内容,比如 Item Lable text 过100的才昄Q这样就需要定制自qc,它要实现GategoryLableGenerator 接口Q实现generateItemLable()Ҏ


其他说明Q?br />//讄Legend的位|?br />        //((JFreeChart) chart).getLegend().setPosition(RectangleEdge.RIGHT);
//讄最高的一?Item 与图片顶端的距离
        plot.getRangeAxis().setUpperMargin(0.15);
        //讄最低的一?Item 与图片底端的距离
        plot.getRangeAxis().setLowerMargin(0.15);
        //坐标轴字?br />        plot.getDomainAxis().setLabelFont(new Font("宋体", Font.PLAIN, 12));
        //横u每个分类的字?br />        plot.getDomainAxis().setTickLabelFont(new Font("宋体", Font.BOLD, 12));
        if(labelPositionsUP_45)
            plot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_45);

//柱图列宽?(BarRenderer) plot.getRenderer()).setMaximumBarWidth(barWidth);



java_蝈蝈 2007-02-06 16:42 发表评论
]]>
Pager-taglib 分页标签http://www.tkk7.com/wyz191/articles/pager-taglib.htmljava_蝈蝈java_蝈蝈Mon, 05 Feb 2007 00:57:00 GMThttp://www.tkk7.com/wyz191/articles/pager-taglib.htmlhttp://www.tkk7.com/wyz191/comments/97914.htmlhttp://www.tkk7.com/wyz191/articles/pager-taglib.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/97914.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/97914.html一介,
Pager-taglibQ支持多U风格的分页昄。实际上Ҏ一个Jsp标签库,为在JSP上显C分信息而设计的一套标{,通过q些标签的不同的l合Q会形成多种不一L分页面Q风格各异,她自带的DEMO有七种左右的分风|包括Google的分风根{而需要订制自已的风格的分页面也非常单?
分页方式有两U:
一U是从Action中得C个ListQ在面上通过<pg:item>q行自动分页?
W二U是通过?pageSize,pageNo两参Cl后台进行数据库分页?

我做两个Demo加以说明ҎQ?/p>

二、准?/b>
把pager-taglib.jar攑ֈlib目录?仅此亦Q完全没必要改web.xml什么的Q还有官方war包中的东襉K可以不要)

代码
<%@ taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg" %>

三,jsp Q第一U分|案由<pg:item>自行分页 Q?/p>

代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%
@tagliburi="/WEB-INF/tld/c.tld"prefix="c"%>
<%@ taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg" %
>
<html>
<head></head>
<body>
<pg:pager
url="
/PageAction.do"
index=
"half-full"
maxPageItems =
"3"
maxIndexPages=
"5"
isOffset =
"<%=false%>"
export
="pageOffset,currentPageNumber=pageNumber"
scope="request">

<table>
<c:forEachitems="${userlist}"var="user">
<pg:item>
<tr>
<tdheight="39">${user.userId}</td>
<td height="39">${user.username}<
/td>
<tdheight="39">${user.password}</td>
<
/tr>
</pg:item>
<
/c:forEach>
</table>
<pg:index>
<center>
<table border=0 cellpadding=0 width=10% cellspacing=0>
<tr align=center valign=top>
<td valign=bottom><font face=arial,sans-serif
size=-1>Result Page: <
/font></td>
<pg:prev ifnull="true">
<% if (pageUrl != null) { %>
<td align=right><A HREF="<%= pageUrl %>"><IMG
SRC=http:
//www.google.com/nav_previous.gifalt=""border=0><br>
<b>Previous</b></A></td>
<% } else { %>
<td><IMG SRC=http:
//www.google.com/nav_first.gifalt=""border=0></td>
<% } %>
<
/pg:prev>
<pg:pages>
<%if(pageNumber==currentPageNumber){%>
<td
><IMGSRC=http://www.google.com/nav_current.gifalt=""><br>
<fontcolor=#A90A08><%=pageNumber%></font></td>
<%}else{%>
<td
><AHREF="<%=pageUrl%>"><IMG
SRC=http://www.google.com/nav_page.gifalt=""border=0><br>
<%= pageNumber %></A></td>
<% } %>
</pg:pages>
<pg:next ifnull
="true">
<%if(pageUrl!=null){%>
<td
><AHREF="<%=pageUrl%>"><IMG
SRC=http://www.google.com/nav_next.gifalt=""border=0><br>
<b>Next</b></A></td>
<% } else { %>
<td><IMG SRC=http:
//www.google.com/nav_last.gifalt=""border=0></td>
<% } %>
<
/pg:next>
</tr>
<
/table>
</center>
<
/pg:index>
</pg:pager>
<
/body></html>

四.标签讲解Q从面里可以看刎ͼq里使用了几个标{?/b>

1?lt;pg:pager>,在这个标{ֺ里就充当着一个领袖的作用Q一切子标签都在它里面工作。就以上出现的参数进行解释一下:
itemsQ数据的U录?
maxPageItemsQ显C最多的U录??
maxIndexPagesQ显C最多的分页?ơ,如设?的话Q则会出现这L情况 1 2 3 4 5 .?3 4 5 6 7 q样的Ş式,其实她自带的DEMO都喜Ƣ把|展现出来排成一排?
isOffsetQ与pg:item配套使用
exportQ这个属性比较重要,文档也对此作好相寚w幅的说明。这个属性是让标{你暴露什么变量,当然q些变量是有选择的,如在Pager标签里,可以暴露出来的变量有pageOffset及pageNumberQ即늠偏移量及늠。通过q两个变量名Q可以在Jsp或Java里面从Request里获得。Export属性接受的D有表辑ּQ如currentPage=pageNumber表示Q把pageNumber的值暴露出来,q赋l一个叫CurrentPage的变量,q个变量被保存到Request中,在Jsp或Java中可以得到?
scopeQ咳。还需要讲么?

2?lt;pg:param>q个标签很有用,用来讄要加入到URL的参数。用Name属性指定即可。在q个Demo中我们还没有用的参数传递,下一个Demo你会看到它的用法?/p>

3?lt;pg:index>q个标签说明分页条显C的内容Q在q里你可以设|各U风格的分页昄方式Q本例是google风格的分|?
4, <pg:prev> , <pg:pages>,<pg:next>q些标签都是D标签֐思义,你一看例子就明白了,我就不用讲了吧?/p>

五,W二U分|?
与页面自行分不同的是还需要给后台传两个参敎ͼ
一个是pageNoQ当前页敎ͼ
可以在每一个PageUrl后面都加?amp;pageNo=<%= pageNumber %>。让我们的URL带上늠的参敎ͼq样E序可以拿到늠L找所需要的数据Q你可以L较一下两Demo的代码。OKQ另一个参数是pagesize,q个原本可以在url=?PageAction.do?pagesize=5来做可是Q?lt;pg>标签不支持这样做它给我们提供了另一个传递变量的ҎQ对了就是我前面标签讲解中所提到q的?lt;pg:param>

代码
<pg:pageritems="${totalRows} "url="/PageAction.do?pagesize=5"

q样传递参C对,应该写成Q?
代码
<pg:pageritems="${totalRows}"url="/PageAction.do"maxIndexPages="5">
<pg:paramname=" pagesize "value="5"/>
另外׃不需要在面分页所?lt;pg:param>要去?
再就?lt;pg:pager>要有items属?

六.以下是Demo代码

代码
<pg:pager
items="${ totalRows }"
url="/PageAction.do"
index="half-full"
maxPageItems="5"
maxIndexPages="10"isOffset="<%=false%>"
export="pageOffset,currentPageNumber=pageNumber"
scope="request">
<pg:paramname="pagesize"value="5"/>

<tablealign="center">
<c:forEachitems="${userlist}"var="user">
<!--pg:item-->
<tr>
<tdheight="39">${user.userId}</td>
<td height="39">${user.username}<
/td>
<tdheight="39">${user.password}</td>
<
/tr>
<!--/pg:item-->
<
/c:forEach>
</table>
<pg:index>
<center>
<table border=0 cellpadding=0 width=10% cellspacing=0>
<tr align=center valign=top>
<td valign=bottom><font face=arial,sans-serif
size=-1>Result Page: <
/font></td>
<pg:prev ifnull="true">
<% if (pageUrl != null) { %>
<td align=right><A HREF="<%=pageUrl%>&pageNo=<%=pageNumber%>"><IMG
SRC=http:
//www.google.com/nav_previous.gifalt=""border=0><br>
<b>Previous</b></A></td>
<% } else { %>
<td><IMG SRC=http:
//www.google.com/nav_first.gifalt=""border=0></td>
<% } %>
<
/pg:prev>
<pg:pages>
<%if(pageNumber==currentPageNumber){%>
<td
><IMGSRC=http://www.google.com/nav_current.gifalt=""><br>
<fontcolor=#A90A08><%= pageNumber %></font></td>
<%}else{%>
<td
><AHREF="<%=pageUrl%>&pageNo=<%=pageNumber%>"><IMG
SRC=http://www.google.com/nav_page.gifalt=""border=0><br>
<%=pageNumber%></A></td>
<% } %>
</pg:pages>
<pg:next ifnull
="true">
<%if(pageUrl!=null){%>
<td
><AHREF="<%=pageUrl%>&pageNo=<%=pageNumber%>"><IMG
SRC=http://www.google.com/nav_next.gifalt=""border=0><br>
<b>Next</b></A></td>
<% } else { %>
<td><IMG SRC=http:
//www.google.com/nav_last.gifalt=""border=0></td>
<% } %>
<
/pg:next>
</tr>
<
/table>
</center>
<
/pg:index>
</pg:pager>
http://www.javaeye.com/t/25147.html


java_蝈蝈 2007-02-05 08:57 发表评论
]]>
prototype.js 详解http://www.tkk7.com/wyz191/articles/prototype.htmljava_蝈蝈java_蝈蝈Wed, 31 Jan 2007 11:08:00 GMThttp://www.tkk7.com/wyz191/articles/prototype.htmlhttp://www.tkk7.com/wyz191/comments/97048.htmlhttp://www.tkk7.com/wyz191/articles/prototype.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/97048.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/97048.html阅读全文

java_蝈蝈 2007-01-31 19:08 发表评论
]]>
DWRU联下拉列表http://www.tkk7.com/wyz191/articles/90562.htmljava_蝈蝈java_蝈蝈Thu, 28 Dec 2006 10:48:00 GMThttp://www.tkk7.com/wyz191/articles/90562.htmlhttp://www.tkk7.com/wyz191/comments/90562.htmlhttp://www.tkk7.com/wyz191/articles/90562.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/90562.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/90562.html
讉K数据库的部分Q?/font>


/*
  * 获取所有大cȝcd列表
  */

public static Map getAccessoriesBigTypeInfoMap(){
  
  Map map = new HashMap();
  List list = new ArrayList();
  Session session = SessionFactory.currentSession();
  Transaction tx = session.beginTransaction();
  
  try {
   
   list = session.createQuery("from AccessoriesTypeInfo where UPID is null or UPID = 0").list();
   for(int i=0;i<list.size();i++){
            
      //---------q里只能采用q种形式Q呵呵,Z么?Q请ȝQDQ的文档?/font>
    map.put(((AccessoriesTypeInfo)list.get(i)).getId(),((AccessoriesTypeInfo)list.get(i)).getTypename());
   }
   tx.commit();
  } catch (Exception e) {
   log.error("AccessoriesTypeInfoDAO.getAccessoriesBigTypeInfoList() failed!!!"+e.getMessage());
   if(tx != null) tx.rollback();
  }finally{
   if(session != null) session.close();
  }
  return map;
 }

/*
  * 获取指定大类下的类cd列表
  *String upid:大类ID
  */

public static Map getAccessoriesSmallTypeInfoMap(String upid){
  
  Map map = new HashMap();
  List list = new ArrayList();
  Session session = SessionFactory.currentSession();
  Transaction tx = session.beginTransaction();
  
  try {
   
   int id = Integer.parseInt(upid);
   list = session.createSQLQuery("select {t.*} from AccessoriesTypeInfo t where t.UPID = ?").addEntity("t",AccessoriesTypeInfo.class).setInteger(0,id).list();
   for(int i=0;i<list.size();i++){
    map.put(((AccessoriesTypeInfo)list.get(i)).getId(),((AccessoriesTypeInfo)list.get(i)).getTypename());
   }
   tx.commit();
  } catch (Exception e) {
   log.error("AccessoriesTypeInfoDAO.getAccessoriesBigTypeInfoList() failed!!!"+e.getMessage());
   if(tx != null) tx.rollback();
  }finally{
   if(session != null) session.close();
  }
  return map;
 }


信息昄:


<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="java.util.List"%>

<script type='text/javascript' src='/qcbst/dwr/interface/JDate.js'></script>
 <script type='text/javascript' src='/qcbst/dwr/engine.js'></script>
 <script type='text/javascript' src='/qcbst/dwr/util.js'></script>
 <script type='text/javascript' src='/qcbst/dwr/interface/AccessoriesType.js'></script>
<script type="text/javascript" src="../../js/clearspace.js"></script>
<script language="javascript">

 function selectAorigin(o){
  
     var big = document.getElementById("bigcategories");
   var small = document.getElementById("smallcategories");
   big.length=1;
   small.length=1;  
   big.options[0].selected=true;
   small.options[0].selected=true;
   if(o == "0"){
  
  DWRUtil.removeAllOptions("bigcategories");   //----------U除下拉列表中的内容
  DWRUtil.removeAllOptions("smallcategories");
  DWRUtil.addOptions("bigcategories",{0:'选择大类'});//----------讄一个初始化的下拉列表内?br />  DWRUtil.addOptions("smallcategories",{0:'选择类'});
     big.length=1;
    small.length=1;  
    big.options[0].selected=true;
    small.options[0].selected=true;
   }else{
         
      //-----------AccessoriesType.getAccessoriesBigTypeInfoMap()取得的信息给getABigInfo()
   AccessoriesType.getAccessoriesBigTypeInfoMap(getABigInfo);
  }
 }
 function getABigInfo(d){
  
  DWRUtil.addOptions("bigcategories",d);
 }
 
 
 function selectAbigcategories(brand){

   var small = document.getElementById("smallcategories");
   small.length=1;
   small.options[0].selected=true;
  if(brand == "0"){
 
  small.length=1;
   small.options[0].selected=true;
  }
  AccessoriesType.getAccessoriesSmallTypeInfoMap(getASmallInfo,brand);
 }
 function getASmallInfo(d){
 
  DWRUtil.addOptions("smallcategories",d);
 }
 
 function clearAInfo(){
  document.getElementById("accessoriesname").value="";
 }
 </script>
<form id="form1" name="form1" method="post" action="/qcbst/v_viewaccessoriesinfosearch1" style="0 0 0 0" target="_top">
                <table width="150" border="0" cellspacing="5" cellpadding="0">
                  <tr>
                    <td height="30" align="center"><span class="STYLE1">请在下边q行_搜烦</span></td>
                  </tr>
                  <tr>
                    <td align="center"><select name="aarea" onChange="selectAorigin(this.value)">
                        <option value="0" selected>选择区域</option>
                        <option value="国">国</option>
                        <OPTION value="q口">q口</OPTION>
                      </select>
                    </td>
                  </tr>
                  <tr>
                    <td align="center"><select name="bigcategories" onChange="selectAbigcategories(this.value)">
                        <option value="0" selected>选择大类</option>
                       
                      </select>
                    </td>
                  </tr>
                  <tr>
                    <td align="center"><select name="smallcategories">
                        <option value="0" selected>选择类</option>
                      </select>
                    </td>
                  </tr>
                  <tr>
                    <td align="center"><input name="accessoriesname" type="text" value="    配g名称" size="15" onFocus="clearAInfo()" /></td>
                  </tr>
                  <tr>
                    <td align="center"><input type="submit" name="Submit" value="开始精查? /></td>
                  </tr>
                </table>
            </form>


WEB-INF下的DWR.XML:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "
http://www.getahead.ltd.uk/dwr/dwr10.dtd ">
<dwr>
<allow>
<create creator="new" javascript="AccessoriesType">
<param name="class" value="com.lvke.web.qcbst.dao.automobile.AccessoriesTypeInfoDAO"/>
</create> 
</allow>
</dwr>



java_蝈蝈 2006-12-28 18:48 发表评论
]]>
dwr util.js 的?/title><link>http://www.tkk7.com/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.tkk7.com/wyz191/articles/90022.html</guid><wfw:comment>http://www.tkk7.com/wyz191/comments/90022.html</wfw:comment><comments>http://www.tkk7.com/wyz191/articles/90022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/wyz191/comments/commentRss/90022.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/wyz191/services/trackbacks/90022.html</trackback:ping><description><![CDATA[ <font size="2"> <span id="u6muusq" 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") 大概{h?font face="Courier New">document.getElementById("id") 如果q回l果唯一的话q回该元素的?不唯一则返回一个数l?/font> .另外,如果单独使用util.js的话,可能在IE5以下的浏览器中无法正怋?需要跟engine.js配合使用. 注意,q里得到的是一个对?如果需要得到该对象的值的?需要用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),q是一个debug用的函数.W一个参数是元素的id,W二个参数是debug{,可以?,1,2.随着{增加,输出信息也会增加.注意q个函数只是一个debug工具,不要对它抱有太大qL.</font> </font> </li> <li> <font size="2"> <font face="Courier New">DWRUtil.getText</font>("elementId"),q回一个select下拉菜单中的text?仅适用于selectcd的元? </font> </li> <li> <font size="2"> <font face="Courier New">DWRUtil.getValue</font>("elementId"),q回一个元素的?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 />}),q回一个对象包含这些元素的?暂时不知道做什么用? </font> </li> <li> <font size="2">DWRUtil.onReturn(event, submitFunction) 定义在输入框中按回R的响?防止执行submit. </font> </li> <li> <font face="Courier New" size="2">DWRUtil.addOptions() 一个重要的Ҏ</font> </li> </ol> </span> </td> </tr> </tbody> </table> <div id="4g4ckak" class="posted" align="right"> <font size="2"> </font> </div> <div id="2sa44q8" class="comments-title"> <a name="comment"> </a> </div> <div id="u6ommcu" 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 />}Q?br /><br />q个函数可以自动取得面上指定ID的|q且q回一个,java中可以认识的map(Hashtable或HashMap)?下面是我试CZ;<br /><br />面Q?br /><br />saveuser.htm<br /><br /><html><br /><head><br /><title><br />saveUser<br /></title><br /><!--dwr/engine.js是dwr的核心引擎脚本处理客L调用的{?-><br /><script src="/oblog312/dwr/interface/SaveUserAction.js" type="text/j avascript"></script><br /><script src="/oblog312/dwr/engine.js" type="text/j avascript"></script><br /><!--dwr/util.js包含了工具函数简化页面处?-><br /><script src="/oblog312/dwr/util.js" type="text/j avascript"></script><br /><script type="text/j avascript"><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 /></script><br /></head><br /><body bgcolor="#ffffff"><br /><form action="" id="userForm" name="userForm" method="POST"><br />ID:<input type="text" id="id" name="id" /><br /><br />姓:<input type="text" id="firstName" name="firstName" /><br /><br />名:<input type="text" id="lastName" name="lastName" /><br /><br />出生日期Q?lt;input type="text" id="birthday" name="birthday" /><br /><br /><input type="submit" onclick="saveuser()"/><br /></form><br /></body><br /></html><br /><br />action部分(SaveUserAction.java)Q?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配置部分Q?br /><br />   <create creator="new" j avascript="SaveUserAction"><br />     <param name="class" value="/oblog312/com.action.SaveUserAction"/><br />     <include method="PutParams"/><br />   </create></font> </td> <td valign="top" align="right" width="55"> <a target="_blank"> <font size="2"> </font> </a> </td> </tr> </tbody> </table> </div> <div id="o8wm4g2" class="comments-title"> </div> <div id="yu4gg4u" class="comments-body"> <table width="100%"> <tbody> <tr> <td valign="top"> <font size="2">DWRUtil.addRows()的用法:<br />DWRUtil.addRows(”items?items,cellFunctions); <br />W一个items,应该是table的idQ第2个itemsQ是q程q回的结果集,cellFunctions,对表D填充的回调函Ccȝ?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的就是传入的l果集的某列的内宏V那么这个表格就应该?列。最后一列是静态的html代码了。不q没研究一下,return回去动静混合的内容,是一个字串会如何。我猜应该也可以吧?/font> </td> <td valign="top" align="right" width="55"> <a target="_blank"> <font size="2"> </font> </a> </td> </tr> </tbody> </table> </div> <br /> <div id="wc2iaqq" class="comments-title"> </div> <div id="eqaomm2" class="comments-body"> <table width="100%"> <tbody> <tr> <td valign="top"> <font size="2">先简单介l一下什么是DWR<br /><br />DWR - Direct Web Remoting<br /><br /> ajax是一U提高web站点吸引力和实用性的书写web面的方法。它从服务器端更新web面的特D区域,从而增强用L交互性。它允许信息在短旉的gq或不用h面的情况下更新?br /><br /> DWR减少了开发时_也减了一些可能的错误Q这些错误是在提供常用的Ҏ函数q消除一些与高交互性web站点有关的重复性代码的时候生的?br /><br /> DWR是作为开源Y?ASL verssion 2.0)而可以免费得到的。它凭借它的广阔的库、例子和指南非常易于实现。把它结合到一个现有的站点是非常简单的Q同样它也可以简单地与大多数java框架l合?br /><br /><br /><br />util.js  util.js包含了一些用的ҎQ从而帮助你利用j avascript(可能)从服务器端更C的web数据?br /><br /> 你可以在DWR之外的地方用它Q因为它q不依赖与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。在以后你花大量旉q行ajax~程的时候,在合适的地方使用q种格式是很有益的?br /><br /> '$'通过l定的ID在当前HTML面扑ֈ元素Q如果多于一个的参数被提交,它就会返回一个包含已扑ֈ元素的数l。这个函Cprototype的library中得到的灉|Q而且Q它q能更好的工作在不同的浏览器中?br /><br /><br /><br />Generating Lists<br /><br /> DWR的一个功能可以给一个下拉列?select list)d选项Q只需使用DWRUtil.addOptions()?br /><br /> 如果你在更新列表之前Q希望保留一些选项Q你需要写以下一些代码:<br /><br />     var sel = DWRUtil.getValue(id);<br />     DWRUtil.removeAllOptions(id);<br />     DWRUtil.addOptions(id, ...);<br />     DWRUtil.setValue(id, sel);<br /><br /> 如果你想有个初始化选项Q如Q“please select”,你可以直接用:<br /><br />     DWRUtil.addOptions(id, ["Please select"]);<br /><br />DWRUtil.addOptions ?U调用方法: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的集合来为每一个数l元素创Z个选项Qpro参数指定text和value的倹{?br /><br />Array of objects (with differing option text and value): DWRUtil.addOptions(selectid, array, valueprop, textprop) 用text和value的集合来为每一个数l元素创Z个选项Qvalueprop定valueQtextprop定text?br /><br />Object: DWRUtil.addOptions(selectid, map, reverse) 为map中每一个属?property)创徏一个选项Q属性名作ؓ选项的valueQ属性的value作ؓ选项的text。这样做看v来是错的Q但实际上这U做法的是正确的。如果reverse参数被设|ؓtrueQ则属性的valueq是被用做选项的value?br /><br />Map of objects: DWRUtil.addOptions(selectid, map, valueprop, textprop) 为map中的每一个对象创Z个选项Qvalueprop指定选项的valueQtextprop指定选项的text?br /><br /><br /><br />Generating Tables<br /><br />DWRUtil.addRows() 从一个数l?W二个参?取得|创徏table的每一行。从另一个数l?W三个参?d|为table的每一行创q列?br /><br /><br /><br />DWRUtil.getText(id)<br /><br />可以Ҏid取得text的|q个Ҏ只能用于select list<br /><br />DWRUtil.getValue(id)<br /><br />可以Ҏid取得valueQ用这个方法,你不必在意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 />q个Ҏ和getValue()一P只是它传入的是一个包含名字和数值的j avascript对象.q个名字是HTML元素的ID。这个方法不会返回Q何对象,它只会将ID的value映射l传入的value。例Q?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, "<br/>");                        //转意<br /> DWRUtil.setValue("getvaluesret", reply);                     //昄<br />}<br /><br /><br /><br />DWRUtil.onReturn<br /><br />贴一D代码,暂时不理解,用onReturn和不用有什么区?br /><br /><script><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 /></script><br /><br /><p><input type="text" onkeydown="DWRUtil.onReturn(event, submitFunction)"/><br /><input type="button" onclick="submitFunction()" value="GO"/><br /><span id="alert" style="display:none; background:#FFFFDD; font-weight:bold;">submitFunction called</span><br /></p><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扑ֈ元素Qƈ更新value<br /><br />DWRUtil.setValues()<br /><br />和setValue(id,value)一P只是它需要的参数是个j avascript对象Q如Q?br /><br />DWRUtil.setValues({ <br /> div: "new div content",<br /> password: "1234567890"<br />});<br /><br /><br /><br />DWRUtil.toDescriptiveString<br /><br />带debug信息的toStringQ第一个ؓ要debug的对象,W二个参Cؓ处理{。等U如下:<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 最多分析到W二层子元素的多行调?<br />And so on. Level 2 and greater probably produce too much output. <br /><br />ȝQDWR不但屏蔽了许多client与server交互的重复且复杂的代码,而且q提供了一些常用的ҎQ一些思想q是从prototypel承而来Qƈ有一定的改进。同Ӟ它也考虑C与struts、hibernate、spring的结合问题?br /><br />需要注意的是,DWR是一U把服务器端的java代码通过j avascript直接从浏览器调用的方?DWR is a way of calling Java code on the server directly from Javascript in the browser.)Q而不是一个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?4q?1月草案提出到现在的Version 1.1 beta 3(2005-12-29)Q已l更新发布了20多次了,但愿在ajax的发展大路上Q能始终看见DWR的n影?br /></font> </td> </tr> </tbody> </table> </div> <font size="2">引自:http://www.bestunix.net/index.php</font> <img src ="http://www.tkk7.com/wyz191/aggbug/90022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/wyz191/" target="_blank">java_蝈蝈</a> 2006-12-26 09:13 <a href="http://www.tkk7.com/wyz191/articles/90022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jodd的?/title><link>http://www.tkk7.com/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.tkk7.com/wyz191/articles/90024.html</guid><wfw:comment>http://www.tkk7.com/wyz191/comments/90024.html</wfw:comment><comments>http://www.tkk7.com/wyz191/articles/90024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/wyz191/comments/commentRss/90024.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/wyz191/services/trackbacks/90024.html</trackback:ping><description><![CDATA[ <p>jodd.jar<br />springside-joddform.jar</p> <p>//---------JSP面<br /><%@ taglib prefix="jodd" uri="<a %</a>></p> <p><jodd:form bean="automobile" scope="session"><br /></jodd:form></p> <p>//---------后台<br />import jodd.bean.BeanUtil;<br />AutomobileSalesInfo automobile = new AutomobileSalesInfo();<br />BeanUtil.load(automobile, request);<br />   <br />有空完善```</p> <img src ="http://www.tkk7.com/wyz191/aggbug/90024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/wyz191/" target="_blank">java_蝈蝈</a> 2006-12-26 09:13 <a href="http://www.tkk7.com/wyz191/articles/90024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSCache分析 http://www.tkk7.com/wyz191/articles/89859.htmljava_蝈蝈java_蝈蝈Mon, 25 Dec 2006 03:53:00 GMThttp://www.tkk7.com/wyz191/articles/89859.htmlhttp://www.tkk7.com/wyz191/comments/89859.htmlhttp://www.tkk7.com/wyz191/articles/89859.html#Feedback0http://www.tkk7.com/wyz191/comments/commentRss/89859.htmlhttp://www.tkk7.com/wyz191/services/trackbacks/89859.html阅读全文

java_蝈蝈 2006-12-25 11:53 发表评论
]]>
在线~辑器一:FCKeditor在线~辑?/title><link>http://www.tkk7.com/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.tkk7.com/wyz191/articles/FCKeditor.html</guid><wfw:comment>http://www.tkk7.com/wyz191/comments/89651.html</wfw:comment><comments>http://www.tkk7.com/wyz191/articles/FCKeditor.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/wyz191/comments/commentRss/89651.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/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">引自Qjack_booth的BLOG</font> </p> <p> <font size="2">html在线~辑器对于我们作新闻产品之类的程序是很重要的Q在|上扑ֽ了好了好一D|_发现FCKeditor,跨^台的Q正在进行的jsp目正需要这ƾhtml在线~辑器。试用了一下FCKeditor,Ҏ|上的文章小l一下:<br /><br /><b>1.下蝲</b><br />FCKeditor.java 2.3 (FCKeditot for java)<br />FCKeditor 2.2 (FCKeditor基本文g)<br />以下是下载地址Q?br /></font> <a title="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复制到项目的根目录下Q?br />目录l构为:tomcat/webapps/TestFCKeditor/FCKeditor<br />然后FCKeditor-2.3.zipQjavaQ压~包中\web\WEB-INF\lib\目录下的两个jar文g拷到目的\WEB-INF\lib\目录下。把其中的src目录下的FCKeditor.tld文gcopy到TestFCKedit/FCKeitor/WEB-INF/?br /><br /><b>4.合ƈweb.xml:</b><br />FCKeditor-2.3.zip压羃包中\web\WEB-INF\目录下的web.xml文g合ƈ到项目的\WEB-INF\目录下的web.xml文g中?br /><br /><br /><b>5. 修改合ƈ后的web.xml文g</b><br />修改合ƈ后的web.xml文gQ将名ؓSimpleUploader的Servlet的enabled参数值改为trueQ?br />以允怸传功能,Connector Servlet的baseDir参数值用于设|上传文件存攄位置?br />d标签定义:<br /><taglib><br /><taglib-uri>/TestFCKeditor</taglib-uri><br /><taglib-location>/WEB-INF/FCKeditor.tld</taglib-location><br /></taglib><br /><br />q行图:<br /></font> </p> <div style="OVERFLOW-X: auto; WIDTH: 100%"> <a 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 />上面文g中两个servlet的映分别ؓQ?editor/filemanager/browser/default/connectors/jsp/connector<br />?editor/filemanager/upload/simpleuploaderQ需要在两个映射前面加上/FCKeditorQ?br />x?FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector?br />/FCKeditor/editor/filemanager/upload/simpleuploader?br /><br /><b>7.修改skin文g?/b><br />q入skin文g夹,如果你想使用fckeditor默认的这U奶黄色Q?br />那就把除了default文g夹外的另两个文g夹直接删?<br /><br /><b>8.删除无用文g</b><br />删除/FCKeditor/目录下除fckconfig.js, fckeditor.js, fckstyles.xml, fcktemplates.xml四个文g以外的所有文?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四个文g的所有文?br /><br /><b>9.修改配置Q?/b><br />打开/FCKeditor/fckconfig.js<br />修改 FCKConfig.DefaultLanguage = 'zh-cn' ;<br />把FCKConfig.LinkBrowserURL{的值替换成以下内容Q?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&Connector=connectors/jsp/connector" ;<br /><br />FCKConfig.FlashBrowserURL<br />= FCKConfig.BasePath + "filemanager/browser/default/browser.html?Type=Flash&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总配|文Ӟ可用记录本打开Q修改后文件存为utf-8 ~码格式。找刎ͼ<br /><br />FCKConfig.TabSpaces = 0 ; 改ؓFCKConfig.TabSpaces = 1 ; 卛_~辑器域内可以用Tab键?br /><br />如果你的~辑器还用在|站前台的话Q比如说用于留言本或是日记回复时Q那׃得不考虑安全了,<br />在前台千万不要用Default的toolbarQ要么自定义一下功能,要么qpȝ已经定义好的BasicQ?br />也就是基本的toolbarQ找刎ͼ<br />FCKConfig.ToolbarSets["Basic"] = [<br />['Bold','Italic','-','OrderedList','UnorderedList','-',/*'Link',*/'Unlink','-','Style','FontSize','TextColor','BGColor','-',<br />'Smiley','SpecialChar','Replace','Preview'] ] ;<br />q是改过的BasicQ把囑փ功能LQ把d链接功能LQ因为图像和链接和flash和图像按钮添加功能都能让前台<br />늛接访问和上传文gQ?fckeditorq支持编辑域内的鼠标右键功能?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 />q也是改q的把鼠标右键的“链接、图像,FLASHQ图像按钮”功能都L?br /><br />  扑ֈQ?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.d文g</b><br />d文g /TestFCKeditor/test.jsp:<br /><%@ page language="java" import="com.fredck.FCKeditor.*" %><br /><%@ taglib uri="/TestFCKeditor" prefix="FCK" %><br /><script type="text/javascript" src="/TestFCKeditor/FCKeditor/fckeditor.js"></script><br /><br /><%--<br />三种Ҏ调用FCKeditor<br />1.FCKeditor自定义标{?(必须加头文g <%@ taglib uri="/TestFCKeditor" prefix="FCK" %> )<br />2.script脚本语言调用 (必须引用 脚本文g <script type="text/javascript" src="/TestFCKeditor/FCKeditor/fckeditor.js"></script> )<br />3.FCKeditor API 调用 (必须加头文g <%@ page language="java" import="com.fredck.FCKeditor.*" %> )<br />--%><br /><br /><%--<br /><form action="show.jsp" method="post" target="_blank"><br /><FCK:editor id="content" basePath="/TestFCKeditor/FCKeditor/"<br />width="700"<br />height="500"<br />skinPath="/TestFCKeditor/FCKeditor/editor/skins/silver/"<br />toolbarSet = "Default"<br />><br />input<br /></FCK:editor><br /><input type="submit" value="Submit"><br /></form><br />--%><br /><br /><form action="show.jsp" method="post" target="_blank"><br /><table border="0" width="700"><tr><td><br /><textarea id="content" name="content" style="WIDTH: 100%; HEIGHT: 400px">input</textarea><br /><script type="text/javascript"><br />var oFCKeditor = new FCKeditor('content') ;<br />oFCKeditor.BasePath = "/TestFCKeditor/FCKeditor/" ;<br />oFCKeditor.Height = 400;<br />oFCKeditor.ToolbarSet = "Default" ;<br />oFCKeditor.ReplaceTextarea();<br /></script><br /><input type="submit" value="Submit"><br /></td></tr></table><br /></form><br /><br /><%--<br /><form action="show.jsp" method="post" target="_blank"><br /><%<br />FCKeditor oFCKeditor ;<br />oFCKeditor = new FCKeditor( request, "content" ) ;<br />oFCKeditor.setBasePath( "/TestFCKeditor/FCKeditor/" ) ;<br />oFCKeditor.setValue( "input" );<br />out.println( oFCKeditor.create() ) ;<br />%><br /><br><br /><input type="submit" value="Submit"><br /></form><br />--%><br /><br />d文g/TestFCKeditor/show.jsp:<br /><%<br />String content = request.getParameter("content");<br />out.print(content);<br />%><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 />感言Q一直用的这个编辑器Q只不过是从朋友那边整过来的Q呵呵,已经改过的<FCKeditor化版Q,感觉非常好,用后Q也没有仔细的看Q研I它<img height="19" src="http://www.tkk7.com/Emoticons/emembarrassed.gif" width="19" border="0" />Q偶发现q一文章,感觉不错Q抱着学习的态度引用过来了</font> </p> </div> <img src ="http://www.tkk7.com/wyz191/aggbug/89651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/wyz191/" target="_blank">java_蝈蝈</a> 2006-12-23 12:52 <a href="http://www.tkk7.com/wyz191/articles/FCKeditor.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSCacher的应?/title><link>http://www.tkk7.com/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.tkk7.com/wyz191/articles/oscache.html</guid><wfw:comment>http://www.tkk7.com/wyz191/comments/89496.html</wfw:comment><comments>http://www.tkk7.com/wyz191/articles/oscache.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/wyz191/comments/commentRss/89496.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/wyz191/services/trackbacks/89496.html</trackback:ping><description><![CDATA[ <p> <font size="2">OSCache是当前运用最q的~存ҎQJBoss,Hibernate,Spring{都对其有支持,<br />下面单介l一下OSCache的配|和使用q程?/font> </p> <p> <font size="2">1.安装q程<br />?/font> <a > <font size="2">http://www.opensymphony.com/oscache/download.html</font> </a> <font size="2">下蝲合适的OSCache版本Q?br />我下载的是oscache-2.0.2-full版本?br />解压~下载的文g到指定目?/font> </p> <p> <font size="2">从解压羃目录取得oscache.jar 文g攑ֈ /WEB-INF/lib 或相应类库目?目录中,<br />jar文g名可能含有版本号和该版本的发布日期信息等Q如oscache-2.0.2-22Jan04.jar</font> </p> <p> <font size="2">如果你的jdk版本?.3.x,在lib中加入Apache Common Lib 的commons-collections.jar包?br />如jdk?.4以上则不?/font> </p> <p> <font size="2">从src或etc目录取得oscache.properties 文gQ放入src根目录或发布环境?WEB-INF/classes 目录<br />如你需要徏立磁盘缓存,M改oscache.properties 中的cache.path信息 (L前面?注释)?br />winc\径类gؓc:\\app\\cache<br />unixc\径类gؓ/opt/myapp/cache</font> </p> <p> <font size="2">拯OSCache标签库文件oscache.tld?WEB-INF/classes目录?/font> </p> <p> <font size="2">现在你的应用目录cM如下Q?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文g?br /><taglib><br /><taglib-uri>oscache</taglib-uri><br /><taglib-location>/WEB-INF/classes/oscache.tld</taglib-location><br /></taglib> </font> </p> <p> <font size="2">Z便于调试日志输出Q须加入commons-logging.jar和log4j-1.2.8.jar到当前类库\径中</font> </p> <p> <font size="2">在src目录加入下面两个日志输出配置文gQ?br />log4j.properties 文g内容为:<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 文g内容?/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 文g配置向导 </font> </p> <p> <font size="2">cache.memory<br />gؓtrue ?false Q默认ؓ在内存中作缓存,<br />如设|ؓfalseQ那cache只能~存到数据库或硬盘中Q那cacheq有什么意义:Q?/font> </p> <p> <font size="2">cache.capacity<br />~存元素个数</font> </p> <p> <font size="2">cache.persistence.class<br />持久化缓存类Q如此类打开Q则必须讄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"><%@ page import="java.util.*" %><br /><%@ taglib uri="oscache" prefix="cache" %></font> </p> <p> <font size="2"><html><br /><body></font> </p> <p> <font size="2">没有~存的日? <%= new Date() %><p><br /><!--自动h--><br /><cache:cache time="30"><br />?0U刷新缓存一ơ的日期: <%= new Date() %> <br /></cache:cache><br /><!--手动h--><br /><cache:cache key="testcache"><br />手动h~存的日? <%= new Date() %> <p><br /></cache:cache><br /><a href="/cache2.jsp">手动h</a></font> </p> <p> <font size="2"></body><br /></html></font> </p> <p> <font size="2">cache2.jsp 执行手动h面如下<br /><%@ taglib uri="oscache" prefix="cache" %></font> </p> <p> <font size="2"><html><br /><body></font> </p> <p> <font size="2">~存已刷?..<p></font> </p> <p> <font size="2"><cache:flush key="testcache" scope="application"/></font> </p> <p> <font size="2"><a href="/cache1.jsp">q回</a></font> </p> <p> <font size="2"></body><br /></html></font> </p> <p> <font size="2">OSCache库提供的flush标记能够h~冲内容。我们可以把下面的代码加入到处理用户动作且可能媄响这一区域的页面之中:</font> </p> <p> <font size="2"><cache:flush key="testcache" scope="application"/> </font> </p> <p> <font size="2">当用户下ơ访问它Ӟtestcache~冲块将被刷?/font> </p> <p> <br /> <font size="2">你也可以通过下面语句定义Cache的有效范?如不定义scope,scope默认为Applcation<br /><cache:cache time="30" scope="session"><br />...<br /></cache:cache></font> </p> <p> <font size="2">4. ~存qo?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("<cache>: 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("<cache>: Using cached entry for " + key);<br />            }</font> </p> <p> <font size="2">            boolean acceptsGZip = false;<br />            if ((!fragmentRequest) && (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) && (clientLastModified >= respContent.getLastModified())) {<br />                    ((HttpServletResponse) response).setStatus(HttpServletResponse.SC_NOT_MODIFIED);<br />                    return;<br />                }</font> </p> <p> <font size="2">                acceptsGZip = respContent.isContentGZiped() && 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("<cache>: 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 >= 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("<cache>: 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("<cache>: 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) && (acceptEncoding.indexOf("gzip") != -1);<br />    }</font> </p> <p> <font size="2">}</font> </p> <p> <br /> <font size="2">你可以在web.xml中定义缓存过滤器Q定义特定资源的~存?br /><filter><br /><filter-name>CacheFilter</filter-name><br /><filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class><br /><init-param><br /><param-name>time</param-name><br /><param-value>60</param-value><br /></init-param><br /><init-param><br /><param-name>scope</param-name><br /><param-value>session</param-value><br /></init-param><br /></filter><br /><filter-mapping><br /><filter-name>CacheFilter</filter-name><br /><url-pattern>*.jsp</url-pattern><br /></filter-mapping><br />上面定义缓存所?jsp面Q缓存刷新时间ؓ60U,~存作用域ؓSession</font> </p> <p> <font size="2"> </font> </p> <p> <font size="2">注意QCacheFilter只捕获Http头ؓ200的页面请求,卛_Ҏ错误h作缓存,<br />而不对其他请求(?00,404,400Q作~存处理 <br /></font> </p> <p> <font size="2"> <strong> <font style="BACKGROUND-COLOR: #ff0000">OSCache - Tags</font> </strong>Q?/font> <a > <font size="2">http://www.opensymphony.com/oscache/wiki/JSP%20Tags.html</font> </a> <br /> <font size="2">  <br />  注:本文引自</font> <a > <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.tkk7.com/wyz191/aggbug/89496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/wyz191/" target="_blank">java_蝈蝈</a> 2006-12-22 13:16 <a href="http://www.tkk7.com/wyz191/articles/oscache.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://taiyu18.com" target="_blank">A޾Ʒ</a>| <a href="http://shguojing.com" target="_blank">޾ƷƵ</a>| <a href="http://276194.com" target="_blank">һƵѹۿ</a>| <a href="http://jlzjjy.com" target="_blank">һҺ</a>| <a href="http://henhenluc.com" target="_blank">վƵ߹ۿ</a>| <a href="http://hwjyrck.com" target="_blank">պƷ˳߹ۿ </a>| <a href="http://czshenyue.com" target="_blank">ľƷ</a>| <a href="http://www-8908.com" target="_blank">freeƵ</a>| <a href="http://mhysf.com" target="_blank">ƷѾþþþӰԺ </a>| <a href="http://www398ph.com" target="_blank">޳aƬ߿</a>| <a href="http://5shitou.com" target="_blank">þþƷAVDz18</a>| <a href="http://tj-zhongfa.com" target="_blank">˳ëƬ߲</a>| <a href="http://hh5151.com" target="_blank">ۺĻ</a>| <a href="http://v1s3u5.com" target="_blank">ŷav߹ۿ</a>| <a href="http://avdian126.com" target="_blank">޾Ʒsuvһ88</a>| <a href="http://kwknc.com" target="_blank">ŮƵaƵȫվһ</a>| <a href="http://8654123.com" target="_blank">޾Ʒŷ߹ۿ</a>| <a href="http://lwjiheng.com" target="_blank">ɫëƬƵ</a>| <a href="http://html5text.com" target="_blank">ִˬƵ </a>| <a href="http://kph37.com" target="_blank">˳Ƶ߲</a>| <a href="http://mm9d.com" target="_blank">Ʒ</a>| <a href="http://295301.com" target="_blank">ѹۿþþƵ</a>| <a href="http://ur5r2kr.com" target="_blank">Ļ߹ۿձ</a>| <a href="http://vankiz.com" target="_blank">2020ΪĻѹۿȫ </a>| <a href="http://zisewang.com" target="_blank">AV˵߹ۿ</a>| <a href="http://www-8908.com" target="_blank">˳ɫ߹ۿ</a>| <a href="http://998wc.com" target="_blank">ؼëƬAëƬ100Ѳ</a>| <a href="http://ikybh.com" target="_blank">ssswwwձվƬ</a>| <a href="http://8833081.com" target="_blank">ҹ1000Ƶ</a>| <a href="http://papapa97.com" target="_blank">ѾƷ͵Բ </a>| <a href="http://kimnote.com" target="_blank">ëƬaëƬѲ</a>| <a href="http://023npxyy.com" target="_blank">鶹ѹۿ91</a>| <a href="http://fenglufzjx.com" target="_blank">ɫͼۺ</a>| <a href="http://hetaoqpj.com" target="_blank">޾Ʒר</a>| <a href="http://4p5e.com" target="_blank"> Ļ</a>| <a href="http://masfd.com" target="_blank">2018Ƶ</a>| <a href="http://zibochanglong.com" target="_blank">Ƶ</a>| <a href="http://tltcn.com" target="_blank">þwww˳_Ƭ</a>| <a href="http://xyxpx.com" target="_blank">www޾Ʒþþ</a>| <a href="http://155lh.com" target="_blank">޳ɫӰԺ</a>| <a href="http://mllm999.com" target="_blank">ŷպĸwww777</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>