вівторок, 1 вересня 2009 р.

Spring MVC: не очевидное

Есть ряд совершенно не очевидных вещей внутри Spring MVC, например
1) чтобы форма работала и обрабатывалась нормально нужно, чтобы у нее обязательно были прописаны id и name. и то, и другое, одновременно. иначе возможны сбои
2) чтобы механизм автоматического binding'а элементов формы работал, нужно, чтобы имена полей формы совпадали с именами полей класса, в который они байндятся. Т.е.

Java class:
public class BackingBean {
private long id;
private String name;

public void setId(long id) {
this.id = id;
}

public long getId() {
return id;
}

public void setName(String name) {
this.name = name;
}

public long get() {
return name;
}
}

JSP:
<form id="foo" name"foo" method="post" action="/somewhere-on-server">
<spring:bind path="backingBean.id">
<input type="text" name="id"/>
</spring:bind>
<spring:bind path="backingBean.name">
<input type="text" name="name"/>
</spring:bind>
</form>

5) метод formBackingObject всегда создает новый экземпляр объекта, если его перегрузить таким образом, чтобы он делал проверку наличия уже созданного объекта в аттрибутах запроса, это позволит уменьшить количество объектов в памяти и сократить время, необходимое для создания этого объекта
4) в Spring Portlet MVC метод onSubmitRender вызывается только в том случае, когда состояние формы было изменено. поэтому в этом методе нельзя реализовывать обработку RenderRequest's, общих для всего контроллера. для обработки общих запросов можно использовать методы showForm, handleRenderRequestInternal, handleRenderRequest
p.s. а в многом остальном Spring MVC прекрасен, как и весь Spring пожалуй