??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
Hibernate扚w处理:
Hibernate扚w处理其实从性能上考虑Q它是很不可取的Q浪费了很大的内存。从它的机制上讲QHibernate它是先把W合条g的数据查出来Q放到内存当中,然后再进行操作。实际用下来性能非常不理?在笔者的实际
使用中采用下面的W三U优化方案的数据?100000条数据插入数据库,L台式机的配置,需要约30分钟,呵呵,晕?
ȝ下来有三U来处理以解x能问题Q?/p>
1Q绕qHibernate API Q直接通过 JDBC API 来做Q这个方法性能上是比较好的。也是最快的.
2Q运用存储过E?/p>
3Q还是用Hibernate API 来进行常规的扚w处理Q可以也有变Q变变在,我们可以在查扑և一定的量的时候,及时的将q些数据做完操作?/p>
删掉Qsession.flush();session.evict(XX对象?; q样也可以挽救一Ҏ能损失。这个“一定的量”要pҎ实际情况做定量参考了。一般ؓ30-60左右,但效果仍然不理想.
1Q绕qHibernate API Q直接通过 JDBC API 来做Q这个方法性能上是比较好的Q也是最快的?实例?更新操作)
Transaction tx=session.beginTransaction(); //注意用的是hibernate事务处理边界
Connection conn=session.connection();
PreparedStatement stmt=conn.preparedStatement("update CUSTOMER as C set C.sarlary=c.sarlary+1 where c.sarlary>1000");
stmt.excuteUpdate();
tx.commit(); //注意用的是hibernate事务处理边界
q小E序中,采用的是直接调用JDBC 的API 来访问数据库Q效率很高。避免了Hibernate 先查询出来加载到内存Q再q行操作引发的性能问题
?
2Q运用存储过E。但q种方式考虑到易植和E序部v的方便?不徏议?(实例?更新操作)
如果底层数据库(如OracleQ支持存储过E,也可以通过存储q程来执行批量更新。存储过E直接在数据库中q行Q速度更加快。在Oracle?/p>
据库中可以定义一个名为batchUpdateCustomer()的存储过E,代码如下Q?
代码内容
create or replace procedure batchUpdateCustomer(p_age in number) as
begin
update CUSTOMERS set AGE=AGE+1 where AGE>p_age;
end;
以上存储q程有一个参数p_ageQ代表客Lq龄Q应用程序可按照以下方式调用存储q程Q?
代码内容
tx = session.beginTransaction();
Connection con=session.connection();
String procedure = "{call batchUpdateCustomer(?) }";
CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0); //把年龄参数设?
cstmt.executeUpdate();
tx.commit();
从上面程序看出,应用E序也必ȝqHibernate APIQ直接通过JDBC API来调用存储过E?
3Q还是用Hibernate API 来进行常规的扚w处理Q可以也有变Q变变在,我们可以在查扑և一定的量的时候,及时的将q些数据做完操作?/p>
删掉Qsession.flush();session.evict(XX对象?; q样也可以挽救一Ҏ能损失。这个“一定的量”要pҎ实际情况做定量参考了。?/p>
(实例?保存操作)
业务逻辑为:我们要想数据库插?0 0000 条数?/p>
tx=session.beginTransaction();
for(int i=0;i<100000;i++)
{
Customer custom=new Customer();
custom.setName("user"+i);
session.save(custom);
if(i%50==0) // 以每50个数据作Z个处理单元,也就是我上面说的“一定的量”,q个量是要酌情考虑?/p>
{
session.flush();
session.clear();
}
}
q样可以把系l维持在一个稳定的范围....
[b]一、jFreeChart产生囑Ş的流E[/b]
创徏一个数据源QdatasetQ来包含要在图形中昄的数?创徏一?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 />
[b]二、饼图[/b]
饼图的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、输出略
[b]三、柱状图[/b]
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 ?Lable
q里先简单理解ؓ横坐标Lable好了
"Value", //range ?Lable
q里也先单理解ؓ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坐标网格线白色
//下面两行使纵坐标的最单位格为整?br /> NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); //获得renderer 注意q里是下嗍造型
到BarRendererQ!
barrenderer.setDrawBarOutline(false); // Bar的外轮廓U不?br /> 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);
[b]四、折U图[/b]
折线囄dataset 两种CatagoryDataset接口(具体实现cLDefaultCategoryDataset),XYDataset 接口
1、CatagoryDataset接口Q ?
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"的(即series1Q点之间的连U?Q这里是虚线Q默认是直线
lineandshaperenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
6F, 6F
}, 0.0F)); //定义series?Second"的(即series2Q点之间的连U?br /> lineandshaperenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
2.0F, 6F
}, 0.0F)); //定义series?Third"的(即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);
[b]五、时间序列图[/b]
旉序列囑֒折线囑־怼Q不同的是它?domain轴的数据是时间而不是数字?旉序列囄dataset ?br /> XYDataset 接口Q具体实现类是TimeSeriesCollection Q和上面cMQ有TimeSeries 对象Q它被添加入
TimeSeriesCollection 。 ?
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?
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?
q个曲线有什么用呢?很简单的例子Q这里有一个以半年每天为单位的数据l制的曲U,我们想看看以月ؓ单位数据
的变化,q时可以用到它了?
TimeSeries timeseries = createEURTimeSeries(); //是以半q每天ؓ单位的数?br /> TimeSeries timeseries1 = MovingAverage.createMovingAverage(timeseries,
"30 day moving average",
30, //30天ؓ一个周?br /> 30); //最开始的30天蟩q?br /> TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
timeseriescollection.addSeries(timeseries);
timeseriescollection.addSeries(timeseries1);
return timeseriescollection;
[b]六、ȝ一下[/b]
dataset plot renderer
饼图 PieDatasetQDefaultPieDatasetQ ?PiePlot ------
q图 ?CatagoryDatasetQDefaultCategoryDatasetQ ?CategoryPlot BarRenderer
折线图 ?CatagoryDatasetQDefaultCategoryDatasetQ ?CategoryPlot LineAndShapeRenderer
XYDatasetQXYSeriesCollectionQ ?XYPlot XYLineAndShapeRenderer
旉序列图 ?XYDataset QTimeSeriesCollectionQ ?XYPlot XYLineAndShapeRenderer
q里只是一些常用的ҎQ具体还是看API ,主要的类ȝ如下Q?br />JFreeChart:生成图表的中间存攄?/p>
[b]七、Item Lable[/b]
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("0.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()Ҏ?/p>
org.hibernate.criterion.Projections?Projection 的实例工厂。我们通过调用 setProjection()应用投媄C个查询?
List results = session.createCriteria(Cat.class) .setProjection( Projections.rowCount() ) .add( Restrictions.eq("color", Color.BLACK) ) .list();
List results = session.createCriteria(Cat.class) .setProjection( Projections.projectionList() .add( Projections.rowCount() ) .add( Projections.avg("weight") ) .add( Projections.max("weight") ) .add( Projections.groupProperty("color") ) ) .list();
在一个条件查询中没有必要昑ּ的?"group by" 。某些投q型就是被定义?span class="emphasis"> 分组投媄Q他们也出现在SQL?tt class="literal">group by子句中?
你可以选择把一个别名指z一个投影,q样可以使投影DU束或排序所引用。下面是两种不同的实现方式:
List results = session.createCriteria(Cat.class) .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) ) .addOrder( Order.asc("colr") ) .list();
List results = session.createCriteria(Cat.class) .setProjection( Projections.groupProperty("color").as("colr") ) .addOrder( Order.asc("colr") ) .list();
alias()?tt class="literal">as()Ҏ便的一个投影实例包装到另外一?别名?tt class="literal">Projection实例中。简而言之,当你d一个投影到一个投影列表中?你可以ؓ它指定一个别名:
List results = session.createCriteria(Cat.class) .setProjection( Projections.projectionList() .add( Projections.rowCount(), "catCountByColor" ) .add( Projections.avg("weight"), "avgWeight" ) .add( Projections.max("weight"), "maxWeight" ) .add( Projections.groupProperty("color"), "color" ) ) .addOrder( Order.desc("catCountByColor") ) .addOrder( Order.desc("avgWeight") ) .list();
List results = session.createCriteria(Domestic.class, "cat") .createAlias("kittens", "kit") .setProjection( Projections.projectionList() .add( Projections.property("cat.name"), "catName" ) .add( Projections.property("kit.name"), "kitName" ) ) .addOrder( Order.asc("catName") ) .addOrder( Order.asc("kitName") ) .list();
你也可以使用Property.forName()来表C投影:
List results = session.createCriteria(Cat.class) .setProjection( Property.forName("name") ) .add( Property.forName("color").eq(Color.BLACK) ) .list();
List results = session.createCriteria(Cat.class) .setProjection( Projections.projectionList() .add( Projections.rowCount().as("catCountByColor") ) .add( Property.forName("weight").avg().as("avgWeight") ) .add( Property.forName("weight").max().as("maxWeight") ) .add( Property.forName("color").group().as("color" ) ) .addOrder( Order.desc("catCountByColor") ) .addOrder( Order.desc("avgWeight") ) .list();
DisplayTag是一个非常好用的表格昄标签Q适合MVC模式Q其主页?a >http://displaytag.sourceforge.net/
一、最单的情况Q未使用<display:column/>标签
<%request.setAttribute( "test", new ReportList(6) );%>
<display:table name="test" />
标签遍历List里的每一个对象,q将对象里的所有属性显C出来。一般用于开发的时候检查对象数据的完整性?br />
二、?lt;display:column/>标签的情?/strong>
<display:table name="test">
<display:column property="id" title="ID" />
<display:column property="name" />
<display:column property="email" />
<display:column property="status" />
<display:column property="description" title="Comments"/>
</display:table>
property对应List里对象的属性(用getXXX()Ҏ取得Q,title则对应表D头里的列名。定义列有两U方式:
A?lt;display:column property="email" />
使用<display:column/>标签里的property属性来定义
B?lt;display:column title="email">email@it.com</display:column>
?lt;display:column/>标签体里增加内容Q可以是帔RQ也可以用其他标{{?br /> 两种方式比较Q用property属性来定义更加快速和利于排序?br />
三、表格显C样式的定义
A、在<display:table/>?lt;display:column/>标签里指定标准的html属性,烦琐
B、修Ҏ式表
<display:table name="test" class="mars">
<display:column property="id" title="ID" class="idcol"/>
<display:column property="name" />
<display:column property="email" />
<display:column property="status" class="tableCellError" />
<display:column property="description" title="Comments"/>
</display:table>
通过class属性来指定所要应用的样式。可以在光认样式表里(./css/screen.cssQ直接修?br />
四、标{֏得数据的数据?br /> 有四U范?br /> pageScope
requestScope (默认) <display:table name="test2" >
sessionScope <display:table name="sessionScope.holder.list" > 注意Q这里要指定范围Q非默认
applicationScope
五、通过增加id属性创建隐含的对象
<display:table name="test" id="testit">
<display:column property="id" title="ID" />
<display:column property="name" />
<display:column title="static value">static</display:column>
<display:column title="row number (testit_rowNum)"><%=pageContext.getAttribute("testit_rowNum")%></display:column>
<display:column title="((ListObject)testit).getMoney()"><%=((ListObject)pageContext.getAttribute("testit")).getMoney()%></display:column>
</display:table>
注意到在<display:table/>里增加了id属性,q时在page context里创Z一个隐含对象,指向List里的当前对象Q?br /> 可以通过(ListObject)pageContext.getAttribute("id")来捕莯个对象。同时还创徏了一个id_rowNum对象Q同P?br /> 通过pageContext.getAttribute("testit_rowNum")来捕P它仅仅代表当前行的行数?br /> 有了q两个隐含对象,可以通过其他标签来访问,例如Jstl:
<display:table id="row" name="mylist">
<display:column title="row number" >
<c:out value="${row_rowNum}"/>
</display:column>
<display:column title="name" >
<c:out value="${row.first_name}"/>
<c:out value="${row.last_name}"/>
</display:column>
</display:table>
六、显C部分数?/strong>
昄开始五条数据:通过讑֮length属?br /><display:table name="test" length="5">
<display:column property="id" title="ID" />
<display:column property="email" />
<display:column property="status" />
</display:table>
昄W三到第八条数据Q通过讑֮offset和length属?br /><display:table name="test" offset="3" length="5">
<display:column property="id" title="ID" />
<display:column property="email" />
<display:column property="status" />
</display:table>
七、对email和url地址的直接连?/strong>
<display:table name="test" >
<display:column property="id" title="ID" />
<display:column property="email" autolink="true" />
<display:column property="url" autolink="true" />
</display:table>
如果要显C的对象里包含email和url地址Q则可以在display:column里直接设定autolink="true"来直接连?br />
八、用装饰模式{换数据显C(写自q decorator Q?/strong>
A、对整个表格应用decorator
<display:table name="test" decorator="org.displaytag.sample.Wrapper" >
<display:column property="id" title="ID" />
<display:column property="email" />
<display:column property="status" />
<display:column property="date" />
<display:column property="money" />
</display:table>
org.displaytag.sample.Wrapper卌己写的decoratorQ它要承TableDecoratorc,看看它的一个方法:
public String getMoney()
{
return this.moneyFormat.format(((ListObject) this.getCurrentRowObject()).getMoney());
}
很明显,它通过父类的getCurrentRowObject()Ҏ获得当前对象Q然后对其getMoney()Ҏq行‘a漆?br /> B、对单独的column应用decorator
<display:table name="test">
<display:column property="id" title="ID" />
<display:column property="email" />
<display:column property="status" />
<display:column property="date" decorator="org.displaytag.sample.LongDateWrapper" />
</display:table>
org.displaytag.sample.LongDateWrapper要实现ColumnDecorator接口Q它的方法:
public final String decorate(Object columnValue)
{
Date date = (Date) columnValue;
return this.dateFormat.format(date);
}
昄Q它获得不了当前对象Q因为它实现的是接口Q,仅仅是获得该对象的columnValueQ然后‘a漆?br />
九、创建动态连?br /> 有两U方法创建动态连接:
A、在<display:column/>里通过增加href、paramId、paramName、paramScope、paramProperty属?br /> href 基本的URL 地址
paramId 加在URL 地址后的参数名称
paramName 数据bean的名Uͼ一般ؓnullQ即使用当前List里的对象Q?br /> paramScope 数据bean的范_一般ؓnull
paramProperty 数据bean的属性名Uͼ用来填充URL 地址后的参数?br /><display:table name="sessionScope.details">
<display:column property="id" title="ID" href="details.jsp" paramId="id" />
<display:column property="email" href="details.jsp" paramId="action" paramName="testparam" paramScope="request" />
<display:column property="status" href="details.jsp" paramId="id" paramProperty="id" />
</display:table>
q种Ҏ便直接,但缺Ҏ无法产生cMdetails.jsp?id=xx&action=xx的复合URL
B、应用decorator 创徏动态连接:
<display:table name="sessionScope.details" decorator="org.displaytag.sample.Wrapper" >
<display:column property="link1" title="ID" />
<display:column property="email" />
<display:column property="link2" title="Actions" />
</display:table>
org.displaytag.sample.Wrapper里的ҎQ?br /> public String getLink1()
{
ListObject lObject= (ListObject)getCurrentRowObject();
int lIndex= getListIndex();
return "<a href=\"details.jsp?index=" + lIndex + "\">" + lObject.getId() + "</a>";
}
public String getLink2()
{
ListObject lObject= (ListObject)getCurrentRowObject();
int lId= lObject.getId();
return "<a href=\"details.jsp?id=" + lId
+ "&action=view\">View</a> | "
+ "<a href=\"details.jsp?id=" + lId
+ "&action=edit\">Edit</a> | "
+ "<a href=\"details.jsp?id=" + lId
+ "&action=delete\">Delete</a>";
}
十、分?br /> 实现分页非常的简单,增加一个pagesize属性指定一ơ想昄的行数即?br /><display:table name="sessionScope.test" pagesize="10">
<display:column property="id" title="ID" />
<display:column property="name" />
<display:column property="email" />
<display:column property="status" />
</display:table>
十一、排?br /> 排序实现也是很简单,在需要排序的column里增加sortable="true"属性,headerClass="sortable"仅仅?br /> 指定昄的样式。column里的属性对象要实现Comparable接口Q如果没有的话可以应用decorator
defaultsort="1" 默认W一个column排序
defaultorder="descending" 默认递减排序
<display:table name="sessionScope.stest" defaultsort="1" defaultorder="descending">
<display:column property="id" title="ID" sortable="true" headerClass="sortable" />
<display:column property="name" sortable="true" headerClass="sortable"/>
<display:column property="email" />
<display:column property="status" sortable="true" headerClass="sortable"/>
</display:table>
注意的是Q当同时存在分页时排序仅仅针对的是当前页面,而不是整个List都进行排?br />
十二、column 分组
分组只是需要在column里增加group属?br /><display:table name="test" class="simple">
<display:column property="city" title="CITY" group="1"/>
<display:column property="project" title="PROJECT" group="2"/>
<display:column property="amount" title="HOURS"/>
<display:column property="task" title="TASK"/>
</display:table>
十三、导出数据到其他格式Q页面溢出filter??Q?/strong>
?lt;display:table/>里设定export="true"
?lt;display:column/>里设定media="csv excel xml pdf" 军_该字D在导出到其他格式时被包不包含,不设定则都包?br /> <display:setProperty name="export.csv" value="false" />
军_该种格式能不能在面中导?br /><display:table name="test" export="true" id="currentRowObject">
<display:column property="id" title="ID"/>
<display:column property="email" />
<display:column property="status" />
<display:column property="longDescription" media="csv excel xml pdf" title="Not On HTML"/>
<display:column media="csv excel" title="URL" property="url"/>
<display:setProperty name="export.pdf" value="true" />
<display:setProperty name="export.csv" value="false" />
</display:table>
十四、配|属性,覆盖默认
两种ҎQ?br /> A、在E序classpath下新建displaytag.properties文g
B、对于单个表|应用<display:setProperty>标签
具体可配|的属性:http://displaytag.sourceforge.net/configuration.html
十五、一个完整的例子
<display:table name="test" export="true" sort="list" pagesize="8">
<display:column property="city" title="CITY" group="1" sortable="true" headerClass="sortable"/>
<display:column property="project" title="PROJECT" group="2" sortable="true" headerClass="sortable"/>
<display:column property="amount" title="HOURS"/>
<display:column property="task" title="TASK"/>
</display:table>
sort="list" Ҏ个listq行排序
导出数据到其他格式时Qgroup无效
对ClassName.class.getResourceAsStream的\径问题比较模p,现在把研I的l果写一下:
ClassName是这个Class的名Uͼq里假设为MyClassQ处于MyPackage.MyChildPackage包中Q如果你source.props文g攑֜Classes文g夹中的时候,可以q样写ClassName.class.getResourceAsStream(/source.props)
如果你想把props文g攑֜包中的时候,假设攑ֈMyPackage.MyChildPackage中的res文g夹,可以q样写ClassName.class.getResourceAsStream(/MyPackage/MyChildPackage/res/source.props)Q?代表的是包的.
RMI从Java1.1开始,RMI使得q行于不同JVM(包括不同L)上的Java应用E序可以彼此通话? 卻I一个JVM中的Java应用E序可以调用另一JVM上的对象Q远E对象)所定义的方法? Java RMI有着重要的意义。RMI在Java|络~程和高U编E中都有重要的应用,如EJB, Jini{? Java2对RMI做了很多增强和改q,如安全性,动态代码下载等? 本文l出了一个最单的例子Q以说明其中的一些基本原理。本文的特点是注重了实际开发和真正的运? 环境相结合,模拟了RMI真正的开发和q行q程? 1. 实现q程接口Q生成远E对象,存根QStubQ和框架(Skeleton) 实现q程接口,q程接口告诉JVMQ实C该接口的对象可以q程调用及有哪些Ҏ可以调用? 本例子中定义了sayHelloQ)。由于远E调用会涉及到网l通讯Q因此这些方法都要抛出RemoteException. q程接口和远E对象可以由A开发,q把q程接口(Hello)d打包分给Client端开发者B? 建立f:\server目录Q把Hello.java和HelloImpl.java拯到该目录中? // Hello.java package jdeveloper.rmi; import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote { String sayHello() throws RemoteException; } 生成q程对象. // HelloImpl.java package jdeveloper.rmi; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; import java.rmi.server.UnicastRemoteObject; public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl() throws RemoteException { super(); } public String sayHello() { return "Hello World!"; } public static void main(String args[]) { // Create and install a security manager if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try { Hello obj = new HelloImpl(); // Bind this object instance to the name "HelloServer" Naming.rebind("HelloServer", obj); System.out.println("HelloServer bound in registry"); } catch (Exception e) { System.out.println("HelloImpl err: " + e.getMessage()); e.printStackTrace(); } } } 存根QStubQ和框架(Skeleton) f: cd \server javac -d . Hello.java javac -d . HelloImpl.java rmic -d . jdeveloper.rmi.HelloImpl jar cvf hello.jar jdeveloper\rmi\Hello.class 把hello.jar分发lClient端的开发者B? 存根QStubQ的存放Q? 存根QStubQ是动态下载的。Client通过存根QStubQ和q程对象的框?Skeleton)通讯Q对Client? 讲就象操作本地对象一栗在大多数情况下Q可下蝲的代码放到http服务器的某个目录中。本例子攑ֈhttp://hjc/rmi下? hjc:机器名,rmi:http的一个目录。如果只是单机测试则可以攑ֈ某个目录?如f:\serverclasses. 本文对以上两种Ҏ都给行的步骤Qpolicy文g和bat文gQ? 2. 实现Client端程? // HelloClient.java package jdeveloper.rmi; import java.rmi.RMISecurityManager; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.NotBoundException; public class HelloClient { public static void main(String args[]) throws Exception{ System.setSecurityManager(new RMISecurityManager()); Hello RemoteObj = (Hello)Naming.lookup("http://"+ args[0] +"/HelloServer"); System.out.println(RemoteObj.sayHello()); } } 建立f:\client目录Q把HelloClient.java拯到该目录中? 建立f:\clientclasses目录Q把hello.jar拯到该目录中? f: cd \client javac -classpath %CLASSPATH%;f:\clientclasses\hello.jar -d . HelloClient.java 3. q行E序 启动DOSH口 set classpath= start rmiregistry A.以单机方式运? 建立f:\serverclasses\jdeveloper\rmi目录 f: cd f:\serverclasses copy f:\server\hello.jar . copy f:\server\jdeveloper\rmi\HelloImpl_Stub.class f:\serverclasses\jdeveloper\rmi\ jar xvf hello.jar 启动新的DOSH口 ?starthelloserver.bat ?rmiserver.policy 攑ֈf:\server\ q行 starthelloserver starthelloserver.bat SET CP=f:\server;f:\serverclasses\hello.jar echo using classpath: %CP% java -classpath %CP% -Djava.rmi.server.codebase=file:/f:\serverclasses/ -Djava.rmi.server.hostname=hjc -Djava.security.policy=rmiserver.policy jdeveloper.rmi.HelloImpl rmiserver.policy grant { permission java.net.SocketPermission "*:1024-65535", "connect"; }; 启动新的DOSH口 ?starthelloclient.bat ?rmiclient.policy 攑ֈf:\client\ q行 starthelloclient starthelloclient.bat @echo off set CP=f:\client;f:\clientclasses\hello.jar echo using classpath %CP% @echo on java -classpath %CP% -Djava.rmi.server.codebase=file:/f:\serverclasses/ -Djava.security.policy=rmiclient.policy jdeveloper.rmi.HelloClient %1 rmiclient.policy grant { permission java.net.SocketPermission "*:1024-65535", "connect"; permission java.io.FilePermission "f:\\serverclasses\\-", "read"; }; B.以网l方式运? 建立 apache_path\htdocs\rmi\jdeveloper\rmi目录 cd apache_path\htdocs\rmi copy f:\server\hello.jar . copy f:\server\jdeveloper\rmi\HelloImpl_Stub.class apache_path\htdocs\rmi\jdeveloper\rmi jar xvf hello.jar ?starthellohttpserver.bat ?rmihttpserver.policy 攑ֈf:\server\ 启动新的DOSH口 q行 starthellohttpserver starthellohttpserver.bat SET CP=f:\server;f:\serverclasses\hello.jar echo using classpath: %CP% java -classpath %CP% -Djava.rmi.server.codebase=http://hjc/rmi/ -Djava.security.policy=rmihttpserver.policy jdeveloper.rmi.HelloImpl rmihttpserver.policy grant { permission java.net.SocketPermission "*:1099", "accept, connect, listen, resolve"; permission java.net.SocketPermission "*:80", "accept, connect, listen, resolve"; }; 启动新的DOSH口 ?starthellohttpclient.bat ?rmihttpclient.policy 攑ֈf:\client\ q行 starthellohttpclient starthellohttpclient.bat @echo off set CP=f:\client;f:\clientclasses\hello.jar echo using classpath %CP% @echo on java -classpath %CP% -Djava.rmi.server.codebase=http://hjc/rmi/ -Djava.security.policy=rmihttpclient.policy jdeveloper.rmi.HelloClient %1 rmihttpclient.policy grant { permission java.net.SocketPermission "*:80", "connect"; permission java.net.SocketPermission "*:1024-65535", "connect"; }; |
一、Iframe标记的?/strong>
提vIframeQ可能你早已之扔到“被遗忘的角落”了Q不q,说v其兄弟Frame׃会陌生了。Frame标记卛_标记Q我们所说的多l构是在一个浏览器H口中显C多个HTML文g。现在,我们遇到一U很现实的情况:如有一个教E,是一节一节地上,每页末尾做一个“上一节“、“下一节“的链接Q除了每节教E内容不同之外,面其它部分内容都是相同的,如果一一地做笨面Q这g太让人厌烦了Q这时突发奇惻I如果有一U方法让面其它地方不变Q只教E做成一一늚内容,不含其它内容Q在点击上下页链接Ӟ只改变教E内定w分,其它保持不变Q这P一是省Ӟ另则以后如教E有个三长两短的变动Q也很方便,不致于牵一发而动全军?更重要的是将那些q告Banner、栏目列表、导航等几乎每页的都有的东西只下载一ơ后׃再下载了?/font>
Iframe标记Q又叫Q动标记Q你可以用它一个HTML文档嵌入在一个HTML中显C。它不同于Frame标记最大的特征卌个标记所引用的HTML文g不是与另外的HTML文g怺独立昄Q而是可以直接嵌入在一个HTML文g中,与这个HTML文g内容怺融合Q成Z个整体,另外Q还可以多次在一个页面内昄同一内容Q而不必重复写内容Q一个Ş象的比喻即“画中画“电视?/font>
现在我们谈一下Iframe标记的用?/font>
Iframe标记的用格式是Q?/font>
<Iframe src="URL" width="x" height="x" scrolling="[OPTION]" frameborder="x"></iframe>
srcQ文件的路径Q既可是HTML文gQ也可以是文本、ASP{;
width、heightQ?M?区域的宽与高Q?br /> scrolling:当SRC的指定的HTML文g在指定的区域不显不完Ӟ滚动选项Q如果设|ؓNOQ则不出现滚动条Q如为AutoQ则自动出现滚动条;如ؓYesQ则昄;
FrameBorderQ区域边框的宽度Qؓ了让“画中画“与邻近的内容相融合Q常讄??/font>
比如Q?/font>
<Iframe src=" http://netschool.cpcw.com/homepage " width="250" height="200" scrolling="no" frameborder="0"></iframe>
二、父H体与Q动之间的相互控?/strong>
在脚本语a与对象层ơ中Q包含Iframe的窗口我们称之ؓ父窗体,而Q动则称为子H体Q弄清这两者的关系很重要,因ؓ要在父窗体中讉K子窗体或相反都必L楚对象层ơ,才能通过E序来访问ƈ控制H体?/font>
1、在父窗体中讉Kq控制子H体中的对象
在父H体中,Iframe卛_H体是document对象的一个子对象Q可以直接在脚本中访问子H体中的对象?/font>
现在有一个问题,卻I我们怎样来控制这个IframeQ这里需要讲一下Iframe对象。当我们l这个标记设|了ID 属性后Q就可通过文对象模型DOM对Iframe所含的HTMLq行一pd控制?
比如在example.htm里嵌入test.htm文gQƈ控制test.htm里一些标记对象:
<Iframe src="test.htm" id="test" width="250" height="200" scrolling="no" frameborder="0"></iframe>
test.htm文g代码?
<html>
<body>
<h1 id="myH1">hello,my boy</h1>
</body>
</html>
如我们要改变ID号ؓmyH1的H1标记里的文字为hello,my dearQ则可用:
document.myH1.innerText="hello,my dear"Q其中,document可省Q?br /> 在example.htm文g中,Iframe标记对象所指的子窗体与一般的DHTML对象模型一_对对象访问控制方式一P׃再赘q?/font>
2、在子窗体中讉Kq控制父H体中对?/font>
在子H体中我们可以通过其parent即父Q双Ԍ对象来访问父H口中的对象?br /> 如example.htmQ?br /> <html>
<body onclick="alert(tt.myH1.innerHTML)">
<Iframe name="tt" src="frame1.htm" width="250" height="200" scrolling="no" frameborder="0"></iframe>
<h1 id="myH2">hello,my wife</h1>
</body>
</html>
如果要在frame1.htm中访问ID号ؓmyH2中的标题文字q将之改?hello,my friend"Q我们就可以q样写:
parent.myH2.innerText="hello,my friend"
q里parent对象׃表当前窗体(example.htm所在窗体)Q要在子H体中访问父H体中的对象Q无一例外都通过parent对象来进行?
Iframe虽然内嵌在另一个HTML文g中,但它保持相对的独立,是一个“独立王国”哟Q在单一HTML中的Ҏ同样适用于Q动中?/font>
试想一下,通过Iframe标记Q我们可那些不变的内容以Iframe来表C,q样Q不必重复写相同的内容,q有点象E序设计中的q程或函敎ͼ减省了多繁琐的手工力_Q另外,臛_重要的是Q它佉K面的修改更ؓ可行Q因为,不必因ؓ版式的调整而修Ҏ个页面,你只需修改一个父H体的版式即可了?/font>
有一点要注意QNestscape览器不支持Iframe标记Q但在时下IE的天下,q似乎也无大,q泛采用Iframe标记Q既己(|站Q着了想Q又为网友节省了|费Q何乐而不为?
Java开发者年鉴一书的在线版本. 要想快速查到某UJava技巧的用法及示例代? q是一个不错的d.
http://www.onjava.com
O'Reilly的Java|站. 每周都有新文?
http://java.sun.com
官方的Java开发者网?- 每周都有新文章发?
http://www.developer.com/java
由Gamelan.com l护的Java技术文章网?
http://www.java.net
Sun公司l护的一个JavaC|站
http://www.builder.com
Cnet的Builder.com|站 - 所有的技术文? 以JavaZ.
http://www.ibm.com/developerworks/java
IBM的Developerworks技术网? q是其中的Java技术主?
http://www.javaworld.com
最早的一个Java站点. 每周更新Java技术文?
http://www.devx.com/java
DevXl护的一个Java技术文章网?
http://www.fawcette.com/javapro
JavaPro在线杂志|站.
http://www.sys-con.com/java
Java Developers Journal的在U杂志网?
http://www.javadesktop.org
位于Java.net的一个Java桌面技术社区网?
http://www.theserverside.com
q是一个讨论所有Java服务器端技术的|站.
http://www.jars.com
提供Java评论服务. 包括各种framework和应用程?
http://www.jguru.com
一个非常棒的采用Q&A形式的Java技术资源社?
http://www.javaranch.com
一个论坛,得到Java问题{案的地方,初学者的好去处?
http://www.ibiblio.org/javafaq/javafaq.html
comp.lang.java的FAQ站点 - 攉了来自comp.lang.java新闻l的问题和答案的分类目录.
http://java.sun.com/docs/books/tutorial/
来自SUN公司的官方Java指南 - 对于了解几乎所有的java技术特性非常有帮助.
http://www.javablogs.com
互联|上最z跃的一个Java Blog|站.
http://java.about.com/
来自About.com的Java新闻和技术文章网?
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR Servlet</display-name>
<description>Direct Web Remoter Servlet</description>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<dwr>
<allow>
<convert converter="bean" match="dwr.sample.Apartment"/>
<create creator="new" javascript="ApartmentDAO" class="dwr.sample.ApartmentDAO">
<include method="findApartments"/>
<include method="countApartments"/>
</create>
</allow>
</dwr>
<script src='dwr/interface/ApartmentDAO.js'></script>
<script src='dwr/engine.js'></script>
<script src='dwr/util.js'></script>
function updateTotal() {
$("resultTable").style.display = 'none';
var bedrooms = document.getElementById("bedrooms").value;
var bathrooms = document.getElementById("bathrooms").value;
var price = document.getElementById("price").value;
ApartmentDAO.countApartments(loadTotal, bedrooms, bathrooms, price);
}
function loadTotal(data) {
document.getElementById("totalRecords").innerHTML = data;
}
function updateResults() {
DWRUtil.removeAllRows("apartmentsbody");
var bedrooms = document.getElementById("bedrooms").value;
var bathrooms = document.getElementById("bathrooms").value;
var price = document.getElementById("price").value;
ApartmentDAO.findApartments(fillTable, bedrooms, bathrooms, price);
$("resultTable").style.display = '';
}
function fillTable(apartment) {
DWRUtil.addRows("apartmentsbody", apartment, [ getId, getAddress, getBedrooms, getBathrooms, getPrice ]);
}