SpringMVC入门第二部分
Posted 大忽悠爱忽悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC入门第二部分相关的知识,希望对你有一定的参考价值。
SpringMVC入门第二部分
- 数据带给页面
- 方法1: 在方法上传入原生的request和session
- 方法2: 在方法里面传入map,model或者modelMap---给request域中带数据
- 方法返回值为ModelAndView
- 给session域中带数据。SpringMVC中提供了一种临时给Session域中保存数据的方式
- @ModelAttribute注解
- @ModelAttribute的原理
- @ModelAttribute标注在方法上面的另外一个作用
- SpringMVC确定POJO自定义对象值的三步
- 自定义类型对象的赋值流程描述,以及@SessionAttributes注解可能引发的异常
- 给自定义类型赋值,主要在于attrName的值,首先会把attrName作为key值去隐含模型中寻找key==attrName的键,然后将key对应的值进行赋值
- 举例2:通过@ModelAttribute("haha")来指定attrName的值
- 举例3:attrName=haha,隐含模型中只有key==book的值,那么会去session域中寻找,@SessionAttributes(value="haha"),但是session中没有键为haha的值,这样会报异常
- 举例5:@ModelAttribute会把方法运行后的返回值也放入隐含模型中,key就是返回值类型小写
- 举例6:把返回值放入隐含模型,但是不使用默认的返回值小写作为key,而是自己指定
- 举例7: 隐含模型中找不到对应的key,session中也找不到,那么会自动创建一个新对象
- @ModelAttribute的总结
- @SessionAttributes的总结
- 视图和视图解析器再分析
- Redirect指定重定向到页面
数据带给页面
方法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入门第二部分的主要内容,如果未能解决你的问题,请参考以下文章