maple-net

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  3 随笔 :: 3 文章 :: 1 评论 :: 0 引用

2011年4月21日 #

做B/S程序用到很多JS和CSS,为了提高性能一般都采取文件压缩,之前都是用别人在线的压缩工具,但每次只能压缩一个文件比较郁闷,每次发布更新很是麻烦,这里抽空写了一个简单的压缩工具,用的Yahoo.Yui.Compressor。

PS:博客园附件咋添加,先放个外链下载地址吧。http://uniold.com/ScriptPacker.rar(时间长了会删除,不保证长期有效)

先上简图

 string s = null;
            if (folderBrowserDialog1.SelectedPath.Length > 0)
            {
                DirectoryInfo d = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
                FileInfo[] fi = d.GetFiles();
                foreach (FileInfo f in fi)
                {
                    if (!Directory.Exists(folderBrowserDialog1.SelectedPath + "\\Min\\"))
                    {
                        Directory.CreateDirectory(folderBrowserDialog1.SelectedPath + "\\Min\\");
                    }
                    if (f.Extension.ToLower() == ".js")
                    {
                        s = JavaScriptCompressor.Compress(ReaderText(folderBrowserDialog1.SelectedPath + "\\" + f.Name), false/*是否详细记录*/, true/*是否混淆*/, 
                            false/*保留所有分号*/, false/*禁用优化*/, 99999/*换行的位置*/, System.Text.Encoding.UTF8/*编码格式*/, null);
                        Create(s, folderBrowserDialog1.SelectedPath + "\\Min\\" + f.Name);
                    }
                    else if (f.Extension.ToLower() == ".css")
                    {
                        s = CssCompressor.Compress(ReaderText(folderBrowserDialog1.SelectedPath + "\\" + f.Name), 99999, CssCompressionType.Hybrid);
                        Create(s, folderBrowserDialog1.SelectedPath + "\\Min\\" + f.Name);
                    }
                }
                DialogResult dr = MessageBox.Show("是否打开压缩后的文件夹?", "是否打开", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (dr == DialogResult.Yes)
                {
                    System.Diagnostics.Process.Start("explorer.exe", folderBrowserDialog1.SelectedPath + "\\Min\\");
                }
                return;
            }
            s = richTex.Text;
            if (checkBox1.Checked)
                richTex.Text = CssCompressor.Compress(s, 99999, CssCompressionType.Hybrid);
            else
                richTex.Text = JavaScriptCompressor.Compress(s, false, true, false, false, 99999, Encoding.UTF8, null);

            richTex.Select();

posted @ 2011-04-21 17:51 Maple 阅读(311) 评论(0) 编辑

2008年11月27日 #

先上图,看看效果

使用jquery-1.2.6和.NET实现的,基本原理我就不写了,很简单现实ICallbackEventHandler下的两个接口,控制控件的重画,代码我写了详细的注释,自己看看吧。

ASPX代码

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AjaxDemo.aspx.cs" Inherits="AjaxDemo" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link href="CSS/StyleSheet.css" rel="stylesheet" type="text/css" />

    <script src="JS/jquery-1.2.6.js" type="text/javascript"></script>

    <script src="JS/ui.js" type="text/javascript"></script>

    <script type="text/javascript">
        $(function() {
            //给标签tabs li a的第一个元素注册点击事件
            $("#tabs li a").eq(0).click(function() {
                UC(1);
            })
            //给标签tabs li a的第二个元素注册点击事件
            $("#tabs li a").eq(1).click(function() {
                UC(2);
            })
            //给标签tabs li a的第三个元素注册点击事件
            $("#tabs li a").eq(2).click(function() {
                UC(3);
            })
            $("#tabs ul").tabs();
        });
        //加载控件
        function UC(tag) {
            var uc = "fragment" + tag;
            if ($("#" + uc).html().length == 0) {//控件内如果有值,将不执行重新加载
                $("#" + uc).html("<img src=\"Images/6-0-1-1.gif\" alt=\"请稍候\" />请稍候……");
                CallServer(tag, uc);
            }
        }
        //重画控件,_v-新的内容,_i-需要更新的控件ID
        function ReceiveCallback(_v, _i) {
            $("#" + _i).html(_v);
        }
 </script>

</head>
<body>
    <form runat="server" id="FromAjax">
    <div id="tabs">
        <ul>
            <li><a href="#fragment1">tag1</a></li>
            <li><a href="#fragment2">tag2</a></li>
            <li><a href="#fragment3">tag3</a></li>
        </ul>
        <div id="fragment1">
            <asp:PlaceHolder ID="PlaUC" runat="server" />
        </div>
        <div id="fragment2">
        </div>
        <div id="fragment3">
        </div>
    </div>
    </form>
</body>
</html>

CS代码

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Globalization;
using System.Threading;

public partial class AjaxDemo : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //注册脚本,实现类型局部刷新
            string callbackReference = ClientScript.GetCallbackEventReference(this, "_v", "ReceiveCallback", "fragment1", false);
            string callbackScript = string.Format("function CallServer(_v,fragment1){{ {0} }}", callbackReference);
            ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);
            AddUC("1");
        }
    }

    #region 动态装载控件
    /// <summary>
    /// 绑定控件
    /// </summary>
    protected void AddUC(string uid)
    {
        Control ct = null;
        switch (uid)
        {
            case "1":
                ct = base.LoadControl("WebUC_1.ascx");
                break;
            case "2":
                Thread.Sleep(3000);//线程阻塞3秒,体现加载与不加载的区别
                ct = base.LoadControl("WebUC_2.ascx");
                break;
            case "3":
                Thread.Sleep(3000);//线程阻塞3秒,体现加载与不加载的区别
                ct = base.LoadControl("WebUC_3.ascx");
                break;
        }
        PlaUC.Controls.Add(ct);
    }
    #endregion

    #region ICallbackEventHandler 成员

    public string GetCallbackResult()
    {
        return Render(PlaUC);
    }

    public void RaiseCallbackEvent(string eventArgument)
    {
        AddUC(eventArgument);
    }

    #endregion

    #region 控件重画
    /// <summary>
    /// 获取指定控件重画的内容
    /// </summary>
    /// <param name="control"></param>
    /// <returns></returns>
    public static string Render(Control control)
    {
        StringWriter SW = new StringWriter(CultureInfo.InvariantCulture);
        HtmlTextWriter HTW = new HtmlTextWriter(SW);
        control.RenderControl(HTW);
        HTW.Flush();
        HTW.Close();
        return SW.ToString();
    }
    #endregion
}

