Neden şablon motoru kullanayım? jsp içerir ve jstl vs fayans, freemarker, hız, sitemesh


95

Görüşümü düzenlemek için bir yol seçmek üzereyim (spring-mvc ile, ancak bu çok önemli olmamalı)

Gördüğüm kadarıyla 6 seçenek var (birbirini dışlamasa da):

  • Fayans
  • Site ağı
  • Freemarker
  • Hız
  • <jsp:include>
  • <%@ include file="..">

Fayanslar ve Sitemesh gruplanabilir; böylece can Freemarker ve Velocity . Her grupta hangisinin kullanılacağı bu tartışma konusu değil, bu konuda yeterince soru ve tartışma var.

Bu ilginç bir okuma , ancak beni fayans kullanmaya ikna edemiyor.

Sorum şu - bu çerçeveler <@ include file=".."> JSTL ile düzgün bir şekilde yapılamayan ne veriyor ? Ana noktalar (bazıları makaleden alınmıştır):

  1. Üstbilgi ve altbilgi gibi sayfaların bölümlerini dahil etmek - aşağıdakiler arasında bir fark yoktur:

    <%@ include file="header.jsp" %>
    

    ve

    <tiles:insert page="header.jsp" />
    
  2. Başlıkta parametrelerin tanımlanması - başlık, meta etiketler, vb. Bu, özellikle SEO açısından çok önemlidir. Şablon oluşturma seçenekleriyle, her sayfanın tanımlaması gereken bir yer tutucu tanımlayabilirsiniz. Ama birlikte jsp böylece JSTL kullanarak <c:set>(dahil sayfasında) ve <c:out>(dahil sayfasında)

  3. Düzeni yeniden düzenleme - içerik haritasını menünün üstüne veya oturum açma kutusunu başka bir yan panelin üzerine taşımak istiyorsanız. Sayfa eklemeleri (jsp ile) iyi organize edilmemişse, bu gibi durumlarda her sayfayı değiştirmeniz gerekebilir. Ancak düzeniniz aşırı karmaşık değilse ve ortak şeyleri üstbilgi / altbilgiye koyarsanız, endişelenecek bir şey yoktur.

  4. Ortak bileşenler ve belirli içerik arasında bağlantı - Bununla ilgili bir sorun bulamıyorum. Bir bölümü yeniden kullanmak istiyorsanız, onu herhangi bir üstbilgi / altbilgi içermeyen bir sayfaya taşıyın ve gerektiğinde ekleyin.

  5. Verimlilik - <%@ include file="file.jsp" %>her şeyden daha etkilidir, çünkü bir kez derlenir. Diğer tüm seçenekler birçok kez ayrıştırılır / yürütülür.

  6. Karmaşıklık - jsp olmayan tüm çözümler ek xml dosyaları, ek kapsamlar, ön işlemci yapılandırmaları vb. Gerektirir. Bu hem bir öğrenme eğrisidir hem de daha fazla olası arıza noktası sunar. Ayrıca, desteği ve değişimi daha sıkıcı hale getirir - neler olduğunu anlamak için bir dizi dosyayı / yapılandırmayı kontrol etmeniz gerekir.

  7. Yer tutucular - hız / serbest işaretleyici JSTL'den daha fazlasını veriyor mu? JSTL'de yer tutucu koyarsınız ve bu yer tutucuları doldurmak için modeli (denetleyiciler tarafından istek veya oturum kapsamına yerleştirilir) kullanırsınız.

Öyleyse, düz JSP'ye ek olarak / yerine yukarıdaki çerçevelerden herhangi birini kullanmam gerektiğine beni ikna edin.


Onları tam olarak nasıl karşılaştıracağımdan emin değilim, çünkü bir süredir Stripes düzen şablonlarını kullanıyorum ve bunun düz JSP'den çok daha iyi olduğunu görüyorum . Bazı jsp: dahil çağrıları kullanıyorum ama bunlar genellikle oldukça özel durumlar. Düzen şablonu mekanizması gerçekten kullanışlı ve güçlü bir araçtır.
Sivri

2
evet, bunların hepsinin "kullanışlı ve güçlü" olduğunu duydum, ama görmedim. Gerçi gördüğüm şey, gereksiz karmaşıklık ve yapılandırma dosyalarının yığınları. (Özel olarak çizgilerden bahsetmiyorum, genel olarak)
Bozho


