下面是一些常用的鏈接,供大家使用:
GIT地址(必須是OSC家的):https://git.oschina.net/tinyframework/tiny
問題報告:https://git.oschina.net/tinyframework/tiny/issues
官方網站:http://www.tinygroup.org
更多內容,請看本人博客,不一樣的內容,一樣的精彩!
本來想改改OSChina的界面,但是研究了一下,OSChina界面實在是高大上呀,不是做不出來,只是工作量比較大,因此還是做個簡單的網站來展示一下用Tiny開發界面的過程,同時在展示過程的同時,會把相關的知識做一個充分的介紹 。
一、尋找網站模板
要做網站,不能沒有模板,自己不會做網頁設計,咋辦?問谷歌找百度唄,找了一陣,看到下面這個模板不錯,就它了。
http://www.tooplate.com/zip_files/2042_the_block.zip
相仔細了解這篇文章的同學,建議把原板的下載下來,對比著看,會更有感覺。
二、開工制作
1.編寫default.layout布局文件
位置:/default.layout
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2<html xmlns="http://www.w3.org/1999/xhtml">
3<head>
4<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5<title>演示網站-${pageTitle}</title>
6<meta name="keywords" content="" />
7<meta name="description" content="" />
8<script src="${TINY_CONTEXT_PATH}/uiengine.uijs"></script>
9<link href="${TINY_CONTEXT_PATH}/uiengine.uicss" rel="stylesheet" />
10</head>
11<body>
12${pageContent}
13</body>
14</html>
這個是標準布局了,直接貼過來,唯一要改的就是標題處加了“演示網站-”開頭。
里面引入的js和css是TinyUI引擎所獨有的,主要處理JS,CSS順序處理、合并、打包等相關,由于這個是框架內部實現的部分,這里只是使用就不展開來敘述了。
${pageContent} 這個標記了渲染替換的位置,一個layout文檔中必須有且只能有一個(如果沒有,你會發現不管怎么寫頁面,內容都是布局的內容;如果有多個,你會發現頁面中的內容會加多次)。
2.編寫UI組件定義文件
位置:/demosite.ui.xml
1<ui-components>
2
3<ui-component name="demosite" dependencies="">
4
5<css-resource>/css/jquery.lightbox-0.5.css,/css/slider_style.css,/css/tooplate_style.css</css-resource>
6
7<js-resource>/js/jquery.js,/js/jquery.lightbox-0.5.js,/js/swfobject.js</js-resource>
8
9</ui-component>
10
11</ui-components>
3.編寫通用宏定義
位置:/common.component
1#macro a(title url)
2
3<a href="#link(url)">${title}</a>
4
5#end
6
7![]()
8
9#macro img(url alt)
10
11<img src=#link(url) alt="${alt}">
12
13#end
14
15![]()
16
17#macro link(url)#if(url.startsWith("/"))${TINY_CONTEXT_PATH}#end${url}#end
18
19![]()
20
21#macro pageTitle(title page)
22
23#!set(pageTitle=title)
24
25#!set(activePage=page)
26
27#end
4.編寫業務宏
位置:/demosite.component
5.定義演示網站布局文件
分析一下幾個頁面,都有頁頭,頁腳,菜單,因此可以把這些共性的文件放在演示網站布局文件中:
位置:/page/default.layout
1#@tooplateWrapper()
2
3#@header()
4
5#siteTitle("The Block")
6
7#@menu()
8
9#menuItem("index.page" "Home" "Home")
10
11#menuItem("about.page" "About Us" "About")
12
13#menuItem("blog.page" "Blog" "Blog")
14
15#menuItem("gallery.page" "Gallery" "Gallery")
16
17#menuItem("contact.page" "Contact" "Contact")
18
19#end
20
21#end
22
23![]()
24
25${pageContent}
26
27![]()
28
29#@tooplateFooter()
30
31Copyright © 2048 <a href="#">Company Name</a> - Design: <a href="http://www.tooplate.com">tooplate</a>
32
33![]()
34
35#end
36
37![]()
38
39#end
40
41<script type="text/javascript">
42
43$('#gallery a').lightBox();
44
45</script>
46
47<script type="text/javascript">
48
49$('#map a').lightBox();
50
51</script>
上面代碼的函義是:
在整個頁面中,上面放置Header,下面旋轉Footer,中間放置內容
最后兩段js,是說:對某指定選擇器中的圖片用lightbox去進行處理。
這里就把所有的通用的部分都抽取到布局文件中了。
6.定義相關頁面
首頁:
1#pageTitle("Home" "Home")
2
3![]()
4
5#@tooplateMiddle()
6
7#flashGridSlider()
8
9#end
10
11![]()
12
13#@tooplateContent()
14
15![]()
16
17<h2>Welcome To The Block!</h2>
18
19![]()
20
21<div class="image_wrapper image_fl"><span></span>
22
23#img("/images/tooplate_image_01.jpg" "image")
24
25</div>
26
27<p><em>The Block is a <a rel="nofollow" href="http://www.tooplate.com">free website template</a> from <a
28
29rel="nofollow" href="http://www.tooplate.com">Tooplate</a>. Credit goes to <a rel="nofollow"
30
31href="http://www.photovaco.com">Free
32
33Photos</a> for photos used in this template.</em></p>
34
35![]()
36
37<p align="justify">Aliquam et augue et odio luctus posuere sit amet et nisi. Maecenas convallis, est sit amet
38
39convallis consectetur, elementum lacus, ut fermentum elit sem. Duis eu elit tortor, sed condimentum nulla.
40
41Phasellus varius posuere adipiscing. Mauris sodales dictum ullamcorper. Validate <a
42
43href="http://validator.w3.org/check?uri=referer" rel="nofollow"><strong>XHTML</strong></a> and <a
44
45href="http://jigsaw.w3.org/css-validator/check/referer" rel="nofollow"><strong>CSS</strong></a>.</p>
46
47![]()
48
49<div class="cleaner h40"></div>
50
51#@box220()
52
53<h4>pharetra id turpis<span>Lorem Ipsum Dolor</span></h4>
54
55![]()
56
57<p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus porta adi Piscing libero, eget elem
58
59ntum lectus varius sed.</p>
60
61<a href="#" class="more">more</a>
62
63#end
64
65#@box220()
66
67<h4>semper nisl ac nibh<span>Donec Tincidunt Varius</span></h4>
68
69![]()
70
71<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum
72
73eu mauris id neque porttitor.</p>
74
75<a href="#" class="more">more</a>
76
77#end
78
79#@box220("rmb")
80
81<h4>consect adipiscing elit<span>Etiam Gravida Sagittis</span></h4>
82
83![]()
84
85<p>Cras eu egestas sem. Aenean mollis feugiat massa, eget pharetra nunc interdum non. Etiam euismod sem ac
86
87sem tincidunt adipiscin.</p>
88
89<a href="#" class="more">more</a>
90
91#end
92
93#end
關于:
#pageTitle("About" "About")
![]()
![]()
#@tooplateMiddleSub()
<h2>About Our Company</h2>
<p>Sed tempus nunc dolor, sit amet aliquet ligula. Ut euismod lectus vel ligula euismod id porttitor tortor placerat. Aenean tincidunt magna sit amet turpis auctor sagittis. Phasellus aliquet augue nec elit lacinia et faucibus massa scelerisque.</p>
#end
![]()
#@tooplateContent()
<h2>Our Company Objectives</h2>
<div class="image_wrapper image_fr"><span></span>
#img("/images/tooplate_image_01.jpg" "image")
</div>
<p><em>Morbi congue lorem sit amet odio iaculis tincidunt. Donec nibh, molestie nec pellentesque non, in diam. Class aptent taciti sociosqu ad litora torquent per conubia nostra.</em></p>
<p>Aliquam et augue et odio luctus posuere sit amet et nisi. Maecenas, est sit amet convallis consectetur, lacus ligula elementum lacus, ut fermentum elit sem et nisi. Duis eu elit tortor, sed condimentum nulla. Phasellus varius posuere adipiscing. Mauris sodales ullamcorper. Validate <a href="http://validator.w3.org/check?uri=referer" rel="nofollow"><strong>XHTML</strong></a> and <a href="http://jigsaw.w3.org/css-validator/check/referer" rel="nofollow"><strong>CSS</strong></a>.</p>
<div class="cleaner h40"></div>
#@box330("float_l")
<h4>what our customers say<span>Testimonial</span></h4>
<blockquote>
<p>Fusce nec felis id lacus sollicitudin vulputate. Sed vitae elit at diam vestibulum ullamcorper et nec quam. Aenean eit ut luctus sit amet, elementum quis enim. Proin tincidunt, arcu id pellentesque accumsan, neque dolor imperdiet ligula, quis viverra tellus nulla a odio. Curabitur vitae enim risus, at placerat turpis. Mauris feugiat suscipit tempus fringilla, felis in velit.</p>
![]()
<cite>Harry - <span>Senior Webmaster</span></cite>
</blockquote>
<a href="#" class="more">more</a>
#end
#@box330("float_r")
<h4>what we do<span>Services</span></h4>
<p> Lorem ipsum dolor sit amet, consectetur adipiscing elit eget elementum lectus varius sed.</p>
<ul class="tooplate_list">
<li>Morbi quis lorem risus</li>
<li>Suspendisse cursus</li>
<li>Donec at viverra</li>
<li>Proin eget purus ante</li>
</ul>
<a href="#" class="more">more</a>
#end
#end
日志:
1#pageTitle("Blog" "Blog")
2
3![]()
4
5![]()
6
7#@tooplateMiddleSub()
8
9<h2>Our Blog Posts</h2>
10
11<p>Vestibulum eleifend consequat laoreet. Pellentesque vel orci sapien. Duis lacus ipsum, pretium ut accumsan in, tempor
12
13nec mauris. Aenean accumsan placerat elit, sit amet faucibus ante commodo a. In et neque nibh, ac tristique
14
15dui. </p>
16
17#end
18
19![]()
20
21#@tooplateContent()
22
23#@postBos("20" "Lorem ipsum dolor sit amet" "/images/tooplate_image_02.jpg" "Image 02" ["Templates","Freebie"] "148")
24
25![]()
26
27<p>Vestibulum adipiscing tempus elit eu condimentum. Fusce at mi felis. Etiam sed velit nibh. Nunc bibendum
28
29justo elementum auctor. Donec at magna eu neque. Vestibulum ante ipsum primis in faucibus orci luctus et
30
31ultrices posuere cubilia. </p>
32
33#end
34
35![]()
36
37#@postBos("17" "Etiam gravida sagittis lacus" "/images/tooplate_image_03.jpg" "Image 03" ["CSS Templates","Web Design"] "128")
38
39![]()
40
41<p>Ellentesque vitae velit eu lectus rhoncus tincidunt. Phasellus dictum dignissim sapien et dapibus. Sed
42
43egestas consequat mauris, orci tincidunt sit amet. Donec pharetra porta ultrices. Sed sit amet lectus
44
45libero, at porttitor odio. Validate <a href="http://validator.w3.org/check?uri=referer"
46
47rel="nofollow"><strong>XHTML</strong></a> and <a
48
49href="http://jigsaw.w3.org/css-validator/check/referer" rel="nofollow"><strong>CSS</strong></a>.</p>
50
51#end
52
53![]()
54
55#@postBos("10" "Aenean vitae velit eget" "/images/tooplate_image_04.jpg" "Image 04" ["Illustrations","Graphics"] "208")
56
57![]()
58
59<p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin gravida
60
61ornare mauris ac lobortis. Praesent elit neque, lacinia eget interdum eu. Phasellus posuere nisl et odio
62
63egestas ac tristique justo ultrices. </p>
64
65#end
66
67#end
1#pageTitle("Gallery" "Gallery")
2
3![]()
4
5#@tooplateMiddleSub()
6
7<h2>Our Gallery</h2>
8
9<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus porta adipiscing libero, eget elementum lectus
10
11varius sed. Aliquam metus urna, dignissim quis posuere at, posuere eget mauris. Vestibulum laoreet sodales tellus
12
13nec mollis. Validate <a href="http://validator.w3.org/check?uri=referer" rel="nofollow"><strong>XHTML</strong></a>
14
15and <a href="http://jigsaw.w3.org/css-validator/check/referer" rel="nofollow"><strong>CSS</strong></a>.</p>
16
17#end
18
19![]()
20
21#@tooplateContent()
22
23#@gallery()
24
25#galleryBox("/images/gallery/image_01_l.jpg" "/images/gallery/image_01_s.jpg" "Nunc et tellus id risus ultrices" "Image 01" "Nunc et tellus id risus ultrices")
26
27#galleryBox("/images/gallery/image_02_l.jpg" "/images/gallery/image_02_s.jpg" "Nunc et tellus id risus ultrices" "Image 02" "Nunc et tellus id risus ultrices")
28
29#galleryBox("/images/gallery/image_03_l.jpg" "/images/gallery/image_03_s.jpg" "Nunc et tellus id risus ultrices" "Image 03" "Nunc et tellus id risus ultrices" "gb_rmb")
30
31#galleryBox("/images/gallery/image_04_l.jpg" "/images/gallery/image_04_s.jpg" "Nunc et tellus id risus ultrices" "Image 04" "Nunc et tellus id risus ultrices")
32
33#galleryBox("/images/gallery/image_05_l.jpg" "/images/gallery/image_05_s.jpg" "Nunc et tellus id risus ultrices" "Image 05" "Nunc et tellus id risus ultrices")
34
35#galleryBox("/images/gallery/image_06_l.jpg" "/images/gallery/image_06_s.jpg" "Nunc et tellus id risus ultrices" "Image 06" "Nunc et tellus id risus ultrices" "gb_rmb")
36
37#end
38
39#end
首頁
關于
日志
畫廊
聯系我們
四、總結
上面的完整示例展現了采用Tiny框架開發頁面的完整過程,下面總結一下需要說明的一些內容:
- 上面展示采用的模板引擎是TinyTemplate,當然也支持Velocity,但是推薦使用TinyTemplate,因為執行速度更快、功能更強、更容易使用
- 布局支持多重嵌套,上面的示例中有兩層布局,根上的解決js、css引入,標題,網站圖標等部分的內容,/page/目錄中的解決網站的整體結構部分的內容,隨著網站的復雜,可以做更多層的布局,使得很多頁面共用的部分都放在布局文件中
- xxx.ui.xml定義了UI組件包的內容及其依賴關系,UI引擎會自動根據ui組件包的定義對js及css進行引入、整合、壓縮。
- 整個頁面只引入一個css和一個js文件,避免引入文件數太多導致的性能下降,同時提供了壓縮,提升網絡傳輸效率(這個例子中的文件都已壓縮,因此壓縮率不高)。
- page文件是用來編寫展示內容的頁面,在顯示.page文件時,有兩種方式,一種是.pagelet方式,一種是.page方式,區別在于用.page方式訪問時,會渲染布局,而pagelet方式不會渲染布局,適合于Ajax方式使用。
- 整個網站在重構完成之后,沒有一段內容是重復的,真正做到Tiny框架所說的DRY原則。
- 所有對上層布局文件的修改都會對所有下層頁面產生影響,真正做到Tiny框架所說的下級服從上級原則。
- 越到底層的開發人員接觸的越少,真正的頁面編寫文件,只需要從控制層轉過來的數據再利用宏去顯示內容即可,可以避免接觸js,css,html等相關內容。(這一點在示例中還沒有做到,畢竟示例是一個靜態網站),真正做到Tiny框架所說的減法原則,越到下面會的技能越少。
- 實際上框架也支持某個頁面不服從上層布局的限制,但是我們不推薦這么做,因此這里沒有展示這種用法。
采用Tiny框架制作前臺,需要考慮好如下角色的協作:
- 美工:用于進行界面設計,頁面切分
- UI組件包開發工程師:根據功能特性,把具有不同功能特性的js,css,image等放在一個jar包中 ,并編寫對應的xxx.ui.xml文件,并設定好依賴關系,如果需要還需要編寫公共的宏文件,用于方便別人使用,并隔離功能與具體的實現,使得后續的開發工程師盡量少的接觸css,js。
- 業務組件開發工程師:根據功能特性,把頁面中的一些比較業務化的,封裝成業務組件,最終暴露的接口是一個名字及一些數據的輸入,使得最終的界面開發工程師盡可能少的接觸原生的html。
- 界面開發工程師:不關心界面展現的具體技術,利用UI組件包及業務組件開發工程師開發的組件,再加上控制層傳過來的數據來編寫最終的展現頁面。
通過上面的分工,使得不同的開發人員關注于不同的技術細節,從而最大化的提升最終界面開發工程師的開發效率,同時因為有了一定的封裝性,可以使得底層的變化不致于影響上層開發人員的工作成果。
歡迎訪問框架論壇:http://web.j2ee.top。本例涉及的代碼和框架資料,將會在論壇分享。《自己動手寫框架》成員QQ群:228977971,讓我們一起動手,了解框架的奧秘!