I’m learning to use a

I’m learning to use a new Web application architecture called Struts, which is a Java framework for making complex websites that carefully separate the front-end pages (which creative folks build) from the back-end code (which the programmers write) from the business logic that orders the pages (which the client service teams change their minds about all the time.)


Web pundit Philip Greenspun has recently compared J2EE (that’s Java 2, Enterprise Edition) applications to SUVs. They’re big, heavy, unwieldy, and theoretically have more power than you ever could use, or want — especially if you do all your driving to and from the grocery store. Which is news to nobody. “Pick the horse for the course” is a standard mantra among experieced interactive architects. Writing a prototype? Great — use PHP and CGI. Writing a landing page that just captures names and addresses for a sweepstakes? Fine, use VBScript and get on with your life. Writing a shopping cart for a thousand simultaneous users? Okay, NOW you need to fire up the Hummer.


Anyhow, saying that Struts has a steep learning curve is, um… correct. What makes it especially difficult is the way that every piece of Java code you write depends on the one above it, which depends on the one above that. The chain runs all the way up the ladder, just like your name and address in your seventh-grade biology textbook went all the way up to “…the world, THE UNIVERSE!”


java.lang.IllegalArgumentException: Path success.html does not start with a '/' character,  at org.apache.catalina.core.ApplicationContext.getRequestDispatcher(ApplicationContext.java:1179),  at org.apache.catalina.core.ApplicationContextFacade.getRequestDispatcher(ApplicationContextFacade.java:174),  at org.apache.struts.action.ActionServlet.processActionForward(ActionServlet.java:1751),  at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1596),  at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:510),  at javax.servlet.http.HttpServlet.service(HttpServlet.java:760),  at javax.servlet.http.HttpServlet.service(HttpServlet.java:853),  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247),  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193),  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256),  at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643),  at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480),  at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995),  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191),  at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643),  at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480),  at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995),  at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2416),  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180),  at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643),  at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171),  at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641),  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172),  at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641),  at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480),  at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995),  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174),  at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643),  at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480),  at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995),  at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223),  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:601),  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:392),  at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:565),  at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:619),  at java.lang.Thread.run(Thread.java:534)
So when you break something in Java, you don’t just get an error message about the closing parenthesis you forgot. The server proceeds to read you the riot act, telling you about your code, then describing how your dumb mistake broke the thing above it, and now the thing above THAT doesn’t work. Java goes into great detail about your ancestry, what it thinks about the town where you came from, and how if your dog was as ugly as you, Java would shave its butt and teach it to walk backwards.


The only thing Java is lacking is the proper vocabulary.

I’m learning to use a

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s