SpringMVC - 个人对@ModelAttribute的见解 和 一些注入参数、返回数据的见解

因为对modelattribute这个注解不了解,所以在网上搜寻一些答案,感觉还是似懂非懂的,所以便自己测试,同时还结合网上别人的答案;最后得出我自己的见解和结果,不知道正确否。同时还进行了一些注入参数的测试.

本人也是菜鸟一枚,在学习springmvc,下面的结果都是我自己测试得出来的,我也不能保证准确性,所以你发现有错误,欢迎指出。

user是我创建的一个类,用于测试的,就四个属性,id、username、password、time

@ModelAttribute

1.    modelattribute注解在方法的前面

因为有modelattribute注解,会创建对象放入model。最后这个user会放入作用域

如果注解后面跟(名字),那么创建的对象,名字会是注解后面指定的名字。

//每次在调用这个controller的其他的方法前,这个方法都会先执行
    @ModelAttribute
    public User hello(){
        return new User(1,"a","b",new Date());
    }

2.  modelattribute注解在参数前面

这样的注解,首先springmvc,会先去model找有没有user2这个对象,如果有,注入到user这个参数中,并且最后返回jsp的时候,user这个对象,会以名字user2放入作用域。

    public String test6(@ModelAttribute("user2") User user){

  

3.  sessionAttributes和modelattribute 同时使用,而且名字一样,

比如都是user2的话,那么sessionAttributes会去session找user2,找不到就会报错。(如果没有user2的话,会报错,解决办法:创建一个方法,return new user,并且方法上面使用modelattribute注解。)

如果找到了user2,就注入到user参数中。

最后的user会以user2的名字,放入session,而不是request作用域。

SpringMVC注入参数

springmvc在注入参数方面很智能。

一般参数提交有 form表单提交方式和url后跟?加参数的形式。还有ajax提交的数据。(不论何种形式提交的参数,都是 名字 = 值,键值对的形式,springmvc就是根据key去进行匹配,匹配到进行注入)

如下面的这个代码测试。我发起请求,url是:http://localhost/springmvc/upload/test4?username=天气&password=123&str=aaaaa。

测试结果是,username和password都注入到了user中,和str也对应的注入到了str中。

注:这个测试中,我发现,对象user会被springmvc自动存入作用域request,而str这不会。

    @RequestMapping(value = "/test4")
    public String test4(User user,String str){
        user.setUsername("啊啊");
        System.out.println(str);
        return "upload";
    }

就这个上面测试的结果,我感觉已经足够平时开发中的大多数提交参数的需求了。

有时候比如,我们想隐藏后台真实参数的名字,就可以用注解@RequestParam来注入参数。

如下代码测试,我请求的url是:http://localhost/springmvc/upload/test4?username=天天&password=123&min=1

结果是:username和password都注入user了,min注入max了。   required的意思是,这个参数是否必须,如果是true的话,同时前台并没有传递这个参数,那么会报错。

    @RequestMapping(value = "/test4")
    public String test4(User user,@RequestParam(value = "min",required = true)String max){
        user.setUsername("啊啊");
        System.out.println(max);
        return "upload";
    }

  

有时候,我们想让参数不要跟在?的后面,保持url链接的干净。就可以使用@PathVariable来注入参数

如下代码测试,我请求的url是:http://localhost/springmvc/upload/test2/aaaaaa

结果是,test2后面的值(aaaaaa)注入abc中。

注:这个代码返回的页面上,有个${str},本来这个${str}是我做另外的测试用的,但是我发现在这个测试中,url中的值aaaaa,也同时放入了request中,在前台jsp页面是能够显示的。但是我在方法中通过request.getParameter和getAttribute尝试去取这个str,却显示结果为空。不明白springmvc是怎么做的。。。。。。  不过我还是需要记住这一点:PathVariable的值也会被放入作用域request中。

    @RequestMapping("/test2/{str}")
    public String test2(@PathVariable("str")String abc) {
        System.out.println(abc);
        return "upload";
    }

  

时间: 2024-10-01 12:40:41

SpringMVC - 个人对@ModelAttribute的见解 和 一些注入参数、返回数据的见解的相关文章

SpringMVC返回数据到视图

通过ModelAndView对象返回数据到视图 在SpringMVC中有一个ModelAndView对象,如其名,Model代表模型,View代表视图,这个名字就很好地解释了该类的作用--它用来存储模型数据以及显示该数据的视图名称.在控制器中调用完模型层处理完用户的请求后,我们可以把结果数据存储在该对象的model属性中,把要返回的视图信息存储在该对象的view属性中,然后让把ModelAndView对象返回给SpringMVC框架.框架则会通过调用Spring配置文件中定义的视图解析器,对该对

springMvc源码学习之:spirngMvc获取请求参数的方法

一.      通过@PathVariabl获取路径中的参数 @RequestMapping(value="user/{id}/{name}",method=RequestMethod.GET) public String printMessage1(@PathVariable String id,@PathVariable String name, ModelMap model) { System.out.println(id); System.out.println(name);

springmvc在使用@ModelAttribute注解获取Request和Response会产生线程并发不安全问题(转)

springmvc在获取Request和Response有很多方式:具体请看:https://www.cnblogs.com/wade-luffy/p/8867144.html 产生线程问题的代码如下: public class BaseController { protected HttpServletRequest request; protected HttpServletResponse response; protected HttpSession session; @ModelAtt

SpringMVC + Mybatis bug调试 SQL正确,查数据库却返回NULL

今天碰到个bug,有点意思 背景是SpringMVC + Mybatis的一个项目,mapper文件里写了一条sql 大概相当于 select a from tableA where b = "123" 这样的级别 然后不管传进去的是什么 数据库里有没有 都会返回null 第一反应是sql语句写错了,比如把1和小写L弄混了之类的,传给sql的参数里有奇怪的空格等等 于是打开debug log 拿到传给sql的preparedStatement 和对应的参数 复制到console里自己查

SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题

原因分析 首先我们来看下Spring mvc 中文件上传的配置 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="UTF-8" /> <property nam

SpringMVC传递参数和获取参数以及返回数据

1.传递form表单,参数接收到对象,name和对象属性对应上即可:   2.springmvc不能直接通过form表单传递多个对象的list集合,要么采用ajax传递,要么采用封装了list属性的bean来接收,jsp页面的name和list的name对应,采用下标区分       3.传递ajax获取数据,ajax可以方便传递多个对象list   4.获取路径参数:  

SpringMVC中redirect跳转后如何保存Model中的数据?

@RequestMapping(value = "delete-user", method = RequestMethod.POST) public String deleteUser(Long[] userId, RedirectAttributes modelMap) { userService.deleteUser(userId); modelMap.addFlashAttribute("resultMsg", "删除成功"); retur

SpringMVC服务端返回数据

下面介绍controller向jsp页面传递数据的几种方式 请求转发 1.在学习MVC之前,用request的setAttribute方法传递数据 @RequestMapping("/response") public ModelAndView sendData01(HttpServletRequest request) { ModelAndView mav = new ModelAndView("result"); request.setAttribute(&qu

SpringMVC环境下实现的Ajax异步请求(JSON格式数据)

一 环境搭建 首先是常规的spring mvc环境搭建,不用多说,需要注意的是,这里需要引入jackson相关jar包,然后在spring配置文件"springmvc-servlet.xml"中添加json解析相关配置,我这里的完整代码如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schem