代码是用VS2008写的,VS2005的朋友只需要把相应的文件复制的其他工程中就可以运行了。

/Files/maple-net/Demo.rar

posted @ 2008-11-27 17:49 Maple 阅读(173) 评论(0) 编辑

先上图,看看效果

使用jquery-1.2.6和.NET实现的,基本原理我就不写了,很简单现实ICallbackEventHandler下的两个接口,控制控件的重画,代码我写了详细的注释,自己看看吧。

ASPX代码

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AjaxDemo.aspx.cs" Inherits="AjaxDemo" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link href="CSS/StyleSheet.css" rel="stylesheet" type="text/css" />

    <script src="JS/jquery-1.2.6.js" type="text/javascript"></script>

    <script src="JS/ui.js" type="text/javascript"></script>

    <script type="text/javascript">
        $(function() {
            //给标签tabs li a的第一个元素注册点击事件
            $("#tabs li a").eq(0).click(function() {
                UC(1);
            })
            //给标签tabs li a的第二个元素注册点击事件
            $("#tabs li a").eq(1).click(function() {
                UC(2);
            })
            //给标签tabs li a的第三个元素注册点击事件
            $("#tabs li a").eq(2).click(function() {
                UC(3);
            })
            $("#tabs ul").tabs();
        });
        //加载控件
        function UC(tag) {
            var uc = "fragment" + tag;
            if ($("#" + uc).html().length == 0) {//控件内如果有值,将不执行重新加载
                $("#" + uc).html("<img src=\"Images/6-0-1-1.gif\" alt=\"请稍候\" />请稍候……");
                CallServer(tag, uc);
            }
        }
        //重画控件,_v-新的内容,_i-需要更新的控件ID
        function ReceiveCallback(_v, _i) {
            $("#" + _i).html(_v);
        }
 </script>

</head>
<body>
    <form runat="server" id="FromAjax">
    <div id="tabs">
        <ul>
            <li><a href="#fragment1">tag1</a></li>
            <li><a href="#fragment2">tag2</a></li>
            <li><a href="#fragment3">tag3</a></li>
        </ul>
        <div id="fragment1">
            <asp:PlaceHolder ID="PlaUC" runat="server" />
        </div>
        <div id="fragment2">
        </div>
        <div id="fragment3">
        </div>
    </div>
    </form>
</body>
</html>

CS代码

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Globalization;
using System.Threading;

