SpringMVC入门第二部分

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC入门第二部分相关的知识,希望对你有一定的参考价值。

SpringMVC入门第二部分

数据带给页面

方法1: 在方法上传入原生的request和session

userController 类:

@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(HttpSession session, HttpServletRequest httpServlet)
    {
         session.setAttribute("msg1","你好session");
         httpServlet.setAttribute("msg2","你好erquest");
        return "Success";
    }
}

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Success</title>
</head>
<body>
request域: ${requestScope.msg2}
session域: ${sessionScope.msg1}
</body>
</html>

在这里插入图片描述


方法2: 在方法里面传入map,model或者modelMap—给request域中带数据

Map方式:

@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(Map<String,Object> map)
    {
       map.put("msg","你好");
        return "Success";
    }
}

model方式:

@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(Model model)
    {
         model.addAttribute("msg","你好");
        return "Success";
    }
}

modelMap方式:

@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(ModelMap model)
    {
         model.addAttribute("msg","你好");
        return "Success";
    }
}

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Success</title>
</head>
<body>
request域: ${requestScope.msg}
</body>
</html>

在这里插入图片描述


map,modelmap,model继承关系图

在这里插入图片描述

给这些参数里面保存的所有数据最终都会放在请求域中,可以在页面获取

Map,model,modelMap最终都是BindingAwareModelMap在工作,相当于给BindingAwareModelMap中保存的数据都会被放在请求域中


方法返回值为ModelAndView

在这里插入图片描述

     @RequestMapping("/dhy")
    public ModelAndView test02()
     {
         //之前的返回值我们就叫视图名:视图名视图解析器会帮我们最终拼串得到页面的真实地址
         //ModelAndView mv=new ModelAndView("Success");
         ModelAndView mv=new ModelAndView();
         mv.setViewName("Success");
          mv.addObject("msg","你好");
         return mv;
     }

在这里插入图片描述


给session域中带数据。SpringMVC中提供了一种临时给Session域中保存数据的方式

使用一个注解@SessionAttributes(只能标注在类上)

在这里插入图片描述

//可以使用数组形式,key是msg,msg1,msg2的都会放入session域中
@SessionAttributes(value = {"msg","msg1","msg2"})
@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(HttpSession session, HttpServletRequest httpServlet)
    {
         session.setAttribute("msg1","你好session");
         httpServlet.setAttribute("msg2","你好erquest");
        return "Success";
    }
    @RequestMapping("/dhy")
    public ModelAndView test02()
     {
         //之前的返回值我们就叫视图名:视图名视图解析器会帮我们最终拼串得到页面的真实地址
         //ModelAndView mv=new ModelAndView("Success");
         ModelAndView mv=new ModelAndView();
         mv.setViewName("Success");
          mv.addObject("msg","你好");
         return mv;
     }
}

在这里插入图片描述

@SessionAttributes(types = {String.class,Integer.class})
@Controller
public class userController {
    @RequestMapping("/hello")
    public String show(HttpSession session, HttpServletRequest httpServlet)
    {
         session.setAttribute("msg1","你好session");
         httpServlet.setAttribute("msg2","你好erquest");
        return "Success";
    }
    @RequestMapping("/dhy")
    public ModelAndView test02()
     {
         //之前的返回值我们就叫视图名:视图名视图解析器会帮我们最终拼串得到页面的真实地址
         //ModelAndView mv=new ModelAndView("Success");
         ModelAndView mv=new ModelAndView();
         mv.setViewName("Success");
          mv.addObject("msg","你好");
         return mv;
     }
}

后来推荐@SessionAttributes就别用了,可能会引发异常,给session中存放数据建议使用原生API


@ModelAttribute注解

问题演示

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>小朋友</title>
</head>
<body>

<form action="book" method="post">
    价格:<input type="text" name="price"/><br>
    <input type="submit" value="提交">
</form>
</body>
</html>
@Controller
public class BookController {

     @RequestMapping("/book")
    public String ShowBook(Book book)
    {
        System.out.println(book);
        return "Success";
    }
}

这里实际上是springMVC创建了一个Book对象,然后将对应的属性通过set方法赋值给该对象

如果我们要完成的操作是对数据库中保存的一条图书记录进行全更新,那么使用这种方法时,就会有问题

例如:我们在页面对图书进行修改时,无法修改图书的名字,因此new出来的Book对象的name值一定为null,如果把该对象放入数据库中,那么book的名字就会变成null,覆盖掉了原本图书的名字


解决方法----@ModelAttribute的使用方式之一

如果是使用从数据库中拿出来的准备好的对象来封装请求参数,那么如果请求参数中不包括对象的全部变量值,那么剩余变量的值就依旧采用数据库中拿出来的对象自身的值,这样就不会造成为null的现象

在这里插入图片描述
在这里插入图片描述

@Controller
public class BookController {

