以前用winforms写模板生成,现在没必要了,有了Velocity(以下简称V),就可以写出web的模板生成了。

使用很简单,下载了之后,引用dll,我这里写了一个通用的类

 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;

using NVelocity;
using NVelocity.App;
using NVelocity;
using NVelocity.Runtime;
using Commons.Collections;
using System.IO;
using NVelocity.Context;
/// <summary>
/// BaseVelocity 的摘要说明
/// </summary>
public class BaseVelocity
{

    
/// <summary>
    
/// Common
    
/// </summary>
    
/// <param name="tempAbsPath">模板路径</param>
    
/// <param name="outAbsPath">输出绝对路径</param>
    
/// <param name="parameters">初始参数</param>
    
/// <param name="tempEncoding">模板编码[options]</param>
    
/// <param name="outEncoding">输出编码[optioins]</param>
    
/// <param name="returnStr"></param>
    
/// <returns></returns>
    private string create(string tempAbsPath, string outAbsPath,Hashtable parameters,string tempEncoding, string outEncoding,bool returnStr)
    {
        
if (tempAbsPath == "") { throw new ArgumentException("模板参数错误"); }
        
if (outAbsPath == "") { throw new ArgumentException("输出参数错误");  }
        
if (tempEncoding == "") tempEncoding = "utf-8";
        
if (outEncoding == "") outEncoding = "utf-8";


        
//创建NVelocity引擎的实例对象
        VelocityEngine velocity = new VelocityEngine();

        
//初始化该实例对象
        string root = tempAbsPath.Substring(0, tempAbsPath.LastIndexOf("\\"+ 1);
        
string fileName = tempAbsPath.Substring(tempAbsPath.LastIndexOf("\\"+ 1);
        ExtendedProperties props 
= new ExtendedProperties();
        props.AddProperty(RuntimeConstants.RESOURCE_LOADER, 
"file");
        props.AddProperty(RuntimeConstants.INPUT_ENCODING, tempEncoding);
        props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, root);
        props.AddProperty(RuntimeConstants.OUTPUT_ENCODING, outEncoding);
        velocity.Init(props); 

        
//从文件中读取模板
        NVelocity.Template temp = velocity.GetTemplate(fileName);        
        IContext context 
= new VelocityContext();
        
if (parameters != null)
        {
            
foreach (string key in parameters.Keys)
            {
                context.Put(key, parameters[key]);
            }
        }      
     
        
//合并模板
        StringWriter writer = new StringWriter();

        
//velocity.MergeTemplate(context, writer);
        temp.Merge(context, writer);

        
//生成静态页
        if (!returnStr)
        {
            
using (StreamWriter writer2 = new StreamWriter(outAbsPath, false, System.Text.Encoding.GetEncoding(outEncoding), 200))
            {
                writer2.Write(writer);
                writer2.Flush();
                writer2.Close();
            }
        }
        
else
            
return writer.ToString();
        
return null;
    }
    
/// <summary>
    
/// 创建静态文件
    
/// </summary>
    
/// <param name="tempAbsPath">模板绝对路径</param>
    
/// <param name="outAbsPath">输出绝对路径</param>
    
/// <param name="parameters">初始参数</param>
    
/// <param name="tempEncoding">模板编码[options]</param>
    
/// <param name="outEncoding">输出编码[optioins]</param>
    
/// <param name="returnStr"></param>
    
/// <returns></returns>
    public void creatFile(string tempAbsPath, string outAbsPath, Hashtable parameters, string tempEncoding, string outEncoding)
    {
        create(tempAbsPath,outAbsPath,parameters,tempEncoding,outEncoding,
false);
    }
    
/// <summary>
    
/// 创建输出字符串
    
/// </summary>
    
/// <param name="tempAbsPath">模板绝对路径</param>
    
/// <param name="outAbsPath">输出绝对路径</param>
    
/// <param name="parameters">初始参数</param>
    
/// <param name="tempEncoding">模板编码[options]</param>
    
/// <param name="outEncoding">输出编码[optioins]</param>
    
/// <param name="returnStr"></param>
    
/// <returns></returns>
    public string createStr(string tempAbsPath, string outAbsPath, Hashtable parameters, string tempEncoding, string outEncoding)
    {
        
return create(tempAbsPath, outAbsPath, parameters, tempEncoding, outEncoding, true);
    }
}

 

这种是通过文件加载模板的

以下可以通过变量加载模板

关键代码:

 

System.Text.StringBuilder builder = new System.Text.StringBuilder();
        builder.Append(
"#foreach($u in $ListUsers)"r"n" +
            
"#beforeall"r"n" +
            
"<table border=""0"" cellpadding=""10"" cellspacing=""10"">" +
            
"<tr><td>Name</td><td>Sex</td><td>City</td></tr>" +
            
"#each"r"n" +
            
"<tr>" +
            
"<td>$u.Name</td>" +
            
"<td>$u.Sex</td>" +
            
"<td>$u.City</td>" +
            
"</tr>" +
            
"#afterall"r"n" +
            
"</table>" +
            
"#nodata"r"n" +
            
"暂无用户资料"r"n" +
            
"#end");

