SpringMVC(深入细节)

Posted Panda_Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC(深入细节)相关的知识,希望对你有一定的参考价值。

1. 结果跳转方式:转发与重定向

kuanshen笔记

1.1 通过SpringMVC来实现转发和重定向 - 无需视图解析器

@Controller
public class ResultSpringMVC 
   @RequestMapping("/rsm/t1")
   public String test1()
       //转发
       return "/index.jsp";
  
   @RequestMapping("/rsm/t2")
   public String test2()
       //转发二
       return "forward:/index.jsp";
  

   @RequestMapping("/rsm/t3")
   public String test3()
       //重定向
       return "redirect:/index.jsp";
   

1.2 通过SpringMVC来实现转发和重定向 - 有视图解析器

重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方嘛 , 所以注意路径问题. 可以重定向到另外一个请求实现 .

@Controller
public class ResultSpringMVC2 
   @RequestMapping("/rsm2/t1")
   public String test1()
       //转发
       return "test";
  
   @RequestMapping("/rsm2/t2")
   public String test2()
       //重定向
       return "redirect:/index.jsp";
       //return "redirect:hello.do"; //hello.do为另一个请求/
  

2. 数据处理

2.1 提交的域名称和处理方法的参数名一致

提交数据 : http://localhost:8080/hello?name=kuangshen
处理方法 :

@RequestMapping("/hello")
public String hello(String name)
   System.out.println(name);
   return "hello";

后台输出 : kuangshen

2.2 提交的域名称和处理方法的参数名不一致

提交数据 : http://localhost:8080/hello?username=kuangshen
处理方法 :

//@RequestParam("username") : username提交的域的名称 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name)
   System.out.println(name);
   return "hello";

2.3 提交的是一个对象

要求提交的表单域和对象的属性名一致  , 参数使用对象即可

1、实体类
public class User 
   private int id;
   private String name;
   private int age;
   //构造
   //get/set
   //tostring()


2、提交数据 : http://localhost:8080/mvc04/user?name=kuangshen&id=1&age=15

3、处理方法 :
@RequestMapping("/user")
public String user(User user)
   System.out.println(user);
   return "hello";


后台输出 : User  id=1, name='kuangshen', age=15 

说明:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null

3. 数据显示到前端(3种方式)

3.1 通过ModelAndView

public class ControllerTest1 implements Controller 

   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, 
          HttpServletResponse httpServletResponse) throws Exception 
       //返回一个模型视图对象
       ModelAndView mv = new ModelAndView();
       mv.addObject("msg","ControllerTest1");
       mv.setViewName("test");
       return mv;
  

3.2 通过ModelMap

@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap 
model)
   //封装要显示到视图中的数据
   //相当于req.setAttribute("name",name);
   model.addAttribute("name",name);
   System.out.println(name);
   return "hello";

3.3 通过Model

@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model)
   //封装要显示到视图中的数据
   //相当于req.setAttribute("name",name);
   model.addAttribute("msg",name);
   System.out.println(name);
   return "test";

3.4 三者对比

  1. Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;

  2. ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;

  3. ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

4. 乱码问题

4.1 测试步骤

测试步骤:
1、我们可以在首页编写一个提交的表单

<form action="/e/t" method="post">
 <input type="text" name="name">
 <input type="submit">
</form>

2、后台编写对应的处理类

@Controller
public class Encoding 
   @RequestMapping("/e/t")
   public String test(Model model,String name)
       model.addAttribute("msg",name); //获取表单提交的值
       return "test"; //跳转到test页面显示输入的值
  

3、输入中文测试,发现乱码

4.2 解决方案

以前乱码问题通过过滤器解决 , 而SpringMVC给我们提供了一个过滤器 , 可以在web.xml中配置 .
修改了xml文件需要重启服务器!

<filter>
   <filter-name>encoding</filter-name>
   <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
   <init-param>
       <param-name>encoding</param-name>
       <param-value>utf-8</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>encoding</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

5. Json交互处理

5.1 Json概念

  1. JSON(javascript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
  2. 采用完全独立于编程语言的文本格式来存储和表示数据。
  3. 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言

5.2 JSON 和 JavaScript 对象的关系

JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

var obj = a: 'Hello', b: 'World'; 
//这是一个对象,注意键名也是可以使用引号包裹的
var json = '"a": "Hello", "b": "World"';
//这是一个 JSON 字符串,本质是一个字符串

5.3 JSON 和 JavaScript 对象互转

  1. 要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:
var obj = JSON.parse('"a": "Hello", "b": "World"');
//结果是 a: 'Hello', b: 'World'
  1. 要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify(a: 'Hello', b: 'World');
//结果是 '"a": "Hello", "b": "World"'

6. Jackson: Controller返回JSON数据

Jackson应该是目前比较好的json解析工具了

6.1 Jackson导入包 配置 依赖

Jackson导入包 配置 依赖

6.2 编写Controller分析代码

@Controller
public class UserController 

   @RequestMapping("/json1")
   @ResponseBody
   public String json1() throws JsonProcessingException 
       //创建一个jackson的对象映射器,用来解析数据
       ObjectMapper mapper = new ObjectMapper();
       //创建一个对象
       User user = new User("秦疆1号", 3, "男");
       //将我们的对象解析成为json格式
       String str = mapper.writeValueAsString(user);
       //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
       return str;
  

1 发现出现了乱码问题,我们需要设置一下他的编码格式为utf-8,以及它返回的类型;
2 通过@RequestMaping的produces属性来实现,修改下代码

//produces:指定响应体返回类型和编码
@RequestMapping(value = "/json1",produces = "application/json;charset
=utf-8")

6.3 返回json字符串统一解决

在类上直接使用 @RestController ,这样子,里面所有的方法都只会返回 json 字符串了,不用再每一个都添加@ResponseBody !我们在前后端分离开发中,一般都使用 @RestController ,十分便捷!

@RestController
public class UserController 

   //produces:指定响应体返回类型和编码
   @RequestMapping(value = "/json1")
   public String json1() throws JsonProcessingException 
       //创建一个jackson的对象映射器,用来解析数据
       ObjectMapper mapper = new ObjectMapper();
       //创建一个对象
       User user = new User("秦疆1号", 3, "男");
       //将我们的对象解析成为json格式
       String str = mapper.writeValueAsString(user);
       //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
       return str;
  

6.4 输出时间对象

解决方案:取消timestamps形式 , 自定义时间格式

@RequestMapping("/json4")
public String json4() throws JsonProcessingException 

   ObjectMapper mapper = new ObjectMapper();

   //不使用时间戳的方式
   mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, 
   false);
   //自定义日期格式对象
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   //指定日期格式
   mapper.setDateFormat(sdf);

   Date date = new Date();
   String str = mapper.writeValueAsString(date);

   return str;

以上是关于SpringMVC(深入细节)的主要内容,如果未能解决你的问题,请参考以下文章

Spring+SpringMVC+MyBatis深入学习及搭建——MyBatis原始Dao开发和mapper代理开发(转发同上)

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

SpringMVC深入理解

SpringMVC@RequestBody小细节

Ambari深入学习(II)-实现细节

Android TV - 在细节片段中失去焦点