Jsp: include'in oldukça verimli olduğuna inanıyorum - dahil olan sunucu uygulamasından dahil edilene kadar bir yöntem çağrısına derlendi. @İnclude'dan daha az üretilen kodla sonuçlanır, bu da önbellek etkileri nedeniyle performansı artırabilir.
Tom Anderson

StringTemplate geliştirici çok benzer gördüğüm en iyi argüman, yapar az güç üstünlüğü
Paul Sweatte

Yanıtlar:


17

Hız için birkaç argüman (Freemarker kullanmadım):

  • E-posta gönderme gibi bir web bağlamı dışında şablonları yeniden kullanma potansiyeli
  • Velocity'nin şablon dili sözdizimi, JSP EL veya etiket kitaplıklarından çok daha basittir
  • Görünüm mantığının diğer mantık türlerinden katı bir şekilde ayrılması - şablonlarınızda betik etiketlerini kullanmaya ve kötü şeyler yapmaya bırakma seçeneği yoktur.

Yer tutucular - hız / freemaker JSTL'den daha fazlasını veriyor mu? JSTL'de yer tutucu koyarsınız ve bu yer tutucuları doldurmak için modeli (denetleyiciler tarafından istek veya oturum kapsamına yerleştirilir) kullanırsınız.

Evet, referanslar gerçekten VTL'nin özüdür:

<b>Hello $username!</b>

veya

#if($listFromModel.size() > 1)
    You have many entries!
#end

Verimlilik - <%@ include file="file.jsp" %>her şeyden daha etkilidir, çünkü bir kez derlenir. Diğer tüm seçenekler birçok kez çözümlenir / yürütülür.

Bu noktaya katılıyorum veya anladığımdan pek emin değilim. Velocity'nin şablonları önbelleğe alma seçeneği vardır, yani ayrıştırıldıkları soyut söz dizimi ağacı her seferinde diskten okunmak yerine önbelleğe alınacaktır. Her iki durumda da (ve bunun için sağlam sayılara sahip değilim), Velocity bana her zaman hızlı geldi .

Düzeni yeniden düzenleme - içerik haritasını menünün üstüne veya oturum açma kutusunu başka bir yan panelin üzerine taşımak istiyorsanız. Sayfa eklemeleri (jsp ile) iyi organize edilmemişse, bu gibi durumlarda her sayfayı değiştirmeniz gerekebilir. Ancak düzeniniz aşırı derecede karmaşık değilse ve ortak şeyleri üstbilgi / altbilgiye koyarsanız, endişelenecek bir şey yoktur.

Aradaki fark, JSP yaklaşımıyla, aynı üstbilgi / altbilgiyi kullanan her JSP dosyasında bu düzeni yeniden organize etmez miydiniz? Döşemeler ve SiteMesh, istediğinizi belirleyebileceğiniz ve ardından ana içerik için bir "içerik" parçasına / şablonuna yetki verebileceğiniz bir temel düzen sayfası (JSP, Hız şablonu vb. - her ikisi de JSP çerçeveleridir) belirlemenize olanak tanır . Bu, başlığı taşımak için yalnızca bir dosya olacağı anlamına gelir.


3
Verdiğiniz hız örnekleri JSTL ile kolaylıkla yapılabilir. verimlilik noktası ile jsps'nin sunucu uygulamalarına derlendiğini ve hiçbir şeyin çözümlenmediğini kastediyorum. Ancak şablonları önbelleğe almak da iyi bir çözüm, evet. yeniden düzenlemeye gelince - hayır, genellikle "dahil edenleri" değil, yalnızca kapsamları değiştirmek zorunda olduğum bir şekilde kapsamları oluştururum. Belki daha karmaşık durumlarda bu mümkün değildir.
Bozho

2
Şablonları web bağlamı dışında yeniden kullanmanın yanı sıra, Velocity, müşteriye gösterilmeden önce işlenmiş web sayfasını kolayca almanızı sağlar. Sitenizin HTML dosyaları olarak oluşturulmasını istediğinizde kullanışlıdır. JSP ile - kolay çözüm yok. JSP'den Velocity'e geçmemizin birincil nedeni buydu. Hız hakkında - Bazı kıyaslamalar yaptım ve Velocity, sayfaları JSP'den tam olarak 2 kat daha hızlı işliyordu. Yani hız sorun değil. Şimdi Velocity ile birkaç yıl geçirdikten sonra bir daha asla JSP'ye geri dönmeyeceğim. Çok daha basit, daha hafif ve daha temiz.
serg

