velocity apache nin projelerinden birisi. ve birçok java projesi tarafından kod üretirken şablon benzeri bir yapıya oturan veri varsa kullanılır. en basit örnek spring framework. bütün velocity kullananları görmek için tıklayınız. şablon benzeri veri ne olabilir örnek. birçok sitede bir aktivasyon maili vardır siz üye olunca sadece size özel bir mail yazılır ve gönderilir yapısıda şuna benzer:
sayın kullanıcı
bikbik.com sitesine üye oldunuz onaylamak için şu linki tıklayın: bikbik.com/aktive/bişeybişey
bu bütün kullanıcılarına giden mailin şablonudur. ve “kullanıcı” stringi bide “bişeybişey” stringi gerçek veriyle yani kullanıcı yerine kullanıcı adı ve bişeybişey yerinede özel bir string(aktivasyon kodu) yazıp gönderilir. gelelim konumuza nvelocity bu velocity kütüphanesinin .net için olanı. eğer ararsanız google da bir sürü nvelocity bulcaksınız. codeplex de sourceforge da birer tane ben gördüm. onları denemedim çünkü castleproject de gördümki dedim hah bu proje canlıdır test edilmiştir 🙂 birçok opensource projenin derdi genelde yeterince teste tutulmamasıdır. sonra ben biyerde kullanırken pat diye elimde kalabilir diye korkuyorum.
neyse indirdim castleproject den ve ekledim asp.net projeme. okuduklarıma göre pat diye çalışması lazım ama bir türlü template i bulduramıyorum. ve basit bir kullanıcı profil oluşturma şablonum varki sitemde bi kaç sayfada gerekiyor. kalkıpda c# kodunun içine html sokmak istemiyorum en sevmediğim şey kodun içinde statik html görmek. şablonum:
<div>
<a href=”/profil/$user_id”>
<img width=”60″ height=”60″ alt=’üye $comProCommenter.Ad’ title=’üye $comProCommenter.Soyad’ src=’$resim’ />
</a>
</div>
<div class=”idy-img fl”>
<a href=”/profil/$user_id”>
<img width=”60″ height=”60″ alt=’üye $comProCommenter.Ad’ title=’üye $comProCommenter.Soyad’ src=’$resim’ />
</a>
</div>
velocity nin en beğendiğim özelliği şablone gönderdiğim objenin istediğim fonksiyon ve property sini çağırabilmem. $ işareti ile başlayan benim bu şablon koduna gönderdiğim değişkenler ve onları şu şekilde atıyorum.
public string getUserProfilePic(string user_id, ProfileCommon comProCommenter)
{
VelocityContext context = new VelocityContext();
context.Put("user_id", user_id);
context.Put("comProCommenter", comProCommenter);
context.Put("resim",VirtualPathUtility.ToAbsolute(comProCommenter.pic_path));
return VelocityManager.Instance.generateHtml("userPicture.vm", context);
}
fakat bu kod resourcenotfoundexception atıp duruyor ve ben her şekilde kontrol etmeme rağmen nvelocity nin setproperty sini kullanıp halledemiyorum. benim çözmem uzun sürdü. nvelocity deki velocityengine i init ederken vermeniz gereken ayarlar şöyle olması gerekiyor.
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using NVelocity.App;
using Commons.Collections;
using NVelocity;
using System.IO;
using NVelocity.Runtime;
using System.Collections;
public sealed class VelocityManager
{
static readonly VelocityManager instance = new VelocityManager();
static readonly VelocityEngine engine = new VelocityEngine();
static VelocityManager()
{
string templatesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "templates");
ExtendedProperties props = new ExtendedProperties();
props.AddProperty("file.resource.loader.path", new ArrayList(new string[] { ".", @".Templates", templatesPath }));
engine.Init(props);
}
public static VelocityManager Instance
{
get
{
return instance;
}
}
public string generateHtml(string templatePath,VelocityContext context ) {
Template template = engine.GetTemplate(templatePath);
StringWriter writer = new StringWriter();
template.Merge(context, writer);
return writer.GetStringBuilder().ToString();
}
}
koddan anlaşılacağı gibi benim vm dosyalarım(vm dosyası içinde şablon kodunu taşıyan dosyalardır.) templates klasörünün altında. umarım tıkanan olursa bulur uzun sürdü çözmesi. halbuki şunu web.config den ayarlasak ne güzel olurdu. ki ona bakındım ama öyle bi çözüm bulamadım. en azından nvelocitynin şuanki halinde yok.