SpringMVC参数绑定之视图传参到控制器如何实现

发布时间:2023-03-06 15:41:18 作者:iii
来源:亿速云 阅读:126

SpringMVC参数绑定之视图传参到控制器如何实现

目录

  1. 引言
  2. SpringMVC参数绑定概述
  3. 视图传参到控制器的基本方式
  4. 复杂数据类型的绑定
  5. 自定义参数绑定
  6. 参数绑定的高级应用
  7. 参数绑定的异常处理
  8. 总结

引言

在SpringMVC框架中,参数绑定是一个非常重要的功能,它负责将用户从视图层(如JSP、HTML等)传递过来的数据绑定到控制器方法的参数上。SpringMVC提供了多种方式来实现参数绑定,包括基本数据类型的绑定、复杂数据类型的绑定以及自定义参数绑定等。本文将详细介绍SpringMVC中视图传参到控制器的实现方式,并通过示例代码帮助读者更好地理解和掌握这些技术。

SpringMVC参数绑定概述

SpringMVC参数绑定是指将HTTP请求中的参数(如表单数据、URL参数、请求头等)绑定到控制器方法的参数上。SpringMVC通过HandlerMethodArgumentResolver接口来实现参数绑定,该接口定义了如何将请求中的参数解析为控制器方法的参数。

SpringMVC内置了多种参数解析器,如RequestParamMethodArgumentResolverPathVariableMethodArgumentResolverModelAttributeMethodProcessor等,这些解析器负责处理不同类型的参数绑定。

视图传参到控制器的基本方式

3.1 使用@RequestParam注解

@RequestParam注解用于将HTTP请求中的参数绑定到控制器方法的参数上。它可以用于绑定基本数据类型、字符串、数组等简单类型的参数。

@Controller
public class UserController {

    @RequestMapping("/user")
    public String getUser(@RequestParam("id") int userId, Model model) {
        // 根据userId查询用户信息
        User user = userService.getUserById(userId);
        model.addAttribute("user", user);
        return "userDetail";
    }
}

在上面的示例中,@RequestParam("id")表示将HTTP请求中名为id的参数绑定到userId参数上。如果请求中没有id参数,SpringMVC会抛出MissingServletRequestParameterException异常。

3.2 使用@PathVariable注解

@PathVariable注解用于将URL中的路径变量绑定到控制器方法的参数上。它通常用于RESTful风格的URL中。

@Controller
public class UserController {

    @RequestMapping("/user/{id}")
    public String getUser(@PathVariable("id") int userId, Model model) {
        // 根据userId查询用户信息
        User user = userService.getUserById(userId);
        model.addAttribute("user", user);
        return "userDetail";
    }
}

在上面的示例中,@PathVariable("id")表示将URL中的id路径变量绑定到userId参数上。如果URL中没有id路径变量,SpringMVC会抛出MissingPathVariableException异常。

3.3 使用@ModelAttribute注解

@ModelAttribute注解用于将HTTP请求中的参数绑定到一个JavaBean对象上。它通常用于表单提交的场景。

@Controller
public class UserController {

    @RequestMapping("/user/add")
    public String addUser(@ModelAttribute("user") User user, Model model) {
        // 保存用户信息
        userService.addUser(user);
        model.addAttribute("message", "用户添加成功");
        return "userDetail";
    }
}

在上面的示例中,@ModelAttribute("user")表示将HTTP请求中的参数绑定到User对象上。SpringMVC会根据请求参数的名称自动匹配User对象的属性,并将参数值设置到对应的属性上。

3.4 使用@RequestBody注解

@RequestBody注解用于将HTTP请求体中的JSON或XML数据绑定到一个JavaBean对象上。它通常用于处理AJAX请求。

@Controller
public class UserController {

    @RequestMapping(value = "/user/add", method = RequestMethod.POST)
    public String addUser(@RequestBody User user, Model model) {
        // 保存用户信息
        userService.addUser(user);
        model.addAttribute("message", "用户添加成功");
        return "userDetail";
    }
}

在上面的示例中,@RequestBody表示将HTTP请求体中的JSON数据绑定到User对象上。SpringMVC会根据请求体的内容自动将JSON数据转换为User对象。

复杂数据类型的绑定

4.1 绑定JavaBean对象

SpringMVC支持将HTTP请求中的参数绑定到一个JavaBean对象上。SpringMVC会根据请求参数的名称自动匹配JavaBean对象的属性,并将参数值设置到对应的属性上。

public class User {
    private int id;
    private String name;
    private int age;
    // getter和setter方法
}

@Controller
public class UserController {

