秋色园学习测试项目

小弟今年6月份刚刚毕业。前天刚刚开始接触秋色园这个开源框架,感觉收获颇多,在此写了一个测试项目,加上了一个自己写的路由机制。还望各位看官见笑了。

我的项目分为:UrlRewrite层,UrlRewriteModule层,WebUI层。

UrlRewrite层用于当http处于刚刚进来的时候用HttpModule处理路由操作。

UrlRewriteModule层里面继承了一个HttpHandler为页面基类,在里面设定了整张页面的生命周期。

WebUI层是web应用层。

如下图:

 

我的路由机制设定的URL格式是这样的:~/模块名/页面名(不加后缀)?参数

其中模块名如果你是在根目录下的如Default.ashx页面则为Home,其他是对应其文件夹名的如AdminDefault.ashx的模块名为Admin

在第一次接受到http请求的时候交由UrlRewrite里面的UrlRewrite处理。并且将get方式获得的参数加请求的URL一起传过去。

public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication)sender;
            HttpUrlRewrite(app.Context);
        }

        public void HttpUrlRewrite(HttpContext context)
        {
            string url = context.Request.Url.AbsolutePath;
            //在这里判断如果是一般文件(图片文件,css文件等)则直接跳转
            if (url.IndexOf(".") > -1 && !(url.IndexOf(".ashx") > -1))
            {
                return;
            }

            string physicUrl = "~/";
            string[] keys = url.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            if (keys.Length == 0 || keys.Length == 1)
            {
                physicUrl += "Default.ashx";
            }
            else
            {
                string modulename = GetModuleName(keys[0]);//模块名称
                string pagename = GetPageName(keys[1]);//页面名称

                if (!string.IsNullOrEmpty(modulename))
                {
                    physicUrl += modulename + "/";
                }
                physicUrl += pagename + ".ashx";
            }

            context.RewritePath(physicUrl, null, string.Format("url={0}&{1}", url, context.Request.Url.Query));
        }

        //在此判断页面名
        internal string GetPageName(string name)
        {
            switch (name)
            {
                case "Default": return "Default";
                case "Action": return "Action";
                case "AdminDefault": return "AdminDefault";
            }

            return name;
        }

        //在此判断模块名称
        internal string GetModuleName(string name)
        {
            switch (name)
            {
                case "Home": return string.Empty;
                case "Admin": return "Admin";
            }

            return name;
        }
View Code

在此处理这段URL并找到其物理路径通过HttpContext的RewritePath方法来跳转到该页面处理。

好!到了这一步已经可以进入对页面的处理模块了!页面类继承抽象类HttpCustom类,而HttpCustom类继承IHttpHandler用于处理http请求

public abstract class HttpCustom : System.Web.IHttpHandler
    {
        #region IHttpHandler 成员

        private HttpRequest _request;

        public HttpRequest Request
        {
            get
            {
                return _request;
            }
            set
            {
                _request = value;
            }
        }

        private HttpResponse _response;

        public HttpResponse Response
        {
            get
            {
                return _response;
            }
            set
            {
                _response = value;
            }
        }

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
        bool IsDocFromCache = false;
        public virtual void ProcessRequest(System.Web.HttpContext context)
        {
            //这里是接收请求的入口,我们将在这里自定义页面生命周期
            Page_Init(context);//参数初始化
            Page_PreLoad();//预加载,初始化html
            if (IsDocFromCache)
            {
                Page_OnCache();//缓存时,个别需要处理,如用户名
            }
            else
            {
                Page_Load();//这个具体分给ashx处理
            }
            Page_PreEnd();//输出前做点什么
            Page_End();//输出html
        }
        private void Page_Init(HttpContext context)
        {
            this._request = context.Request;
            this.Response = context.Response;
        }
        private void Page_PreLoad()
        {

        }
        protected abstract void Page_Load();
        protected virtual void Page_OnCache()
        {

        }
        private void Page_PreEnd()
        {

        }
        private void Page_End()
        {

        }
        #endregion
    }
View Code

因为做测试我在重载的Page_Load方法里面所以输出一下文字已表示请求到的页面。

public class AdminDefault : HttpCustom
    {

        protected override void Page_Load()
        {
            this.Response.Write("this is adminDefault page!");
            foreach (string key in Request.QueryString.Keys)
            {
                this.Response.Write("<br/>");
                this.Response.Write(Request.QueryString[key]);
            }
        }
    }
View Code

好到这里已经完成了!我们来测试下运行项目,在浏览器中输入http://localhost:3801/Admin/AdminDefault?t=3&fg=afsdf,然后页面出来了如下图:

 

当然要一个完整的后面还有很多步骤,如页面的动态化生成,缓存,数据库(要真要继续弄下去打算用nhibernate来进行数据操作)等!

附源码:下载

 

原文地址:https://www.cnblogs.com/hangjian/p/3232441.html