     @RequestMapping("/book")
     //告诉SpringMVC不要new这个book了,而是使用我刚才保存的book
     //即用我刚才从数据库中查找出来的book
    public String ShowBook(@ModelAttribute("book") Book book)
    {
        System.out.println(book);
        return "Success";
    }


@ModelAttribute
    void BookFromDao(Map<String,Object> map)
    {
    //模拟从数据库查出来的book
         Book book=new Book("大忽悠自传",19);
        System.out.println("数据库中查到的图书信息:"+book);
        map.put("book",book);
    }
}

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>小朋友</title>
</head>
<body>

<form action="book" method="post">
    价格:<input type="text" name="price"/><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

在这里插入图片描述

在这里插入图片描述
如果由springmvc来New一个新的book对象,那么这里的name就为null


@ModelAttribute的原理

在这里插入图片描述

在这里插入图片描述


@ModelAttribute标注在方法上面的另外一个作用

在这里插入图片描述


SpringMVC确定POJO自定义对象值的三步

在这里插入图片描述

自定义类型对象的赋值流程描述,以及@SessionAttributes注解可能引发的异常

给自定义类型赋值,主要在于attrName的值,首先会把attrName作为key值去隐含模型中寻找key==attrName的键,然后将key对应的值进行赋值

在这里插入图片描述


举例1:在给Book book对象赋值前,不加@ModelAttribute注解,那么会将参数类型首字母小写,即Book—>book,去隐含模型中寻找对应的key值

@Controller
public class BookController {

     @RequestMapping("/book")
    public String ShowBook(Book book,Map<String,Object> map)
    {
        System.out.println(book);
        return "Success";
    }
@ModelAttribute
    void BookFromDao(Map<String,Object> map)
    {
        Book book=new Book("大忽悠自传",19);
        System.out.println("数据库中查到的图书信息:"+book);
        map.put("book",book);//放入隐含模型中,key==book
    }
}

在这里插入图片描述


举例2:通过@ModelAttribute(“haha”)来指定attrName的值

@Controller
public class BookController {

     @RequestMapping("/book")
     //告诉SpringMVC不要new这个book了,而是使用我刚才保存的book
     //即用我刚才从数据库中查找出来的book
    public String ShowBook(@ModelAttribute("haha") Book book,Map<String,Object> map)
    {
        System.out.println(book);
        return "Success";
    }


@ModelAttribute
    void BookFromDao(Map<String,Object> map)
    {
        Book book=new Book("大忽悠自传",19);
        System.out.println("数据库中查到的图书信息:"+book);
        map.put("haha",book);//放入隐含模型中,key==haha
    }
}

在这里插入图片描述


举例3:attrName=haha,隐含模型中只有key==book的值,那么会去session域中寻找,@SessionAttributes(value=“haha”),但是session中没有键为haha的值,这样会报异常

@SessionAttributes("haha")
@Controller
public class BookController {

     @RequestMapping("/book")
     //告诉SpringMVC不要new这个book了,而是使用我刚才保存的book
     //即用我刚才从数据库中查找出来的book
    public String ShowBook(@ModelAttribute("haha") Book book,Map<String,Object> map)
    {
        System.out.println(book);
        return "Success";
    }

@ModelAttribute
    void BookFromDao(Map<String,Object> map)
    {
        Book book=new Book("大忽悠自传",19);
        System.out.println("数据库中查到的图书信息:"+book);
        map.put("book",book);//放入隐含模型中,key==haha
    }
}

在这里插入图片描述


举例5:@ModelAttribute会把方法运行后的返回值也放入隐含模型中,key就是返回值类型小写

@Controller
public class BookController {
     @RequestMapping("/book")
    public String ShowBook(Book book)
    {
        System.out.println(book);
        return "Success";
    }
@ModelAttribute
    Book BookFromDao()
    {
        Book book=new Book("大忽悠自传",19);
        System.out.println("数据库中查到的图书信息:"+book);
        return book;
    }
}

在这里插入图片描述


举例6:把返回值放入隐含模型,但是不使用默认的返回值小写作为key,而是自己指定

@Controller
public class BookController {
     @RequestMapping("/book")
    public String ShowBook(@ModelAttribute("haha") Book book)
    {
        System.out.println(book);
        return "Success";
    }
@ModelAttribute("haha")
    Book BookFromDao()
    {
        Book book=new Book("大忽悠自传",19);
        System.out.println("数据库中查到的图书信息:"+book);
        return book;
    }
}

在这里插入图片描述



举例7: 隐含模型中找不到对应的key,session中也找不到,那么会自动创建一个新对象

@Controller
public class BookController {
     @RequestMapping("/book")
    public String ShowBook(@ModelAttribute("haha") Book book)
    {
        System.out.println(book);
        return "Success";
    }
@ModelAttribute
    Book BookFromDao()
    {
        Book book=new Book("大忽悠自传",以上是关于SpringMVC入门第二部分的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC入门第三部分

Spring MVC入门第1天--框架说明与快速入门

Spring MVC入门第2天--SpringSpringMVC与MyBatis三大框架整合

spring boot入门第一个项目

Avalonia跨平台入门第十一篇之自定义Window

Avalonia跨平台入门第十四篇之ListBox折叠列表