1、课程设计(综合实验)报告( 2010 - 2011 年度第二学期)名 称: 网络综合实验 题 目: 列车时刻表查询程序 院 系: 计算机系 班 级: 学 号: 学生姓名: 指导教师: 设计周数: 2 成 绩: 日期: 2011 年 6 月 8 日一、综合实验目的与要求1 任务:利用 Web Service 技术实现列车时刻表查询。2 目的:学习在网络应用程序中创建和使用 Web 服务。Web Service 由于其跨平台的优越性,被越来越多的网站所重用。了解其实现原理及使用方法,有利于了解未来的网络开发技术。3 要求:利用 Web Service 技术,实现一个查询列车时刻的网站,要求界面美观
2、,方便易用;通过课程设计学生应该具备初步分析、设计和开发网络应用软件的能力,具备分析与检查软件错误、解决和处理实验结果的能力。4 学生要求人数:1 人。二、实验正文1、实验内容编写一个网站页,可供用户查询最新列车时刻表情况,可站到站查询、车次查询和途径站查询,合理设计查询组合。基本工作过程如下:(1) 了解 Web Service 技术的原理和使用方法;(2) 寻找提供列车时刻信息的 Web 服务;(3) 利用 Web Service 完成查询网页与信息提供网站的链接;(4) 测试网页。2、使用工具Visual Studio2010 ,ASP.NET,C#3、实验原理web service 发
3、布后,客户端添加引用,之后 vs 实际上在此时已经在后台生成本地代理类。之后看起来像是对 web service 的操作,实际上是对本地代理类的操作。代理类中处理网路访问逻辑,客户端的使用就象操作本地类一样简单便捷。客户端发出 web service 请求后,请求到达代理类,代理类处理请求从服务端获得SOAP 数据包,而后进行数据处理后转发客户端。此中间涉及到的关于 SOAP,WSDL 等定义,简单的可以理解为:SOAP 中定义了传输数据类型的格式和规则,而 WSDL 则以XML 的形式定义了 web service 的消息和有关操作,通过 http 传输协议进行数据传输。4、实验步骤(1)新
4、建一个 ASP.NET 的网站,在解决方案资源管理器中单击右键,选择添加 web 引用,在 URL 中添加 http:/ web 引用名为 train,添加引用。(2)因为提供 web service 的服务器上提供了几个让我们调用来进行查询的函数,它们的返回值要与所设计的网站上的显示进行绑定,因此用到了 Repeater 控件,按照如下图所示的页面布局设计网页,添加页面控件。Repeater 控件的程序语句要在源代码中显示的写出。将车次与函数返回值中的 TrainCode 相绑定,并在这一项中建立超链接,从而使在点击具体的车次时可以在一个新的页面显示出车次的具体途径站查询。另外将始发站与函数
5、返回值 FirstStation 绑定,终点站与 LastStation 绑定,发车站与 StartStation 绑定,发车时间与 StartTime 绑定,到达站与 ArriveStation 绑定,到达时间与 ArriveTime 绑定,里程 KM 与 KM 绑定,历时与 UseDate 绑定。网站的框体源代码可以自动生成。(3)编写后台程序。因为本实验要调用网上提供的web函数,首先要建立调用函数的服务对象train.TrainTimeWebService train = new train.TrainTimeWebService();由于函数的返回值是是 DataSet 类型,建立一
6、个 DataSet 的变量接收返回的数据DataSet ds = new DataSet();在页面加载时由Label1显示web函数getVersionTime()的返回值,显示“火车时刻表为第六次提速最新列车时刻表,数据库最后更新:及时更新”,在Page_Load()函数中编写代码实现在第一次访问页面时显示函数的返回值,具体代码是:protected void Page_Load(object sender, EventArgs e)if (this.IsPostBack = false)Label1.Text = train.getVersionTime();Botton1实现的功能是将
7、textStartStation和textArriveStation里面的内容作为函数getStationAndTimeByStationName()的参数传递给服务器,用DataSet类型的ds接收函数的返回值,Repeater1的数据源即为该函数返回的数据。具体代码如下:protected void Button1_Click(object sender, EventArgs e)string start = textStartStation.Text;string end = textArriveStation.Text;ds = train.getStationAndTimeBySta
8、tionName(start, end, “);Repeater1.DataSource = ds.Tables0.DefaultView;Repeater1.DataBind();数据绑定到模板时的事件是:定义一个Hyperlink的对象来代表TrainCode,当输入的要查询的车次没有被发现时,链接的ToolTip显示FirstStation的内容即“数据没有被发现”,当能查询到车次的具体信息时,链接的ToolTip显示“获取*车次的具体信息”,并生成该链接的网络地址。实现的具体代码如下:protected void Repeater1_ItemDataBound(object sende
9、r, RepeaterItemEventArgs e)if (e.Item.ItemType = ListItemType.Item) | (e.Item.ItemType = ListItemType.AlternatingItem)HyperLink oHyperLink = (HyperLink)e.Item.FindControl(“TrainCode“);string TrainCode = DataBinder.Eval(e.Item.DataItem, “TrainCode“).ToString();oHyperLink.Text = TrainCode;string First
10、Station = DataBinder.Eval(e.Item.DataItem, “FirstStation“).ToString();string StartStation = DataBinder.Eval(e.Item.DataItem, “StartStation“).ToString();string ArriveStation = DataBinder.Eval(e.Item.DataItem, “ArriveStation“).ToString();if (FirstStation.Contains(“没有被发现“)oHyperLink.ToolTip = FirstStat
11、ion;oHyperLink.NavigateUrl = “;elseoHyperLink.ToolTip = “获得 “ + TrainCode + “ 详细信息“;oHyperLink.NavigateUrl = “Detail.aspx?id=“ + Server.UrlEncode(TrainCode) + “Botton2实现的功能是将textTrainCode里面的内容作为函数getStationAndTimeDataSetByTrainCode()的参数传递给服务器,用DataSet类型的ds接收函数的返回值,Repeater1的数据源即为该函数返回的数据。具体代码如下:prot
12、ected void Button2_Click(object sender, EventArgs e)string code = textTrainCode.Text;ds = train.getStationAndTimeDataSetByTrainCode(code, “);Repeater1.DataSource = ds.Tables0.DefaultView;Repeater1.DataBind();(4)在解决方案中添加新项,选择web窗体,命名为Detail.aspx,并按照下面的页面布局设计网页,添加页面控件:将车站名称与调用的函数返回值中的TrainStation绑定,将到
13、站时间与ArriveTime绑定,将发车时间与StartTime绑定,将里程KM与KM绑定。网站的框体源代码可以自动生成。(5)编写Detail.aspx的后台程序。因为本实验要调用网上提供的web函数,首先要建立调用函数的服务对象train.TrainTimeWebService train = new train.TrainTimeWebService();由于函数的返回值是是 DataSet 类型,建立一个 DataSet 的变量接收返回的数据DataSet ds = new DataSet();在页面加载时由Label3显示web函数getVersionTime()的返回值,显示“火车
14、时刻表为第六次提速最新列车时刻表,数据库最后更新:及时更新”,本页面作为第一个页面车次的链接页面,需要将第一个页面的TrainCode传递过来,即定义一个string类型的变量来获取链接的id,代码为string TrainCode = Request.QueryString.Get(“id“);并将该TrainCode 作为函数getDetailInfoByTrainCode()的函数传递给服务器,用DataSet类型的ds接收函数的返回值,Repeater1的数据源即为该函数返回的数据。具体代码如下:protected void Page_Load(object sender, Event
15、Args e) string TrainCode = Request.QueryString.Get(“id“);Label1.Text = “火车 “ + TrainCode + “ 车次详细信息“;title1.Text = Label1.Text + “列车时刻表 Web Service 实例“;Label3.Text = train.getVersionTime();ds = train.getDetailInfoByTrainCode(TrainCode, “);Repeater1.DataSource = ds.Tables0.DefaultView;Repeater1.DataB
16、ind();Label2.Text = “经由车站共计“ + ds.Tables0.Rows.Count.ToString() + “个“;数据绑定到模板时的事件是显示该车次的具体信息,当所显示的车站与输入的发车站相同时该行变为黄色,当所显示的车站与输入的到达站相同时该行变为橙色,其他的背景颜色为“#FFF8D9”,实现的具体代码:protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)if (e.Item.ItemType = ListItemType.Item) | (e.Item.Item
17、Type = ListItemType.AlternatingItem)System.Web.UI.HtmlControls.HtmlTableRow oTR = (System.Web.UI.HtmlControls.HtmlTableRow)e.Item.FindControl(“TR1“);String StartStation = Request.QueryString.Get(“Start“);String ArriveStation = Request.QueryString.Get(“Arrive“);if (DataBinder.Eval(e.Item.DataItem, “T
18、rainStation“).ToString().Equals(StartStation)oTR.BgColor = “#FFFF00“;else if (DataBinder.Eval(e.Item.DataItem, “TrainStation“).ToString().Equals(ArriveStation)oTR.BgColor = “#FF9900“;elseoTR.BgColor = “#FFF8D9“;至此该综合实验完成。三、综合实验结果在浏览器中打开程序的主界面在发车站中输入“石家庄”,在到达站中输入“衡水”,显示结果如下:点击其中的某一个车次,如 45164517,显示如下
19、:在主界面的车次中输入 45164517,显示如下:点击车次下的超链接,显示结果如下所示:四、综合实验总结或结论本次实验是一门比较综合性的实验,用到的知识较多,使用的工具也比较陌生,但原理相对简单。前一周基本上就是在熟悉开发环境的应用,及对 ASP.NET 和 C#的熟悉与应用,第二周开始对实验程序进行编写。虽然说本次实验的原理比较简单,但是实现起来还是有一定难度的,通过查询图书资料及对网络资源的利用,对用到的控件的属性和功能及设置方法、设置形式有了比较深入的了解,同时对后台程序的编写也有了比较深刻的认识。由于原来并没有做过类似的东西,因此该实验让我学到很多知识,同时也激发了我对 web se
20、rvice 应用的浓厚兴趣,以后我会加强这方面的了解,争取可以学到更多。五、参考文献1Web 程序设计ASP.NET 实用网站开发 清华大学出版社 沈士根、汪承焱、许小东编著;2C#程序设计教程 清华大学出版社 李春葆、谭成予、金晶、曾平编著附录(设计流程图、程序、表格、数据等)设计流程:详见实验步骤程序的主界面代码,保存名称为 Default.aspx:列车时刻查询 列车时刻表 Web Service 应用发车站到达站车次车次始发站终点站发车站发车时间到达站到达时间里程KM历时主界面的后台程序,保存名称为Default.aspx.cs:using System;using System.Co
21、llections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Data;public partial class _Default : System.Web.UI.Pagetrain.TrainTimeWebService train = new train.TrainTimeWebService();DataSet ds = new DataSet();protected void Page_Load(object se
22、nder, EventArgs e)if (this.IsPostBack = false)Label1.Text = train.getVersionTime();protected void textStartStation_TextChanged(object sender, EventArgs e)protected void Button1_Click(object sender, EventArgs e)string start = textStartStation.Text;string end = textArriveStation.Text;ds = train.getSta
23、tionAndTimeByStationName(start, end, “);Repeater1.DataSource = ds.Tables0.DefaultView;Repeater1.DataBind();protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)if (e.Item.ItemType = ListItemType.Item) | (e.Item.ItemType = ListItemType.AlternatingItem)HyperLink oHyperLink = (
24、HyperLink)e.Item.FindControl(“TrainCode“);string TrainCode = DataBinder.Eval(e.Item.DataItem, “TrainCode“).ToString();oHyperLink.Text = TrainCode;string FirstStation = DataBinder.Eval(e.Item.DataItem, “FirstStation“).ToString();string StartStation = DataBinder.Eval(e.Item.DataItem, “StartStation“).T
25、oString();string ArriveStation = DataBinder.Eval(e.Item.DataItem, “ArriveStation“).ToString();if (FirstStation.Contains(“没有被发现“)oHyperLink.ToolTip = FirstStation;oHyperLink.NavigateUrl = “;elseoHyperLink.ToolTip = “获得“ + TrainCode + “ 详细信息“;oHyperLink.NavigateUrl = “Detail.aspx?id=“ + Server.UrlEnco
26、de(TrainCode) + “protected void Button2_Click(object sender, EventArgs e)string code = textTrainCode.Text;ds = train.getStationAndTimeDataSetByTrainCode(code, “);Repeater1.DataSource = ds.Tables0.DefaultView;Repeater1.DataBind();链接界面的代码,保存名称为Detail.aspx:列车时刻表 Web Service 应用车站名称到站时间发车时间里程KM该界面的后台程序,保
27、存名称为Detail.aspx.cs:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Data;public partial class _Detail : System.Web.UI.Pagetrain.TrainTimeWebService train = new train.TrainTimeWebService();DataSet ds = ne
28、w DataSet();protected void Page_Load(object sender, EventArgs e)string TrainCode = Request.QueryString.Get(“id“);this.Label1.Text = “火车 “ + TrainCode + “ 车次详细信息“;title1.Text = Label1.Text + “列车时刻表 Web Service 实例“;Label3.Text = train.getVersionTime();ds = train.getDetailInfoByTrainCode(TrainCode, “);
29、Repeater1.DataSource = ds.Tables0.DefaultView;Repeater1.DataBind();Label2.Text = “经由车站共计“ + ds.Tables0.Rows.Count.ToString() + “ 个“;protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)if (e.Item.ItemType = ListItemType.Item) | (e.Item.ItemType = ListItemType.AlternatingItem
30、)System.Web.UI.HtmlControls.HtmlTableRow oTR = (System.Web.UI.HtmlControls.HtmlTableRow)e.Item.FindControl(“TR1“);String StartStation = Request.QueryString.Get(“Start“);String ArriveStation = Request.QueryString.Get(“Arrive“);if (DataBinder.Eval(e.Item.DataItem, “TrainStation“).ToString().Equals(StartStation)oTR.BgColor = “#FFFF00“;else if (DataBinder.Eval(e.Item.DataItem, “TrainStation“).ToString().Equals(ArriveStation)oTR.BgColor = “#FF9900“;elseoTR.BgColor = “#FFF8D9“;