Matt RaibleMatt Raible is a writer with a passion for software. Connect with him on LinkedIn.

The Angular Mini-Book The Angular Mini-Book is a guide to getting started with Angular. You'll learn how to develop a bare-bones application, test it, and deploy it. Then you'll move on to adding Bootstrap, Angular Material, continuous integration, and authentication.

Spring Boot is a popular framework for building REST APIs. You'll learn how to integrate Angular with Spring Boot and use security best practices like HTTPS and a content security policy.

For book updates, follow @angular_book on Twitter.

The JHipster Mini-Book The JHipster Mini-Book is a guide to getting started with hip technologies today: Angular, Bootstrap, and Spring Boot. All of these frameworks are wrapped up in an easy-to-use project called JHipster.

This book shows you how to build an app with JHipster, and guides you through the plethora of tools, techniques and options you can use. Furthermore, it explains the UI and API building blocks so you understand the underpinnings of your great application.

For book updates, follow @jhipster-book on Twitter.

10+ YEARS


Over 10 years ago, I wrote my first blog post. Since then, I've authored books, had kids, traveled the world, found Trish and blogged about it all.

BeanUtils.copyProperties() with Dollar amounts and Dates

A frequent issue that crops up when using Struts is how to transfer data from ActionForms to DTOs or POJOs and vise-versa. In other words, how do you get the data from your true model into Struts' Model? There are a few solutions out there, including the ActionForm-Value Object Mapper and BeanUtils.copyProperties. I've used both and (IMO) the only advantage of using BeanUtils is that Struts uses it internally and it's a bit easier to work with.

The reason I'm writing this post is to show you how to handle Dates and Doubles in your POJOs. The first step is easy - you simply need to register converters for Date and Doubles. The easiest way to do this (that I know of) is to add a static block to one of your classes. I do this in BaseManager, but it could be easily done in a BaseForm class.

    static {
        ConvertUtils.register(new CurrencyConverter(), Double.class);
        ConvertUtils.register(new DateConverter(), Date.class);

        if (log.isDebugEnabled()) {
            log.debug("Converters registered...");
        }
    }

When I use Doubles, it tends to be for dollar amounts displayed in a JSP page. Therefore, I call it a CurrencyConverter (source), and I use a DateConverter (source) for dates.

After registering these converters, the next step is to throw a little validation into the mix so that the String values (from the Form) are in an expected format. Since I'm using XDoclet to generate my Forms, it's as easy as adding a couple of tags to my POJO. Here is an example for validation Dates:

    /**
     @return Returns the startDate.
     * @struts.validator type="required"
     * @struts.validator type="date"
     * @struts.validator-var name="datePatternStrict" value="MM/dd/yyyy"
     * @hibernate.property column="start_date" not-null="true"
     */
    public Date getStartDate() {
        return startDate;
    }

And one for validating dollar amounts:

    /**
     @return Returns the startingSalary.
     * @struts.validator type="required"
     * @struts.validator type="mask" msgkey="errors.currency"
     * @struts.validator-var name="mask" value="${currency}"
     * @hibernate.property column="salary_start" not-null="true"
     */
    public Double getStartingSalary() {
        return startingSalary;
    }

For the currency validation to work, you have to add a few things to your Struts project. The first is the errors.currency to your ApplicationResources.properties file:

errors.currency=The '{0}' field should be a dollar amount.

The 2nd piece you'll need to add is the currency mask as a constant in your validation.xml file (or metadata/web/validation-global.xml if you're using XDoclet/AppFuse):

<constant>
    <constant-name>currency</constant-name>
    <constant-value>^\d{1,3}(,?\d{1,3})*\.?(\d{1,2})?$</constant-value>
</constant>

I'm not much of a regular expression expert, but I think this mask is specific to US Dollar amounts. I'd love to see a i18n version, but I haven't had a need for one (yet) - so it's not a big deal for me. The last thing you'll need to do is add a little JSTL lovin' to render your dollar amounts with the proper number of decimal places:

<fmt:formatNumber type="number" minFractionDigits="0"
    maxFractionDigits="2" value="${myForm.startingSalary}"/>

It seems that most web frameworks are getting away from a separate web model (ActionForms) and allowing you to use your POJOs in your view. This is likely to be a bit cleaner, but I'm sure they still have to use some sort of converter to get Dates/Doubles from your UI into your POJOs. The nice thing I've seen in other frameworks is that they have Date Converters built in. Why doesn't Struts? Who knows, but IMO it should be a built-in component.

Both of the Converters described in this article can be found in AppFuse.

Posted in Java at Mar 08 2004, 07:00:08 AM MST 1 Comment

Outline for talk on Display Tag, Struts Menu and AppFuse in NYC

This weekend I'm preparing slides for my talk in NYC on the Display Tag and Struts Menu. I'm also going to do a bit about AppFuse since it includes and uses both libraries. I have an hour to talk, so I think I'll try to present for 50 minutes and leave the last 10 minutes for questions or simply quitting early. That means, realistically, I only have 15-20 minutes for each project. That sure seems like a lot now, but I'm sure it'll fly once I'm up there in front of everyone. I'm definitely nervous about this event - I've only ever done technical talks to team members, never to a large audience. I've done large audience (20-50 attendees) talks, but those where in college and covered growing up in Montana and business plan-type presentations. Oh well, I'm sure I'll get over my anxiety about 10 minutes into it.

The purpose of this post is to write down the topics I plan to cover and hopefully get some feedback from the more experienced presenters out there. I'd also like to get feedback from developers - as in what you'd like to see covered if you were attending.

  • Introduction. Who am I, etc. (2 minutes)
  • Struts Menu. What is it - it's history, etc. (3 minutes)
       - Features and Demo of sample app. Questions. (5 minutes)
       - Expression Language support and building menus from a database (including code). (10 minutes)
  • The Display Tag. What is it - it's history, etc. (3 minutes)
       - Features and Demo of sample app. Questions (7 minutes)
       - Expression Language support and using to create an editable table (including code). (10 minutes)
  • AppFuse. What is it - it's history, etc. (3-5 minutes)
       - Features, Libraries included, etc. Questions (5 minutes)

Posted in Java at Mar 06 2004, 09:47:32 AM MST 8 Comments

Happy Birthday Spam

Spam turns 10 today. I've been using my PowerBook for a week solid with no XP intervention. I have to admit, I'm really starting to get used to it - especially Mail's Junk Mail feature. Of course, using IDEA every day is quite a treat too.

Posted in The Web at Mar 05 2004, 11:12:28 AM MST Add a Comment

Great CSS Designs

While reading the latest issue of A List Apart this morning, I got sidetracked and visited the CSS Zen Garden, finally landing on David Shea's blog. There I found his listing of Great CSS Designs. There's some very nice sites in there.

In other news, today is one of those days that sucks to work from home. I can see the snow falling out my window, and it's snowed almost 2 feet in the last 48 hours at Vail, Breckenridge and Winter Park. Urgghh, the slopes are calling, but so is my pocketbook. Note to self: get your priorities straight next year so this doesn't happen again. This is the first year in the past 5 that I haven't bought a ski pass and I won't do it again. Oh well, at least it'll be a good night for a hockey game.

Posted in The Web at Mar 05 2004, 07:45:05 AM MST 3 Comments

JAG - similar to AppFuse, but offers more choices

This afternoon, I stumbled upon the open source Java Application Generator on SourceForge:

JAG is an application that creates complete, working J2EE applications. It is intended to alleviate much of the repetitive work involved in creating such applications, while providing a means of quality assurance that the applications created will be of consistent quality.

Major differences include: JAG has a Swing GUI to create your app and it uses EJB 2.0 for its persistence layer. AppFuse has an Ant task (ant new) and uses Hibernate (or iBATIS) for the persistence layer. Both use Struts 1.1 with Tiles and Validator support. The question is - will they eventually offer Spring, WebWork and Tapestry options for the MVC layer? I doubt it...

