
Springing into the server side
The WaveMaker server is a Java application running in a Java Virtual Machine (JVM). Like the client, it builds upon proven frameworks and libraries. In the case of the server, the foundational block is the SpringSource framework, http://www.springsource.org/SpringSource, or the Spring framework. The Spring framework is the most popular enterprise Java development framework today, and for good reason.
The server of a WaveMaker application is a Spring application that includes the WaveMaker common
, json
, and runtime
modules. More specifically, the WaveMaker server uses the Spring Web MVC framework to create a DispatcherServlet
that delegates client requests to their handlers. WaveMaker uses only a handful of controllers, as we will see in the next section. The effective result is that it is the request URL that is used to direct a service call to the correct service. The method
value of the request is the name of the client exposed function with the service to be called. In the case of overloaded functions, the signature of the params
value is used to find the method matching by signature. We will look at example requests and responses shortly.
Behind this controller is not only the power of the Spring framework, but also a number of leading frameworks such as Hibernate and, JaxWS, and libraries such as log4j and Apache commons. Here too, these libraries are available to you both directly in any custom work you might do and indirectly as tooled features of Studio.
As we are working with a Spring server, we will be seeing Spring beans often as we examine the server-side configuration. One need not be familiar with Spring to reap its benefits when using custom Java in WaveMaker. Spring makes it easy to get access to other beans from our Java code. For example, if our project has imported a database as MyDB
, we could get access to the service and any exposed functions in that service using getServiceBean()
.The following code illustrates the use of getServiceBean()
:
MyDB myDbSvc = (MyDB)RuntimeAccess.getInstance().getServiceBean("mydb");
We start by getting an instance of the WaveMaker runtime. From the returned runtime instance, we can use the getServiceBean()
method to get a service bean for our mydb
database service. There are other ways we could have got access to the service from our Java code; this one is pretty straightforward. We'll dig into this in more detail in Chapter 9, Custom Java Services.
Starting from web.xml
Just as the client side starts with index.html
, a Java servlet starts in WEB-INF
with web.xml
. A WaveMaker application web.xml
is a rather straightforward Spring MVC web.xml
. You'll notice many servlet-mappings, a few listeners, and filters. Unlike index.html
, web.xml
is managed directly by Studio. If you need to add elements to the web-app context, add them to user-web.xml
. The content of user-web.xml
is merged into web.xml
when generating the deployment package. We will cover deployment in Chapter 13, Deploying Applications.
The most interesting entry is probably contextConfigLocation
of /WEB-INF/project-springapp.xml
. Project-springapp.xml
is a Spring beans file. Immediately after the schema declaration is a series of resource imports. These imports include the services and entities that we create in Studio as we import databases and otherwise add services to our project. We'll be looking at a number of these files in detail when we discuss services in the later chapters.
If you open project-spring.xml
in WEB-INF
, near the top of the file you'll see a comment noting how project-spring.xml
is yours to edit. For experienced Spring users, here is the entry point to add any additional imports you may need. An example of such can be found at http://dev.wavemaker.com/wiki/bin/Spring. In that example, an additional XML file, ServerFileProcessor.xml
, is used to enable component scanning on a package and sets some properties on those components. Project-spring.xml
is then used to import ServerFileProcessor.xml
into the application context. Many users of WaveMaker still think of Spring as the season between Winter and Summer. Such users do not need to think about these XML files. However, for those who are experienced with Java, the full power of the Spring framework is accessible to them.
Also in project-springapp.xml
is a list of URL mappings. These mappings specific request URLs that require handling by the file controller. Gzipped resources, for example, require the header Content-Encoding
to be set to gzip. This informs the browser the content is gzip encoded and must be uncompressed before being parsed.
Note
There are a few names that use ag
in the server. WaveMaker Software the company was formerly known as ActiveGrid, and had a previous web development tool by the same name. The use of ag
and com.activegrid
stems back to the project's roots, first put down when the company was still known as ActiveGrid.
Closing out web.xml
is the Acegi filter mapping. Acegi is the security module used in WaveMaker 6.5, discussed in Chapter 12, Securing Applications. Even when security is not enabled in an application, the Acegi filter mapping is included in web.xml
. When security is not enabled in the project, an empty project-security.xml
is used.