使用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 >
本文转自博客园伍华聪的博客,原文链接: 使用NVelocity0.5实现服务器端页面自动生成,如需转载请自行联系原博主。


目录
相关文章
|
开发框架 JavaScript 前端开发
揭秘:如何让你的asp.net页面变身交互魔术师——先施展JavaScript咒语,再引发服务器端魔法!
【8月更文挑战第16天】在ASP.NET开发中,处理客户端与服务器交互时,常需先执行客户端验证再提交数据。传统上使用ASP.NET Button控件直接触发服务器事件,但难以插入客户端逻辑。本文对比此法与改进方案:利用HTML按钮及JavaScript手动控制表单提交。后者通过`onclick`事件调用JavaScript函数`SubmitForm()`来检查输入并决定是否提交,增强了灵活性和用户体验,同时确保了服务器端逻辑的执行。
265 5
|
UED
判断iframe链接页面 服务器状态
【10月更文挑战第6天】
532 153
|
UED
判断iframe链接页面 服务器状态
判断iframe链接页面 服务器状态
335 59
|
JavaScript
新员工webpack打包后上传服务器页面空白
新员工webpack打包后上传服务器页面空白
270 0
|
数据采集 资源调度 前端开发
React的服务器端渲染:使用ReactDOMServer进行高效页面预渲染
【4月更文挑战第25天】使用ReactDOMServer,React支持服务器端渲染以实现高效预渲染。通过在Node.js环境中将React组件转化为HTML字符串,减少客户端JavaScript负载和渲染时间。优点包括更快首屏加载、改善SEO和兼容无JavaScript环境,但也会增加服务器负载、复杂性和状态管理挑战。开发者需根据项目需求平衡SSR和CSR。
|
网络安全
嗯… 无法访问此页面43.139.210.211 花了太长时间进行响应,无法连接宝塔,是服务器内的宝塔面板开启了ssl的验证,但是没有绑定证书,所以被拦截,关闭宝塔面板的ssl访问认证恢复正常
嗯… 无法访问此页面43.139.210.211 花了太长时间进行响应,无法连接宝塔,是服务器内的宝塔面板开启了ssl的验证,但是没有绑定证书,所以被拦截,关闭宝塔面板的ssl访问认证恢复正常
|
JavaScript API
前后端数据交互.js文件的axios的写法,想要往后端发送数据,页面注入API,await的意思是同步等待服务器数据,并返回,axios注入在其他页面,其他页面调用的时候,同步作用
前后端数据交互.js文件的axios的写法,想要往后端发送数据,页面注入API,await的意思是同步等待服务器数据,并返回,axios注入在其他页面,其他页面调用的时候,同步作用
|
前端开发 JavaScript Java
文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb
文本----简单编写文章的方法(中),后端接口的编写,自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑,想写好一个项目,先分析一下需求,再理一下实现思路,再搞几层,配好参数校验,lomb
文本----简单编写文章的方法(上),自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑
文本----简单编写文章的方法(上),自己编写好页面就上传到自己的服务器上,使用富文本编辑器进行编辑
|
移动开发 iOS开发 Perl
iOS客户端和h5页面的互相调用,服务器和客户端间通信方式
iOS客户端和h5页面的互相调用,服务器和客户端间通信方式
558 0