SpringMvc学习笔记(八)服务端数据传递客户端显示-后台传数据到前台

JavaWeb阶段传递数据,ModelAndView传递数据,其他方式传递数据,通过读取ModelAndView的源码分析,ResponseEntiy返回JSON数据 - IE和谷歌浏览器正常,JSON返回日期处理方式

源码获取github

1.项目结构

2.JavaWeb阶段传递数据

ModelAndViewDemoController.java

/**
 * JavaWeb阶段传递数据
 *
 * @param request
 * @param response
 * @throws ServletException
 * @throws IOException
 */
@GetMapping("/server01")
@ResponseBody   //不处理
public void test01(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   request.setAttribute("hs", "和尚");
   request.setAttribute("class", "计算机");
   request.setAttribute("number", 8);

   //请求转发传递数据---这个没有通过视图解析器
   request.getRequestDispatcher("/WEB-INF/jsp/result01.jsp").forward(request, response);
}

result01.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Title</title>
</head>
<body>
<h2>数据获取方式</h2>
<h2>${requestScope.hs}</h2>
<h2>${requestScope["class"]}</h2>
<h2>${number} ---默认情况下是从pageContext->request->session->application下开始寻找</h2>
</body>
</html>

3.ModelAndView传递数据—指明了key值

ModelAndViewDemoController.java

/**
    * 通过ModelAndView传递数据
    *
    * @return
    */
   @GetMapping("/server02")
   public ModelAndView test02() {
      ModelAndView mav = new ModelAndView();

//    mav.addObject() 没有指明KEY
      //一步一步的追源码,发现一个ModelMap的类实例化对象.用它的addAttribute方法添加,ModelMap又是继承了HashMap
      mav.addObject("title", "通过ModelAndView传递数据");
      mav.addObject("hs", "中国和尚");
      mav.addObject("class", "计算机计科");
      mav.addObject("number", 11);
      mav.setViewName("jsp/result02");    //请求转发,通过视图解析器
      return mav;
   }

result02.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Title</title>
</head>
<body>
<h2>${title}</h2>
<h2>${requestScope.hs} --指明范围了的</h2>
<h2>${requestScope["class"]}</h2>
<h2>${number} ---默认情况下是从pageContext->request->session->application下开始寻找</h2>
</body>
</html>

4.ModelAndView传递数据—没有指明key值

ModelAndViewDemoController.java

/**
    * 传递数据没有指明KEY_默认KEY的规则
    *
    * @return
    */
   @GetMapping("/server03")
   public ModelAndView test03() {
      ModelAndView mav = new ModelAndView();
      mav.addObject("integer", 100);
      mav.addObject(200);

      mav.addObject("string", "字符串");
      mav.addObject("悟空");
//    规则:客户端获取没有加key的数据,默认key正常是数据对应的类型的首字母小写 Integer---integer  String---string
//      两个key一样的,只认最后一个
//    double是关键字,不能${double},只能${requestScope["double"] }

      double a = 123.123;
      mav.addObject(a);

      User user = new User();
      user.setMydate(new Date());
      mav.addObject(user);

      mav.setViewName("jsp/result03");    //请求转发,通过视图解析器
      return mav;
   }

result03.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt" %>
<html>
<head>
   <title>Title</title>
</head>
<body>
<h2>${requestScope.integer }</h2>
<h2>${requestScope.string }</h2>
<h2>${requestScope["double"] }-----因为double是关键字,所以不能.double</h2>
<h2>${requestScope.user.mydate }</h2>
<h2>${requestScope["user"]["mydate"] }</h2>
日期格式化
<fmt:formatDate value="${user.mydate }" pattern="yyyy-MM-dd HH:mm:ss"/>
</body>
</html>

5.其他方式传递数据,通过读取ModelAndView的源码分析

OtherDemoController.java

package com.hs.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Map;

/**
 * 其他的方式传递数据
 */
@Controller
public class OtherDemoController {

   /**
    *其他1--通过Map在形参中实例化
    * @param map
    * @return
    */
   @GetMapping("/server04")
   public String test01(Map<String,Object> map) {
      map.put("title", "Map在形参中定义,可以传递数据");
      map.put("hs", "123");
      map.put("class", "12222");
      map.put("number", 1111);
      return "jsp/result04";  //通过请求转发视图解析器
   }

   /**
    * 其他2--通过ModelMap在形参中实例化
    * @param modelMap
    * @return
    */
   @GetMapping("/server05")
   public String test02(ModelMap modelMap) {
      modelMap.addAttribute("title", "ModelMap进行传递数据");
      modelMap.addAttribute("hs", "123");
      modelMap.addAttribute("class", "12222");
      modelMap.addAttribute("number", 1111);
      return "jsp/result04";  //通过请求转发视图解析器
   }

   /**
    * 其他3--通过Model接口传递数据
    * @param model
    * @return
    */
   @GetMapping("/server06")
   public String test03(Model model) {
      model.addAttribute("title", "Model接口进行传递数据");
      model.addAttribute("hs", "123");
      model.addAttribute("class", "12222");
      model.addAttribute("number", 1111);
      return "jsp/result04";  //通过请求转发视图解析器
   }
}