@ serg555 herhangi bir yerde yayınlanan ölçütleriniz var mı? Bununla ilgili daha fazla veri görmek isterim. Ben de kıyaslamayı nasıl yaptığınızı görmek isterim. Sanırım bu aynı "Velocity vs JSP vs diğer motorlar" sorusunu düşünen diğerleri için iyi bir bilgi olacaktır.
matt b

Sonuçları göndermedim. Sadece sitemizden birkaç sayfayı dönüştürdüm ve öncesi ve sonrası oluşturma süresini ölçtüm. Hiçbir şey bilimsel değil :)
serg

@ serg555 jsp'nin platformu / servlet kapsayıcısı / sürümü neydi?
Bozho

12

Seçim arasında jsp:includeve Fayans / Sitemesh / vs arasındaki seçimdir kolayca ve güçlü geliştiricilerin her zaman karşı karşıya kaldığı. Elbette, yalnızca birkaç dosyanız varsa veya mizanpajınızın çok sık değişmesini beklemiyorsanız, o zaman jstlve kullanın jsp:include.

Ama uygulamalar aşamalı olarak büyüyen bir yolu var ve haklı zor olabilir "biz daha kolay gelecek sorunları gidermek böylece durdurma yeni bir gelişme ve güçlendirme fayans (veya başka bir çözüm)" Bir kullanmıyorsanız gerekli olan, Başlangıçta karmaşık çözüm.

Uygulamanızın her zaman basit kalacağından eminseniz veya daha karmaşık çözümlerden birini entegre edeceğiniz bazı uygulama karmaşıklığı ölçütleri belirleyebilirseniz, o zaman fayans / vb. Kullanmamanızı öneririm. Aksi takdirde, en baştan kullanın.


5

Sizi diğer teknolojileri kullanmaya ikna etmeyeceğim. Bildiğim kadarıyla herkes işine yarıyorsa JSP'ye bağlı kalmalı.

Esas olarak Spring MVC ile çalışıyorum ve SiteMesh ile birlikte JSP 2+ ile mükemmel bir eşleşme buluyorum .

SiteMesh 2/3

Diğer şablonlama motorlarındaki kalıtım çalışmaları gibi, dekoratörlerin görünümlere uygulanmasını sağlayın. Günümüzde böyle bir özelliğin çalışması düşünülemez.

JSP 2+

JSP'nin şablonlarda Java kodundan kaçınmayı zorlaştıracağını iddia eden insanlar sahtedir. Bunu yapmamalısın ve bu sürümle bunu yapmak gereksiz. Sürüm 2, önceki sürümlere kıyasla büyük bir avantaj olan EL kullanarak arama yöntemlerini destekler.

JSTL etiketleri ile kodunuz yine de HTML gibi görünecektir, bu nedenle daha az garip olacaktır. Yay, çok güçlü olan taglibs aracılığıyla JSP için çok fazla destek sağlar.

Taglib'lerin genişletilmesi de kolaydır, bu nedenle kendi ortamınızı özelleştirmek çocuk oyuncağıdır.


SiteMesh'e bir fayda görmüyorum. Jsp etiketleri, SiteMesh ile aynı dekorasyon işlevini sunar, ancak daha fazla esneklik, daha az kırılgan kurulum ve hiçbir işlem sonrası ayrıştırma dahil olmadığından daha fazla verimlilik de tahmin ediyorum.
Magnus

2

JSP kullanımına karşıt yüzler için en iyi argümanlardan biri (listenizde değil, ancak bundan bahsedeceğim), derlemenin JSP derleyicisine devredilmek yerine yorumlayıcıyla entegre olmasıdır. Bu, JSF 1.1 ile sahip olduğum en can sıkıcı şeylerden birinin - çalışma zamanı motorunun değişikliği keşfetmesi için bir değişikliği kaydederken çevreleyen bir JSF etiketindeki id özniteliğini değiştirmek zorunda kaldığım - ortadan kalktı ve tasarruf sağladı. düzenleyici, tarayıcıda yeniden yükleme döngüsü ve çok daha iyi hata mesajları.


