Using @RequestParam for multiple POST-Parameters

2019-08-23 02:41发布

问题:

I have a very similiar problem solved in this thread: click

To make a long story short:

I'm generating form elements dynamically with jQuery and in the result it looks like this:

<div id="XYZ-1">
<input type="text" id="XYZ-1-position" name="XYZ-1-position" style="width: 20px;"/>
<input type="text" id="XYZ-1-input" name="XYZ-1-value" style="width: 400px;"/>
</div>

<div id="XYZ-2">
<input type="text" id="XYZ-2-position" name="XYZ-2-position" style="width: 20px;"/>
<input type="text" id="XYZ-2-input" name="XYZ-2-value" style="width: 400px;"/>
</div>

So for handling one form field, I'm using just this simple @ReqeustParam:

     @RequestMapping(value = "/data", method = RequestMethod.POST)
 public String myHandler(@RequestParam("XYZ-1-value")String content, Model model) {

    model.addAttribute("dataset", content); 
            return "data"

In the Thread of the beginning of my post it is solved like:

public String controllerMethod(@RequestParam(value="myParam[]") String[] myParams){
....
}

And this works for input types with the same name:

<input type="checkbox" name="myParam[]" value="myVal1" />
<input type="checkbox" name="myParam[]" value="myVal2" />

But the difference to my problem is, that my form elements do NOT have the same name - each has an individual Name.

So my question is how I can handle these individual post-parameters in a single handler in my controller.

Thanks in advance

回答1:

The pattern I like for this sort of thing is to have a form bean that contains a list (or map) of beans that wrap my individual values. So, I would have:

public class FormBean {
  private List<FormItem> items;
  //...getters/setters
}

and

public class FormItem {
  private String val1;
  private Integer val2;
  //...getters/setters
}

And controller method:

@RequestMapping()
public String default(@ModelAttribute("formBean") FormBean formBean) {
   // Blah blah blah
}

On the view-side, the mapping name would look like:

<input type="text" name="formBean.items[0].val1" />
<input type="text" name="formBean.items[0].val2" />

Or you could use the JSTL tags:

<form:form modelAttribute="formBean">
  <form:input path="items[0].val1" />
  <form:input path="items[0].val2" />
</form:form>

This way everything is nice and packaged up, and its really easy on the view-side to parse the name when adding new rows.

EDIT

Simple example on auto-placing models into session (I am typing this from memory...please validate on your own)

Controller:

@Controller
@RequestMapping("/form")
@SessionAttributes({"formBean"})
public class FormController {
    @RequestMapping()
    public String defaultView(@ModelAttribute("formBean") FormBean formBean, Model uiModel) {
        // Do something...add anything to the uiModel that you want to use in your form...you should not need to add formBean as it should auto-matically get put into session now with the @SessionAttributes annotation
        // Also to note, if you set the "formBean" attribute on the Model or ModelAndView, it will replace the one in Session.  Also, you can add the SessionStatus to one of your methods and use its .setComplete() method to indicate you are done with the session...you usually do this after you know the user is done with the application so the session can get cleaned up.
    }

    @RequestMapping("/someOtherPath")
    public String someOtherHandler(@ModelAttribute("formBean") FormBean formBean, Model uiModel) {
        // Do something...again, formBean should be either created or out of session
    }

    @ModelAttribute("formBean")
    private FormBean createFormBean() {
        // This method can be named anything, as long as it returns a FormBean, has the @ModelAttribute named on it, and has no arguments.  Use this method to populate your FormBean when its created (set defaults and such).
        return new FormBean();
    }
}


回答2:

First, you don't need the [] - it will work without it. But if the name of each checkbox differs, then you need a separate @RequestParam for each checkbox.