Scott Mitchell 的ASP.NET 2.0数据教程之十五:在GridView的页脚中显示统计信息

导言

除了需要了解产品的单价、库存量和订货量,并按等级排序之外,用户可能还对统计信息感兴趣,比如说平均价格、库存总量等等。这些统计信息常常显示在报表最下面的一个统计行中。GridView控件可以含有一个页脚行,我们可以通过编程将统计数据插入到它的单元格里面去。

这个任务给了我们以下3个挑战:

 

1.      配置GridView以显示它的页脚行

2.      确定统计数据。即我们应该如何计算平均价格还有库存总量?

3.      将统计信息插入到页脚行的相应的单元格中

 

在本节教程中,我们将会看到如何去征服这些挑战。另外呢,我们将创建一个页面,它含有一个列出所有“类别”的下拉框,选择一个“类别”就可以在GridView中显示这个类别的产品。GridView中包含一个页脚行,用于显示此类产品的平均价格、库存总量和订货总量。


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure01.gif
图一:统计信息显示在GridView的页脚行中

 

由于含有“类别”到“产品”的主 / 从界面,所有本节是建立在前面的“ 使用DropDownList进行主/从过滤 ”节中所讨论的那些概念的基础上的。如果你还没有看过那一节的话,在继续本节的学习之前,还是去看看比较好。

 
第一节:添加“类别”下拉框和“产品”GridView 

 

在往GridView中添加页脚行之前,让我们先来简单的建立一个主/从报表。一旦我们完成了这第一步的工作,我们就可以来看看如何加入统计数据了。

 

首先打开CustomFormatting文件夹中的SummaryDataInFooter.aspx页面。添加一个DropDownList控件,并将其ID设置为Categories。然后,在这个DropDownList的智能标签上点击“选择数据源(Choose Data Source)”,添加一个新的调用CategoriesBLL类的GetCategories ()方法的ObjectDataSource控件,将这个ObjectDataSource命名为CategoriesDataSource


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure02.gif

图二:添加一个新的名为CategoriesDataSourceObjectDataSource控件


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure03.gif 

图三:使这个ObjectDataSource控件调用CategoriesBLL类的GetCategories ()方法

 

再配置了了ObjectDataSource之后,向导会将我们返回到DropDownList的数据源配置向导那里,在这儿我们可以指定哪个字段需要显示以及哪个字段应该作为DropDownListListItem的值。我们将CategoryName字段拿来显示,而把CategoryID拿来作为值。


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure04.gif

图四:分别使用CategoryNameCategoryID来作为ListItem的文本和值

 

现在,我们便在系统中有了一个能列出类别的DropDownList了。现在我们需要添加一个根据所选的类别来列出产品的GridView。不过,在此之前,让我们先花点时间到DropDownList的智能标签中勾上“启用自动回发(Enable AutoPostBack)”复选框。我们在前面的“使用DropDownList进行主/从过滤 lidong6”节中讨论过,在将DropDownListAutoPostBack属性设置为true之后,只要DropDownList的值发生了变化,页面就会回发。这样就可以刷新GridView以显示新选择的类别的产品了。如果AutoPostBack属性设置为false(默认值),改变类别将不会导致回发,因此也就不能刷新产品列表了。


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure05.gif

图五:在DropDownList的智能标签中勾上“启用自动回发”复选框

 

添加一个GridView控件到页面上以便可以根据选定的类别来显示产品。将这个GridViewID设置为ProductsInCategory,并将其绑定到一个新的名为ProductsInCategoryDataSourceObjectDataSource上。


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure06.gif

图六:添加一个新的名为ProductsInCategoryDataSourceObjectDataSource

 

配置这个ObjectDataSource,以使其调用ProductsBLL类的GetProductsByCategoryID(categoryID)方法。


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure07.gif

图七:使这个ObjectDataSource调用GetProductsByCategoryID(categoryID)方法

 

由于GetProductsByCategoryID(categoryID)方法需要一个参数,所以在向导的最后一步里,我们可以指定参数值的数据源。为了根据显示所选的类别来显示产品,这个参数应该从Categories下拉框中获取。


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure08.gif

图八:从Catefories下拉框中获取categoryID参数

 

