Creating a Roller theme from scratch using Apache Roller 4.0

Exclusive offer: get 50% off this eBook here
Apache Roller 4.0 – Beginner's Guide

Apache Roller 4.0 – Beginner's Guide — Save 50%

A comprehensive, step-by-step guide on how to set up, customize, and market your blog using Apache Roller

£16.99    £8.50
by Alfonso V. Romero | December 2009 | Beginner's Guides Content Management Java Open Source

In this article by Alfonso V. Romero, you'll learn to build a theme from the ground up, using several templates properties, and methods commonly used in Roller themes.

To learn more about some of the properties and templates used in Roller themes read Working with Templates in Apache Roller 4.0.

Creating a Roller theme from scratch

Now things are going to get a little rough; just kidding! In Apache Roller, it's very easy to create your own themes, and in this section I'm going to show you how.

For the following exercises, you'll need to download http://www.packtpub.com/files/code/9508_Code.zip. Extract the chapter07.zip file's contents into a directory in your hard disk. For example, I used Ubuntu Linux in the exercises, created a chapter07 directory inside my Desktop directory, and copied the mytheme directory inside Desktop/chapter07. All the steps in the exercises are based on these assumptions.

Creating a directory for your theme

Every Roller theme has a directory and some required files such as weblog.vm, _day.vm, and theme.xml. The next exercise will show you how to create a directory for your new theme inside Roller's themes directory, and how to copy these required files from the support files.

Time for action – creating a directory for your theme

Now, I'll show you all the necessary steps to create your new theme directory inside Roller's themes directory in a Linux Ubuntu system, and then copy all the required files. If you're using Windows or any other flavor of Linux, the procedure is very similar:

  1. Go to your Roller themes directory and create a directory named mytheme:

    Apache Roller 4.0 – Beginner's Guide

  2. Open a terminal window, go to the themes subdirectory inside Desktop/chapter07, and type sudo cp * /usr/local/tomcat/webapps/roller/ themes/mytheme to copy all the mytheme files to your Roller installation:

    Apache Roller 4.0 – Beginner's Guide

  3. In the end, your mytheme directory will have four files, as shown in the following screenshot:

    Apache Roller 4.0 – Beginner's Guide

  4. Now restart Tomcat and wait until it's running again. Then open your web browser, log into Roller, and go to the Design tab to see the Weblog Theme page:

    Apache Roller 4.0 – Beginner's Guide

  5. Click on the Shared Theme option and select My First Roller Theme from the drop-down listbox:

    Apache Roller 4.0 – Beginner's Guide

  6. Click on the Update Theme button to change your current Roller theme, and then click on the See how your blog will look with this theme link:

    Apache Roller 4.0 – Beginner's Guide

  7. Roller will open a new web browser tab to show you a preview of the new theme you selected:

    Apache Roller 4.0 – Beginner's Guide

  8. Close the preview tab and leave the Front Page: Weblog Theme page open for the next exercise.

What just happened?

As you can see from the previous exercise, the mytheme theme has a very basic functionality. That's because the CSS stylesheet (mystylesheet.css) is empty, so I'm going to show you how to add styles to your headings, links, and all the other elements displayed in your weblog. However, first we need to see a quick introduction to the four files that every Roller theme must have in order to run without any trouble:

File

Definition

Tip

weblog.vm

Describes the main page of your weblog

In this file you set the structure for your weblog, using macros and elements from Roller and the Velocity template language.

_day.vm

Describes how to display one day's worth of entries in your weblog

Here you can configure how to display each entry's title, content and comments, for example. You can set the font's color and size of each element, based on the CSS stylesheet definitions.

mystylesheet.css

Stylesheet override file that defines the CSS style code used by your weblog

Here you define all your weblog's styles, like size and color for headings and fonts used in your posts.

theme.xml

Theme definition file that describes each file used in your weblog

You need to include some basic data about your theme, the stylesheet file, the weblog and _day templates, and every other file and/or resource used in your weblog.

In the next exercises, you'll learn how to edit these files to change your weblog's visual appearance and suit your needs.

The stylesheet override file

The first thing we need to do in order to change your new theme's visual appearance is edit the stylesheet override file: mystylesheet.css. We can do this in two ways: Edit the file directly from the mytheme directory inside Roller's themes directory, or use Roller's Custom Theme feature. If we use the first option, we'll need to restart Tomcat every time we make a modification to mystylesheet.css. On the other hand, if we choose the second option, we can edit the stylesheet inside Roller's admin interface and see how our changes affect our weblog's visual appearance immediately, so I'm going to show you how to use the second option.

