领悟Web设计模式(转)
<form id="webForm" method="post" runat="server"> <asp:DropDownList id="dropDownList" runat="server"></asp:DropDownList> <asp:Button id="button" runat="server" Text="Button"></asp:Button> <asp:DataGrid id="dataGrid" runat="server"></asp:DataGrid> </form>
//页面初始化事件 private void Page_Load(object sender, System.EventArgs e) { if ( ! IsPostBack ) { string SQL_SELECT_PORTAL = "SELECT * FROM PORTAL"; //使用using确保释放数据库连接 //连接字符串存放在Web.Config文件中便于修改 using( SqlConnection conn = new SqlConnection( ConfigurationSettings.AppSettings["ConnectionString"] ) ) { SqlDataAdapter dataAdapter = new SqlDataAdapter( SQL_SELECT_PORTAL, conn ); DataSet dataSet = new DataSet(); dataAdapter.Fill( dataSet ); //设置下拉列表的数据源与文本域、值域 dropDownList.DataSource = dataSet; dropDownList.DataTextField = "portalName"; dropDownList.DataValueField = "portalId"; dropDownList.DataBind(); } } } //Button的Click事件 private void button_Click(object sender, System.EventArgs e) { string SQL_SELECT_SUBJECT = "SELECT * FROM SUBJECT WHERE portalId = {0}"; using( SqlConnection conn = new SqlConnection( ConfigurationSettings.AppSettings["ConnectionString"] ) ) { //用下拉列表选择的值替换掉SQL语句中的待定字符{0} SqlDataAdapter dataAdapter = new SqlDataAdapter( string.Format( SQL_SELECT_SUBJECT, dropDownList.SelectedValue ), conn ); DataSet dataSet = new DataSet(); dataAdapter.Fill( dataSet ); dataGrid.DataSource = dataSet; dataGrid.DataBind(); } }
private static string SQL_SELECT_PORTAL = "SELECT * FROM PORTAL"; private static string SQL_SELECT_SUBJECT = "SELECT * FROM SUBJECT WHERE portalId = {0}"; private static string SQL_CONNECTION_STRING = ConfigurationSettings.AppSettings["ConnectionString"]; public static DataSet GetPortal() { return GetDataSet( SQL_SELECT_PORTAL ); } public static DataSet GetSubject( string portalId ) { return GetDataSet( string.Format( SQL_SELECT_SUBJECT, portalId ) ); } public static DataSet GetDataSet( string sql ) { using( SqlConnection conn = new SqlConnection( SQL_CONNECTION_STRING ) ) { SqlDataAdapter dataAdapter = new SqlDataAdapter( sql, conn ); DataSet dataSet = new DataSet(); dataAdapter.Fill( dataSet ); return dataSet; } } Controller(webForm.aspx.cs):负责转化用户的输入 private void Page_Load(object sender, System.EventArgs e) { if ( ! IsPostBack ) { //调用Model的方法获得数据源 dropDownList.DataSource = SQLHelper.GetPortal(); dropDownList.DataTextField = "portalName"; dropDownList.DataValueField = "portalId"; dropDownList.DataBind(); } } private void button_Click(object sender, System.EventArgs e) { dataGrid.DataSource = SQLHelper.GetSubject( dropDownList.SelectedValue ); dataGrid.DataBind(); }
Page Controller(BasePage.cs): public class BasePage : System.Web.UI.Page { private string _title; public string Title//页面标题,由子类负责指定 { get { return _title; } set { _title = value; } } public DataSet GetPortalDataSource() { return SQLHelper.GetPortal(); } public DataSet GetSubjectDataSource( string portalId ) { return SQLHelper.GetSubject( portalId ); } protected override void Render( HtmlTextWriter writer ) { writer.Write( "<html><head><title>" + Title + "</title></head><body>" );//统一的页面头 base.Render( writer );//子页面的输出 writer.Write( @"<a href=""http://www.asp.net"">ASP.NET</a></body></html>" );//统一的页面尾 } }
public class webForm : BasePage//继承页面基类 { private void Page_Load(object sender, System.EventArgs e) { Title = "Hello, World!";//指定页面标题 if ( ! IsPostBack ) { dropDownList.DataSource = GetPortalDataSource();//调用基类的方法 dropDownList.DataTextField = "portalName"; dropDownList.DataValueField = "portalId"; dropDownList.DataBind(); } } private void button_Click(object sender, System.EventArgs e) { dataGrid.DataSource = GetSubjectDataSource( dropDownList.SelectedValue ); dataGrid.DataBind(); } }
<!-- 指定对Dummy开头的aspx文件交由Handler处理 --> <httpHandlers> <add verb="*" path="/WebPatterns/FrontController/Dummy*.aspx" type="WebPatterns.FrontController.Handler,WebPatterns"/> </httpHandlers> <!-- 指定名为FrontControllerMap的页面映射块,交由UrlMap类处理,程序将根据key找到对应的url作为最终的执行路径,您在这可以定义多个key与url的键值对 --> <configSections> <section name="FrontControllerMap" type="WebPatterns.FrontController.UrlMap, WebPatterns"></section> </configSections> <FrontControllerMap> <entries> <entry key="/WebPatterns/FrontController/DummyWebForm.aspx" url="/WebPatterns/FrontController/ActWebForm.aspx" /> 。。。 </entries> </FrontControllerMap> 修改webForm.aspx.cs: private void button_Click( object sender, System.EventArgs e ) { Response.Redirect( "DummyWebForm.aspx?requestParm=" + dropDownList.SelectedValue ); } 当程序执行到这里时将会根据Web.Config里的定义触发类Handler的ProcessRequest事件: Handler.cs: public class Handler : IHttpHandler { public void ProcessRequest( HttpContext context ) { Command command = CommandFactory.Make( context.Request.Params ); command.Execute( context ); } public bool IsReusable { get { return true; } } }
public class CommandFactory { public static Command Make( NameValueCollection parms ) { string requestParm = parms["requestParm"]; Command command = null; //根据输入参数得到不同的Command对象 switch ( requestParm ) { case "1" : command = new FirstPortal(); break; case "2" : command = new SecondPortal(); break; default : command = new FirstPortal(); break; } return command; } } public interface Command { void Execute( HttpContext context ); } public abstract class RedirectCommand : Command { //获得Web.Config中定义的key和url键值对,UrlMap类详见下载包中的代码 private UrlMap map = UrlMap.SoleInstance; protected abstract void OnExecute( HttpContext context ); public void Execute( HttpContext context ) { OnExecute( context ); //根据key和url键值对提交到具体处理的页面 string url = String.Format( "{0}?{1}", map.Map[ context.Request.Url.AbsolutePath ], context.Request.Url.Query ); context.Server.Transfer( url ); } } public class FirstPortal : RedirectCommand { protected override void OnExecute( HttpContext context ) { //在输入参数中加入项portalId以便页面处理 context.Items["portalId"] = "1"; } } public class SecondPortal : RedirectCommand { protected override void OnExecute(HttpContext context) { context.Items["portalId"] = "2"; } } 最后在ActWebForm.aspx.cs中: dataGrid.DataSource = GetSubjectDataSource( HttpContext.Current.Items["portalId"].ToString() ); dataGrid.DataBind();
<%@ OutputCache Duration="60" VaryByParam="none" %>,
public static DataSet GetPortal() { DataSet dataSet; if ( HttpContext.Current.Cache["SELECT_PORTAL_CACHE"] != null ) { //如果数据存在于缓存中则直接取出 dataSet = ( DataSet ) HttpContext.Current.Cache["SELECT_PORTAL_CACHE"]; } else { //否则从数据库中取出并插入到缓存中,设定绝对过期时间为3分钟 dataSet = GetDataSet( SQL_SELECT_PORTAL ); HttpContext.Current.Cache.Insert( "SELECT_PORTAL_CACHE", dataSet, null, DateTime.Now.AddMinutes( 3 ), TimeSpan.Zero ); } return dataSet; }
领悟Web设计模式(转)相关推荐
- java设计模式之道文字版,Java Web设计模式之道 PDF
资源名称:Java Web设计模式之道 PDF 第一部分 仙人指路--设计模式简介 第1章 设计模式概述 1.1 设计模式是什么 1.2 软件设计模式的发展历程 1.3 作者阐述软件设计模式的主要方式 ...
- 三万长文50+趣图带你领悟web编程的内功心法:一文带你深入解读HTTP的发展史
看到题目,大家是不是认为根据上一篇(两万字长文50+张趣图带你领悟网络编程的内功心法)一样,其实不然,我们上一边介绍的是网络编程的基本功,有了这些基本功之后,我们就可以在此之上构建更加接近实际应用的w ...
- java web 设计模式之道_JavaWeb之MVC设计模式
时间:2016-11-26 16:22 --MVC MVC模式(Model - View - Controller)是软件工程中的一种架构模式,把软件系统分为三个基本部分: 模型(Model).视图( ...
- 『设计模式』80年代的人们就已经领悟了设计模式-- 发布者/订阅者模式 (包括发布者/订阅者模式和观察者模式的区别)
23种设计模式+额外常用设计模式汇总 (持续更新) 发布-订阅模式 在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者).而是将发布的消息分为 ...
- ajax自动加载blogjava和博客园的rss
自动加载blogjava和博客园的rss <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "h ...
- 极客Web前端开发资源大荟萃
每周极客都将总结本周最精彩的素材提供给大家,希望可以带给你更多地灵感和帮助!极客#GB课程库#现已上线,无论你是初级.中级.还是正在进修的高级前端工程师.这里都将帮助你得到更多更高效的学习. #GB课 ...
- Head First Design Patterns(深入浅出设计模式)-目录
目录 序 你的大脑是如何理解设计模式的?此时,你正在设法学习些知识,而你的大脑要通过确认这些知识来给你提供支持.你的大脑在想:"最好出去做些更重要的事情,就象消灭野兽或者光着身子滑雪不是个好 ...
- 神级以下必读! ~程序员学习资料(图书源码) 01
为表示感谢,少见的郑重声明:本文转自- http://blog.csdn.net/fanxiaobin577328725/article/details/51894331?locationNum ...
- Java培训学习步骤有哪些
最近几年,有很多学习java技术的同学都有过半途而废的想法,认为java零基础是很难学会的,其实出现这样的问题,最主要的原因就是学习方法有问题,下面小编整理的Java培训学习步骤,希望能够帮助大家更有 ...
最新文章
- expand yourself
- vue 箭头函数兼容性_前端学习计划之VUE学习(二)
- YOLOv5训练coco128数据集流程
- json非法字符有哪些_JSON文件中非法字符的处理
- 华为P30 Pro真机上手谍照曝光 这颜值打几分?
- Linux虚拟化KVM-Qemu分析(六)之中断虚拟化
- 大学计算机入学教育心得1000,新学期入学教育心得体会1000字
- Grow heap (frag case) to 6.437MB for 1114126-byte allocation
- 竖排书A5双面打印设置指南
- win10 开机黑屏时间长 联想y470解决方案
- SAP STO With Billing流程与配置
- python批量删除图片和空文件夹
- 神经网络中的对抗样本
- nemesis什么车_英国Mazda推出RX-8 Nemesis限量特式车
- 《幼儿体适能》课程教学大纲
- PDF转Word方法小罗列
- 提升数据存储性能,主要有哪几种方法?
- c连接mysql数据库字符串函数_在mysql数据库—— 字符串函数的运用
- 树莓派4b 安装摄像头
- window.showModalDialog() 过时替代方案
热门文章
- ASP.NET Core 2.1带来SignalR、Razor类库
- 第7章 面向对象编程(OOP) 《Kotin 编程思想·实战》
- Ubuntu操作系统安装之开发人员必备
- 增强for循环对于“二维”数组进行循环的案例
- 源代码安全加密系统对软件开发企业的重要性
- SerfJ REST
- 关于Javacript“原型”和“prototype属性”两者需要澄清的几点
- Mysql 安全登陆工具 mysql_config_editor
- NRF52832与W25Q80通信
- 贴现率 vs 折现率