Another nice design - Phono Phunk
I'm going to have to save this one for later. It's definitely one of the cleanest and prettiest blogs I've seen in a long time. Well done! Thanks to Wouter for the link.
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 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.
I'm going to have to save this one for later. It's definitely one of the cleanest and prettiest blogs I've seen in a long time. Well done! Thanks to Wouter for the link.
Heard on the radio this morning: Dodge is bringing back the Dodge Charger in 2006. Remember the General Lee from the Dukes of Hazzard? That's a Charger and here are pictures of the 2006 (or at least the concept car). "The Dukes" was one of my favorite TV shows growing up.
Since I grew up without electricity (hence, no TV), people often ask me if I've seen certain shows. I had friends, I watched TV at their houses. Also, my grandparents (who lived 10 miles down the road) had a TV. Night Rider and Dukes of Hazzard were shows that I went out of my way to see. However, there are shows like Gilligan's Island that I've never seen.
I won't be buying a new Charger, but I do plan on restoring an old VW Bus in the near future. I restored a couple of bugs in high school and college and I really enjoyed it. Right now, I'm looking for a late '50s or early '60s 23-window bus. I plan on dropping in a Porsche 911 or 914 engine, wrapping it with some Porsche wheels, and generally enjoying the whole process. It'll probably take me 2-3 years to complete the project - but I definitely need a new hobby. Being on the computer so much just isn't healthy. Besides, kids can participate in a car restoration. Hopefully I'll be able to post pictures like this in a few years.
Fabrizio (the lead developer on the display tag project), took my hack for supporting JSTL's SQL Tag and turned it into a nice feature. The display tag now supports Maps and you can iterate through JSTL's Results using the regular tag or the EL-enabled version. Download nightly build - now automated!
As an exercise for the NYC conference, I implemented an editable table using the display tag. It's a bit ugly, but it does work. You're more than welcome to use it and improve it. ;-) To see it, checkout the following demo pages in AppFuse:
Any feedback would be great.
For most of this week, I've been developing Velocity templates for rendering resumes in HTML and RTF (Word). Thanks for Mathias once again for showing me this was possible. The HTML part has been pretty easy, but the RTF stuff has been a bear. Mostly because I want to hide/show different sections of a person's resume based on whether they've entered information or not. In order to do this, I first created a rough draft of the RTF template in Word and then I began hand editing it with a text editor (HomeSite and BBEdit). And if you look at the RTF syntax, it's pretty damn ugly. The main thing I'm struggling with now is showing hiding rows of a table based on whether data exists or now. In HTML - it's easy - you just put your #if statement before a <tr> and you can easily hide the row. In RTF - it seems like the number of rows/columns/borders, etc. is all defined at the beginning of the table - but I can't really read the syntax well enough to understand it.
Therefore, my question is - does anyone know RTF well enough to tell me how I can hide a row? Is there something in the beginning of the table definition I can modify with Velocity #if statements? For now, I'm simply putting "Not Specified" text in rows where no data exists.
Finally, how about some RTF syntax I've learned in this process:
{\f116\fs20 = Verdana 10pt Font
The document must end with " }}" (no quotes) on the same line as the last bit of text
Escape "\n" with "\\par "
{\b\f116\fs24\cf17 = Bold, Verdana, 12pt, Ocean colored Font
How's that for a bunch of useless information! ;-)
Last night was a fun night. First of all, Mike Clark spoke about TDD development
at the DJUG and he wowed me with his presentation abilities. I think he could
have presented on just about anything and it would've been entertaining. He had
a fair amount of humor in his presentation and came off as a true Montanan (a.k.a. very cool guy).
I talked with him after the meeting as a whole bunch of us were entering Rock Bottom Brewery and
my suspicions where confirmed. I look forward to the next time I hang out with
Mike.
At Rock Bottom, it was all about drinking beer and bullshitting about Java. I sat
across from Rod Cope (Out of the Box) and next to Bruce Snyder (Geronimo/Castor). The topics
ranged from Groovy (Rod is speaking about Groovy at the Denver NFJS) to Spring
to Castor and Kids (Bruce has a little one that's a week and a half younger than
Abbie). I had a great time talking to these guys and look forward to our next
meeting. It won't be long until I see Bruce again - he's attending SD West next
week. He reminded me that next Wednesday is St. Patty's day, so since I'm part Irish -
it should be a fun night.
St. Patty's day is also both my sister and Julie's
sister's birthday - neat eh?
I didn't leave downtown until 1:00 a.m. - a great
Java-infested night it was. Thanks for the conversations and the booze folks -
I had a great time.
Roller currently has an issue where line breaks in comments are not auto-converted to <br>'s. This problem only exists in the in-page comments and the twisty comments you see on this site. Today, I might've figured out the solution. It turns out that using Jakarta Common's StrutsUtils to replace new lines with <br>'s doesn't work:
#set($comments = $stringUtils.replace($comments, "\n", "<br />"))
However, using the String.replaceAll(new, old) in JDK 1.4 does work:
#set($comments = $comments.replaceAll("\n", "<br />"))
I figured this out on my current project and haven't tested it on Roller. Since I didn't find anything on this via Google - I though y'all might be interested.
Spotted on the WebWork Mailing List today. Groove Systems (Rick Salsa's employer) has some nice hosting solutions. I currently pay $30 (Canadian) for 200 MB, 5 GB Transfer and my own JVM at KGBInternet.com. Keith (at KGB) rocks because he is always quick to respond to any of my issues and always tries to help me out. However, I have to admit, Groove's Grooviest package looks pretty nice. For the same price ($30 Canadian), you get 1 GB space, 15 GB Transfer and your own JVM.
The only question I have is how much memory do you get? Keith does nothing to limit memory usage, so I'm currently set at a 512 MB max heap size. Who knows if I'm using it all, that's just what I'm set at. Oh and one other thing you might like to know:
... right now you can get a 32meg private jvm for free.
Read the read e-mail from Rick for more info.
Someone asked me recently, "Do you censor your blog?" As in, "do you only write about stuff that you think readers will be interested in?" At the time, I said, "No - I write whatever the hell I want." However, I've come to realize that this is not exactly true. When I first started writing this blog, back in August 2002, I wrote about everything. I didn't care, I was writing to write and nobody was reading me.
Then, in November of 2002, along came the opportunity to help write a book. This was pretty damn exciting for me, as I think that being a published author is pretty cool (BTW, if I never started blogging, I'd have never gotten the Pro JSP or the Spring Live deals).
What has happened over the last year or so is something I never expected. Hopefully it's just in my head and it isn't really true. I've started to feel like an authority on web development - so I feel that I can't really post dumb questions, problems, etc. on this site. I feel that if I do, I'll lose credibility. It doesn't help that I've gone from 2 visits a day to over 4000. Damn - I'm censoring myself. That's just wrong...
I'm tempted to say, credibility be damned, actions speak louder than words - and run with it. After all, most of the hits on this site come from Google - and the reason is because I've copied and pasted so many errors/exceptions into this blog. More errors = more hits = more money from Google Ads? ;-)
One request I've seen on the displaytag-user list a few times is the ability to change a <tr>'s CSS class based on a certain value. While the displaytag doesn't have this feature out-of-the-box, it is possible (and fairly easy) to do. All you need to do is sprinkle a little JavaScript into the mix. Basically, the displaytag will render a well-formed HTML table - like the following:
| Username | First Name | Last Name |
|---|---|---|
| mraible | Matt | Raible |
| tomcat | Tomcat | User |
By adding an "id" attribute to your table (i.e. id="user"), your table will get an "id" attribute and now you can easily access it via the DOM. The following JavaScript will grab the table and search the first column for a value of 'mraible' - and if found, it will change the row's background color to red.
<script type="text/javascript">
<!--
var table = document.getElementById("user");
var tbody = table.getElementsByTagName("tbody")[0];
var rows = tbody.getElementsByTagName("tr");
// add event handlers so rows light up and are clickable
for (i=0; i < rows.length; i++) {
var value = rows[i].getElementsByTagName("td")[0].firstChild.nodeValue;
if (value == 'mraible') {
rows[i].style.backgroundColor = "red";
}
}
//-->
</script>
You could easily change rows[i].style... to rows[i].className = if you want to assign a new CSS class. Now let's see it in action (and see if your browser supports it). This has only been tested in Safari and Mozilla on OS X.
| Username | First Name | Last Name |
|---|---|---|
| mraible | Matt | Raible |
| tomcat | Tomcat | User |
Other displaytag tips: Static Headers HowTo and Highlight and allow clicking of rows. The 2nd tip (highlighting) is available in AppFuse, in the userList.jsp page.
BTW, I also added support for the DisplayTag to render the results from JSTL's SQL Tag. I haven't committed it yet - I'm still waiting for more feedback.
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 {
|
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:
/**
|
And one for validating dollar amounts:
/**
|
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.