Time for action – editing the stylesheet override file

It's very easy to edit the stylesheet override file for your custom theme inside Roller, and the next exercise will show you how to do it:

  1. Go to the Front Page: Weblog Theme tab in your web browser, select the Custom Theme option, click on the I want to copy the templates from an existing theme into my weblog checkbox, and click on the Update Theme button:

    Apache Roller 4.0 – Beginner's Guide

  2. Roller will show you the following success message:

    Apache Roller 4.0 – Beginner's Guide

  3. Now click on the Templates link to see a list of the templates you currently have in your custom space:
  4. Looking at the template list in the previous screenshot, there are some templates from the other custom theme which we need to remove. Click on the Remove link of the custom.css, mytemplate, and _css templates to delete them from your custom space, as we won't need them, and they don't belong to mytheme.
  5. After removing all the unneeded files, there should be only two templates inyour list:

    Apache Roller 4.0 – Beginner's Guide

  6. Now click on the Stylesheet link to see and start editing your mystylesheet.css file's code:

    Apache Roller 4.0 – Beginner's Guide

  7. As you can see, your custom stylesheet is empty. If you click on the Front Page link in Roller's menu bar, you'll see your weblog's current front page:

    Apache Roller 4.0 – Beginner's Guide

  8. Now click on your web browser's Back button to return to the stylesheet editing page, and add the following code to your custom stylesheet:
    div.dayTitle {
    color:brown;
    font-weight:bold;
    font-size:90%;
    text-transform:uppercase;
    border-bottom:1px dotted #666;
    }
    .entryTitle {
    font-weight: bold;
    }

  9. Your stylesheet should now contain the line beginning with /*, along with the code you've just entered:

    Apache Roller 4.0 – Beginner's Guide

  10. Click on the Save button to apply the changes to your stylesheet, and then select the Front Page link to see how the code you entered affects your weblog's visual appearance:

    Apache Roller 4.0 – Beginner's Guide

  11. If you compare the previous screenshot with the one from step 7, you'll see that the code you entered into the override stylesheet changed the way your weblog displays the day and entry titles. Now click on the Back button of your web browser to return to the stylesheet editing page, and add the following lines of code above the lines you entered in step 8:
    a {
    text-decoration: none;
    }
    a:link {
    color: blue;
    font-weight: medium;
    }
    a:visited {
    color: purple;
    font-weight: medium;
    }
    a:hover {
    text-decoration: underline overline;
    }
    body {
    font-family:"Lucida Grande", lucida, Geneva, Arial,
    sans-serif;
    background:#FFFFCC;
    }
  12. Your stylesheet should now look like this:

    Apache Roller 4.0 – Beginner's Guide

  13. Click on the Save button and then select the Front Page link to see your weblog's front page:

    Apache Roller 4.0 – Beginner's Guide

  14. Click on the Back button to return to your stylesheet editing page.
Apache Roller 4.0 – Beginner's Guide A comprehensive, step-by-step guide on how to set up, customize, and market your blog using Apache Roller
Published: December 2009
eBook Price: £16.99
Book Price: £27.99
See more
Select your format and quantity:

What just happened?

In the previous exercise, you edited your stylesheet override file (mystylesheet.css) to change your weblog's visual appearance. To understand what these code segments do, let's take a look at the _day template's code:

<div class="dayBox">
<div class="dayTitle">
$utils.formatDate($day, "EEEE MMM dd, yyyy")
</div>
#foreach( $entry in $entries )
<div class="entryBox">
<p class="entryTitle">$entry.title</p>
<p class="entryContent">
#if($model.permalink)
$entry.displayContent
#else
$entry.displayContent($url.entry($entry.anchor))
#end
</p>
<p class="entryInfo">
Posted at
<a href="$url.entry($entry.anchor)">$utils.formatDate
($entry.pubTime, "hh:mma MMM dd, yyyy")</a>
by $entry.creator.userName in <span
class="category">$entry.category.name</span>
&nbsp;|&nbsp;
#if ($utils.isUserAuthorizedToAuthor($entry.website))
<a href="$url.editEntry($entry.anchor)">Edit</a>
&nbsp;|&nbsp;
#end
#if($entry.commentsStillAllowed || $entry.commentCount >
0)
#set($link = "$url.comments($entry.anchor)" )
<a href="$link"
class="commentsLink">Comments[$entry.commentCount]
</a>
#end
</p>
</div>
#end
</div>

The lines in bold are the ones directly involved with the CSS code you entered in the exercise:

<div class="dayTitle">
$utils.formatDate($day, "EEEE MMM dd, yyyy")
</div>

The div element represents a "division" or a section in a web page. The only code inside this division is $utils.formatDate($day, "EEEE MMM dd, yyyy"). This is a property from the $utils object used to show the date and time of each day containing one or more posts in the weblog, in the format specified by the "EEEE MMM dd, yyyy" string.

The class="dayTitle" code segment indicates that this division will use the styles defined in the .dayTitle class from the stylesheet:

div.dayTitle {
color:brown;
font-weight:bold;
font-size:90%;
text-transform:uppercase;
border-bottom:1px dotted #666;
}

This CSS code indicates that every text element inside this division will be shown in brown color, in bold style, with a smaller size (90%) than the other fonts outside the division, and the text will be converted to uppercase. The last CSS element indicates that there will be a one pixel-wide, dotted grey border at the bottom of each text element (#666 is a hexadecimal color code).

All this stuff means that each day in the weblog will be shown like this:

Apache Roller 4.0 – Beginner's Guide

Now, the next line in the _day template:

<p class="entryTitle">$entry.title</p>

The <p> HTML tag indicates a paragraph inside your web page, and $entry.title is the only code inside this paragraph. As we saw before, $entry.title shows the title of an entry in your weblog. The class="entryTitle" element is related to the .entryTitle code block in your stylesheet:

.entryTitle {
font-weight: bold;
}

This CSS code indicates that all the text inside the paragraph will be shown in bold. In this case, each entry's title of your weblog will be shown in bold:

Apache Roller 4.0 – Beginner's Guide

The rest of the bold lines in the _day template use an <a> element, known as an anchor in HTML. This element is used to display links in web pages, and is related to all the a elements in the stylesheet:

a {
text-decoration: none;
}
a:link {
color: blue;
font-weight: medium;
}
a:visited {
color: purple;
font-weight: medium;
}
a:hover {
text-decoration: underline overline;
}


These elements define how the links in your weblog will be displayed. The first block of code indicates that the links won't have a text decoration (that is, links won't be underlined, as in most web pages), the color of each link will be blue, the font weight will be medium, and the color of visited links will be purple. The last block of code indicates that, if someone positions the mouse cursor over a link, it will be underlined and overlined.

The following screenshot shows what happens when you put your mouse cursor over the date and time hyperlink created with the <a href="$url.entry($entry.anchor)">$utils.formatDate($entry.pubTime, "hh:mma MMM dd, yyyy")</a> line in the _day template:

Apache Roller 4.0 – Beginner's Guide

You can see the underline and overline effects from the a:hover CSS element, along with the purple color due to the a:visited CSS element.

The <a href="$url.editEntry($entry.anchor)">Edit</a>  |  line from the _day template has similar effects:

Apache Roller 4.0 – Beginner's Guide

The last block of code we used in the previous exercise is:

body {
font-family:"Lucida Grande", lucida, Geneva, Arial, sans-serif;
background:#FFFFCC;
}

In this case, the body CSS element defines the font used to display your weblog's data. There are several fonts included, to maximize browser compatibility. You can experiment with different fonts and font families to see how your changes affect your weblog's way of displaying data.

The weblog template: Your weblog's main page

Now that we've seen how to edit the mystylesheet.css stylesheet override file and how the _day.vm template uses CSS styles and Velocity code to display your weblog's data, it's time to see how the weblog.vm template works to show your weblog's main page.

Time for action – editing the weblog template

In this exercise, you'll learn how to edit the weblog.vm template in your Roller theme, to add a side bar and some other elements:

  1. Open your web browser and type http://yourhostname/roller/roller-ui/menu.rol to log into Roller. In my case, the complete URL is http://alromero.no-ip.org/roller/roller-ui/menu.rol:
  2. Apache Roller 4.0 – Beginner's Guide

  3. Once you're logged in, click on the Settings link in your weblog to go to the Weblog Settings page:
  4. Apachea Roller 4.0 – Beginner's Guide

  5. Once you're in the Weblog Settings page, click on the Design tab and then on the Stylesheet link to see your custom stylesheet code:

    Apache Roller 4.0 – Beginner's Guide

  6. Scroll down the stylesheet code window and add the following lines at the end:
    .rCategory li {
    font-size: 80%;
    display: inline;
    list-style-type: none;
    padding-right: 20px;
    }
    li.selected {
    font-weight: bold;
    }
  7. Click on the Save button and then select the Front Page link to see how this code affects your weblog's main page:

    Apache Roller 4.0 – Beginner's Guide

  8. Now click on your web browser's Back button to return to your stylesheet code, and add the following code at the end:
    .content_wrapper {
    width: 80%;
    float: right;
    }
    .content {
    padding: 0em 2em 2em 2em;
    }
    .sidebar_wrapper {
    width: 20%;
    float: left;
    }
  9. Click on the Save button and then on the Templates link to see the list of templates in your theme:

    Apache Roller 4.0 – Beginner's Guide

  10. Click on the Weblog link to edit your weblog.vm template code, and add the following lines right before the </html> tag:
    <div class="sidebar_wrapper">
    <h2>Search</h2>
    <div class="sidebar">
    #showWeblogSearchForm($model.weblog false)
    </div>
    </div>
  11. Now your weblog.vm template code should look like this:

    Apache Roller 4.0 – Beginner's Guide

  12. Click on the Save button and then select the Front Page link to see how the code you entered affects your weblog's main page:

    Apache Roller 4.0 – Beginner's Guide

  13. Now click on your web browser's Back button, and add the following code right before the last </div> tag:
    <h2>Links</h2>
    <div class="sidebar">
    #set($rootFolder = $model.weblog.getBookmarkFolder("/"))
    #showBookmarkLinksList($rootFolder false false)
    </div>
    <h2>Navigation</h2>
    <div class="sidebar">
    #showPageMenu($model.weblog)
    #showAuthorMenu(true)
    </div>

  14. Now your weblog.vm template code should look like this:

    Apache Roller 4.0 – Beginner's Guide

  15. Click on the Save button, and then on the Front Page link to see how the code you entered affects your weblog's main page:

    Apache Roller 4.0 – Beginner's Guide

  16. Click on your web browser's Back button to return to the weblog template editing page, select the Stylesheet link to go to your stylesheet code, replace the width: 80%; line that's right under .content_wrapper with {width: 79%; and add the following lines to the sidebar_wrapper block of code:
    font-size: 80%;
    border-right: 1px dotted #666;

  17. The following screenshot shows the line you have to modify, along with the two lines you have to add to the stylesheet file:

    Apache Roller 4.0 – Beginner's Guide

  18. Click on the Save button and then select the Front Page link to see the changes to the stylesheet code reflected in your weblog's main page:

What just happened?

In this exercise, you learned to manipulate some of the CSS styles for your weblog's main page, along with some Velocity properties, methods, and macros used in the weblog.vm template of your theme. In step 4, you added two blocks of CSS code to your stylesheet:

.rCategory li {
font-size: 80%;
display: inline;
list-style-type: none;
padding-right: 20px;
}
li.selected {
font-weight: bold;
}

The first block, .rCategory, is generated by the #showWeblogCategoryLinksList macro, that we used in the following block code, from the weblog.vm file:

<center>
#set($rootCategory = $model.weblog.getWeblogCategory("nil"))
#showWeblogCategoryLinksList($rootCategory false false)
</center>

The <center> and </center> HTML tags indicate that everything between them must be centered on the page. We already saw how the next two lines work: the first gets a list of categories from your weblog, and the second is a macro that generates the HTML code for displaying that list of categories in your weblog page. Before adding the .rCategory and li.selected blocks to your stylesheet, the list of categories is displayed as shown in the following screenshot:

Apache Roller 4.0 – Beginner's Guide

Now let's see what each element inside the .rCategory block does:

Element

What it does

font-size: 80%;

reduces the text's font size to an 80% of the original value

display: inline;

the list of categories is displayed inline (no line breaks before or after each category)

list-style-type: none;

There's no disc or any other marker shown before each category name

padding-right: 20px;

There's a 20 pixels-wide blank space to the right of each category name

The second block you added to the stylesheet, li.selected, has only one element:

Element

What it does

font-weight: bold;

The selected category will show up in bold text. The first time you open your weblog main page, the All category name is selected.

After adding the .rCategory and li.selected blocks to your stylesheet, the list of categories is displayed as shown in the following screenshot:

Apache Roller 4.0 – Beginner's Guide

In step 6, the .content_wrapper block of CSS code you added to your stylesheet affects everything between the <div class="content_wrapper"> element in the weblog.vm file, and its corresponding closing tag (/div). This block of code sets the width of your weblog's content to occupy only 80% of the whole page (width: 80%;) and makes it float to the right (float: right;).

The second block of CSS code, .content, affects everything between the <div class="content"> element in the weblog.vm file and its corresponding closing tag (/div). It creates a blank space between the top, bottom, right, and left borders (padding: 0em 2em 2em 2em;). 1em indicates a space equal to the current font (that is, if the current font size is 12pt, 1em = 12pt, and 2em = 24pt. 1pt is the same as 1/72 inch, for reference purposes).

The third block of CSS code, .sidebar_wrapper, affects everything between the <div class="sidebar_wrapper"> element in weblog.vm and its corresponding closing tag (). It sets the width of your weblog's sidebar to occupy only 20% of the whole page (width: 20%;), and makes it float to the left (float: left;).

Now, let's examine the weblog.vm template. The block of code you added in step 8 creates a Search field in your weblog's left sidebar via the #showWeblogSearchForm($model.weblog false) macro, as shown in the screenshot from step 10. The blocks of code that you added in step 11 adds the Links and Navigation sections to your weblog's left sidebar.

The Links section contains a list of bookmarks (blogroll) created with the #showBookmarkLinksList($rootFolder false false) macro. The Navigation section shows a page navigation menu created with #showPageMenu($model.weblog), which shows a list of all the pages in your weblog, and an authoring menu created with the #showAuthorMenu(true) macro, which shows links for editing and configuring your weblog if you're allowed to author it.

In step 14, you modified your content_wrapper section width, from 80% to 79%, in order to allow a one pixel-wide grey border on the sidebar_wrapper section (border-right: 1px dotted #666;), and reduced this section's font size to 80% (font-size: 80%;), in order to make the sidebar elements look less cluttered.

You can see the results of all these code modifications in step 16's screenshot.

Have a go hero – finishing your Roller theme

OK, you have seen some of the most widely used macros, properties, and methods for a Roller theme. I showed you how to use Roller's admin interface to edit your templates and your stylesheet override file, to avoid having to restart Tomcat every time you copy new files to your mytheme directory inside Roller's themes directory.

Now you need to save all the changes you've made to the stylesheet override file, mystylesheet.css, and to the weblog.vm file, to a safe location. In this case, you can copy those files back to the mytheme directory you extracted from the chapter07 support file. Use Roller's Stylesheet link to go to your stylesheet, copy all the code in it, and paste it in the mystylesheet.css file inside Desktop/chapter07/mytheme. Then do the same with the weblog.vm file that you modified inside Roller. This is the quickest way to make changes to a theme you're creating and then, when you're satisfied with it, copy all the code from the files inside Roller into a directory on the outside. Then you can compress your theme's directory and even share it with other Roller users!

Oh, and I almost forgot! There are zillions of Roller macros, properties, and methods you can use in your own themes that we didn't cover because of space restrictions. However, you can check out the Roller Template Guide and learn about all of the macros, objects, properties, and methods available. Experimenting is the key to learning, don't forget!

The last thing I want to talk about is the theme.xml file. This file must include the override stylesheet, the templates, and resources used in your Roller theme. It uses an XML language syntax, very similar to the HTML code we saw before. Take a look at the theme.xml file inside mytheme and you'll find the mystylesheet.css, weblog.vm, and _day.vm files we used in this article's exercises:

<?xml version="1.0" encoding="UTF-8"?>
<weblogtheme>
<id>mytheme</id>
<name>My First Roller Theme</name>
<author>Alfonso Romero</author>
<preview-image path="preview.jpg" />
<stylesheet>
<name>MyStylesheet</name>
<description>Stylesheet Override File</description>
<link>mystylesheet.css</link>
<templateLanguage>velocity</templateLanguage>
<contentsFile>mystylesheet.css</contentsFile>
</stylesheet>
<template action="weblog">
<name>Weblog</name>
<description>Main template of weblog</description>
<link>weblog</link>
<navbar>false</navbar>
<hidden>true</hidden>
<templateLanguage>velocity</templateLanguage>
<contentType>text/html</contentType>
<contentsFile>weblog.vm</contentsFile>
</template>
<template action="custom">
<name>_day</name>
<description>Displays one day of entries</description>
<link>_day</link>
<navbar>false</navbar>
<hidden>true</hidden>
<templateLanguage>velocity</templateLanguage>
<contentType>text/html</contentType>
<contentsFile>_day.vm</contentsFile>
</template>
</weblogtheme>

The <weblogtheme> XML tag represents the whole weblog theme. Inside this tag, you must include several elements:

  • A unique ID for your theme (id), that by convention must be the same as your theme's name
  • The name of your theme
  • The name of the author
  • The path of the preview-image
  • Information about the stylesheet override file
  • Information about the weblog template
  • Information about the _day template
  • Information about any other templates used in your weblog
  • Information about resources, such as images

You should take a snapshot of your working theme when you're satisfied with it, so go ahead, and include it in your mytheme directory. The snapshot file must be named preview.jpg, according to the theme.xml file.

If you're using Windows, you can press Alt + Prt Scr to capture the active window, then open MS Paint, and press Ctrl + V to paste the screenshot on the Paint window, then save the image. If you want to capture the whole screen, press Prt Scr without Alt.

If you're using Ubuntu Linux, you can also use Alt + Prt Scr (or just Prt Scr to capture the whole screen) and then paste the screenshot in your favorite paint program, such as the GIMP Image Editor.

In the chapter07 support file, I also included a directory called mytheme_final, where you'll find the weblog.vm and _day.vm files we saw in the previous exercises, along with the complete mystylesheet.css file and a preview.jpg image file. You can copy this theme to your Roller installation in the same way you did with the mytheme directory, to see the differences between them.

It would be a good idea to include the mytemplate.vm file that you created during the first exercises of this article in mytheme. Just remember to edit the theme.xml file and create a mytemplate.vm file inside your mytheme directory. Don't forget to restart Roller every time you make changes to the themes directory!

Now you can take a good look at all the other themes installed in your Roller weblog. Study them carefully, compare them to the mytheme templates and CSS stylesheet, and experiment all you can with Roller themes! If you have any questions, don't hesitate to send me an e-mail!

Summary

In this article, you learned how to create your first Roller theme from scratch and the basics about the theme.xml, weblog.vm, _day.vm, and stylesheet override files used inside a Roller theme.

Apache Roller 4.0 – Beginner's Guide A comprehensive, step-by-step guide on how to set up, customize, and market your blog using Apache Roller
Published: December 2009
eBook Price: £16.99
Book Price: £27.99
See more
Select your format and quantity:

About the Author :


Alfonso V. Romero

Alfonso Romero is a freelance computer consultant and translator from Mexico. He's been working with Linux and open source software since 1999. He started operating his first web server (Apache) from a PC at home, offering free hosting services to experiment with Postfix, Squirrel Mail, MySQL, Apache, Tomcat, and Virtual Hosting. Since then, he's been working as a computer consultant for several clients in Mexico – writing Java, C++, and Web applications. Since 2000, he has worked for Pearson Education in Mexico as a computer books freelance translator and consultant. His latest book translations are the Spanish versions of Java How to Program, Seventh Edition, from Deitel & Deitel, and C++ How to Program, Sixth Edition, also from Deitel & Deitel. Al enjoys writing tutorials and teaching about Java, C++, PHP, the Apache Web server, Tomcat, MySQL, Web applications like Apache Roller, and all of the wonderful open source applications used today, and when he's not experimenting with new trends in Open Source applications, he enjoys playing his electric guitar.

Books From Packt

Joomla! with Flash
Joomla! with Flash

Joomla! 1.5 SEO
Joomla! 1.5 SEO

Zend Framework 1.8 Web Application Development
Zend Framework 1.8 Web Application Development

Ext JS 3.0 Cookbook
Ext JS 3.0 Cookbook

ICEfaces 1.8: Next Generation Enterprise Web Development
ICEfaces 1.8: Next Generation Enterprise Web Development 

Spring Persistence with Hibernate
Spring Persistence with Hibernate 

3D Game Development with Microsoft Silverlight 3: Beginner's Guide
3D Game Development with Microsoft Silverlight 3: Beginner's Guide

Microsoft Office Live Small Business: Beginner’s Guide
Microsoft Office Live Small Business: Beginner’s Guide

Code Download and Errata
Packt Anytime, Anywhere
Register Books
Print Upgrades
eBook Downloads
Video Support
Contact Us
Awards Voting Nominations Previous Winners
Judges Open Source CMS Hall Of Fame CMS Most Promising Open Source Project Open Source E-Commerce Applications Open Source JavaScript Library Open Source Graphics Software
Resources
Open Source CMS Hall Of Fame CMS Most Promising Open Source Project Open Source E-Commerce Applications Open Source JavaScript Library Open Source Graphics Software