SEO uyumlu URL nasıl üretilir ?

Kodu İndir

Bağlantı adreslerinin nasıl ifade edildiği öncelikle insanlar için sonra arama motorları için çok büyük bir öneme sahip. SEO (Search engine optimization) konusunda epeyce bir ağırlığı olan güzel bağlantı adresleri üretme konusuna daha programatik bir açıdan bakmak istiyorum.

Kötü bağlantı (URL) adresine örnek : www.abcde.com/article?id=5&konu=tarim+ciftcilik+konulari

? ve & gbi karakterler bir bağlantının kalitesini düşürür.

İyi bağlantı adresine örnek olarak : www.abcde.com/article/tarim-ciftcilik-konulari

Bağlantı adresi çok daha kolay okunuyor.

Apache Wicket kullanarak dinamik bir şekilde SEO uyumlu bağlantı üreten projeyi sizlere anlatmak istiyorum. Dikkat isterim ! Dinamik bir şekilde bağlantıları oluştaracağız.

Projeyi yukarıdaki adresden indirebilirsiniz fakat öncesinde lütfen maven projesini indirin ve kurun.

Konunun detaylarına geçmeden evvel projeyi çalıştırıp, sonuçlarını sizinle paylaşmak isterim.  Proje çalıştırmak için projenin içeriğinin olduğu dizine gidin (src dizini ve pom.xml olduğu dizine) ve jetty:run deyiniz.

 

 

Uygulamanın çalıştığını test etmek için bir tarayıcı açın ve  …

 

Uygulama çok göze hitap etmiyor, kabul. Unutmadan uygulamayı çalıştırmadan önce lütfen bilgisayarınızda 8080 portundan çalışan başka bir uygulama olup olmadığını kontrol ediniz.

 

Esas nokta bu Tıkla bağlantılarının üzerine tıklayınca yaşanacak. İşte …

 

Bağlantı adresinin nasıl SEO uyumlu olduğuna lütfen dikkat edeniz.

Peki bunu Apache wicket ile nasıl yaparız ? Tekrardan hatırlatmak isterim Apache wicket için sadece html ve Java bilmeniz yeterli. Şimdi sizlere projenin yapısını göstermek istiyorum

 

 

Ben IDE olarak IntelliJ kullanıyorum ve kesinlikle tavsiye ederim. Proje herşey dahil 14 dosyadan oluşuyor. Maven projesi yapısında olduğu için neyin nerede olduğu belli. pom.xml , web.xml ve log.properties dosyalarından bahsetmeyeceğim.

Projeyi konsoldan jetty:run diyerek çalıştırdığım gibi com.kodcu.test paketi altında bulunan Start.java‘ yı sağ tıklayarak  “run” veya “debug” diyerekte çalıştırabilirim.

Wicket dünyasında ayar işlemleri XML aracılığıyla yapılmaz.  Ayarlama işlemlerinin olduğu yer extends WebApplication dediğiniz sınıfın içidir.

WicketApplication.java

public class WicketApplication extends WebApplication {

    private ArticleStore store = new ArticleStore();

    public ArticleStore getStore() {
        return store;
    }

    protected void init() {
        mount(
                new IndexedParamUrlCodingStrategy(
                        "/articles", ArticlePage.class));
    }

    /**
     * @see org.apache.wicket.Application#getHomePage()
     */
    public Class getHomePage() {
        return HomePage.class;
    }
}

new IndexedParamUrlCodingStrategy diyerek  /articles/<articleKey> şeklinde olan tüm dinamik bağlantılar için yer açmış ve stratejiyi belirlemiş olduk. Strateji açık ve net ben bağlantı adreslerimin /articles/ask-ve-savas şeklinde gözükmesini istiyorum. Devam…

Doldurucu.java

public class Doldurucu {

    public static HashMap doldur() {
        HashMap articles = new HashMap();

        Article kitap1 = new Article("Yedi cuculer", "yedi-cuculer", "1 iste ....");
        Article kitap2 = new Article("Kirk Haramiler", "kirk-harimiler", "2 iste ....");
        Article kitap3 = new Article("Ask ve Savas", "ask-ve-savas", "3 iste ....");
        Article kitap4 = new Article("Baris ve Dunya", "baris-ve-dunya", "4 iste ....");
        Article kitap5 = new Article("Bilgi ve Guc", "bilgi-ve-guc", "5 iste ....");

        articles.put(kitap1.getKey(), kitap1);
        articles.put(kitap2.getKey(), kitap2);
        articles.put(kitap3.getKey(), kitap3);
        articles.put(kitap4.getKey(), kitap4);
        articles.put(kitap5.getKey(), kitap5);

        return articles;
    }
}

