75307

Freemarker - select option not saved

Question:

I have a form in my ftl file and one part of this is this select:

<select id=”${spring.status.expression}” value=”${spring.status.expression}”> <$assign value=(spring.status.value!””) /> <option value=”A” >A</option> <option value=”B” >B</option> <option value=”C” >C</option> </select>

It is assigned to A by default what is fine, but when I click option B and then click submit, B won't stay selected, because it will be assigned default value A. How can I fix it ? I see some answers on stackoverflow but in php which I don't use.

Answer1:

Let's build a common ground:

First, create a POJO to hold the information of your form

public class Foo { private String bar; // public getter and setter ommitted }

Now, in your Spring MVC controller, put the instance you want to bind to into Spring MVC's model. This is done by annotating a method using @ModelAttribute which returns the required instance. Typically, you'll read current values for your form from a database - For the sake of brevity I'm just creating a new model instance here:

@Controller public class MyController { @ModelAttribute public Foo readFooFromDB() { // read the current option from the DB or simply create a default option here Foo f = new Foo(); f.setBar("B"); return f; } }

Spring will now put the Foo instance into it's model using the name foo. You could change that name by assigning another value to your @ModelAttribute annotation.

Next add a @RequestMapping method to your controller, which will forward to your Freemarker View:

@Controller public class MyController { .... @RequestMapping("/request/path/") public String process() { return "mytemplate"; } }

Finally, in your template use Spring's FreeMarker macros to render a form including your select:

<#import "spring.ftl" as spring /> <form action="/request/path/"> <#assign options = { "A": "Option A", "B": "Option B", "C": "Option C" } /> <@spring.formSingleSelect path="foo.bar" options /> <input type="submit" value="Send" /> </form>

The form should now render the current value of the your Foo instance ("B" in our case) as the selected option.

So far, so good. Last step (the one you were originally asking for): If you submit your form, Spring should bind the submitted bar value to your foo instance. To achieve this, simply add the instance as a parameter to your request method and annotate it again with @ModelAttribute. Note that the name of the parameter is important here and must match the name of the instance in Spring's model - foo in our case:

@Controller public class MyController { .... @RequestMapping("/request/path/") public String process( @ModelAttribute Foo foo) { // Binds all submitted request params to matching properties of your foo instance // validate your foo instance and probably save it in a DB return "mytemplate"; } }

Voilá

Recommend

  • Authlogic and password and password confirmation attributes - inaccessible?
  • How to get page to update with new records from server without a route change?
  • Please let me know how does > operator works in C? [closed]
  • Need to catch ui.router state and its url when the url changes
  • ElementListUnion - Simple xml giving duplicate annotation for generic list objects
  • Karate vs Spock
  • Hibernate with Primary Key in PostgreSQL with camelCase Format
  • Objective C difference between self.variable and variable assignments
  • Problem obtaining entities with uniqueidentifier primary key
  • How to add an object in my collection by only using add method? [closed]
  • Validity Method for Reference Classes
  • Using an enum contained in a Cloud Endpoint model on a Android client
  • HALF_PTR Windows data type
  • What's wrong with my datatrigger binding?
  • Create registry key in 32-bit hive on x64 PC using Installshield 2012 LE - Avoid redirection
  • Can XOR be expressed using SKI combinators?
  • Configuring multiple DefaultJmslistenercontainerfactory
  • F#: In which memory area is the continuation stored: stack or heap?
  • Most efficient way to move table rows from one table to another
  • JPA flush vs commit
  • What is the purpose of TaskExecutor in spring?
  • Eloquent paginate function in Slim 3 project using twig
  • Do I need to reset a Perl hash index?
  • How to access EntityManager inside Entity class in EJB3
  • Align navbar back button on right side
  • Window Size for Mac application
  • DirectX11 ClearRenderTargetViewback with transparent buffer?
  • Why is the timeout on a windows udp receive socket always 500ms longer than set by SO_RCVTIMEO?
  • Web-crawler for facebook in python
  • AT Commands to Send SMS not working in Windows 8.1
  • VB.net deserialize, JSON Conversion from type 'Dictionary(Of String,Object)' to type '
  • Windows forms listbox.selecteditem displaying “System.Data.DataRowView” instead of actual value
  • Unit Testing MVC Web Application in Visual Studio and Problem with QTAgent
  • JTable with a ScrollPane misbehaving
  • apache spark aggregate function using min value
  • unknown Exception android
  • Sorting a 2D array using the second column C++
  • failed to connect to specific WiFi in android programmatically
  • How to push additional view controllers onto NavigationController but keep the TabBar?
  • How can I use threading to 'tick' a timer to be accessed by other threads?