Evet, MTU facelets içindir sırf tercüman ile sıkı entegrasyon çözümü. Ama burada durum böyle değil :)
Bozho

Bunlardan herhangi birinin aynı özelliğe sahip olması durumunda bahsetmiştim - bu benim için belirleyici bir özellik olurdu.
Thorbjørn Ravn Andersen

2

İyi bir görünüm teknolojisi, çoğu ve çoğu rahatsız edici if / switch / conditional ifadesini ortadan kaldırır, basit include bunu yapmaz. 'Karmaşık' bir görünüm teknolojisinin kullanılması 'basit' bir uygulama ile sonuçlanır.


1

Belirli uygulamalarınız hakkında bilgi vermediniz. Örneğin, JSP'yi birkaç nedenden dolayı kullanmıyorum:

JSP şablonlarında Java kodunu kullanmaktan kaçınmak zordur, bu nedenle saf Görünüm kavramınızı kırarsınız ve sonuç olarak kodu görünüm ve denetleyici olarak birkaç yerde tutmakta zorluk yaşarsınız.

JSP, bir oturumu oluşturan JSP içeriğini otomatik olarak oluşturur. Bundan kaçınmak isteyebilirim, ancak uygulamalarınız her zaman oturum kullanıyorsa sizin için bir sorun olmayabilir.

JSP, derleme gerektirir ve hedef sistemde Java derleyicisi yoksa, herhangi bir küçük ince ayar başka bir sistemi kullanmayı ve ardından yeniden konuşlandırmayı gerektirir.

Minimal JSP motoru yaklaşık 500k bayt kodu artı JSTL'dir, bu nedenle gömülü sistemler için uygun olmayabilir

Şablon motoru, JSON yükü, web sayfası, e-posta gövdesi, CSV gibi aynı modelin farklı içerik türünü oluşturabilir.

Java dışı programcılar, teknik bilgisi olmayan kişiler normal şablonları değiştirmekte hiçbir zaman zorluk yaşamadıklarında, JSP şablonlarıyla çalışırken zorluk yaşayabilir.

Uzun zaman önce aynı soruyu soruyordum ve diğer çözümlerde gördüğüm tüm dezavantajlardan arınmış çerçevemi (kesinlikle şablon motoru tabanlı) yazarak bitirdim. Söylemeye gerek yok, yaklaşık 100k bayt kodu.


0

Bunun akıllıca bir cevap olarak ortaya çıktığının farkındayım, ama gerçek şu ki, mevcut projenizde kod yerine şablonlama kullanmanın bir avantajı görmüyorsanız, bunun nedeni muhtemelen mevcut projenizde bir tane olmamasıdır. .

Bunun bir kısmı ölçekle ilgili. İçermelerin her parçasının sitemesh diyelim kadar güçlü olduğunu düşünebilirsiniz ve bu kesinlikle doğru, en azından az sayıda sayfa için (muhtemelen yaklaşık 100 diyebilirim), ancak birkaç bininiz varsa yönetilemez olmaya başlar. (Yani eBay için gerekli değil, Salesforce için muhtemelen öyledir)

Ayrıca, daha önce bahsedildiği gibi, serbest işaret ve hız, sunucu uygulamasına özgü değildir. bunları herhangi bir şey için kullanabilirsiniz (posta şablonları, çevrimdışı belgeler vb.). Freemarker veya velocity kullanmak için Servlet kabına ihtiyacınız yoktur.

Son olarak, 5 puanınız sadece kısmen doğrudur. Henüz erişilmemişse, her erişildiğinde derlenir. Bu, bir şeyi her değiştirdiğinizde, JSP'yi yeniden derlemek için sunucu uygulaması kapsayıcılarının "çalışma" dizinini silmeyi hatırlamanız gerektiği anlamına gelir. Şablon motoruyla bu gereksizdir.

TL; DR Templaing motorları, JSP + JSTL'nin bazı (algılanan veya gerçek) eksikliklerini gidermek için yazılmıştır. Bunları kullanıp kullanmamanız tamamen gereksinimlerinize ve projenizin ölçeğine bağlıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.