Article bir model sınıfdır yani verileri tutar. Article sınıfına ait nesneleri oluştıurduğumuz yer. Normal şartlarda buranın veritabanından dolması beklenirdi.

Article.java

public class Article implements Serializable {
    private  String title, key, content;
    //... diğer getter ve setter yordamları
}

ArticleStore.java : Bu sınıf verilere erişim sağlayan yardımcı rölünde. Article nesnesini index’e veya ismine göre bulmaya yarar.

public class ArticleStore {
    private HashMap articles = Doldurucu.doldur(); // veriler doluyor

    public Article getByKey(int index) {
        try {
            Collection articleCollection =  articles.values();
            ArrayList arrayList = new ArrayList(articleCollection);
            return arrayList.get(index);
        } catch (Exception ex) {
            return null;
        }
    }

    public Article getByKey(String key) {
         try {
           return articles.get(key);
        } catch (Exception ex) {
            return null;
        }
    }
}

ArticleModel.java : Bir yapıştırıcı rölündedir. Wicket bileşeni ile Model nesnesi arasındaki bağlantıyı sağlar.  Wicket dünyasındaki model yapılarını öğrenmek için tıklayınız.

public class ArticleModel extends
        LoadableDetachableModel {

    private String key;

    public ArticleModel(Article article) {
        super(article);
        this.key = article.getKey();
    }

    public ArticleModel(String key) {
        this.key = key;
    }

    protected Article load() {
        return
                ((WicketApplication) Application.get())
                        .getStore()
                        .getByKey(key);
    }

 

ArticleLink.java : Wicket’da kendi bileşeninizi çok kolay bir şekilde yapabilirsiniz. İşte bu sınıf Link sınıfından türetilmiş ve yeni özellikler kazandırılmış hali.

public class ArticleLink extends Link {

    public ArticleLink(String id, IModel model) {
        super(id, model);
    }

    public final void onClick() {
        // artik buna gerek yok
        // baglanti adresleri getURL icerisinde uretiliyor
    }

    protected CharSequence getURL() {
        return ArticlePage.urlFor(getModelObject());
    }
}

Şimdi Article – ArticleModel – ArticleLink arasında ilişkiyi daha net gösterebiliriz.

Bu sayede verilerin wicket bileşenleri ile birleştirilip yönetilmesi daha kolay bir hale geliyor. Gelelim gösterimin gerçekleştiği sayfalara.

HomePage.java : Bu ekran uygulama ilk çalıştığında kullanıcıyı karşılayan kısım olacak. Burada bağlantıları oluşturup (new ArticleLink….) sayfaya ekliyoruz.

// HomePage.html için kodu indirin lütfen
public class HomePage extends WebPage {
    public HomePage(final PageParameters parameters) {
       WicketApplication wicketApplication = (WicketApplication) getApplication();

        Article article =
               wicketApplication.getStore().getByKey(0);
        add(new ArticleLink("link", new ArticleModel(article)));
       ..........
}

ArticlePage.java : Article nesnesinin içeriğinin gösterildiği sayfa. Bu sayfa içerisinde bağlantı adresini kodlamak (encode) ve kodu çözücü (decode) iki yordam bulunuyor.

public static CharSequence urlFor(Article article) {
     PageParameters params = new PageParameters();
     params.put("0", article.key);
     params.put("0", article.getKey());
     return rc.urlFor(ArticlePage.class, params);
}

Şu noktaya dikkat; params.put(“0”, article.getKey()); buradaki “0” IndexedParamUrlCodingStrategy kullanığımızdan dolayı bunun anlamı ilk elemana yani “0”. indeks’e ilgili Article nesnesinin anahtarını yerleştir demek oluyor.

Burada bir sistem kurduğumuzu belirtmek isterim. Genel bir çözüm oluşturmuş olduk. Artık projenin her yerinden bizim yazığımız ArticleLink wicket bileşenini kullanabiliriz veya başka projelerde de rahatlıkla kullanabiliriz.

Kodu İndir

 

Kaynak : igor vaynberg -wicket cookbook – Bölüm 12 – Sayfa 5 – https://www.packtpub.com/apache-wicket-cookbook/book

4 Comments
  • Posted at 16:14, 23/05/2011

    bilginiz varsa php için de yayınlarsanız çok güzel olur

  • Alihan uygun
    Posted at 20:58, 27/08/2011

    Cok is yav Spring MVC de bu is cok daha kolay.

  • Posted at 01:32, 03/12/2017

    Güzel yazı ve faydalı bilgiler
    kullanışlı olduğun için teşekkürler

    Önder

  • Posted at 11:39, 06/12/2017

    Baya işe yarar bir konu teşekkürler

Post a Comment

Comment
Name
Email
Website