blob: 28fcf53bcb5baaa0419c27f26892f66fbfa552bb [file] [view]
---
layout: default
title: Model Driven
parent:
title: Core Developers
url: index
---
# Model Driven
{:.no_toc}
* Will be replaced with the ToC, excluding a header
{:toc}
Struts 2 does not have "forms" like Struts 1 did. In Struts 2 request parameters are bound directly to fields
in the actions class, and this class is placed on top of the stack when the action is executed.
If an action class implements the interface `org.apache.struts2.ModelDriven` then it needs to return an object
from the `getModel()` method. Struts will then populate the fields of this object with the request parameters,
and this object will be placed on top of the stack once the action is executed. Validation will also be performed
on this model object, instead of the action. Please read about [VisitorFieldValidator Annotation](visitor-field-validator-annotation)
which can help you validate model's fields.
The model is also the target of `@StrutsParameter` authorization: its members are populated from the request without
requiring the annotation, on every input channel. Shape the model as a request DTO holding only the fields the action
intends to accept, not as a domain or persistence entity. See
[StrutsParameter Annotation](struts-parameter-annotation.html#modeldriven-actions) for the full rules.
{:.alert .alert-warning}
## Interceptor
To use `ModelDriven` actions, make sure that the [Model Driven Interceptor](model-driven-interceptor) is applied
to your action. This interceptor is part of the default interceptor stack `defaultStack` so it is applied to all actions
by default.
## Example
Action class:
```java
public class ModelDrivenAction implements ModelDriven {
public String execute() throws Exception {
return SUCCESS;
}
public Object getModel() {
return new Gangster();
}
}
```
Gangster class (model):
```java
public class Gangster implements Serializable {
private String name;
private int age;
private String description;
private boolean bustedBefore;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isBustedBefore() {
return bustedBefore;
}
public void setBustedBefore(boolean bustedBefore) {
this.bustedBefore = bustedBefore;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
```
JSP for creating a Gangster:
```jsp
<s:form action="modelDrivenResult" method="POST" namespace="/modelDriven">
<s:textfield label="Gangster Name" name="name" />
<s:textfield label="Gangster Age" name="age" />
<s:checkbox label="Gangster Busted Before" name="bustedBefore" />
<s:textarea cols="30" rows="5" label="Gangster Description" name="description" />
<s:submit />
</s:form>
```