<a>添加主人信息</a>
<form action="vote/vote04" method="post" >
主人id:<input type="text" name="id"><br>
主人名:<input type="text" name="monsterName"><br>
宠物名:<input type="text" name="pet.petName"><br>
<input type="submit" value="提交" ><br>
@RequestMapping(value = "/vote04")
public String vote04(Monster monster, HttpServletRequest request,
HttpServletResponse response){
System.out.println("请求到vote04");
request.setAttribute("monster", monster);
request.setAttribute("address","湖州");
return "voteOK";
}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>获取参数成功
地址: ${address}<br>
主人名字:${requestScope.monster.monsterName}<br>
主人信息:${requestScope.monster}<br>
</body>
</html>
<%--确保这里的name与bean的属性名一致,否则拿不到值--%>
<a>添加主人信息</a>
<form action="vote/vote05" method="post" >
主人id:<input type="text" name="id"><br>
主人名:<input type="text" name="monsterName"><br>
宠物名:<input type="text" name="pet.petName"><br>
<input type="submit" value="提交" ><br>
</form>
@RequestMapping(value = "/vote05")
public String vote05(Monster monster, Map <String,Object> map){
map.put("monster", monster);
map.put("Address", "BEIJING");
return "voteOK";
}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>获取参数成功
地址: ${address}<br>
主人名字:${requestScope.monster.monsterName}<br>
主人信息:${requestScope.monster}<br>
1>从本质看,请求响应的方法return"xx",好像是返回了一个字符串,其实本质都是返回了一个ModeIAndView对象,只是默认被封装起来的.
2>ModelAndView即可以包含model数据,也可以包含视图信息
3>ModelAndView对象的addObject方法可以添加 key-val数据,默认在request域中4>ModelAndView对象setView方法可以指定视图名称
<%--确保这里的name与bean的属性名一致,否则拿不到值--%>
<a>添加主人信息</a>
<form action="vote/vote06" method="post" >
主人id:<input type="text" name="id"><br>
主人名:<input type="text" name="monsterName"><br>
宠物名:<input type="text" name="pet.petName"><br>
<input type="submit" value="提交" ><br>
</form>
@RequestMapping(value = "/vote06")
public ModelAndView vote06(Monster monster){
//创建一个modleANDView
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("monster", monster);
modelAndView.addObject("address", "杭州");
modelAndView.setViewName("voteOK");
return modelAndView;
}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>获取参数成功
地址: ${address}<br>
主人名字:${requestScope.monster.monsterName}<br>
主人信息:${requestScope.monster}<br>
</body>
1、通过@SessionAttributes实现将数据放入session域
首先,在handler上写一个@SessionAttributes注解
@SessionAttributes(value = "myMaster")
@RequestMapping(value = "/vote")
@Controller
public class VoteHandler {
只要有一个map的形参,调用了put方法,且key值与@SessionAttributes相同,就会被自动放入到session域中?
@RequestMapping(value = "/vote07")
public String vote07(Map <String,Object> map,Monster monster){
map.put("myMonster",monster);
map.put("address","SHANGHAI");
return "voteOK";
}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>获取参数成功
地址: ${address}<br>
主人名字:${requestScope.monster.monsterName}<br>
主人信息:${requestScope.monster}<br>
主人名字(session):${sessionScope.myMonter.monsterName}<br>
主人信息(session):${sessionScope.myMonter}<br>
</body>
小结
注意当我们给Handler的某个方法前增加了注解@ModelAttribue后,则该方法就会在任何一个目标方法前调用,这样程序员就可以在调用目标方法前,准备相应的model,并做预处理.
@ModelAttribute 被这个方法修饰,
? ? // 会在该handler的所有方法被调用前,去调用
public class VoteHandler {
@ModelAttribute //@ModelAttribute 被这个方法修饰,
// 会在该handler的所有方法被调用前,去调用
public void testPrepare(){
System.out.println("preparing......");
}
@RequestMapping(value = "/vote08")
public String vote08(){
System.out.println("update......");
return "voteOK";
}
<a href="vote/vote08">测试prepare</a>
?
该案例概述:
在做update操作时,我们只提交编号,名字,那么后端还需要判断前端提交了哪几个字段,要对其更新,比较麻烦。于是出现了如下案例,在更新操作前先做预处理
先上原理图,看看记得吗
<body>
<a href="vote/vote08">测试prepare</a>
<h1>修改人员</h1>
<form action="person/person01" method="POST">
<%-- 为了让handler获取到id,将id值藏入隐藏域--%>
<input type="hidden" name="id" value="100">
<%-- 指定我们的请求方式,让HiddenHttpMethodFilter转换--%>
<input type="hidden" name="_method" value="PUT">
编号:<input type="text" disabled="disabled" name="id" value="100"><br>
名字:<input type="text" name="name" ><br>
<input type="submit" value="点击修改">
</body>
@RequestMapping(value = "/person")
@Scope(value = "prototype")
@Controller
public class PersonHandler {
@ModelAttribute
public void personPre(@RequestParam(value = "id" ,required= false)
Integer id, Map<String,Object> map){
//获取到要修改的person的id
if(id != null){
//然后通过id到数据库去查找对应的person
//假定我们从数据库中获取到这个id = 100 的person
Person person = new Person();
person.setId(100);
person.setName("jkl");
person.setAddress("china");
//把这个person放入到mapzhong ,注意名字,一定要和目标方法的javabean的
// @ModelAttribute中的名字一样!!!!!!!
map.put("person",person);
System.out.println("hashCode1 = "+person.hashCode());
//然后给updatePerson
}
}
/***1.在当目标方法的参数中有一个和页面对应的javabean信息时,
* springMVC就会将jsp提交的数据封装到目标方法的javabean(person)中
*2.并将javabean对象放入到request域。
*3.在默认情况下,放入到request域中的javabean对象的属性是该Javabean的类名首字母***小写的Person person2,
* 即这里的Person类名的person
*4.其实,如果你的目标方法有一个javabean对象,那么该java对象前,默认会有*@ModelAttribute(value="person")
*即public String updatePerson(Person person2)等价
* public String updatePerson(@ModelAttribute(value="person") Person person2)
*5.如果我们改变默认放在request域中的javabean的属性名,则可以直接修改
*@ModelAttribute(value="person")的值@ModelAttribute(value="myperson")
*/
@RequestMapping(value = "/person01",method = RequestMethod.PUT)
public String updatePerson(Person person) {
System.out.println("person01 = "+person);
System.out.println("hashCode2 = "+person.hashCode());
return "personOK";
}
}
?控制台输出,请注意,hashCode1 = hashCode2 (要充分理解请看原理图)
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true"
isELIgnored="false" %>
<html>
<head>
<title>Title</title>
personid: ${requestScope.person.id} <br>
personname:${requestScope.person.name}<br>
personAddress:${requestScope.person.address}<br>
</head>
<body>