spring mvc(4)处理模型数据

处理模型数据

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

– ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加

  模型数据

– Map 及 Model: 入参为org.springframework.ui.Model、org.springframework.ui.

  ModelMap 或 java.uti.Map 时,处理方法返回时,Map

  中的数据会自动添加到模型中。

– @SessionAttributes: 将模型中的某个属性暂存到

  HttpSession 中,以便多个请求之间可以共享这个属性

– @ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中

注:下面的代码均来自上一篇的注解代码之后的测试代码!!

 ModelAndView

控制器处理方法的返回值如果为 ModelAndView, 则其既

包含视图信息,也包含模型数据信息。

添加模型数据:

– MoelAndView addObject(String attributeName, Object

attributeValue)

– ModelAndView addAllObject(Map<String, ?> modelMap)

设置视图:

– void setView(View view)

– void setViewName(String viewName)

TestRequestMapping.java

   @RequestMapping("/testModelAndView")
     public ModelAndView testModelAndView(){

           String viewName="success";
           ModelAndView andView = new ModelAndView(viewName);
           andView.addObject("time", new Date());
           return andView;
     }

index.jsp

<a href="springmvc/testModelAndView">testModelAndView</a>

success.jsp;

     time:${requestScope.time}

总结:SpringMVC会把ModelAndView的model中数据放入到request域对象中

 Map 及 Model

Spring MVC 在内部使用了一个org.springframework.ui.Model 接口存储模型数据

具体步骤

– Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。

– 如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传

  递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数

  据,也可以向模型中添加新的属性数据

目标方法可以添加Map类型(实际上是Model或者ModelMap类型)的参数

TestRequestMapping.java

@RequestMapping("/testMap")
     public String testMap(Map<String, Object> map){
           map.put("name", "MrChengs");

           return "success";
     }

indexjsp

<a href="springmvc/testMap">testMap</a>

success.jsp

name:${requestScope.name}

  

@SessionAttributes

只能放在类的上面

若希望在多个请求之间共用某个模型属性数据,则可以在

控制器类上标注一个 @SessionAttributes, Spring MVC

将在模型中对应的属性暂存到 HttpSession 中。

@SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(value)

还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(type)

– @SessionAttributes(types=User.class) 会将隐含模型中所有类型

为 User.class 的属性添加到会话中。

– @SessionAttributes(value={“user1”, “user2”})

– @SessionAttributes(types={User.class, Dept.class})

– @SessionAttributes(value={“user1”, “user2”},

types={Dept.class})

TestRequestMapping.java

@SessionAttributes(value="user")
@Controller
@RequestMapping("/springmvc")
public class TestRequestMapping {
     @RequestMapping("/testSessionAttributes")
     public String  testSessionAttributes(Map<String,Object> map){
           User user = new User("MrChangs", "1234", "[email protected]");
           map.put("user", user);

           return "success";
     }
}

index.jsp

 <a href="springmvc/testSessionAttributes">testSessionAttributes</a>

success.jsp

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

  

@ModelAttribute

模拟修改数据路中的数据,有些不能修改。

index.jsp

 <!--
      模拟修改操作
      1.原始数据:id=1,name=MrChengs,pw=1234,[email protected]
      2.密码不能修改
      3.表单回显,模拟操作直接在表单填写对应的额属性值
   -->
   <form action="springmvc/ModelAttribute" method="post">
      <input type="hidden" name="id" value="1">
      <br>
      name:<input type="text" name="username" value="MrChengs">
      <br>
      email:<input type="text" name="email" value="[email protected]">
      <br>
      <input type="submit" value="submit">
   </form>

  