完成了向导之后,这个GridView将会包含一些对应于产品的每一个属性的BoundField。让我们来清理一下这些BoundField,剩下要显示的ProductNameUnitPriceUnitsInStock以及UnitsOnOrder就可以了。然后你可以随便的给剩下的这些BoundField添加一些字段级的设置(比如说将UnitPrice格式化为货币形式)。做了这些更改之后,这个GridView的声明标记应该是这个样子:

 

 

 1 None.gif < asp:GridView  ID ="ProductsInCategory"  runat ="server"  AutoGenerateColumns ="False"
 2 None.gif    DataKeyNames ="ProductID"  DataSourceID ="ProductsInCategoryDataSource"  EnableViewState ="False" >
 3 None.gif     < Columns >
 4 None.gif         < asp:BoundField  DataField ="ProductName"  HeaderText ="Product"  SortExpression ="ProductName"  />
 5 None.gif         < asp:BoundField  DataField ="UnitPrice"  DataFormatString ="{0:c}"  HeaderText ="Price"
 6 None.gif            HtmlEncode ="False"  SortExpression ="UnitPrice" >
 7 None.gif             < ItemStyle  HorizontalAlign ="Right"  />
 8 None.gif         </ asp:BoundField >
 9 None.gif         < asp:BoundField  DataField ="UnitsInStock"  HeaderText ="Units In Stock"  SortExpression ="UnitsInStock" >
10 None.gif             < ItemStyle  HorizontalAlign ="Right"  />
11 None.gif         </ asp:BoundField >
12 None.gif         < asp:BoundField  DataField ="UnitsOnOrder"  HeaderText ="Units On Order"  SortExpression ="UnitsOnOrder" >
13 None.gif             < ItemStyle  HorizontalAlign ="Right"  />
14 None.gif         </ asp:BoundField >
15 None.gif     </ Columns >
16 None.gif </ asp:GridView >


现在,我们就拥有了一个可以根据所选类别来显示相关的产品的名称、单价、库存量以及订货量的功能齐全的主/从报表了。


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure09.gif

图九:现在的效果(译者注:估计原文这里弄错了,写得跟图八的一样。这里的原文是“Figure 9: Get the categoryID Parameter Value from the Selected Categories DropDownList”,图八的原文是“Figure 8: Get the categoryID Parameter Value from the Selected Categories DropDownList”)

 

第二步:在GridView中显示页脚 

GridView控件可以显示页眉和页脚行。这些行的显示与否分别取决于ShowHeaderShowFooter属性,默认情况下,ShowHeader的值为true,而ShowFooter的值为false。要显示页脚行的话,我们只需简单的将ShowFooter属性设置为true就可以了。


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure10.gif

图十:将GridViewShowFooter属性设置为true

 

GridView中所定义的每一个字段都在页脚行中有一个对应的单元格,不过这些单元格默认是空的。花点时间到浏览器中看看我们的成果。由于我们将GridViewShowFooter属性设置为true了,所以GridView现在包含了一个空的页脚行。


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure11.gif

图十一:现在,GridView有了一个页脚行

 

图十一中的页脚行并不明显,因为它的背景是白色的。让我们在Styles.css中创建一个名为FooterStyleCSS类,用它来指定一个深红色的背景,并在DataWebControls主题中配置GridView.skin这个皮肤文件(Skin file)以将此CSS类分配给此GridViewFooterStyleCssClass属性。如果你需要复习一下皮肤和主题的相关内容,请参考“使用ObjectDataSource显示数据”。

 

先给Styles.css添加以下的CSS类:

 

 

1 None.gif .FooterStyle
2 ExpandedBlockStart.gifContractedBlock.gif {dot.gif} {
3InBlock.gif    background-color: #a33;
4InBlock.gif    color: White;
5InBlock.gif    text-align: right;
6ExpandedBlockEnd.gif}


FooterStyle这个CSS类跟HeaderStyle类是一样的,只是HeaderStyle的背景色要深一点且文本是粗体显示的而已。此外,页脚的文本是右对齐的,而页眉的文本是居中的。

 

然后,为了将这个CSS类关联到每一个GridView的页脚上,在DataWebControls主题中打开GridView.skin文件并设置FooterStyleCssClass属性。作了这个添加之后,文件的标记代码应该是这个样子:

 

 