        VelocityEngine vltEngine 
= new VelocityEngine();
        vltEngine.Init();

        VelocityContext vltContext 
= new VelocityContext();
        vltContext.Put(
"PageTitle""字符串模板例子");
        vltContext.Put(
"ListUsers", listUsers);

        System.IO.StringWriter vltWriter 
= new System.IO.StringWriter();
        vltEngine.Evaluate(vltContext, vltWriter, 
null, builder.ToString());

        Response.Write(vltWriter.GetStringBuilder().ToString());

 

 

posted @ 2010-02-02 13:24 云淡风轻-.net 阅读(71) | 评论(0) |  编辑

1,对于域名a.a.com和域名http://www.a.com/的两个页面

  如果要在a.a.com使用AJAX访问http://www.a.com/的时候js 会提示"没有权限"

这样的错误很明显,跨域了,在js当中跨域,怎么解决呢?

  发现在页面用Script来引用http://www.google.com/js/js.js 时却不会报错,所以就想了个转化的办法

 也是在网上查到的,人家称之为AJAJ技术,其实也是AJAX的一部分吧

 既然我要用script标签来引用外部js,那么肯定得有个<script>申明吧

 <head>

<script src='' language='"javascript" id="get"></script>

</head>

好了,现在就可以在js中动态链接外部js了、

button.click=function(){

var doc=document.getElementById("get");

doc.src='http://www.google.com/js/js.js';

//如果'http://www.google.com/js/js.js'的内容是

----------------------------------------

var p='你色吗';

----------------------------------------

那么我就可以这样写了

//这里注意点,不是IF

(doc.readStatus==200)

      alert(p);

整个源码示例:

 

 1 <HTML> 
 2 <HEAD> 
 3 <TITLE> New Document </TITLE> 
 4 <META NAME="Generator" CONTENT="EditPlus"> 
 5 <META NAME="Author" CONTENT=""> 
 6 <META NAME="Keywords" CONTENT=""> 
 7 <META NAME="Description" CONTENT=""> 
 8 </HEAD> 
 9 <SCRIPT LANGUAGE="JavaScript" src="" id="get"> 
10 </SCRIPT> 
11 <SCRIPT LANGUAGE="JavaScript"> 
12 
13 function get(url) 
14 
15 var obj = document.getElementById("get"); 
16 obj.src = url; 
17 (obj.readStatus == 200
18 
19 alert(xml); 
20 
21 
22 function text() 
23 
24 get('get.php'); 
25 
26 
27 </SCRIPT> 
28 <BODY> 
29 <INPUT TYPE="button" value="CLICK ME" onclick="text()"> 
30 </BODY> 
31 </HTML> 

 

 

get.php的代码就是

<? echo '你色吗?' ?>

 

点击按钮,输出 “你色吗?”

就这么简单,看起来比那个Ajax的简单吧

这个是Ajax执行权限的跨域,另一个,cookie的跨域,这个很简单了

2,cookie的跨域

var main=".main.com"; //记着一定要加个“.”

function setCookie(name,value,day)
{
    var now=new Date();var ms;
    if(day>0){
    now.setTime(now.getTime()+(day*24*3600*1000));
    }
    document.cookie=name+"="+escape(value)+";expires="+now.toGMTString()+";path=/;domain="+main;
}

附上php跨域示例

     dotnet跨域示例 

3,Forms验证下的一级域名和二级域名的登录同步

 简要的说下

 <authentication mode="Forms" >
     <forms defaultUrl="default.aspx" loginUrl="login.aspx" name="_aq"   timeout="60" domain=".xs.com" ></forms>
  </authentication>

 注意的几项 name domain 这两个选项在父子域名中必须相同

 另外登录代码

                    FormsAuthenticationTicket tic = new FormsAuthenticationTicket(uname, true, gettimeByvalue(time));
                    string entic = FormsAuthentication.Encrypt(tic);
                    HttpCookie h = new HttpCookie(FormsAuthentication.FormsCookieName, entic);
                    h.Expires = d;
                    h.Domain = FormsAuthentication.CookieDomain;
                    h.HttpOnly = true;
                    HttpContext.Current.Response.Cookies.Add(h);

 注意加红部分

注销部分

       Context.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
        FormsAuthentication.SignOut();
        Response.Redirect("/");

 4,JSONP方式

   这里补上浪子兄的建议,使用JSONP突破跨域瓶颈

  理论上就是我上面说的方法,只是一些js框架都封装起来了

  就已jquery来做示例

 ajax方法:

代码
 $.ajax({
             url:"show.aspx",
             dataType:"jsonp",
             jsonp:"jsoncallback",/*默认值:callback*/
             success:function(data){
                 alert(data.mes);
             }
        });

 

  show.aspx页面:

 

 Response.ContentType = "application/x-javascript";    
 
string cb = Request.Params["jsoncallback"];
 Response.Write(cb 
+ "({mes:\"kofaslfj\"})");
 Response.End();

 

getJSON方法:

$.getJSON("show.aspx&callback=?",function (d){
         alert(d.mes);
        }
        );

 

这个show.aspx与上面差不多一样,把jsoncallback换成callback就行了

另外不知有人有不同域名跨域的解决方案,希望能够一起讨论...

 

 

 

 

 

posted @ 2010-01-28 14:44 云淡风轻-.net 阅读(1443) | 评论(11) |  编辑

通常看到别人以及自己以前在绑定无限极分类的时候,总是需要多次连接数据库,这样觉得造成了资源的浪费,然后我想一次把所有数据先取出来(类型不是很多的情况),这样可以节省服务器的开销,数据库结构:

classidid                     主键
jobClassName          对应的类型名称
ClassName        对应的父类的id

通常做法:

 

Code

很明显,这种做法是每个父分类都得建立一次连接,完全浪费资源

现在一次取出所有分类,使用DataView的RowFilter属性做多次过滤

关键代码

 

Code

这样的话,也就没必要浪费资源的了。

其实这篇文章有些牵强了,一般分类都很少做改动的,直接用缓存或静态化处理就可以了,只是想到了记录一下O(∩_∩)O~。


 

posted @ 2009-11-01 19:00 云淡风轻-.net 阅读(189) | 评论(0) |  编辑

有个xml文件以前用循环,然后用StringBuilder拼接输出到页面,这种写法却不被人认可,首先就是繁琐,其次,性能不一定好。

今天想着写了另外一种写法。

Xml结构分三层

xml

上面只是实例,一看这个结构,很不利于dataset的绑定,后来一个个的试,发现到 dataset.read()可以为每层xml结构生成一个datatable,datatable中又为每个节点生产一个节点Id,我如果要绑定到repeater中很不好帮,上面的三层,生产三个datatable,既然有生成节点id,那就好办了,就像表的外连接呗,用两个repeater嵌套

repeater

外层repeater绑定时传入内层repeater节点id,然后内层使用dataview 加工,分层绑定

cs

上面的有个获取valume_id的字段就是节点id,相当于外键。

结果:

 

posted @ 2009-07-16 16:55 云淡风轻-.net 阅读(110) | 评论(0) |  编辑

前一篇文章SQL SERVER2005 分区表几何倍数提高网站性能 已经讲到了如何去为一张表创建分区,今天这里要说的就是再创建好分区后,如何对分区进行修改,比如添加范围,合并范围,查询分布之类的。废话不说,代码才是硬道理

1.首先要改变分区范围,就得给它一个位置吧,要把它放哪里吧,所以必须先给它一个存在的位置使用关键字next used

添加一个组

ALTER DATABASE [D] ADD FILEGROUP [GF2]
ALTER DATABASE [WSBOOK] ADD FILE ( NAME = N'GF2', FILENAME = N'E:\E\E1\DGF2.ndf' , SIZE = 5MB , FILEGROWTH = 10% )
 
TO FILEGROUP [GF2]

为架构添加范围

ALTER PARTITION SCHEME [D_PARTITION_SHEME]
NEXT USED GF2

这句话就是让下一个分区使用和现在已经存在的分区GF2分区中,这样此分区就存储了五段partition的数据

2.添加一个范围

ALTER PARTITION FUNCTION [D_PARTITIONFUNC]()
SPLIT RANGE (
'700000')  

也可以合并一个范围

ALTER PARTITION FUNCTION [D_PARTITIONFUNC]() MERGE RANGE ('400000'

3.查询分区分布

SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID('dbo.B')

4.删除分区

DROP TABLE dbo.Ws_BookChapterUrl
DROP PARTITION SCHEME [D_PARTITION_SHEME]
DROP PARTITION FUNCTION [D_PARTITIONFUNC]

 

这篇文章文章以及前一篇文章讲的也就是分区的一个部分-范围分区,这也是最常见的模式,其实还有其他的分区模式,这里就不敷衍了,有兴趣的自己去找资料。

现在有个问题,提出来跟大家探讨探讨,虽然分区可以使一张表存储上百G的数据,可是难道SQL SERVER 2005就没有数据瓶颈了,就是一张表顶多能存多少数据,如果达到那个瓶颈,分区是不是可以解决它呢?最好的办法又是什么呢?

 

posted @ 2009-06-26 10:14 云淡风轻-.net 阅读(270) | 评论(1) |  编辑
     摘要: 项目做到后期了,发现数据到数据在不断增长,现在是1000w多条,估计以后数据还会增加,可是现在数据库到索引也加了,在数据库做一个大大查询时,前台web会超时,很郁闷,怎么办呢,第一个想法是分库,可是分库这个表关联的太多了,并且这个表又是一对多中多大一方,不好处理,在google上工作了一天,终于让我发现了sql2005的新特性 :表分区功能表分区功能,相当于把一张表大数据无限极细化到多张表上,多个...  阅读全文
posted @ 2009-06-24 18:52 云淡风轻-.net 阅读(2562) | 评论(18) |  编辑
     摘要: 今天突然发现在ff中,访问了几个页面突然就出现Bad Request,访问其他网站没问题,在Ie中也没问题上网查资料,一个共同问题就是主机头不为空,然后我改了主机头,晕,还是没好,代码应该没问题,然后我开始测试Cookie,在火狐中cookie居然乱码然后改了代码:[代码]分别加入escape与unescape测试,成功  阅读全文
posted @ 2009-06-16 10:18 云淡风轻-.net 阅读(66) | 评论(0) |  编辑
     摘要: [代码]页面: [代码]后台程序1:[代码]后台程序2:[代码]结果:自己写的一个ajax发送请求,分别返回json和xml的,以做备用  阅读全文
posted @ 2009-06-08 14:23 云淡风轻-.net 阅读(2366) | 评论(6) |  编辑