A Java web framework in the spirit of WebObjects

Free and open source. Components pair an HTML template with a Java class, and engifer apps deploy alongside your existing WO apps.

Inbox.html
<h2>Hello <wo:str value="$user.name" /></h2>

<wo:if condition="$hasMessages">
	<ul>
		<wo:repetition list="$messages" item="$message">
			<li>
				<wo:link action="$openMessage">
					<wo:str value="$message.subject" />
				</wo:link>
			</li>
		</wo:repetition>
	</ul>
</wo:if>

Most web frameworks make you translate: state into URLs, clicks into routes, pages into JSON and back. In engifer you write the page, and the framework keeps track of the rest.

  • A click is a method call

    Bind a link to a Java method. engifer remembers the page it was on, so the method runs with all its state in place. No route, no form parsing, no IDs in hidden fields.

  • Templates are HTML

    Plus a few dynamic tags: <wo:str>, <wo:if>, <wo:repetition>. Bindings like $user.name resolve against your component's plain getters and fields.

  • Components all the way down

    A page is a component. So is a menu, a table or a form row. Each is a template and a class; they nest, and take bindings like HTML tags take attributes.

  • Update part of a page

    Wrap something in an update container and re-render only that, from the same component action. No front-end build.

  • Mistakes show up where they happen

    Misspell a key and the error renders in place, in the page, with a suggestion: "Did you mean 'title'?" Templates reload on every request.

  • Plain Java

    Java 25 and a standard Maven project. Apps deploy beside existing WebObjects apps, under wotaskd and JavaMonitor.

  • Getting started

    From an empty folder to a running app with a page and a component action, in ten minutes.

  • Templating

    Components, dynamic tags and bindings: what you can write in a template.

  • For WebObjects developers

    What's the same, what's different, and deploying alongside WO apps.

From the blog