    @RequestMapping("/user/add")
    public String addUser(@ModelAttribute("user") User user, Model model) {
        // 保存用户信息
        userService.addUser(user);
        model.addAttribute("message", "用户添加成功");
        return "userDetail";
    }
}

在上面的示例中,User对象有三个属性:idnameage。SpringMVC会根据请求参数的名称自动将参数值设置到User对象的对应属性上。

4.2 绑定集合类型

SpringMVC支持将HTTP请求中的参数绑定到一个集合类型的参数上。SpringMVC会根据请求参数的名称自动将参数值设置到集合中。

@Controller
public class UserController {

    @RequestMapping("/user/add")
    public String addUser(@RequestParam("ids") List<Integer> ids, Model model) {
        // 根据ids查询用户信息
        List<User> users = userService.getUsersByIds(ids);
        model.addAttribute("users", users);
        return "userList";
    }
}

在上面的示例中,@RequestParam("ids")表示将HTTP请求中名为ids的参数绑定到List<Integer>类型的ids参数上。SpringMVC会根据请求参数的名称自动将参数值设置到集合中。

4.3 绑定数组类型

SpringMVC支持将HTTP请求中的参数绑定到一个数组类型的参数上。SpringMVC会根据请求参数的名称自动将参数值设置到数组中。

@Controller
public class UserController {

    @RequestMapping("/user/add")
    public String addUser(@RequestParam("ids") int[] ids, Model model) {
        // 根据ids查询用户信息
        List<User> users = userService.getUsersByIds(ids);
        model.addAttribute("users", users);
        return "userList";
    }
}

在上面的示例中,@RequestParam("ids")表示将HTTP请求中名为ids的参数绑定到int[]类型的ids参数上。SpringMVC会根据请求参数的名称自动将参数值设置到数组中。

自定义参数绑定

5.1 使用@InitBinder注解

@InitBinder注解用于自定义参数绑定的行为。它通常用于处理日期、时间等特殊类型的参数绑定。

@Controller
public class UserController {

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
    }

    @RequestMapping("/user/add")
    public String addUser(@RequestParam("birthday") Date birthday, Model model) {
        // 保存用户信息
        User user = new User();
        user.setBirthday(birthday);
        userService.addUser(user);
        model.addAttribute("message", "用户添加成功");
        return "userDetail";
    }
}

在上面的示例中,@InitBinder注解用于注册一个自定义的Date类型编辑器。SpringMVC会根据注册的编辑器将请求参数中的日期字符串转换为Date对象。

5.2 自定义Converter

Converter接口用于将一种类型的对象转换为另一种类型的对象。SpringMVC支持通过自定义Converter来实现参数绑定。

public class StringToUserConverter implements Converter<String, User> {

    @Override
    public User convert(String source) {
        User user = new User();
        user.setId(Integer.parseInt(source));
        return user;
    }
}

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToUserConverter());
    }
}

@Controller
public class UserController {

    @RequestMapping("/user/add")
    public String addUser(@RequestParam("user") User user, Model model) {
        // 保存用户信息
        userService.addUser(user);
        model.addAttribute("message", "用户添加成功");
        return "userDetail";
    }
}

在上面的示例中,StringToUserConverter实现了Converter接口,用于将字符串转换为User对象。SpringMVC会根据注册的Converter将请求参数中的字符串转换为User对象。

5.3 自定义Formatter

Formatter接口用于将字符串转换为对象,或将对象转换为字符串。SpringMVC支持通过自定义Formatter来实现参数绑定。

public class UserFormatter implements Formatter<User> {

    @Override
    public User parse(String text, Locale locale) throws ParseException {
        User user = new User();
        user.setId(Integer.parseInt(text));
        return user;
    }

    @Override
    public String print(User user, Locale locale) {
        return user.getId().toString();
    }
}

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new UserFormatter());
    }
}

@Controller
public class UserController {

    @RequestMapping("/user/add")
    public String addUser(@RequestParam("user") User user, Model model) {
        // 保存用户信息
        userService.addUser(user);
        model.addAttribute("message", "用户添加成功");
        return "userDetail";
    }
}

在上面的示例中,UserFormatter实现了Formatter接口,用于将字符串转换为User对象。SpringMVC会根据注册的Formatter将请求参数中的字符串转换为User对象。

参数绑定的高级应用

6.1 使用@SessionAttribute注解

@SessionAttribute注解用于将HTTP会话中的属性绑定到控制器方法的参数上。它通常用于跨请求共享数据。

@Controller
@SessionAttributes("user")
public class UserController {