1 None.gif < asp:GridView  runat ="server"  CssClass ="DataWebControlStyle" >
2 None.gif    < AlternatingRowStyle  CssClass ="AlternatingRowStyle"  />
3 None.gif    < RowStyle  CssClass ="RowStyle"  />
4 None.gif    < HeaderStyle  CssClass ="HeaderStyle"  />
5 None.gif    < FooterStyle  CssClass ="FooterStyle"  />
6 None.gif    < SelectedRowStyle  CssClass ="SelectedRowStyle"  />
7 None.gif </ asp:GridView >


就像下面这个屏幕截图所显示的那样,这个更改使页脚清晰的显示出来了。


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure12.gif

图十二:GridView的页脚现在有了一个红红的背景色

 

第三步:计算统计数据 

在显示了GridView的页脚之后,下一个面对我们的挑战就是如何计算统计数据。有两个计算统计信息的途径:

 

1.      通过一个SQL查询——我们可以向数据库发出一个额外的查询来为某个特定的类别计算统计信息。SQL包含一系列的聚合函数,并由GROUP BY子句指定应该根据什么数据来进行统计。下面的SQL查询将会返回我们所需要的信息:

 

1 None.gif SELECT  CategoryID,  AVG (UnitPrice),  SUM (UnitsInStock),  SUM (UnitsOnOrder)
2 None.gif FROM  Products
3 None.gif WHERE  CategoryID  =  categoryID
4 None.gif GROUP  BY  CategoryID

 

当然,你也可能不喜欢直接在SummaryDataInFooter.aspx页面中直接执行这个查询,而是希望在ProductsTableAdapter ProductsBLL 中创建一个方法来干这个事情。

2.   由于这些信息已经添加到GridView中了,所以可以直接计算——就像在“基于数据的自定义格式化”中讨论的那样,在GridView的数据绑定之后,GridViewRowDataBound事件处理方法会在添加每一行数据时被执行一次。为这个事件创建了事件处理方法之后,我们就可以保持一个累积的合计值了。在最后一行数据被绑定到DataGrid上之后,我们就有了一个合计值以及需要计算平均值的信息了。

 

一般来说,我还是喜欢第二种方法的,因为它节省了一次到数据库的往返,而且要达到这个效果还需要在数据访问层和业务逻辑层中实现统计功能,不过话说回来了,其实两种办法都行的。在这本教程中,我们还是使用第二个办法吧,并使用RowDataBound事件处理方法来记录这个累积合计。

 

GridView新建一个RowDataBound事件处理方法,你可以在设计器中选择GridView,然后在属性窗口中点击那个带闪电符号的图标,找到RowDataBound事件并双击它就可以了。这样就会在SummaryDataInFooter.aspx页面的后置代码类中添加一个新的名为ProductsInCategory_RowDataBound的事件处理方法了。

 

 

1 None.gif protected  void  ProductsInCategory_RowDataBound( object  sender, GridViewRowEventArgs e)
2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
3InBlock.gif
4ExpandedBlockEnd.gif}

 

为了可以维护一个累积合计,我们需要在这个事件处理方法的外面定义一些变量。创建以下4个页面级的变量:

 

·         _totalUnitPrice,类型为decimal

·         _totalNonNullUnitPriceCount,类型为int

·         _totalUnitsInStock,类型为int

·         _totalUnitsOnOrder,类型为int

 

然后,在RowDataBound事件处理方法中写一些代码,使每一个数据行都可以增加这些变量的值。

 

 1 None.gif //  类范围,累积合计的变量……
 2 None.gif decimal  _totalUnitPrice  =  0m;
 3 None.gif int  _totalNonNullUnitPriceCount  =  0 ;
 4 None.gif int  _totalUnitsInStock  =  0 ;
 5 None.gif int  _totalUnitsOnOrder  =  0 ;
 6 None.gif
 7 None.gif protected  void  ProductsInCategory_RowDataBound( object  sender, GridViewRowEventArgs e)
 8 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 9InBlock.gif    if (e.Row.RowType == DataControlRowType.DataRow)
10ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
11InBlock.gif        // 通过e.Row.DataItem 属性引用ProductsRow
12InBlock.gif        Northwind.ProductsRow product = (Northwind.ProductsRow)((System.Data.DataRowView)e.Row.DataItem).Row;
13InBlock.gif
14InBlock.gif        // 增加累积合计(如果它们不为NULL的话!)
15InBlock.gif        if (!product.IsUnitPriceNull())
16ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
17InBlock.gif            _totalUnitPrice += product.UnitPrice;
18InBlock.gif            _totalNonNullUnitPriceCount++;
19ExpandedSubBlockEnd.gif        }

20InBlock.gif
21InBlock.gif        if (!product.IsUnitsInStockNull())
22InBlock.gif            _totalUnitsInStock += product.UnitsInStock;
23InBlock.gif
24InBlock.gif        if (!product.IsUnitsOnOrderNull())
25InBlock.gif            _totalUnitsOnOrder += product.UnitsOnOrder;
26ExpandedSubBlockEnd.gif    }

27ExpandedBlockEnd.gif}

 

RowDataBound事件处理方法中,我们首先应该确保我们正在操作一个DataRow。一旦确定了是这么回事,e.Row中那个刚刚绑定到GridViewRow对象的Northwind.ProductsRow实例就可以赋值给product变量了。接着,累积合计就被当前产品的相关值(当然了,我们还是应该要确保它们不会含有一个数据库NULL值)增加了。我们同时记录了累积的UnitPrice合计以及非空UnitPrice记录的条数,因为平均价格是这两个数的商。


第四步:在页脚中显示统计数据 

计算了统计数据之后,最后一个步骤就是在GridView的页脚上显示它了。同样,这个任务也可以通过RowDataBound事件处理方法来完成。回忆一下RowDataBound事件处理方法,它会在每一行绑定到GridView的时候被触发,页脚行也不例外。因此,我们可以扩展我们的事件处理方法,让它可以通过如下的代码来在页脚行中显示数据:

 

 

 

 1 None.gif protected  void  ProductsInCategory_RowDataBound( object  sender, GridViewRowEventArgs e)
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif    if (e.Row.RowType == DataControlRowType.DataRow)
 4ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 5InBlock.gif      //……增加累积合计……
 6ExpandedSubBlockEnd.gif    }

 7InBlock.gif    else if (e.Row.RowType == DataControlRowType.Footer)
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 9InBlock.gif      //……在页脚中显示统计数据……
10ExpandedSubBlockEnd.gif    }

11ExpandedBlockEnd.gif}


因为页脚行是在所有的数据行都已经添加之后才添加到GridView中的,所以我们可以相信在将统计数据显示在页脚中之前,累积合计值都已经计算完毕了。最后一步就是将这些值放到页脚的单元格中了。

 

要在页脚的特定单元格中显示文本,可以使用use e.Row.Cells[index].Text = value,单元格的索引是从0开始的。下面的代码计算了平均价格(总的价格除以产品的数量)并将其与库存量和订货量一起显示到GridView页脚的相应单元格中。

 

 

 1 None.gif protected  void  ProductsInCategory_RowDataBound( object  sender, GridViewRowEventArgs e)
 2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 3InBlock.gif    if (e.Row.RowType == DataControlRowType.DataRow)
 4ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 5InBlock.gif      //……增加累积合计……
 6ExpandedSubBlockEnd.gif    }
 7InBlock.gif    else if (e.Row.RowType == DataControlRowType.Footer)
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 9InBlock.gif      // 确定平均单价
10InBlock.gif      decimal avgUnitPrice = _totalUnitPrice / (decimal) _totalNonNullUnitPriceCount;
11InBlock.gif
12InBlock.gif      // 在相应的单元格中显示统计数据
13InBlock.gif      e.Row.Cells[1].Text = "Avg.: " + avgUnitPrice.ToString("c");
14InBlock.gif      e.Row.Cells[2].Text = "Total: " + _totalUnitsInStock.ToString();
15InBlock.gif      e.Row.Cells[3].Text = "Total: " + _totalUnitsOnOrder.ToString();
16ExpandedSubBlockEnd.gif    }

17ExpandedBlockEnd.gif}


图十三展示了添加了这段代码之后这个报表的样子。注意ToString("c")是如何让平均价格这个统计信息格式化成货币形式的。


aspnet_tutorial15_SummaryInfoInGVFooter_cs_figure13.gif 

