One of the projects runs on JBoss application server. The interface for configuring the application is deployed as a WAR file. So we can update the configuration tools on future releases by just shipping a new WAR file to the customers. The student didn't understand how this works. Here was my 5 minute explanation...
In Java you have JAR files. A JAR file is a ZIP file with a bunch of Java classes in it. You can create a JAR file such that it can be run using 'java -jar'. It just requires the JAR file to have specific files in specific locations. A WAR file is the same idea.
For example, if I want to create the WAR file console.war I might do the following:
- Create the directory C:\console
- Create the directory C:\console\WEB-INF
- Create the directory C:\console\META-INF
- Create the file C:\console\WEB-INF\web.xml
- Create the file C:\console\META-INF\Manifest.mf
This is the basic structure. Now I need the code that will actually get run. Let's say I create the class AdminConsole in the package com.mycompany.myproject.console. Or, in other words, I created the file C:\console\classes\com\mycompany\myproject\console\AdminConsole.class.
The web.xml is defined by J2EE WAR file standards to have a specific format. It might contain something like:
<web-app> <servlet> <servlet-name> com.mycompany.myproject.console.AdminConsole </servlet-name> <servlet-class> com.mycompany.myproject.console.AdminConsole </servlet-class> </servlet> <servlet-mapping> <servlet-name> com.mycompany.myproject.console.AdminConsole </servlet-name> <url-pattern> /console/Admin </url-pattern> </servlet-mapping> </web-app>
The <servlet> tag tells the application server about the class file and the <servlet-mapping> tells the application server when to run the code. So if the server in on the machine darrell.blogger.com the user could enter the following in a web browser:
http://darrell.blogger.com/console/Admin
The <url-pattern> takes the /console/Admin and knows which Java code to run. It will run the AdminConsole.class code. The AdminConsole class has to have specific methods implemented. Just like a desktop application knows to start at:
public static void main(Strings[] args)
The AdminConsole class will extend javax.servlet.http.HttpServlet and will have doGet() and possibly doPost() methods.
With a desktop application, if I wanted to print to the screen I'd use System.out, e.g.
System.out.println("Hello");
but with a servlet I'd have to get the output stream and write to it, e.g.
ServletOutputStream sos = response.getOutputStream(); // uses the methods of ServletOutputStream to write to the web browser // e.g. sos.write().
Additionally, when you write to the web browser you have to indicate it the data is an image, text, HTML, etc. Before you write you can do things like:
response.setContentType("text/html");
So if you can write a Java application, it is fairly easy to convert to a web application.