Skip to main content

Webcontent (Frontend Serving)

The Frank!Framework can serve static web content (HTML, CSS, JavaScript) directly from a configuration. This allows building custom frontends that interact with Frank adapters via API calls.

Directory Convention

Place static files in a webcontent/ directory within the configuration:

src/main/configurations/MyConfig/
├── Configuration.xml
├── webcontent/
│ ├── index.html
│ ├── style.css
│ └── app.js

URL Pattern

Files in webcontent/ are served at:

https://<host>/webcontent/<configuration-name>/<path>

For example, if the configuration is named MyConfig:

File pathServed at URL
webcontent/index.html/webcontent/MyConfig/index.html
webcontent/css/style.css/webcontent/MyConfig/css/style.css
webcontent/js/app.js/webcontent/MyConfig/js/app.js

Welcome File

index.html is the default welcome file. Navigating to /webcontent/MyConfig/ serves webcontent/index.html automatically.

The <base> Tag

For multi-file frontends with relative paths (CSS, JavaScript, images), set the <base> tag in index.html to ensure relative URLs resolve correctly:

<!DOCTYPE html>
<html>
<head>
<base href="/webcontent/MyConfig/">
<link rel="stylesheet" href="style.css">
</head>
<body>
<script src="app.js"></script>
</body>
</html>

Without the <base> tag, relative paths may resolve against the browser's address bar rather than the webcontent directory.

Angular Applications

For Angular single-page applications, set baseHref in angular.json to match the webcontent URL:

{
"projects": {
"my-app": {
"architect": {
"build": {
"options": {
"baseHref": "/webcontent/MyConfig/",
"outputPath": "../frank/src/main/configurations/MyConfig/webcontent"
}
}
}
}
}
}

This ensures:

  • Angular router generates correct URLs
  • Static assets (images, fonts) load from the correct path
  • The ng build output goes directly into the Frank configuration's webcontent folder

ClassLoader Compatibility

Webcontent serving works regardless of the classLoaderType configured for the configuration. Whether the configuration is loaded from the filesystem, the database, or a classpath JAR, the webcontent/ directory is served to the browser.

Security

The /webcontent URL is protected by default — access requires an authenticated user with any role. To restrict access to specific roles, configure:

servlet.WebContentServlet.securityRoles=IbisObserver

For public (unauthenticated) access in LOC stage, no additional configuration is needed since LOC stage disables authentication by default.

Calling Frank Adapters from the Frontend

A typical pattern is to expose adapter endpoints via <ApiListener> and call them from the frontend JavaScript:

// Example: calling a Frank adapter from webcontent
fetch('/api/my-endpoint', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ key: 'value' })
})
.then(response => response.json())
.then(data => console.log(data));

The API endpoint and webcontent are served from the same origin, so no CORS configuration is needed.