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.

JSP 2.0 Article in July JDJ

I got the July issue of JDJ today. In it I found a good article on JSP 2.0 (printable, less ads version). Things I learned from the article:

  • JSTL 1.1 will introduce 16 standardized EL functions:
    - fn:length(): Get the length of a collection or a string.
    - fn:toUpperCase(), fn:toLowerCase(): Change the capitalization of a string.
    - fn:substring(), fn:substringBefore(), fn:substringAfter(): Get a subset of a string.
    - fn:trim(): Trim whitespace from a string.
    - fn:replace(): Replace characters in a string.
    - fn:indexOf(), fn:startsWith(), fn:endsWith(), fn:contains(), fn:containsIgnoreCase(): Check if a string contains another string.
    - fn:split(): Split a string into an array.
    - fn:join(): Join a collection into a string.
    - fn:escapeXml(): Escape XML characters in a string.
  • The tag libraries in JSTL 1.1 have new URIs (for example, http://java.sun.com/jsp/jstl/core instead of the JSTL 1.0 equivalent http://java.sun.com/jstl/core_rt). The new JSTL 1.1 tag libraries accept request-time expressions for their attributes, and delegate to the JSP container to evaluate EL expressions.

Good stuff to know. I'm ready to start developing JSP 2.0 apps - I hope the Tomcat dev team releases a stable build soon. Or maybe I should just look into using Resin...

Posted in Java at Jul 10 2003, 09:54:44 PM MDT 4 Comments

Compression Filter Issues - EOFException

I'm having some issues with implementing a Compression Filter in my day-time project. It works fine via the browser (and in AppFuse/Roller), but not in one of my Webtests. I think this is because my response doesn't have anything in it, but who knows. From my log file:

CompressionFilter.doFilter(87) | Unzipped size: 0
CompressionFilter.doFilter(106) | Zipped size: 20

And then the lovely error message from my testcase:

[canoo] java.io.EOFException
[canoo]     at java.util.zip.GZIPInputStream.readUByte(GZIPInputStream.java:200)
[canoo]     at java.util.zip.GZIPInputStream.readUShort(GZIPInputStream.java:190)
[canoo]     at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:130)
[canoo]     at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:58)
[canoo]     at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:68)
[canoo]     at com.meterware.httpunit.WebResponse.defineRawInputStream(WebResponse.java:617)

I'm thinking I need to close a stream or something, but since it works fine via the browser - I'm stumped! Any ideas are appreciated. I can post the testcase if necessary.

Update: Richard Hill on the Webtest mailing list hooked me up with the solution. It turned out to be a bug in the JDK, which causes issues in HttpUnit. Here's the solution I used to workaround it.

Posted in Java at Jul 10 2003, 04:59:51 PM MDT 2 Comments

Changing Struts' bean:message to JSTL's fmt:message

I converted AppFuse to use JSTL's <fmt:message> tag instead of Struts' <bean:message> tags this morning. It was pretty easy. Here's the steps I took:

1. First, I added the following to metadata/web/seb-settings.xml:

<!-- Define the basename for a resource bundle for I18N -->
<context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>ApplicationResources</param-value>
</context-param>

2. Then I added the format tag to web/common/taglibs.jsp:

<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>

3. Finally, I did find/replace with <bean:message/<fmt:message.

4. I also had to change my title and header keys in web/WEB-INF/tiles-config.xml to remove the . from the bean names. In other words, I converted title.key and heading.key to titleKey and headingKey and also made the appropriate changes in web/layouts/baseLayout.jsp.

Easy as Pie!

Posted in Java at Jul 10 2003, 07:59:29 AM MDT 35 Comments

NewsMonster 1.0 and Mozilla Application Development

I got a couple of treats from the XUL Announce mailing list this morning:

Kevin A. Burton (of Apache Jetspeed fame) has released NewsMonster 1.0 - a cross-plattform weblog manager with a brain - that runs inside Mozilla 1.0 (Netscape 7.0 or greater) on OS X, Linux, or Windows and showcases the power of XUL and Java.

Too bad it doesn't run on Mozilla Firebird. Oh well, I use NetNewsWire and believe it's the best aggregator out there.

O'Reilly has published an in-depth look at Mozilla's new roadmap titled "The Future of Mozilla Application Development" by David Boswell and Brian King.

If I could instantly learn anything right now, it would be XUL, Velocity and WebWork - in that order. I don't know what good this knowledge would do me, but it sure would be nice to learn stuff w/o even trying.

Posted in Java at Jul 10 2003, 06:43:59 AM MDT 2 Comments

[Denver JUG] The J2EE 1.4 Web Foundation: Servlets and JSPs

