一、 Web主要功能:
1、 页面展现
2、 数据缓存——页面输出缓存、数据缓存、对象缓存
二、 实现细节:
1、 网站页面文件功能说明
文件名 | .aspx文件 | .cs文件 |
default | 1、使用了两个用户控件,Banner(页面底端)和NavBarNoMenu(页面顶端) | 没有特殊作用 |
Banner | 在页面底端,用于显示用户最感兴趣的宠物的广告图片 | 使用到了AccountController.cs文件 |
AccountController | 无 | 1、用于实现一组对用户账户进行操作的功能:如创建、更新账户,用户登录、注销,返回账号对象,取回当前用户最喜爱的宠物类别等 2、跟Web层打交道的类(从Web层引用的命名空间可以看出),只有BLL和Model中的类。在实例化的时候一定要注意,实例化的是哪个层的类。如BLL层叫Account,而Model层叫AccountInfo |
Category | 1、注意:使用另一个命名空间(即使是同一个Assembly)中的类的方法!例: <%@ Register TagPrefix="controls" Namespace="PetShop.Web.Controls" Assembly="PetShop.Web" %> 2、开始涉及到翻页程序的问题!将SimplePager和DataGrid对照着看,可以知道在控件中使用模板列的方式,以及控件中的实现方式! | 1、最主要的就是一个PageChanged()方法,响应了由SimplePager定义的PageIndexChanged事件 2、处理了该从哪里取数据,即该显示什么数据的问题 3、若数据已被显示过,则直接从缓存中读取数据,并将SimplePager对象绑定数据源;若数据没有被显示过,则实例化BLL层的对象,从数据库读取数据(IList引用),并缓存起来,然后将SimplePager对象绑定数据源 4、绑定数据源的事件又引发了SimplePager对象的OnDataBinding()事件处理程序 |
SimplePager | 无 | 1、为了使SimplePager类使用继承于IList接口的数据源,所以重写了Repeater的DataSource属性 2、对外公布了PageIndexChanged事件,可供客户事件处理程序使用 3、主要用于计算(当前)页码,以及根据总页码及当前页码,决定是否显示“向前”和“向后”的(图片)按钮 4、不规定数据源,使这个翻页程序可在很多场合重用 5、SimplePager控件似乎不应该在每次翻页的时候都检查数据源啊?! |
NavBar.ascx | 1、导航条。包括主图片、分情况显示登录或注销输入框、Category项目等 2、由于是演示程序,这里的Category被写死在页面当中,当类别可以动态修改的时候不能使用,参考价值不大 | 1、主要用于根据用户身份认证情况显示登录选项和注销选项 |
Items | 1、显示Items列表和显示Products列表(Category文件)实现方式是类似的 2、也是在页面中使用了SimplePager控件,用于根据“当前给定的数据源”进行数据绑定,并翻页显示 | 1、与Category.aspx.cs完成的功能相同 |
ItemDetails | 1、显示某个Item的具体细节情况,如单价、库存数量等 2、如果选中,可点击“添加”按钮,将该Item添加到购物车(在购物车页面中调整要购买该Item的数量) | 1、读取用户请求的ItemId 2、实例化BLL层的对象,根据ItemId得到一个ItemInfo实例 3、将此ItemInfo实例的各个属性分别赋值给页面上的各Label,并显示 |
CleanString.cs | 无 | 1、用于过滤用户输入的字符,如去掉空格,替换掉怪字符等 2、加一些更特殊的过滤选项,可以使用在自己的项目中 |
ShoppingCart | 1、非登录用户也可以向购物车中添加物品,但当下订单的时候会出现登录框 2、主要用于显示当前购物车中的物品条目及数量 | 1、用于处理用户点击“Update”或“Remove”时,重新计算某个Item的费用、总共的费用或移除某个Item 2、其他响应购物车事件的操作 |
ViewStatePager.cs |
| 1、主要用于处理购物车中物品显示时的翻页问题 2、继承于SimplePager类,大部分的方法都由重写SimplePager类的同名方法得到 3、比SimplePager类多定义了两个方法:PreviousClicked()和MoreClicked() |
CartController.cs | 无 | 1、主要功能:对购物车的存取操作 2、创建或从Session中取出现有的购物车;将修改后的购物车保存回Session 3、购买购物车中现有的物品——调用BLL层,插入一个新的订单(使用了BLL层的OrderInsert.cs类,这个类是应用“分布式事务”进行处理的典型案例) 4、向Session中保存或取出用户信用卡信息和邮递地址信息等 |
CreateAccount | 1、用于显示用户注册时的界面 2、其中的My Address和My Preference都采用了独立的User Control | 1、对用户输入的信息,都要使用CleanString类进行过滤 2、使用了Model中的AccountInfo和AccountController类,将用户注册的信息添加到数据库中 |
MyAccount | 1、只有一个Label标签,用于在用户“账户创建”、“用户账户更新”和“用户登录”的时候显示相应的信息 | 1、根据用户的动作(create/update/signin),给Label绑定不同的显示内容 |
EditAccount | 1、显示当前用户的注册信息 | 1、从Session中读取当前用户的注册信息,并绑定到页面的各显示控件上 2、调用AccountController中定义的UpdateAccount()方法,将用户对账户信息的更改保存回数据源 |
SignOut | 1、显示用户成功注销的信息 | 1、调用AccountController中定义的LogOut()方法,注销当前用户 |
Search | 1、显示搜索结果 | 1、针对用户输入的关键字,调用底层定义的方法进行搜索 2、根据关键字的缓存是否存在,判断针对此关键字的查询结果是否已经被缓存过。如果已经缓存过,则直接从缓存中提取出结果集(IList接口引用);若没有缓存过,则要调用底层方法,返回结果集,然后缓存起来 3、但这种缓存机制会出现问题!如果在查询结果被缓存过之后,即使数据库中的数据源内容更改了,显示出来的查询结果仍然不会被更新!!! 4、关闭当前浏览器也不行!缓存不是针对当前会话的!!!而似乎是针对全局的,也就是Application级的! |
WebServices | WebServices.asmx | 1、使用了BLL层的OrderRead类 2、根据传入的orderId,返回相应的OrderInfo对象 |
2、 表示层主要有以下几大块功能:
(1) 用户注册
(2) 用户登录、注销
(3) 按照Category、Product、Item的层次进行浏览
(4) 购物车:由ShoppingCart.aspx、Cart.ascx、CartController.cs组成。还有BLL中的Cart.cs和Model中的CartItemInfo.cs
(5) 订单生成
(6) 搜索
3、 AccountController.cs和CartController.cs类,名称虽然叫做xxxController,但是实际作用却类似于MVC模式中的M!这是一组对“数据存储”(无论是数据库或购物车Session)进行操作的类
三、 启发:
1、 一下子看不懂没关系,可以分散着,看每个部分实现的功能,然后再进行整体考虑——关键的问题是——坚持!!!!!!
2、 代码中,若涉及到使用某“字符串”进行赋值的时候,大都是在代码头部使用常量,将这些要赋值的字符串先赋予常量。在真正的代码段当中只使用这些定义好的常量就可以了!
3、 组织很多同类型对象的方法——使用ArrayList;返回很多同类型对象的方法——返回ArrayList的引用
四、 问题:
1、 AutoEventWireup属性?
2、 enableSessionState="ReadOnly"?
3、 FormsAuthentication类的用法?
4、 AccountController.cs文件,创建用户的时候(CreateAccount()方法),又写Session又写Cookie,有什么用?
5、 OnLoad()方法的用法?!与Page_Load()方法的异同?
6、 ASP.NET缓存的问题——在知识漏洞的文档当中已经列出