The pragmatic, compact, fast library to build HTML Forms in MVC-Framworks.
The form-handling support in current java MVC frameworks is very basic. jFormChecker tries to fill this gap by providing these features:
- central form-definition for reuse and separation of concerns
- handling the request-response loop for forms
- handling error-messages and error-highlighting of the label
- correct tab-order
- pre-fillments of form-elements
- automatically syntactical correct HTML (5) with label and "label-for"
- pre-fillments of user-input after submit
- max-lenght constraint on every element to avoid security issues
- easy validation, easy custom validation
- all standard form fields and more (date-input)
- Very compact output in sourcecode
- prebuild Bootstrap Styles
- prebuild ajax handling
- Avoiding a lot of boilerplate code
- Translateable error-messages.
jFormChecker is for java what Symfony-Forms is for PHP or Rose::HTML for Perl.
The concept is simple:
-
Define a form with every element in it
-
Let the central "FormChecker" class handle the validation and processing
-
use a simple tag in the output
Example Form-Definiton:
public class ExampleForm extends FormCheckerForm {
public ExampleForm() {
add(TextInput.build("firstname").
setDescription("Your Firstname").
setCriterias(Criteria.accept("John")));
add(TextInput.build("lastname").
setDescription("Your lastname:").
setCriterias(Criteria.accept("Doe")));
}
}
Controller code:
FormChecker fc = FormChecker.
build("id", request, new ExampleForm()).
run();
model.add("fc", fc);
Example template output:
...
<h1>The form</h1>
${fc.completeForm}
<p>Lorem ipsum</p>
...
(yes it is that simple!)
Alternativly you can output the elements manually if you need more control over your html:
...
<h1>The form</h1>
<div class="lastnameedit">
${fc.elements.lasntame.label}
${fc.elements.lasntame.inputTag}
</div>
...
- If you don't specify a description, the label will be dismissed automatically
- Specify a help-text to display an aria-compliance description. (With nice bootstrap style)
- Use a custom validator by injecting per "setValidator". This can be used to validate with bean-validation. (Did not add bean validation because this is a huge dependency)
- easy ajax handling
- Specify a message source to translate error-messages. Adapter for ResourceBundle available.
...
<dependency>
<groupId>de.cyclon-softworx</groupId>
<artifactId>jformchecker</artifactId>
<version>0.0.6</version>
</dependency>
...
0.0.1 2016/02/16 Initial release
0.0.2 2016/09/24 Fix bug in min/max criteria
0.0.3 2016/09/29 Major refactorings , error-Messages can be translated
0.0.4 2016/10/03 More control over HTML rendering
0.0.5 2016/10/04 Simplified Error-Handling, new wrapper for form-fields, working properties
0.0.6 2016/10/05 Control over required mark and label composition
Without jFormChecker, html forms must be constructed manually in the template.
Example-Definition of a form in spring-mvc:
public class Adress {
@Size(min=2, max=30)
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
...
}
Example-Definition of a form in html (spring-forms)
<form:form class="form-horizontal" method="post"
modelAttribute="userForm" action="${userActionUrl}">
<form:hidden path="id" />
<spring:bind path="name">
<div class="form-group ${status.error ? 'has-error' : ''}">
<label class="col-sm-2 control-label" label-for="name">Name</label>
<div class="col-sm-10">
<form:input path="name" type="text" class="form-control"
id="name" placeholder="Name" />
<form:errors path="name" class="control-label" />
</div>
</div>
</spring:bind>
<spring:bind path="email">
<div class="form-group ${status.error ? 'has-error' : ''}">
<label class="col-sm-2 control-label" label-for="email">Email</label>
<div class="col-sm-10">
<form:input path="email" class="form-control"
id="email" placeholder="Email" />
<form:errors path="email" class="control-label" />
</div>
</div>
</spring:bind>
<spring:bind path="country">
<div class="form-group ${status.error ? 'has-error' : ''}">
<label class="col-sm-2 control-label" label-for="country">Country</label>
<div class="col-sm-5">
<form:select path="country" class="form-control">
<form:option value="NONE" label="--- Select ---" />
<form:options items="${countryList}" />
</form:select>
<form:errors path="country" class="control-label" />
</div>
<div class="col-sm-5"></div>
</div>
</spring:bind>
...
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn-lg btn-primary pull-right">Add
</button>
</div>
</div>
</form:form>
As you can see, especially on the template side, you have to enter a lot of stuff for basic highlighting errors...
Thanks to Arman Sharif for his work on jreform.sourceforge.net and the great Critera Classes