Structure of ActiveWeb project
An ActiveWeb project a Maven project, therefore it has all the usual Maven conventions. However there are some specifics regarding ActiveWeb, which are discussed below. Here is a structure of a typical ActiveWeb project:
Configuration
ActiveWeb uses Java code for configuration, instead of XML or other files. The picture above shows a package app.config
. This package contains 2 - 3 classes responsible for configuration of AvtiveWeb project. In fact, it barely has any configuration. Most configuration of the application is dealing with configuring database connections. For more on configuration, see here: Database configuration
Location of controllers
Controllers are always located in a package app.controllers
(and sub-packages). At first this looks strange, but this is a requirement of the framework and a general convention. Developers after a while get used to and start to appreciate it. A controller is a Web component, and as such is not a subject of sharing across multiple applications. Controllers of one web applications will not intermingle with controllers of another. This approach yields the following benefits:
- ActiveWeb application structure is identical from one project to another, making it easier to onboard new developers
- Controllers are compiled on the fly and reloaded on every request in development mode.
Location of models
ActiveWeb has excellent integration with ActiveJDBC, and the app.models
package is for ActiveJDBC models. Placing models into package app.models
is a convention and a recommendation. In more complex projects models are kept in a different shared module used across multiple project modules.
Location of services
The package app.services
is a suggestion and a convention for services. If a service is not shared across multiple modules, it makes sense to place it into this package. If a service is used in other places, it might actually be in a completely different module/package.
ActiveWeb also provides automatic dependency injection of services into controllers and filters. ActiveWeb is integrated with Google Guice. For more information, please refer to Dependency injection.
Location of views
ActiveWeb uses FreeMarker for rendering and does not use JSPs. The FreeMarker templates are located in directory
src/main/webapp/WEB-INF/views
The subdirectories indicate controller names.
In an example above, there are three directories under WEB-INF/views
: books
, layouts
and system
books
is a directory specific to this small example project. It hosts templates for app.controllers.BooksController
system
is a directory provided by ActiveWeb. It contains two templates which are used by framework. Application developers are free to customize these according to the look and feel of the website.
- The
404.ftl
is rendered when a resource not found (no controller, or action, or template) - the
system.ftl
is used when there is an internal system error (exceptions in controllers, etc.).
layouts
is a directory to hold default and other layouts. The default layout is called default_layout.ftl
and is invoked automatically by default (wraps every page into a layout)
RequestDispatcher configuration
ActiveWeb framework is a Servlet filter. As a result it is easy to set it up in a file web.xml
. Below is a configuration file from a real commercial project. Usually these files do not get any more complicated:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>activeweb</display-name>
<filter>
<filter-name>dispatcher</filter-name>
<filter-class>org.javalite.activeweb.RequestDispatcher</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>exclusions</param-name>
<param-value>css,images,js,html,ico,png</param-value>
</init-param>
<init-param>
<param-name>root_controller</param-name>
<param-value>home</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>dispatcher</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
There are three parameters you can use to configure the framework:
- encoding - this is what encoding to set on HTTP request and response just before using either. We recommend to always set it to UTF-8 to avoid issues with internationalization
- exclusions - this is a comma-separated list of strings on URI which the framework should ignore (not attempt to process are requests to controllers). These are static files, like images, HTML, CSS, JavaScript, PDF downloads, etc. The format is a comma separated list of sub-strings that are present on URIs of requests that are to be excluded.
- root_controller - this is a name if a controller that the framework will automatically call if no path is provided, such as:
http://yourdomain.com
. For this specific example, the controller called will beapp.controllers.HomeController
with default actionindex
. It is equivalent to calling URL:http://yourdomain.com/home
.
How to comment
The comment section below is to discuss documentation on this page.
If you have an issue, or discover bug, please follow instructions on the Support page