BTW, my experience with java.net has been quite nice so far. I like the fact that I can use a pserver for developer CVS access (vs. SSH only at SF). I also like that I can approve e-mails just by replying to an e-mail (vs. using a web interface on SF). The best part, however, has to be that CVS commits and e-mail messages are immediately browse-able in the archives. This is rather convenient when you're a blogger that likes to link to source code and messages in (sudo) real-time.

Posted in Java at Mar 04 2004, 01:05:51 PM MST 1 Comment

[Construction] Garage Demolition

Today, the builder started tearing down the garage and pouring the foundation for the master bath. It's pretty cool that all this is happening during my week off!

Tearing down the garage
The Garage demolition begins...
There goes the roof
There goes the roof!
The foundation begins
Master Bath Foundation begins...
Foundation settings
Styrofoam Moldings for the foundation

Posted in General at Mar 03 2004, 01:46:49 PM MST 1 Comment

[ANN] Anthill 1.7.0 Released!

I've been using Anthill for about a year now, and I think it's a kick-ass product. I don't really have any issues with the current version, but it's nice that there's a new release. If you're interested, you can view the release notes.

Posted in Java at Mar 02 2004, 09:52:51 AM MST 2 Comments

It's gonna be a good week

New Foundation It's gonna be a good week. Yesterday, I gave a demo at my client and they loved it. Shortly after that, my sister (Kalin) flew in to town. She's here until Thursday and I'm taking today, tomorrow and Thursday off. Vacations during the week are very nice. We're babysitting Abbie today, so it should be a good day - especially with a stop at Chipotle for lunch.

In other news, construction on our house started yesterday. Here's a photo of part of the new foundation (for the master bath) getting dug. There's already been one casualty - our sewer line. Luckily, Bob the Builder was able to run to Home Depot and fix it for our house full of guests. We also talked to our new (temporary) landlord on Sunday. We got pretty lucky - our neighbors bought a new house and we're going to finish out their lease. So we're going to live next door to our house while it's being built. Pretty cool, huh?

In even bigger news, Julie submitted her resignation at Qwest last week and today is her last day. She got tired of Abbie getting sick at daycare and more so, she was bored out of her mind. Things will be a bit tight - COBRA is just over $1000/month and it's our only option since she's pregnant. Doh! At least we'll only need it until September/October (crosses fingers for a healthy baby).

Posted in General at Mar 02 2004, 09:24:46 AM MST 3 Comments

AppFuse 1.4 Released!

This release involves many changes: re-arranging packages/directories, Spring integration, Remember Me refactorings and I also added iBATIS as a persistence option. I also spent a lot of time going through the tutorials to make sure they are up to date. I've been using AppFuse 1.4 for a few weeks on my current project, and I really do like the way Spring makes it easy to configure Hibernate, Transactions and Interface->Implementation relationships. If you're interested in upgrading your AppFuse 1.x app to use Spring, you can checkout this howto.

I also made the leap and moved the AppFuse project from SourceForge to java.net. This is mainly so I have more control over mailing lists and adding other developers. As of today, CVS files in SourceForge and Java.net are the same - but I'll only be updating Java.net from here on out. I also have released files in both projects, but will only use java.net in the future.

I spent all weekend updating the tutorials and fixing release-related issues. Phew - I'm glad that's over. "So," you ask, "what's next?"

A week of vacation (my sister flies in tomorrow), followed by starting to write Spring Live and creating a Spring MVC option for AppFuse. Oh yeah, I'll also be at SD West in Santa Clara, CA - let me know if you plan on attending.

Posted in Java at Mar 01 2004, 12:35:54 AM MST 11 Comments

Pictures from Tucson

Last weekend, we headed to Tucson, Arizona to visit with family. Here are some good pics from the trip - and one of Abbie with her new kitty.

Trains
Cool Trainyard
Trains
El Charro
Trains
Saguaro National Park
Trains
Abbie giving Zoe a kiss

Posted in General at Feb 27 2004, 10:43:32 PM MST Add a Comment