• 使用NVelocity0.5实现服务器端页面自动生成


    地球人都知道,静态HTML页面通常会比服务器端页面如asp、aspx页面要来的快,即使这些页面没有服务器端代码。
    另外要命的是,这些页面在主流的搜索引擎能中最为吃香,和那些aspx还带几个尾巴参数的页面比起来,真是天上地下。
    如果那天老板发现这个问题,叫你把辛辛苦苦实现的服务器端程序向静态HTML页面靠拢,你会做何感想?
    有一种URL重写的方案可以实现对搜索引擎的欺骗,除了这种方法,自动生成静态HTML页面应该是最彻底的方法了。
    言归正传,开始介绍如何实现吧
    1. 引用Nvelocity0.5,记得是0.5哦,NVelocity0.4我试过好久,好像不行,好像和路径有关系。
    2、引用一些需要的命名空间
    using NVelocity;
    using NVelocity.App;
    using NVelocity.Exception;
    using NVelocity.Runtime;
    using NVelocityTemplateEngine;
    using NVelocityTemplateEngine.Interfaces;
    3、初始化一些变量来使用
            INVelocityEngine fileEngine;
            IDictionary context;

            /// <summary>
            
    /// 初始化NVelocity模板引擎并加载程序的配置信息e
            
    /// </summary>

            protected void InitTemplateEngine()
            
    {
                context 
    = new Hashtable();
                
    string templateDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Articles");
                fileEngine 
    = NVelocityEngineFactory.CreateNVelocityFileEngine(templateDirectory, true);
            }

    4、页面生成代码
            public override void Execute()
            
    {
                
    string message = string.Format("Create the Helper class file.");
                log.Debug(message);

                
    string sql = string.Format("select * from article ");
                
    if (!isCreateAll)
                
    {
                    sql 
    = string.Format("select * from article where generated =False ");
                }


                
    using (IDataReader reader = xConfig.ExecuteReader(sql))
                
    {
                    
    while (reader.Read())
                    
    {
                        PrepareClass(reader);
                        OutputFile();
                    }

                }

                
                sql 
    = "update article set generated =True ";
                
    if (!isCreateAll)
                
    {
                    sql 
    = "update article set generated =True  where generated =False ";
                }

                xConfig.ExecuteNonQuery(sql);
            }


            
    /// <summary>
            
    /// Prepares the class content.
            
    /// </summary>

            private void PrepareClass(IDataReader reader)
            
    {
                FileNameOfOutput 
    = string.Format("{0}#{1}", ((DateTime) reader["datetime"]).ToString("yyyy-MM-dd"), reader["id"].ToString());

                context.Clear();
                context.Add(
    "id", reader["id"].ToString());
                context.Add(
    "category", reader["category"].ToString());
                context.Add(
    "title", reader["title"].ToString());
                context.Add(
    "content", reader["content"].ToString());
                context.Add(
    "datetime", reader["datetime"].ToString());
            }


            
    /// <summary>
            
    ///根据模板创建输出的文件
            
    /// </summary>

            public virtual void OutputFile()
            
    {
                
    if (fileEngine != null)
                
    {
                    
    string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, directoryOfOutput);
                    
    string fileName = Path.Combine(filePath, fileNameOfOutput + fileExtension);

                    DirectoryInfo dir 
    = new DirectoryInfo(filePath);
                    
    if (!dir.Exists)
                    
    {
                        dir.Create();
                    }

                    
                    log.Debug(
    string.Format("Class file output path:{0}", fileName));
                    
    using (StreamWriter writer = new StreamWriter(fileName, false))
                    
    {
                        fileEngine.Process(context, writer, 
    this.templateFile);
                    }

                }

            }

    5、界面层生成页面
                string template = "page.htm";
                
    try
                
    {
                    HelperClassAdapter helper 
    = new HelperClassAdapter(template, false);
                    helper.Execute();
                    Response.Write(
    "<script>alert('生成成功');</script>");
                }

                
    catch(Exception ex)
                
    {
                    Helper.ShowError(
    this, ex, false);
                    
    return;
                }


    页面生成就可以了,具体做法自己琢磨就可以了。
    页面模板文件
    <HTML>
    <HEAD>
    <TITLE>$title</TITLE>
    <META http-equiv=Content-Type content="text/html; charset=UTF-8">
    <META content="$title" name=description>
    <META content="$title" name=keywords>
        
    </HEAD>
        
    <BODY>
          
    <strong class="style3">$title</strong></h2>
          
    <div> $content </div>
          
    <hr width="98%"/>
          
    <div align="right">$datetime</div>
        
    </BODY>
    </HTML>
    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    生活中残忍的真相
    @ControllerAdvice 拦截异常并统一处理
    自律的人生
    50建议
    公众号自动发送红包
    增加记忆力方式
    MySQL行转列与列转行
    微人生的活法
    人生三出戏
    很重要的一点是 关注并坚持去做那些短期看不到效果,但对你影响深远的事情。
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/1047904.html
Copyright © 2020-2023  润新知