hualinux springMVC 5.7:处理模型数据

目录

一、简单的使用ModelAndView来向页面传递参数

二、使用参数Map来向页面传值

三、使用@SessionAttributes注解,把值放到session域中

3.1 例1 

3.2 例2

四、@SessionAtrribute引发的异常


Spring MVC 提供了以下几种途径输出模型数据

  • ModelAndView:处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据
  • Map Model:入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。
  • @SessionAttributes:将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性
  • @ModelAttribute::方法入参标注该注解后, 入参的– 对象就会放到数据模型中

 

一、简单的使用ModelAndView来向页面传递参数

实际开发中,总要大量的向页面中传递后台的数据,那么存放数据的方法也有多种多样,比如说存到request中,大家都知道是使用request.setAtrribute()来向request域中传递值,但是实际上springMVC给我们封装了更好的方法,那就是使用ModelAndView

  • 控制器理方法的返回如果ModelAndView, 既包含视图信息,也包含模型数据信息
  • 添加模型数据:
MoelAndView addObject(String attributeName, Object attributeValue)

ModelAndView addAllObject(Map<String, ?> modelMap)
  • 设置视图:
void setView(View view)

void setViewName(String viewName)

 

在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:

    @RequestMapping(value = "/springmvc/testModelAndView")
    public ModelAndView testModelAndView(@RequestParam("name") String name){
        String viewNmae="ok";
        //导入相关为是:import org.springframework.web.servlet.ModelAndView;
        ModelAndView modelAndView=new ModelAndView(viewNmae);
        //添加模型数据到 ModelAndView 中.
        modelAndView.addObject("time",new Date());
        modelAndView.addObject("name",name);
        return modelAndView;
    }

注:ModelAndView 引用的是:

import org.springframework.web.servlet.ModelAndView;

打开web/index.jsp,在其页面的<body></body>标签中添加如下代码:

<p><a href="springmvc/testModelAndView">Test ModelAndView</a></p>

/WEB-INF/view/ok.jsp,添加EL表达式代码如下:

time:${requestScope.time}
<br>
name:${name}

运行tomcat,idea会自动打开主页点,下面链接

二、使用参数Map来向页面传值

可以在执行方法中定义一个Map参数,然后在方法中,向map添加内容,然后在页面中根据map的键来取对应的值,也是存在request域中

在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:

  /*
     * 目标方法可以添加Map 类型的参数。
     * 了解:(实际上也可以是Model 类型或者ModelMap类型)的参数
     * */
    @RequestMapping("/springmvc/testMap")
    public String testMap(Map<String,Object> map){
        map.put("names", Arrays.asList("Tom","Jerry","Mike"));
        return "ok";
    }

打开web/index.jsp,在其页面的<body></body>标签中添加如下代码:

<p><a href="springmvc/testMap">Test Map</a></p>

web/WEB-INF/view/ok.jsp修改为:

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
    <title>view视图下的jsp</title>
    <meta charset="UTF-8">
</head>
<body>
<h3>ok,访问成功!</h3>
names:${requestScope.names}
</body>
</html>

运行tomcat,idea会自动打开主页点,下面链接

 

三、使用@SessionAttributes注解,把值放到session域中

上面2点所诉的内容,虽然是把后台数据传递到前台,但是全部都是放置到request域中,这里讲一下使用@SessionAtrributes注解,把后台数据同时放到session中。

         首先介绍一下这个注解,这个注解只能放在类上面,而不能放在方法上面。它有两个属性,一个是value属性,一个是types属性,这两个数据都是数组,所以可以声明多个,其实不论是value属性,还是types属性,都可以把数据同时放到session域中,只不过value属性对应的是执行方法中的map集合的键,只要是对应的键,那么其值,也会同时被传递到session域中(这里之所以加上“同时”这个词,是因为它会同时存到requestsession),而types属性,则是放置类的集合,只要map集合中存的是该类的数据,则也会同时被放到request

若希望在多个求之共用某个模型属性数据可以在 控制器注一个 @SessionAttributes, Spring MVC 将在模型中对应的属性存到 HttpSession 中。

