在学习三中,我们学习到了通过ModelAndView途径输出模型数据。今天我们来讲一下通过model及map途径来输出模型数据。
这一种方法比较简单,具体的看代码:
在index.jsp中写入:
<a href="testMap">TestMap</a><br>
在控制器中写入:
@RequestMapping("/testMap")
public String testMap(Map<String,Object> map){
map.put("names", Arrays.asList("liming","tom"));
System.out.println(map.getClass().getName());
return "success";
}
然后测试结果为:
上面这种途径很简单,我在这里就不再做过多的阐述。
我们知道,不管是ModelAndView还是Model还是Map,它们都是把返回的模型数据放在requst请求域中,下面我要说的这俩种是把数据暂放在session域中。
@SessionAttributes;用法:如果希望在多个请求直接共用某个模型属性数据,则可在控制器类上标注一个@SessionAttributes,SpringMvc将在模型中对应的属性暂存到HttpSession中。
类型:@SessionAttributes除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需放到会话中。不知道我这么说能不能理解,如果不能的话,希望可以通过下面的代码让思路更清楚一些
首先我们同样的在index.jsp页面中写入链接代码:
<a href="testSessionAttributes">TestSessionAttributes</a><br>
</body>
然后我们在控制器中写如下:
@SessionAttributes(value={"user"},types={String.class})
@Controller
public class HelloWorld {
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Map<String,Object> map){
User user=new User("hxl","123","2602628466@qq.com",20);
map.put("user", user);
map.put("address", "sichuan");
return "success";
}
这里需要注意的是@SessionAttributes注解必须写在类上面,它有俩个参数,一个是value,一个是type,都可以同时接收多个参数,这里我设置的是接收属性名为user的参数,和类型为java.lang.String类型的参数
然后我们在success.jsp页面中来测试结果:
<h2>这里是@SessionAttributes测试结果:session域中的user:${sessionScope.user}</h2>
<h2>这里是@SessionAttributes测试结果:request域中的user:${requestScope.user}</h2>
<h2>这里是@SessionAttributes测试结果:reqeust域中的sss:${requestScope.sss}</h2>
<h2>这里是@SessionAttributes测试结果:session域中的sss:${sessionScope.sss}</h2>
这里还是提醒一下,我在之前实体类的基础上,将原来的User类,重写了一个不包含address属性的构造方法,并且将原来的tostring()删除,又重写了一个不包含address属性的address的tostring()
最后我们来看一下结果吧:
这就是@sessionAttributes注解的用法 ,以后在开发可能会遇到。
接下来,我们最后还要学习一个@ModelAttribute:它有三个运行流程:
1.执行@ModelAttribute注解修饰的方法,从数据库中取出对象,把对象放入到了Map中
2.SpringMvc从Map中取出对象,并把表单的请求参数赋给该对象的对应属性
3.SpringMvc把上述对象传入目标方法的参数
下面我们用代码看一下这个流程,其中第一步和第三步是我们能通过代码看到过程,第二步我们可以结合源代码来进行分析
首先我们在index.jsp中写这样一段from表单代码:
<form action="testModelAttribute">
id:<input type="text" name="id" value="01"/>
<br>s
username:<input type="text" name="username" value="hxl"/>
<br>
email:<input type="text" name="email" value="2602628466@qq.com"/>
<br>
age:<input type="text" name="age" value="20">
<br>
<input type="submit" value="submit">
</form>
下面我们主要是想实现的功能是:原始数据为:01,hxl,2602628466@qq.com,20
现在我们要修改数据,密码不能被修改,表单回显,在form表单中输入要修改的值
下面我们来写目标方法:
@ModelAttribute
public void getUser(@RequestParam(value="id",required=false) Integer id,
Map<String,Object> map){
if(id!=null){
User user=new User(01,"hxl","123","26026284662qq.com",20);
System.out.println("模拟从数据库中已经取出一个user对象"+user);
map.put("user", user);
}
}
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("修改:"+user);
return "success";
}
这里千万要注意一点:在@ModelAttribute修饰的方法中,放入到map时的键需要和目标方法入参类型的第一个字母小写的字符串一致,比如这里的User--user
不知道为什么这次的效果图传不上来
但是总体就是在原来已有的对象的基础上,修改部分数据,从而在表单上回显的数据对象不是通过new出来的新对象,而是从数据库取出来的对象 这样对于一些较敏感的属性来说操作起来也更为安全。