Request Parameter Handling in SpringMVC
1. Retrieving Request Parameters via HttpServletRequest
SpringMVC controllers can access request parameters through the HttpServletRequest object.
<form action="${pageContext.request.contextPath}/auth/login" method="get">
Username: <input type="text" name="username"/> <br/>
Password: <input type="password" name="password"/> <br/>
<input type="submit" />
</form>
@Controller
@RequestMapping("/auth")
public class AuthenticationController {
@RequestMapping(value = "/loginProcess")
public String handleLogin(HttpServletRequest request) {
// Extract parameters from HttpServletRequest
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("Username: " + username + " Password: " + password);
return "success";
}
}
2. Retrieving Request Parameters via Controller Method Parameters
Controller method parameters can directly map to request parameters when their names match.
<form action="${pageContext.request.contextPath}/auth/login" method="get">
Username: <input type="text" name="username"/> <br/>
Password: <input type="password" name="password"/> <br/>
<input type="submit" />
</form>
@Controller
@RequestMapping("/auth")
public class AuthenticationController {
@RequestMapping(value = "/loginProcess")
// Parameters directly map to request parameters
public String handleLogin(String username, String password) {
System.out.println("Username: " + username + " Password: " + password);
return "success";
}
}
Important: Method parameter names must match the input field names in the HTML form.
3. Using @RequestParam Annotation
The @RequestParam annotation maps request parameters to handler method parameters, allowing parameter renaming and configuration of required status and default values.
Syntax: @RequestParam(value="paramName", required=true|false, defaultValue="")
- value: Name of the request parameter
- required: Whether the parameter is required (default: true)
- defaultValue: Default value if parameter is not provided
<form action="${pageContext.request.contextPath}/auth/login" method="get">
Password: <input type="password" name="pwd"/> <br/>
<input type="submit" />
</form>
@Controller
@RequestMapping("/auth")
public class AuthenticationController {
@RequestMapping(value = "/loginProcess")
public String handleLogin(
@RequestParam(value = "username", required = true, defaultValue = "guest") String user,
@RequestParam(value = "pwd") String password) {
System.out.println("Username: " + user + " Password: " + password);
return "success";
}
}
4. Additional Parameter Binding Annotations
@RequestHeader Annotatino
Maps request header informtaion to controller method parameters.
Properties: value, required, defaultValue (same as @RequestParam)
@CookieValue Annotation
Maps cookie data to controller method parameters.
Properties: value, required, defaultValue (same as @RequestParam)
5. Retrieving Request Parameters via POJO Objects
SpringMVC can bind request parameters to Plain Old Java Objects (POJOs) when parameter names match object properties.
Example POJO structure:
public class UserProfile {
// Simple property
private String username;
// Nested object
private PersonalDetails details;
// Array
private String interests[];
// List
private List<String> roles;
// Map
private Map<String, Organization> organizations;
// Getters and setters omitted
}
HTML form for complex POJO binding:
<form action="${pageContext.request.contextPath}/user/create" method="post">
Username: <input type="text" name="username" value="johndoe"/> <br/>
Age: <input type="text" name="details.age" value="30"/> <br/>
Weight: <input type="text" name="details.weight" value="75"/> <br/>
Interest 1: <input type="checkbox" name="interests" value="reading" checked>Reading
<input type="checkbox" name="interests" value="sports" checked>Sports <br/>
Role 1: <input type="text" name="roles[0]" value="admin"/> <br/>
Role 2: <input type="text" name="roles[1]" value="user"/> <br/>
Org1 Name: <input type="text" name="organizations['org1'].name" value="TechCorp"/> <br/>
Org1 Size: <input type="text" name="organizations['org1'].size" value="large"/> <br/>
<input type="submit" />
</form>
Controller implementation:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/create")
public String createUserProfile(UserProfile profile) {
// Access properties
String username = profile.getUsername();
int age = profile.getDetails().getAge();
String[] interests = profile.getInterests();
// Process the profile data
System.out.println("Username: " + username);
System.out.println("Age: " + age);
System.out.print("Interests: ");
for(String interest : interests) {
System.out.print(interest + " ");
}
// Process list and map similarly
return "success";
}
}
Supporting classes:
public class PersonalDetails {
private int age;
private int weight;
// Getters and setters omitted
}
public class Organization {
private String name;
private String size;
// Getters and setters omitted
}
This approach provides a clean way to handle complex forms with nested objects, arrays, lists, and maps.