result04.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Title</title>
</head>
<body>
<h2>${title}</h2>
<h2>${requestScope.hs} --指明范围了的</h2>
<h2>${requestScope["class"]}</h2>
<h2>${number} ---默认情况下是从pageContext->request->session->application下开始寻找</h2>
</body>
</html>

6.ResponseEntiy返回JSON数据 - IE和谷歌浏览器正常

JsonDemoController.java

/**
 * JSON格式1:ResponseEntity返回JSON数据格式
 *
 * @return
 */
@GetMapping("/json01")
public ResponseEntity<Map<String, Object>> test01() {
   Map<String, Object> map = new HashMap<>();
   map.put("name", "马老板");
   map.put("sex", "男");

   HttpHeaders headers = new HttpHeaders();
   headers.setContentType(MediaType.TEXT_HTML);    //设置响应方式,在HTML页面上显示
   return new ResponseEntity<Map<String, Object>>(map, headers, HttpStatus.CREATED);
}

/**
 * JSON格式1:用List存多条JSON数据
 *
 * @return
 */
@GetMapping("/json02")
public ResponseEntity<List<Map<String, Object>>> test02() {
   List<Map<String,Object>> tempList = new ArrayList<Map<String,Object>>();
   Map<String,Object> map = new HashMap<String, Object>();
   map.put("name", "马老板");
   map.put("sex", "男");
   tempList.add(map);

   map = new HashMap<String, Object>();
   map.put("name", "悟空");
   map.put("sex", "男");
   tempList.add(map);

   HttpHeaders headers = new HttpHeaders();
   headers.setContentType(MediaType.TEXT_HTML);
   return new ResponseEntity<List<Map<String, Object>>>(tempList, headers, HttpStatus.CREATED);
}

7.@ResponseBody推荐方式返回json数据

JsonDemoController.java

/**
 * JSON格式3:简写方式
 *
 * @return
 */
@GetMapping("/json03")
@ResponseBody   //把java数据转换为JSON的字符串 存在BUG(IE浏览器不好使,解决办法在springmvc.xml配置)
public Map<String, Object> test03() {
   Map<String, Object> map = new HashMap<>();
   map.put("name", "马老板");
   map.put("sex", "男");
   return map;
}

/**
 * JSON格式4:简写方式
 *
 * @return
 */
@GetMapping("/json04")
public @ResponseBody List<Map<String, Object>> test04() {
   List<Map<String,Object>> tempList = new ArrayList<Map<String,Object>>();
   Map<String,Object> map = new HashMap<String, Object>();
   map.put("name", "马老板");
   map.put("sex", "男");
   tempList.add(map);

   map = new HashMap<String, Object>();
   map.put("name", "悟空");
   map.put("sex", "男");
   tempList.add(map);
   return tempList;
}

解决BUG问题在springmvc.xml配置

<!--1.启动SpringMVC注解-->
<mvc:annotation-driven>

   <mvc:message-converters register-defaults="true">
      <!--解决@ResponseBody在IE浏览器的BUG问题-->
      <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
         <property name="prettyPrint" value="true"/>
         <property name="supportedMediaTypes">
            <list>
               <value>text/html;charset=UTF-8</value>
               <value>text/plan;charset=UTF-8</value>
               <value>application/json;charset=UTF-8</value>
            </list>
         </property>

      </bean>
   </mvc:message-converters>

8.JSON返回日期处理方式

JsonDemoController.java

/**
 * 处理日期格式,需要在user的date属性下加注解,或者springmvc配置全局日期处理
 * @return
 */
@GetMapping("/json05")
@ResponseBody
public User test05() {
   User user = new User();
   user.setMydate(new Date());
   return user;
}

User.java下设置

package com.hs.model;

import java.util.Date;

public class User {
   // 相放哪里就放哪里,pattern:格式,timezone:时区,这是设置东八区
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
   Date mydate;

   // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
//    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
   public Date getMydate() {
      return mydate;
   }

   public void setMydate(Date mydate) {
      this.mydate = mydate;
   }

   @Override
   public String toString() {
      return "User{" +
            "mydate=" + mydate +
            '}';
   }
}

springmvc.xml中配置全局的

<!--1.启动SpringMVC注解-->
<mvc:annotation-driven>

   <mvc:message-converters register-defaults="true">
      <!--解决@ResponseBody在IE浏览器的BUG问题-->
      <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
         <property name="prettyPrint" value="true"/>
         <property name="supportedMediaTypes">
            <list>
               <value>text/html;charset=UTF-8</value>
               <value>text/plan;charset=UTF-8</value>
               <value>application/json;charset=UTF-8</value>
            </list>
         </property>

         <!--解决Jackson转换的日期问题,一劳永逸的办法,全局设置,但是和持久化类中的注解比,谁近更选择谁-->
         <property name="objectMapper">  <!--property:xxx属性-->
            <bean class="com.fasterxml.jackson.databind.ObjectMapper">  <!--bean:xx实例化了-->
               <property name="dateFormat">
                  <bean class="java.text.SimpleDateFormat">
                     <!--yyyy-MM-dd HH:mm:ss只能这么写,如果不显示小时,就需要在持久化类中注解设置-->
                     <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/>  <!--constructor-arg:xx构造函数-->
                  </bean>
               </property>
            </bean>
         </property>

      </bean>
   </mvc:message-converters>

</mvc:annotation-driven>
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值