//标记的方法会在每个目标方法执行之前被调用

    //1.由@ModelAttribute标记的方法,会把每个目标之前被springmvc调用
    //[email protected]注解也可以来修饰目标方法pojo类型的入参,其value属性值如下作用
    //2.1)springmvc会使用value属性值在implicitModel中查找对应的对象,若存在直接传入到目标方法的入参中
    //2.2)springmvc会把value为key,pojo类型对象为value,存到request中

      @ModelAttribute
     public void getUser(@RequestParam(value="id",required=false) Integer id,
                Map<String,Object> map){
           if(id != null){
                User user = new User(1, "MrChengs", "1234", "[email protected]");
                System.out.println("得到一个参数");

                //注意:这里的key为users,如果改为users等其他字符,等不到结果,程序可以正常的执行
            //解决方法在下面的代码中
                map.put("users", user);
           }
     }

     @RequestMapping("/ModelAttribute")
     public String testModelAttribute(@ModelAttribute("users")User user){
           System.out.println("update:" + user);
           return "success";
     }

在success页面:

可以使用如下的方法获得打印值

user:${requestScope.users}

如果不添加@ModelAttribut,在测试中代码的值为null

运行过程:

1.执行@ModelAttribute注解修饰的方法,把数据取出防砸map中,map的key为user

2.SpringMVC从Map中取出User对象,并把表单请求参数放到赋给给该user对象多的对应属性

3.SpringMVC把上述对象传入目标方法的参数

注意:在MOdelAttribute修饰的方法中,放入map的键需要和入参第一个字母小写的字符串一致

SpringMVC确定目标方法POJO类型入参的过程:

1.确定一个key

2.在implicitModel中查找对应的key对象,若存在,则作为入参传入

3.在implicitModel中不存在key对象,则查找当前的Handler,是都使用了@SessionAttribute对应的                value值若存在则直接传入到方法的入参中,不存在抛异常

4.若Handler没由标识的@SessionAttribute注解或者@Session Attribute的value值不包含key,则会通过        反射来创建pojo类型的参数,作为目标方法的参数

5.SpringMVC会把key和value保存到impliciModel中,进而会保存早request中

关于@SessionAttribute的异常

java类:

注意这里@SessionAttribute(user)和方法中的user同名

@SessionAttributes(value="user")
@Controller
@RequestMapping("/springmvc")
public class TestRequestMapping {
 @RequestMapping("/ModelAttribute")
     public String testModelAttribute(User user){
           System.out.println("update:" + user);
           return "success";
     }
}

在ModelAttribute方法的user

没找到就去@SeeionAttribute中找

所以此时会报错----抛异常

解决方案:

1.写ModelAttribute注解下的方法