    @RequestMapping("/user/login")
    public String login(@RequestParam("username") String username, Model model) {
        // 根据username查询用户信息
        User user = userService.getUserByUsername(username);
        model.addAttribute("user", user);
        return "userDetail";
    }

    @RequestMapping("/user/profile")
    public String profile(@SessionAttribute("user") User user, Model model) {
        // 显示用户信息
        model.addAttribute("user", user);
        return "userProfile";
    }
}

在上面的示例中,@SessionAttributes("user")表示将user属性存储在HTTP会话中。@SessionAttribute("user")表示将HTTP会话中的user属性绑定到User对象上。

6.2 使用@CookieValue注解

@CookieValue注解用于将HTTP请求中的Cookie值绑定到控制器方法的参数上。它通常用于处理Cookie数据。

@Controller
public class UserController {

    @RequestMapping("/user/profile")
    public String profile(@CookieValue("userId") int userId, Model model) {
        // 根据userId查询用户信息
        User user = userService.getUserById(userId);
        model.addAttribute("user", user);
        return "userProfile";
    }
}

在上面的示例中,@CookieValue("userId")表示将HTTP请求中名为userId的Cookie值绑定到userId参数上。如果请求中没有userIdCookie,SpringMVC会抛出MissingCookieException异常。

6.3 使用@RequestHeader注解

@RequestHeader注解用于将HTTP请求头中的值绑定到控制器方法的参数上。它通常用于处理请求头数据。

@Controller
public class UserController {

    @RequestMapping("/user/profile")
    public String profile(@RequestHeader("User-Agent") String userAgent, Model model) {
        // 根据User-Agent判断客户端类型
        if (userAgent.contains("Mobile")) {
            model.addAttribute("message", "移动端访问");
        } else {
            model.addAttribute("message", "PC端访问");
        }
        return "userProfile";
    }
}

在上面的示例中,@RequestHeader("User-Agent")表示将HTTP请求头中的User-Agent值绑定到userAgent参数上。如果请求中没有User-Agent请求头,SpringMVC会抛出MissingRequestHeaderException异常。

参数绑定的异常处理

7.1 参数绑定失败的处理

在SpringMVC中,如果参数绑定失败,SpringMVC会抛出MethodArgumentNotValidExceptionMissingServletRequestParameterException等异常。我们可以通过@ExceptionHandler注解来处理这些异常。

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MissingServletRequestParameterException.class)
    public ResponseEntity<String> handleMissingServletRequestParameterException(MissingServletRequestParameterException ex) {
        return new ResponseEntity<>("缺少必要的请求参数: " + ex.getParameterName(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        return new ResponseEntity<>("参数验证失败: " + ex.getBindingResult().getFieldError().getDefaultMessage(), HttpStatus.BAD_REQUEST);
    }
}

在上面的示例中,@ExceptionHandler注解用于处理MissingServletRequestParameterExceptionMethodArgumentNotValidException异常。当参数绑定失败时,SpringMVC会调用对应的异常处理方法,并返回相应的错误信息。

7.2 自定义异常处理器

除了使用@ExceptionHandler注解处理异常外,我们还可以通过实现HandlerExceptionResolver接口来自定义异常处理器。

public class CustomExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        if (ex instanceof MissingServletRequestParameterException) {
            return new ModelAndView("error", "message", "缺少必要的请求参数");
        } else if (ex instanceof MethodArgumentNotValidException) {
            return new ModelAndView("error", "message", "参数验证失败");
        }
        return null;
    }
}

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        resolvers.add(new CustomExceptionResolver());
    }
}

在上面的示例中,CustomExceptionResolver实现了HandlerExceptionResolver接口,用于处理MissingServletRequestParameterExceptionMethodArgumentNotValidException异常。当参数绑定失败时,SpringMVC会调用CustomExceptionResolverresolveException方法,并返回相应的错误页面。

总结

SpringMVC提供了多种方式来实现视图传参到控制器的参数绑定,包括基本数据类型的绑定、复杂数据类型的绑定以及自定义参数绑定等。通过本文的介绍,读者可以掌握SpringMVC中参数绑定的基本用法,并了解如何通过自定义参数绑定和异常处理来增强应用程序的灵活性和健壮性。希望本文能帮助读者更好地理解和应用SpringMVC框架中的参数绑定技术。

推荐阅读:
  1. springMvc前端如何使用json的方式向后台传递对象数组方法
  2. vue+springmvc导出excel数据的实现代码

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springmvc

上一篇:chkdsk无法供raw驱动器使用如何解决

下一篇:.gitignore文件作用及使用方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》