@SessionAttributes 除了可以通属性名指定需要放到会中的属性外,可以通模型属性的指定些模型属性需要放到会

  • @SessionAttributes(types=User.class) 会将含模型中所有User.class 的属性添加到会中。
  • @SessionAttributes(value={“user1”, “user2”})
  • @SessionAttributes(types={User.class, Dept.class})
  • @SessionAttributes(value={“user1”, “user2”}, types={Dept.class})

3.1 例1 

在src/main/java/com.hualinux.springmvc.entities/User.java,添加如下代码:

//为了方便不使用Address类,所以没有使用Address属性
public User(String username, String password, String email, int age) {
    this.username = username;
    this.password = password;
    this.email = email;
    this.age = age;
}

在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码: 

//@Controller表示要使用模板,如果用@RestController则表示直接把数据返回给浏览器
@Controller
public class SpringMVCTest {
    
/*
     * @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(实际上使用的是value属性值)
     * 还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上使用的是type属性值)
     *
     * 注意:该注解只能放在类的上面,而不能修饰放方法。
     * */
    @RequestMapping("/springmvc/testSessionAttributes")
    public String testSessionAttributes(Map<String,Object> map){
        User user=new User("Tom","123456","tom@hualinux.com",15);
        map.put("user",user);
        return "ok";
    }
...
}

在web/WEB-INF/view/ok.jsp,添加如下代码

request user:${requestScope.user}
<br><br>
session user: ${sessionScope.user}

打开web/index.jsp,在其页面的<body></body>标签中添加如下代码:

<p><a href="springmvc/testSessionAttributes">Test SessionAttributes</a></p>

运行tomcat,idea会自动打开主页点,下面链接

 

 在SpringMVCTest类顶部添加 @SessionAttributes({"user"})注解,再次运行

注意:使用了value属性后,这个属性也就必须存在,意思就是说,必须有一个map,然后有一个user的键,不然会报错,当然,这个是可以解决的,后面会详细讲到。

 

3.2 例2

@SessionAttributes({"user"})加多一个types属性,其它不变

@SessionAttributes(value = {"user"},types = {String.class})

SpringMVCTest.java的map添加多一个put

 @RequestMapping("/springmvc/testSessionAttributes")
    public String testSessionAttributes(Map<String,Object> map){
        User user=new User("Tom","123456","tom@hualinux.com",15);
        map.put("user",user);
        map.put("school","hualinux");
        return "ok";
    }

ok.jsp添加两个

<br><br>
request school:${requestScope.school}
<br><br>
session school: ${sessionScope.school}
<br><br>

运行结果为:

 

四、@SessionAtrribute引发的异常

上面说到使用@SessionAtrribute来修饰一个类,就可以把一些值存放到session域中,但是如果找不到对应的值,就会报异常,这里可以用@ModelAtrribute来进行修饰,对它改名就可以了

在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:

   @ RequestMapping("/springmvc/testModelAtrribute")
    public String testModelAtrribute(@ModelAttribute("abc") User user){
        System.out.println("修改:"+user);
        return "ok";
    }

打开web/index.jsp,在其页面的<body></body>标签中添加如下代码:

<p><a href="springmvc/testModelAtrribute">Test ModelAtrribute</a></p>

 运行tomcat,idea会自动打开主页点,下面链接

看一下idea最下方日志输出为:

修改:User{username='null', password='null', email='null', age=0, address=null}

本章测试完之后把ok.jsp其它数据删除,恢复原来的

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
    <title>view视图下的jsp</title>
    <meta charset="UTF-8">
</head>
<body>
<h3>ok,访问成功!</h3>
<%--names:${requestScope.names}--%>
<%--

request user:${requestScope.user}
<br><br>
session user: ${sessionScope.user}
<br><br>
request school:${requestScope.school}
<br><br>
session school: ${sessionScope.school}
<br><br>
--%>


</body>
</html>

把SpringMVCTest.java类顶部添加的注解去掉

//@SessionAttributes

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值