I'm sitting in the Qwest Auditorium right now, in the heart of downtown Denver. It's 7:20 p.m. and Sue Spielman is getting ready to launch her presentation on J2EE 1.4. There is a gentleman who is trying to start a JBoss Special Interest Group - if you live in Denver and are interested - send an e-mail to the DJUG mailing list. I've been here since 5:45 (after driving an hour from DTC) so this better be good. ;-) The Eclipse in Action speaker (David Gallardo) is coming to speak in October. In September, the author of AspectJ is coming in conjunction with Grady Booch. Never heard of him, but judging from the applause - I'm living under a rock.

On with the presentation. Sue thinks that J2EE 1.4 will be released towards the end of this year. Damn, I was hoping for the end of the summer.

What's new in Servlets 2.4?

1. Platform Requirements:

  • HTTP/1.1 - New static constants. HttpServletResponse.SC_FOUND to represent status code 302 instead of HttpSerlvetResponse.SC_MOVED_TEMPORARILY.
  • J2SE 1.3

2. DTD to XML Schemas:

  • Provides easier way to define element structure, element ordering structure is arbitrary under <web-app>
  • New elements in 2.4 XSD: <env-entry>, <resource-ref>, <resource-env-ref>, <jsp-config>

3. Complete event listener lifecycle:

  • New Request Events. Be aware that distributed containers handle listeners a bit different (1 instance per JVM).
    • ServletContext - manage, startup/shutdown, attribute changes
    • HttpSession - creation, invalidation, attribute changes, migration if sessions distributed
    • Request - request coming in or out of scope in a web component, attribute changes
  • javax.servlet.ServletRequestEvent, ServletRequestAttributeEvent
  • new interfaces ServletRequestListener, ServletRequestAttributeListener
  • SessionActivationListener is what you'd use for serializing sessions across a cluster

4. Filter enhancements:

  • Ability to configure filters to be invoked under request dispatcher. What does "under the Request Dispatcher mean?" It means that you can apply filters under RequestDispatcher forward() and include() calls. Defined in web.xml:
  • <dispatcher>REQUEST</dispatcher> and/or FORWARD, INCLUDE, ERROR (REQUEST was the only option in Servlets 2.3)
  • Example: if you have INCLUDE - a request doesn't invoke the filter, a forward doesn't invoke the filter, but an include would.

5. Enhancements for i18n:

  • Two new methods: setCharacterEncoding(String encoding) - do before getWriter() and getContentType().
  • <locale-encoding-mapping-list> - new element in the XSD to provide the deployer with the ability to assign locale-to-charset mappings outside servlet code.
<locale-encoding-mapping>
  <locale>en</locale>
  <encoding>en_US</encoding>
</locale-encoding-mapping>
  • Response encoding for English locales will default to US English (as opposed to the "other" English from Great Britain) ;-)

6. API Improvements added to the ServletRequest to help handle proxy servers: getLocalAddr(), getLocalName(), getLocalPort(), getRemotePort().

7. Other improvements:

  • Distributed sessions must throw an IllegalArgumentException if an object placed in the session can't be serialized
  • Relationship b/w session invalidate/timeout clarified (can now set zero or negative values in <session-timeout>)
  • Deprecation of Single ThreadModel (never used it - did you?)

8. Misc. Clarifications:

  • Welcome files can be servlets
  • Any library files exposed by the container apart from the WEB-INF structure must be loaded by the same classloader w/in any single JVM.
    • Examples include the JARs Tomcat loads from $CATALINA_HOME/shared/lib
    • This should help in avoiding potential ClassCastExceptions

As I expected, there still is now way to get the user's requested URL with container managed authentication. Damn.


JSP 2.0

1. Simplifies tag extension protocol

  • SimpleTag interface: doTag(), Tag attribute methods, NO scriplet code allowed
  • SimpleTagSupport class, implements SimpleTag, adds convenience methods: public JspFragment getJspBody(), public JspTag getParentTag()

