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.
You searched this site for "young russian teenboy model pre teen". 788 entries found.

You can also try this same search on Google.

The future of the DisplayTag Library

From the displaytag-devel mailing list:

I am sorry if I am asking a stupid question but is there any activity going on in the project? There are no new releases for almost a year... Neither are there any news on the project page. In our project we have modified the 1.0 version a bit and would like to share these changes with the community.

Fabrizio's response:

See http://displaytag.sourceforge.net now ;)

the website was frozen to the last 1.0 release, also due an extensive refactoring to the build/documentation system (migration to maven 2, splitting of optional modules and examples, ...) but activity on the project never stopped.

1.1 is now near, and I switched the default homepage to the 1.1 documentation. Warning: it's not released yet, but nightly builds are up.

The biggest feature of 1.1 has to be the ability to do external sorting and paging.

If you're looking for Ajax support in the displaytag, look no further than AjaxTags. I haven't been able to get ajax:displayTag working in my projects because I'm using a newer version of Prototype. However, it looks like the next version of AjaxTags supports the latest version of Prototype.

In addition to AjaxTags, you can also use AjaxAnywhere. Here's the code you'll need to do that (after adding AjaxAnywhere to your project):

<aa:zone name="userTable">

<display:table name="users" class="list" requestURI="" id="userList" export="true" 
    excludedParams="*" pagesize="5" sort="list">
    <display:column property="id" sort="true" href="editUser.html"
        paramId="id" paramProperty="id" titleKey="user.id"/>
    <display:column property="firstName" sort="true" titleKey="user.firstName"/>
    <display:column property="lastName" sort="true" titleKey="user.lastName"/>
    <display:column titleKey="user.birthday" sort="true" sortProperty="birthday">
        <fmt:formatDate value="${userList.birthday}" pattern="${datePattern}"/>
    </display:column>
</display:table>

</aa:zone>

<script type="text/javascript">
    ajaxAnywhere.getZonesToReaload = function() { return "userTable" }
    ajaxAnywhere.onAfterResponseProcessing = function() { replaceLinks() }
    function replaceLinks() {
        // replace all the links in <thead> with onclick's that call AjaxAnywhere
        var sortLinks = $('userList').getElementsByTagName('thead')[0]
                                     .getElementsByTagName('a');
        ajaxifyLinks(sortLinks);
        if (document.getElementsByClassName('pagelinks').length > 0) {
            var pagelinks = document.getElementsByClassName('pagelinks')[0]
                                    .getElementsByTagName('a');
            ajaxifyLinks(pagelinks);
        }
    }
    function ajaxifyLinks(links) {
        for (i=0; i < links.length; i++) {
            links[i].onclick = function() {
                ajaxAnywhere.getAJAX(this.href); 
                return false;
            }
        }
    }
    replaceLinks();
</script>

Libraries used in above code: AjaxAnywhere 1.0.2, DisplayTag 1.0 and Prototype 1.4.0_pre4. You can also see a demo online or download the code.

Posted in Java at Dec 29 2005, 10:46:56 AM MST 26 Comments

Struts 1.2.8 has client-side validation issues just like 1.2.7

This weekend, I upgraded AppFuse from Struts 1.2.4 to 1.2.8. After failing to upgrade to 1.2.7, I was a little leary of this release - for good reason. It turns out, the 1.2.8 release has the same client-side validation issue as 1.2.7. The good news is it's a Commons Validator issue this time, and you can fix it by upgrading to Commons Validator 1.2.0 (it ships with 1.1.4).

If you're using custom client-side validators, you might have to patch your functions. Here's what I did to mine:

- oTwoFields = eval('new ' + formName.value + '_twofields()');
+ oTwoFields = eval('new ' + retrieveFormName(form) + '_twofields()');

Also, if you'd like to use Spring MVC with Commons Validator 1.2.0, you'll need to patch springmodules-validator. Or you can just download the one from AppFuse's CVS.

Posted in Java at Dec 19 2005, 04:55:37 PM MST 2 Comments

New Computer - should I keep it?