图十三:现在的效果(译者注:估计原文这里又弄错了,写得跟图十二的一样。这里的原文是“Figure 13: The GridView’s Footer Row Now Has a Reddish Background Color”,图十二的一样。这里的原文是“Figure 13: The GridView’s Footer Row Now Has a Reddish B的原文是“Figure 12: The GridView’s Footer Row Now Has a Reddish Background Color”)

 

总结 

显示统计信息是一个常见的报表需求,而GridView控件可以在页脚行中包含这样的信息,而且它将这个操作变得非常简单。当GridViewShowFooter属性被设置为true时就可以显示页脚行了,并且通过RowDataBound事件处理方法可以将这些信息显示在它的不同的单元格中。可以通过重新查询数据库的数据,也可以在ASP.NET页面的后置代码类中通过编程的方式来计算这些统计数据。

 

本节教程结束了我们关于GridViewDetailsView以及FormView控件的自定义格式化的学习。接下来的教程中,我们会开始一个使用这些控件来进行增删改操作的探索。

 

编程愉快!

 


关于作者
Scott Mitchell,著有六本ASP/ASP.NET方面的书,是4GuysFromRolla.com的创始人,自1998年以来一直应用微软Web技术。Scott是个独立的技术咨询顾问,培训师,作家,最近完成了将由Sams出版社出版的新作,24小时内精通ASP.NET 2.0。他的联系电邮为mitchell@4guysfromrolla.com,也可以通过他的博客http://ScottOnWriting.NET与他联系。


转载于:https://www.cnblogs.com/xiongeee/archive/2006/08/17/479814.html

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
<p> <span style="color:#337FE5;"><strong>【为什么还需要学习C++?】</strong></span> </p> <p style="margin-left:0cm;"> 你是否接触很多语言,但从来没有了解过编程语言的本质? </p> <p style="margin-left:0cm;text-align:start;"> 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? </p> <p style="margin-left:0cm;text-align:start;"> 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? </p> <p style="margin-left:0cm;text-align:start;">   </p> <p style="margin-left:0cm;text-align:start;"> 那么C++就是你个人能力提升,职业之路进阶的不二之选。 </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p style="margin-left:0cm;"> <strong><span style="color:#337FE5;">【课程特色】</span></strong> </p> <p style="margin-left:0cm;text-align:start;"> 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 </p> <p style="margin-left:0cm;text-align:start;"> 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 </p> <p style="margin-left:0cm;text-align:start;"> 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p class="ql-long-24357476"> <span style="color:#337FE5;"><strong>【学完后我将达到什么水平?】</strong></span> </p> <p class="ql-long-24357476"> 1.对C++的各个知识能够熟练配置、开发、部署; </p> <p class="ql-long-24357476"> 2.吊打一切关于C++的笔试面试题; </p> <p class="ql-long-24357476"> 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 </p> <p class="MsoNoSpacing" style="margin-left:18pt;"> <br /> </p> <div> <br /> </div> <p> <br /> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#337FE5;"><strong>【面向人群】</strong></span> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;">1.希望一站式快速入门的C++初学者;</span> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;">2.希望快速学习 C++、掌握编程要义、修炼内功的开发者;</span> </p> <p style="margin-left:0cm;text-align:start;"> <span style="color:#222226;font-family:PingFangSC-Regular, "font-size:14px;background-color:#FFFFFF;">3.有志于挑战更高级的开发项目,成为资深开发的工程师。</span> </p> <p style="margin-left:0cm;text-align:start;"> <br /> </p> <p> <br /> </p> <p> <span style="color:#337FE5;"><strong>【课程设计】</strong></span> </p> <p> 本课程包含3大模块 </p> <p> <strong>基础篇</strong><br /> 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 </p> <p> <br /> <strong>进阶篇</strong><br /> 本篇主要讲解编程常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 </p> <p> <br /> <strong>提升篇:</strong><br /> 本篇可以帮助学员更加高效的进行c++开发,其包含类型转换、文件操作、异常处理、代码重用等内容。 </p> <p> <img src="https://img-bss.csdnimg.cn/202007091130239667.png" alt="" /> </p>
百度云盘分享 简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存清除,从账户取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJBJNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件得到公钥编码的字节数组、如何从字节数组解码公钥。 Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Jav
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页