2. Relationships: .tag file mechanism allows page authors to use JSP syntax to write custom actions

  • Use directive standard syntax: <%@ tag %> instead of <%@ page %>
  • JSP compiler generates custom action code (look in Tomcat's work directory)
  • Flexible packaging:
    • drop .tag file into WEB-INF/tags
    • implicit tag library generation
    • can still write a TLD if you want, or TLD in a JAR file

3. EL Functions: simple function invocations, defined in tag libraries, but it's a fair amount of work - like writing a TLD file and .java source file.

4. Expression Language:

  • . and [] operations access JavaBean properties and Collection elements
  • ${books.title}, ${books[title]}, ${books["JSTL Practical Guide"]}
  • Automatic type conversion
  • Ability to specify defaults (i.e. in case of null)
  • EL can access Cookies, request params, headers, scope variables and others

5. XML-based JSPs:

  • .jspx and .tagx for pure XML versions
  • no more <jsp:root> just use namespace: xmlns:jsp=http://www.sun.com/JSP/Page
  • For full list of XML features - see section 6.

JSTL (Java Standard Tag Library)

  • Over 42 standard custom actions available for common tasks needed by page authors
  • JSTL will become rev 1.1 in the J2EE 1.4 release

1. Core features:

  • Control flow: for each, conditionals
  • URL management: encoding, ftp, http
  • Formatting and i18n: date, time, numbers, locales
  • XML: transformations and XPath
  • Database support: queries, data sources, transactions
  • 4 custom action libraries: core, xml, i18n formatting, sql.

Man, Sue really knows her stuff. This was a very enjoyable presentation for me and I'm glad I came. Too bad JSPs can't be used as templates like Velocity - that would be sweet! Of course, I like Velocity and it is easy to use - but I've never implemented it from scratch. I do hope to in Moblogger and Struts Menu, but who knows when that will happen.

Update (7/17/2003): Presentation slides from this are now available for download:

  • July 9 - Basic Concepts: Scott Davis Apache Xerces - XML Parse (PowerPoint and samples)
  • July 9 - Main Speaker: Sue Spielman J2EE 1.4 Web Foundation (PowerPoint)

Posted in Java at Jul 09 2003, 11:15:44 PM MDT Add a Comment

RE: .Mac Bookmarks

.Mac Bookmarks seems like a good idea. I tried it, and it is cool, but it's not what I'm looking for. I have enough open windows as it is - another one only makes it more difficult. I need my bookmarks to be a part of my browser, like they currently are. That's what I like. What I want is the ability to specify a URL to my bookmarks.html file. My favorite browsers, Firebird and Camino both use a local bookmarks.html file, so this would work perfectly. I don't need bookmarks when I'm not on the net, so there would be no issues (for me) with connectivity.

I got the tip off for .Mac Bookmarks from Erik.

Posted in The Web at Jul 09 2003, 03:30:47 PM MDT 1 Comment

Good JUG Meetings this week in Colorado

Tonight in Denver - Celebrating DJUG's award as a top 25 user group, Apache Xerces, and The J2EE 1.4 Web Foundation. Meeting starts at 5:30 and ends around 9:00. I'm going.

Tomorrow in Boulder - Web Frameworks by Kris Thompson. This presentation will cover a basic understanding of what in general a web framework is and then cover on overview of some of the more popular frameworks out there. I want to go, but squeezing 40 hours in a 3 1/2 day week will prevent me.

Posted in Java at Jul 09 2003, 07:01:16 AM MDT Add a Comment

Pictures from the Cabin

We had an awesome time at the cabin this 4th of July, as evidenced by the many photos I snapped. Enjoy!

Seeley Lake through my sunglasses Abbie and I at the beautiful Holland Lake

Posted in General at Jul 09 2003, 05:57:36 AM MDT Add a Comment

Good Presos from TSS Symposium

I found a few good presentations in my Inbox today. I read them. Usually I don't. I enjoyed them, especially Mike's. I think WW2 looks promising, and I expect that I will try it soon. I predict that I will like it and I will be enthusiastic about it. Many hours will be lost exploring it's codebase and questioning it's authors. Julie will long for me to come to bed, but I will stay up and educate myself. This doesn't sound like any fun at the moment. So I will control my curiousity for another day. Hopefully I can control it for another month or year.

Posted in Java at Jul 08 2003, 04:20:44 PM MDT 3 Comments

Back from the Cabin

I just flew in from Montana this morning - and boy does it suck to be back. Being back in Denver isn't so bad, it's sitting at the keyboard, programming Java, reading weblogs/e-mail and being stuck in an office while summer is going on! Man is it beautiful outside right now. And it's even nicer in Montana. 5 days of laughing, sleeping, rafting, playing frisbee, BBQ-ing, friends and the wonderful sun makes it very hard to come back to this thing I despise today - work.

Sure it'll be fun in a day or so when I start becoming a part of this digital world again - through responding to e-mails and updating this site - but right now - bbblllllllllaaaaahhhh!!! Give me a beer and a lawn chair and put me back on vacation - that's where I belong - on the front porch of the cabin, with Abbie on my lap - listening to the birds chirping and watching the deer tiptoe through the garden below. Rafting down the crystal green river on the Middle Fork of the Flathead. There's nothing like summer in Montana.

Posted in General at Jul 08 2003, 02:35:29 PM MDT 1 Comment