HP Pavilion a1250n When I arrived here in Florida on Wednesday, I got a call from Julie saying my Windows Desktop was hosed. When she started it up, she just got a black screen. This is the problem with having a 23" Cinema Display hooked up to a Windows box - you can never see if anything went wrong on startup. I told her she needed to hook up one of my humongous 19" CRT monitors from the basement, and plug it in to see what was wrong. 10 minutes later, she calls me back and tells me the problem: it can't find the hard drive. I walk her though putting in the XP CD and trying to repair the drive, but it doesn't work. I tried to convince her to live w/o e-mail and the internet until I got home, but that didn't fly either.

I got a call from her yesterday afternoon telling me that she'd just bought a computer from Best Buy. I cringed. "Best Buy?", I thought. Knowing my penny-pinching wife, I figured the machine would be a $300 eMachine. However, she sent me a link and I was pleasantly surprised. She bought a HP Pavilion a1250n, which seems to be a dual AMD 64. After further reading, it seems it's a dual-core and not a dual processor. Regardless, I was quite proud that she bought something that I've been thinking of getting. I've used AMD-based machines in the past and they've always seemed much faster than an equivalent Pentium box.

This machine does seem to be a "media center" PC, which is expected when you buy it from Best Buy. But what exactly does that mean? Does it mean it won't make a good development box? We have 14 days to return it, so I'm wondering if I should. I don't really want to buy a new desktop (unless it's a G5), but my 2.6 GHz Dimension 8300 has thrown up quite a few times in the last few months - so I'm probably due. I tried to talk Julie into a G5, but a lot of the software she's using for her new business is Windows-only ... and VirtualPC sucks.

Update: I've decided to keep the box, mainly because my Dell Dimension 8300 is getting old and this one seems much faster. It's unlikely I'll ever have a Mac desktop because we still need and enjoy using Windows for a lot of things. I'd love to, but it just won't fly with the wife - as well as many software vendors out there. To make things a bit speedier, I did buy 4 GB of RAM for the HP today. I'll likely turn my Dell into a Suse box for Subversion, CUPS and Samba.

Posted in General at Dec 09 2005, 09:07:55 AM MST 22 Comments

Remotely debug your app in Eclipse

Levent Gurses has a nice blog entry on Remote Debugging with Eclipse. I was able to use his instructions a couple months ago to attach to a remote instance of WebLogic (8.1 SP4) to debug an application. The beauty of his instructions is I had it all working in about 5 minutes. Yesterday I realized you could use the settings in *any* application server, and remotely debug it - or at least you should be able to. Today I noticed he added instructions for Tomcat and JBoss. Good stuff - thanks Levent!

Here's the settings you need in your startup script - just in case Levent's blog is down the next time I need this info.

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044

Posted in Java at Dec 02 2005, 11:04:19 AM MST 20 Comments

Ant colored logging on Windows

In the past, I've had issues getting Ant's AnsiColorLogger to work on Windows with Cygwin. Thanks to a friend of mine, Steve DeRidder, I was finally able to figure out a working solution. Here's what you need to do if you're using Cygwin.

Install the "rxvt" component of Cygwin through its update tool. Once you've done that, there are two options for integration:

  • Right-click context menu: Download rxvt_reg.reg to your hard drive. Edit it with a text editor to point to your Cygwin installation and save it. Then right click on the file and "merge" it into your registry.
  • Shortcut: Create a new shortcut with the following command (all on one line, adjust your Cygwin path accordingly):
    C:\Tools\cygwin\bin\rxvt.exe -bg white -fg black -sr -sl 5000 -fn "Fixedsys" 
    -ls -e /usr/bin/bash --login -c "exec /bin/bash -rcfile ~/.bashrc"
    

Thanks for the tip Steve!

Posted in Java at Dec 01 2005, 06:19:51 PM MST Add a Comment

Free Forums from Nabble.com

Nabble seems like a pretty cool site:

Our forums are truly public, democratic and absolutely free. Nabble's advanced community filtering gives you only the best content without the need for moderation. Find forums that interest you or easily start your own in minutes.

I first found out about Nabble a few days ago when I started seeing messages on the AppFuse mailing with a from address of "sent by Nabble.com". I did some searching and found they have a set of AppFuse Forums. The cool thing about these forums is they're not only a set of mailing list archives, but they also allow you post to the mailing list. Nabble forums are similar to Jive Forums (like OpenSymphony has) - they keep the forums and the mailing lists in synch, which is pretty cool IMO.

I spoke (via e-mail) with Will Lin - one of the co-starters of the Nabble project. Here are a few things he had to say about Nabble:

The goal of Nabble is to do the discussion right, just like Google did the search right. There are many problems with the current forms of discussions in mailing lists, message boards, user groups etc. Most importantly, (1) the search, most forum search are broken, a lot of people use Google's site:archive.domain.com to search discussion archive - what a hack, because Google does not index all the messages especially the recent ones.

In the mailing list case, developers get mad because users post dumb questions repeatedly, but the users don't have a good way to search past discussions ... (2) moderation, most discussions rely on one or two strong moderator to resolve spam and flame wars, with Nabble, all the members can work togeter to rate up (promote) top contributors, and rate down (drive out) spam and trouble makers; (3) cataloging - similar topic discussions should be able to be combined for browsing and search.

One of the coolest features of Nabble is you can create your own forum, and skin it however you like. I've done this for AppFuse, and created an easy to remember alias at http://appfuse.org/forums. You can also check out the easily-searchable Roller Archives, as well as many other OS project's mailing list archives.

Posted in Java at Nov 30 2005, 10:20:07 PM MST 5 Comments

Equinox: the name conflicts with an Eclipse project

I just received the following e-mail from an anonymous user via my contact page.

You might have already heard, but the Eclipse guys have started a new 
project also called Equinox, which is their implementation of the OSGi 
framework (which is my first choice for building modular enterprise apps 
these days).

http://www.eclipse.org/equinox

Not sure who had the name first, but I can see this getting more 
confusing as both products continue to gain mindshare and blog coverage.

First of all, I am aware of this thanks to Euxx. I don't know which project started first, but Google still seems to prefer mine over Eclipse's. Eclipse's Equinox project is #46 when searching for equinox, while mine is up to #9. ;-)

If I could think of a better name, I'd change. However, being #9 on Google makes it pretty tempting to keep the "Equinox" name.

Posted in Java at Nov 29 2005, 12:07:51 PM MST 5 Comments

Edit Java webapps Redux: Jetty Launcher and Equinox

A few weeks ago, I realized I was developing webapps the hard way, by re-deploying everytime I made a change. It's important to have a build process that can create a WAR and deploy, but it's also important to have a system where you can edit/save/view changes w/o ever deploying.

I spent some time this weekend working with Jetty Launcher, Eclipse 3.1 and the latest version of Equinox. Below are instructions on how to make the two work together. Once you've completed the steps below, you should be able to launch Jetty and edit/save Java files or JSP files in Equinox - and the changes will show up immediately in your webapp. No deployment or Ant/Maven interaction necessary.

I've tested this setup on Eclipse 3.1, using both OS X and Windows XP.

Step 1: Install Jetty and Launcher

Download and install Jetty. I tested 5.1.4 and 5.1.6 and both seem to work (6.0.0 Beta does not). In Eclipse, go to Help » Software Updates » Find and Install. Select Search for new features to install and click Next. Click on the New Remote Site button and enter "Jetty Launcher" for the name and "http://jettylauncher.sourceforge.net/updates" for the URL. Click OK, continue to download and restart your workspace.

Step 2: Install Equinox and create Eclipse project files

Download Equinox 1.5 beta 1 and extract to your workspace (I generally use c:\Source on Windows and /Users/${username}/dev on OS X). Download Maven 2.0, install it, and add $M2_HOME/bin to your $PATH. From the command line, cd into the equinox directory and type "mvn eclipse:eclipse". Get a cup of coffee or soda while you wait for Maven to download all the dependencies.

Once the project files have been created, open Eclipse and go to File » New » Project » Java Project. Click Next and type "equinox" in the Project name box. Click Finish to begin importing the project. You'll probably get an error like the following. Click OK to continue.

Eclipse Error

Click Next to continue (I had to click it a few times before it took me to the next screen). On the next screen (Define the Java build settings), select the web directory and click Configure inclusion and exclusion filters. Click the Add button for Exclusion patterns and enter "WEB-INF/classes/" (the trailing slash is important).

You're not done yet, now you need to define the M2_REPO variable that points to all the downloaded dependencies. Click the Libraries tab and then the "Add Variable" button as seen below.

Eclipse Error

Click the Configure Variables button and add a new one with a name of M2_REPO and Path of to your local Maven repository (/Users/${username}/.m2/repository on OS X and C:\Documents and Settings\${username}\.m2\repository on Windows). Click OK, Cancel and then Finish.