public partial class AjaxDemo : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //注册脚本,实现类型局部刷新
            string callbackReference = ClientScript.GetCallbackEventReference(this, "_v", "ReceiveCallback", "fragment1", false);
            string callbackScript = string.Format("function CallServer(_v,fragment1){{ {0} }}", callbackReference);
            ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);
            AddUC("1");
        }
    }

    #region 动态装载控件
    /// <summary>
    /// 绑定控件
    /// </summary>
    protected void AddUC(string uid)
    {
        Control ct = null;
        switch (uid)
        {
            case "1":
                ct = base.LoadControl("WebUC_1.ascx");
                break;
            case "2":
                Thread.Sleep(3000);//线程阻塞3秒,体现加载与不加载的区别
                ct = base.LoadControl("WebUC_2.ascx");
                break;
            case "3":
                Thread.Sleep(3000);//线程阻塞3秒,体现加载与不加载的区别
                ct = base.LoadControl("WebUC_3.ascx");
                break;
        }
        PlaUC.Controls.Add(ct);
    }
    #endregion

    #region ICallbackEventHandler 成员

    public string GetCallbackResult()
    {
        return Render(PlaUC);
    }

    public void RaiseCallbackEvent(string eventArgument)
    {
        AddUC(eventArgument);
    }

    #endregion

    #region 控件重画
    /// <summary>
    /// 获取指定控件重画的内容
    /// </summary>
    /// <param name="control"></param>
    /// <returns></returns>
    public static string Render(Control control)
    {
        StringWriter SW = new StringWriter(CultureInfo.InvariantCulture);
        HtmlTextWriter HTW = new HtmlTextWriter(SW);
        control.RenderControl(HTW);
        HTW.Flush();
        HTW.Close();
        return SW.ToString();
    }
    #endregion
}

代码是用VS2008写的,VS2005的朋友只需要把相应的文件复制的其他工程中就可以运行了。

/Files/maple-net/Demo.rar

posted @ 2008-11-27 17:01 Maple 阅读(401) 评论(1)  编辑

2007年3月11日 #

http://www.cnblogs.com/ltp
posted @ 2007-03-11 15:40 Maple 阅读(12) 评论(0)  编辑

什么是三层架构?
所谓的三层开发就是将整个业务应用划分为表示层-业务逻辑层―数据访问层-数据库等,有的还要细一些,明确地将客户端的表示层、业务逻辑访问、和数据访问及数据库访问划分出来,十分有利于系统的开发,维护、部署和扩展。
软件要分层,其实总结一句话,是为了实现“高内聚、低耦合”。采用“分而治之”的思想,把问题划分开来各个解决,易于控制,易于延展,易于分配资源。 
这种三层结构有什么优势呢?
1. 通过将整个系统分为不同的逻辑块,大大降低了应用系统开发和维护的成本。
三层结构将表示部分和业务逻辑部分按照客户层和应用服务器相分离,客户端和应用服务器、应用服务器和数据库服务器之间的通信以及异构平台之间的数据交换等都可以通过中间件或者相关程序来实现。当数据库或者应用服务器的业务逻辑改变时,客户端并不需要改变,反之亦然,从而大大提高了系统模块的复用性,缩短了开发周期,降低了维护费用。
2. 将数据访问和逻辑操作都集中到组件中,增强了系统的复用性。
如:将数据访问集中到数据访问层的组件中,从而减少了应用程序中的重复代码,每个需要访问数据库、表的窗体都使用相同的组件。

如:一些共性的逻辑操作都集中封装在逻辑层的组件中,每一个使用该方法的操作,可以共享来访问该组件。
3. 系统的扩展性大大增强

模块化使得系统很容易在纵向和水平两个方向拓展:一方面可以将系统升级为更大、更有力的平台,同时也可以适当增加规模来增强系统的网络应用。由于摆脱了系统同构性的限制,使得分布数据处理成为可能。在扩充或修改功能时,基本不会破坏原有结构的稳定性。

引用至:http://ltp.cnblogs.com/archive/2005/12/03/289726.html
三层开发中容易犯的错误http://www.cnblogs.com/yukaizhao/archive/2007/03/08/layer_develop_errors.html

posted @ 2007-03-11 15:28 Maple 阅读(263) 评论(0) 编辑

2007年2月16日 #

一个在Page_Load之前执行的类,可以执行重写页面呈现,使所有页面拥有统一的特性;比如标题后缀和编写身份验证,IP限制访问等最高级别特性。

代码丢App_Code文件夹,再在需用调用的页面继承该类就OK了。
posted @ 2007-02-16 02:09 Maple 阅读(787) 评论(0)  编辑