After a quick win with the JSP version of Hello World, it seemed that a servlet-based version was only a tweak or two away. Alas, it was not to be.
Coding
After using Maven to create another web project, I added a simple controller and DTO model object based on this article. Not wanting to get involved with Spring, etc., the project required mapping in the web.xml file as well.
I also updated the web.xml file to version 2.5 of the servlet engine.
A few basic language mistakes later, the code compiled.
Lesson Learned: Unlike .NET’s using statement, the Java import statement includes classes, not packages.
Packaging
Unfortunately, Maven was unable to complete the build because of this error:
error: package javax.servlet does not exist
The solution to this little ditty was only a Google away. Missing a dependency in Maven’s POM file:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
Not sure why Maven’s archetype doesn’t include this dependency by default, but adding it to the POM fixed things so Maven was able to package the project into a WAR file.
Deployment
Tomcat was able to unpack the WAR file without incident.
Execution
Hitting the URL a .NET developer might expect:
did not work. As memory served, though, I was half-expecting it – Java, like *nix, is a prissy environment when it comes to case, so:
invoked my new controller action.
Unfortunately, the app coughed up a run-time error:
org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
The Fix
More Googling lead to this Stack Overflow article – the original poster was close and the top answer helped a lot. Basically more missing dependencies in the POM:
<dependency>
<groupId>taglibs</groupId><artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
and a tweak needed to the JSP provided by Maven, which was missing the jsp segment for version 1.2 of the jstl:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
After these adjustments, my little project ran, albeit with another repeat of a self-inflicted wound: Would it kill Sun to provide a real property syntax? Come on!