2.表明一个modelAttribute,在第一次查找中赋值,不在第二次找SeesionAttribute

 public String testModelAttribute(@ModelAttribute("acbc")User user){
十月 16, 2018 4:38:06 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [springDispatcherServlet] in context with path [/Spring_MVC_01] threw exception [Session attribute ‘user‘ required - not found in session] with root cause
org.springframework.web.HttpSessionRequiredException: Session attribute ‘user‘ required - not found in session
     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.raiseSessionRequiredException(AnnotationMethodHandlerAdapter.java:791)

  

 @ModelAttribute

在方法定义上使用 @ModelAttribute 注解:Spring MVC

在调用目标处理方法前,会先逐个调用在方法级上标注了

@ModelAttribute 的方法。

在方法的入参前使用 @ModelAttribute 注解:

– 可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数定到对象中,再传入入参

– 将方法入参对象添加到模型中

由@SessionAttributes引发的异常

org.springframework.web.HttpSessionRequiredExcept:
Session attribute ‘user‘ required - not found in session

如果在处理类定义处标注了@SessionAttributes(“xxx”),则尝试从会话中获取该属性,并将其赋给该入参,然后再用

请求消息填充该入参对象。如果在会话中找不到对应的属性,则抛出 HttpSessionRequiredException 异常

 如何避免@SessionAttributes引发的异常

原文地址:https://www.cnblogs.com/Mrchengs/p/9940917.html

时间: 2024-10-10 17:34:46

spring mvc(4)处理模型数据的相关文章

Spring MVC 之传递模型数据到视图中

类似于 JSP-Servlet 中的 req.setAttribute . req.getSession().setAttribute ... --> 最后在 JSP 用 EL 表达式取得这些数据对象, STEP-1 传递模型数据的三种方式 package spittr.web; import static org.springframework.web.bind.annotation.RequestMethod.GET; import java.util.List; import org.sp

spring mvc 的jpa JpaRepository数据层 访问方式汇总

spring mvc 的jpa JpaRepository数据层 访问方式汇总 博客分类: spring jpa springjpaJpaRepository 本文转载至:http://perfy315.iteye.com/blog/1460226 AppleFramework在数据访问控制层采用了Spring Data作为这一层的解决方案,下面就对Spring Data相关知识作一个较为详细的描述. 1.Spring Data所解决的问题 Spring Data :提供了一整套数据访问层(DA

Spring MVC系列之模型绑定(SpringBoot)(七)

前言 上一节我们在SpringBoot中启用了Spring MVC最终输出了HelloWorld,本节我们来讲讲Spring MVC中的模型绑定,这个名称来源于.NET或.NET Core,不知是否恰当,我们暂且这样理解吧. @RequestParam VS  @PathVariable 一看注解名称应该非常好理解,注解@RequestParam主要用来获取查询字符串参数,而注解@PathVaruable用于获取路由参数,下面我们来看如下一个例子: @ResponseBody @RequestM

spring mvc返回json字符串数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable

1.spring mvc返回json数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable 2. @RequestMapping(value = { "/actor_details" }, method = { RequestMethod.POST }) @ResponseBody public ResultObject actorDetails(@RequestBody ActorDetailsRequest req)

Spring MVC(二) HTTP请求数据的绑定

HTTP请求数据的绑定 通过注解绑定 @RequestParam-->绑定请求参.@RequestHeader-->绑定请求头参数.@CookieValue-->绑定Cookie的值.@PathVariable-->绑定URL中的 示例: @RequestMapping(value="/handle2")public String handle2(@CookieValue("JSESSIONID") String sessionId,@Req

基于Spring MVC的ECharts动态数据实时展示

基于SpringMVC进行ECharts动态实时数据展示,ECharts的官网示例是前端的js动态随机数据,没有与后端程序进行交互,由于本人之前对Spring MVC和ajax不太了解,所以,走了很多弯路,通过这部分的学习,让自己对MVC架构和简单的ajax有了初步的了解,下面就记录一下自己搭建的这部分程序. 首先需要配置web.xml,设置好servlet和filter,这部分可以参考众多spring示例,这里就不赘述了. 接下来就是需要将echarts的相关代码写入到一个jsp文件,代码如下

Spring MVC中返回JSON数据的几种方式

我们都知道Spring MVC 的Controller方法中默认可以返回ModeAndView 和String 类型,返回的这两种类型数据是被DispatcherServlet拿来给到视图解析器进行继续处理返回页面的,而不是直接返回给客户端的.有时候我们需要发请求后让服务端直接返回一些数据,不再经过DispatcherServlet,这个时候通常有两种方式: 1.使用@ResponseBody注解 该注解的作用是把方法返回结果转成json或xml格式并进行返回,不管要返回什么类型的数据,是Str

Spring MVC如何进行JSON数据的传输与接受

本篇文章写给刚接触SpingMVC的同道中人,虽然笔者本身水平也不高,但聊胜于无吧,希望可以给某些人带来帮助 笔者同时再次说明,运行本例时,需注意一些配置文件和网页脚本的路径,因为笔者的文件路径与读者的未必相同 首先准备以下 jar包:commons-logging-1.1.3.jarjackson-core-asl-1.9.2.jarjackson-mapper-asl-1.9.2.jarspring-aop-4.0.6.RELEASE.jarspring-beans-4.0.6.RELEAS

spring mvc 接收表单数据

---恢复内容开始--- 一个普通的表单. 表单的代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/T