Step 3: Configure Jetty Launcher for Equinox

In Eclipse, go to Run » Debug and select Jetty Web in the Configurations panel. Click the New button. In the "Use Options" section, use "web" for the webapp root and (optionally) "/equinox" for the context name.

Jetty has issues running applications that use commons-logging, so you'll need to turn off all the INFO logging from the projects that Equinox uses. To do this, click on the Arguments tab and add the following to the list of VM arguments:

-DDEBUG -DDEBUG_PATTERNS=org.appfuse -DDEBUG_VERBOSE=-1

This can be placed on the line below the -Djetty.home argument. For more information on logging in Jetty, see the Jetty logging and debugging tutorial.

Step 4: Start Jetty in debug mode and modify to your hearts content

Click Apply and then Debug, and watch Jetty startup. If you go to http://localhost:8080/equinox/users.html in your browser, you should see a log message like the following:

11:44:25.855 DEBUG  [SocketListener0-1] org.appfuse.web.UserController.handleRequest
(UserController.java:24) >29> entering 'handleRequest' method...

You should be able to click on "UserController.java:24" to navigate to the UserController.java class. In this class, modify the log.debug(...) message, save the file and hit refresh on your browser. The console should spit out your updated log message. If it didn't, go to Window » Preferences » Workspace and make sure Build automatically is checked.

As far as I can tell, edit/save/refresh will work for .java and .jsp files, but not for .xml files. For that, the Jetty Launcher adds a Stop/Restart Jetty icon to your Eclipse toolbar. This setup seems to work great, except for the fact that you can't see when Jetty is done starting up in the console.

NOTE: I tried to get a similar setup working with the Tomcat Eclipse Plugin (v3.1 beta) and the Eclipse Web Tools Project (v0.7.1). Neither worked as smoothly, and the WTP wouldn't even deploy to Tomcat.

Posted in Java at Nov 28 2005, 11:58:15 AM MST 8 Comments

Are you doing client-side validation in your JSF applications?

Are you doing client-side validation in your JSF application? I am in Equinox and AppFuse, but it seems somewhat primitive. I'm using David Geary's corejsf-validator.jar from his Core JSF book. It hooks into Commons Validator, and while it does work - it has some issues. First of all, if you have it in your classpath when testing, it screws up Ant-style path matching in Spring (applicationContext*.xml doesn't work). Secondly, it puts all the JavaScript validation functions right in your page, rather than in an external file that can be cached by your browser.

In reality, I believe that JSF should include client-side validation as part of the spec. After all, all of the other popular Java web frameworks support it. Then again, Rails is growing in popularity and AFAIK, it doesn't support it. In addition, the popular Java webapps I've seen (JIRA, Confluence, Jive Forums) don't use it either. I'm not trying to advocate that we should all be using client-side validation in our apps, I'm merely saying it should be an option in the standard web framework for Java.

The only public (and open source) option I've found is the Commons Validator support in Shale. Will this work in a MyFaces application w/o Shale? Are there other client-validation frameworks for JSF I don't know about? Or is the best option "don't use client-side validation with JSF?"

Posted in Java at Nov 24 2005, 09:02:39 AM MST 6 Comments

Editing Java webapps instead of edit/deploy/reload

For the last few years, I've always done Java webapp development the hard way. Yeah, I'm the guy that makes Dion cringe (although I'm pretty sure he's not referring directly to me). I edit a class/jsp/xml file and run "ant deploy reload". Then I wait a few seconds for my context to reload in Tomcat. Luckily, I do mostly test-first development, so it's rare that I have to open my browser to test stuff. However, with the power of CSS and Ajax, manual testing in a browser is becoming more and more useful (although Selenium may solve that).

I've long resisted the power of the IDE, b/c I've always trusted Ant and felt confortable with the command line. However, I'm ready for a change. I'm ready to start developing Equinox and AppFuse-based applications using the edit/save/auto-reload cycle. So how do I get started? Where's the instructions for setting up my IDEs to work this way?

I prefer to use Eclipse and IDEA for development - so I'll likely try to get this working in both. If I get it working, I'll make sure and provide good documentation so others can do the same. I'm also willing to make any changes in project structure to make this happen; modifying build.xml (or pom.xml) to accomodate shouldn't be too difficult.

Posted in Java at Nov 07 2005, 09:16:03 AM MST 23 Comments