本篇文章主要整理了数据处理、乱码处理和Json的相关知识。参考的狂神说的公众号以及视频。所有代码亲测有效。
数据处理主要包括处理提交的数据以及将数据显示到前端。
处理提交的数据一般有三种情况:
(1)提交的域的名称和方法的参数名称一致时:
@RequestMapping("/name") public String test2(Model model,String name){ System.out.println(name); model.addAttribute("msg","name"); return "hehe"; }
(2)提交的域的名称和方法的参数名称不一致时:
修改代码:在参数前加入@RequestParam注解,强制域名称和方法参数名一致。
@RequestMapping("/name") public String test2(Model model,@RequestParam("username")String name){ System.out.println(name); model.addAttribute("msg","name"); return "hehe"; }
(3)如果提交的是一个对象,则域名称要和对象的属性对应。
public class User { private String name; private int age;}//省略其他方法
@RequestMapping("/user") public String test3(Model model, User user){ System.out.println(user); model.addAttribute("msg","user"); return "hehe"; }
将数据显示到前端一般有三种方式:
(1)在SpringMVC基础一中的Demo采用的是ModelAndView :
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //ModelAndView 模型和视图 ModelAndView mv = new ModelAndView(); //封装对象,放在ModelAndView中。Model mv.addObject("msg","HelloSpringMVC!"); //封装要跳转的视图,放在ModelAndView中 mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp return mv; }
(2)处理提交的数据时Demo中用到的Model
(3)ModelMap:可以封装显示到视图的数据
@RequestMapping("/hello") public String test4(@RequestParam("username") String name, ModelMap model){ //封装要显示到视图中的数据 //相当于req.setAttribute("name",name); model.addAttribute("name",name); System.out.println(name); return "hehe"; }
接着介绍一下乱码处理。
form.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>formtitle>head><body><form action="/e/t" method="post"> <input type="text" name="name"> <input type="submit">form>body>html>
@Controllerpublic class Encoding { @RequestMapping("/e/t") public String test(Model model, String name){ System.out.println(name); model.addAttribute("msg",name); //获取表单提交的值 return "hehe"; //跳转到test页面显示输入的值 }}
解决方法一:自定义过滤器
public class EncodingFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); chain.doFilter(request,response); } public void destroy() { }}
配置过滤器
<filter> <filter-name>EncodingFilterfilter-name> <filter-class>com.zhu.filter01.EncodingFilterfilter-class> filter> <filter-mapping> <filter-name>EncodingFilterfilter-name> <url-pattern>/*url-pattern> filter-mapping>
解决了!!!
解决方法二:SpringMVC自带的过滤器,在XML中配置:
<filter> <filter-name>encodingfilter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class> <init-param> <param-name>encodingparam-name> <param-value>utf-8param-value> init-param> filter> <filter-mapping> <filter-name>encodingfilter-name> <url-pattern>/*url-pattern> filter-mapping>
解决!
最后介绍一下关于JSON的知识。JSON简单却十分重要!
JSON(JavaScript Object Notation, JS 对象标记)是一种轻量级的数据交换格式。
采用完全独立于编程语言的文本格式来存储和表示数据。
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:
对象表示为键值对,数据由逗号分隔
花括号保存对象
方括号保存数组
{"name": "zhulin"}{"age": "24"}{"sex": "男"}
JSON 键值对是用来保存 JavaScript 对象的一种方式,JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
Demo:
<html lang="en"><head> <meta charset="UTF-8"> <title>Titletitle>head><body><script type="text/javascript"> var obj = JSON.parse('{"a": "Hello", "b": "World"}'); console.log(obj); //结果是 {a: 'Hello', b: 'World'} var json = JSON.stringify({a: 'Hello', b: 'World'}); console.log(json); //结果是 '{"a": "Hello", "b": "World"}' //编写一个js的对象 var user = { name:"朱琳", age:24, sex:"男" }; //将js对象转换成json字符串 var str = JSON.stringify(user); console.log(str); //将json字符串转换为js对象 var user2 = JSON.parse(str); console.log(user2.age,user2.name,user2.sex);script>body>html>
解析JSON的工具有Jackson和fastjson。
Jackson
导入依赖,web.xml和springmvc-servlet.xml和之前配置类似。
<dependency> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-databindartifactId> <version>2.9.8version>dependency>
@Controllerpublic class UserController { @RequestMapping("/json1") @ResponseBody public String json1() throws JsonProcessingException { //创建一个jackson的对象映射器,用来解析数据 ObjectMapper mapper = new ObjectMapper(); //创建一个对象 User user = new User("朱琳1", 24); //将我们的对象解析成为json格式 String str = mapper.writeValueAsString(user); //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便 return str; }}
@ResponseBody注解表示不经过视图解析器。在类上直接使用 @RestController ,这样子,里面所有的方法都只会返回 json 字符串。
这里有个问题,IDEA中新建了模块之后,如果tomcat启动总是报错代码没问题,一般是没有将依赖加入lib中,在Project Struture中:
启动tomcat,测试发现出现乱码问题!
修改代码:
//produces:指定响应体返回类型和编码@RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")@ResponseBodypublic String json1() throws JsonProcessingException {}
再次测试,解决!
还有一种解决办法:Spring配置统一指定。
<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8"/> bean> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="failOnEmptyBeans" value="false"/> bean> property> bean> mvc:message-converters> /mvc:annotation-driven>
同样解决!
再来测试一下输出时间:
@RequestMapping("/json2") public String json2() 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; }
此外,为了方便代码复用还可以写个工具类:
package com.zhu.utils;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.SerializationFeature;import java.text.SimpleDateFormat;public class JsonUtils { public static String getJson(Object object) { return getJson(object,"yyyy-MM-dd HH:mm:ss"); } public static String getJson(Object object,String dateFormat) { ObjectMapper mapper = new ObjectMapper(); //不使用时间差的方式 mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); //自定义日期格式对象 SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); //指定日期格式 mapper.setDateFormat(sdf); try { return mapper.writeValueAsString(object); } catch (JsonProcessingException e) { e.printStackTrace(); } return null; }}
这样,对之前的代码进行改进:
@RequestMapping("/json3") public String json3() throws JsonProcessingException { Date date = new Date(); String json = JsonUtils.getJson(date); return json; } @RequestMapping("/json4") public String json4() throws JsonProcessingException { User user = new User("朱琳4", 24); String json = JsonUtils.getJson(user); return json; }
fastjson
fastjson有三个主要的类:
JSONObject :代表 json 对象
JSONObject实现了Map接口, 猜想 JSONObject底层操作是由Map实现的。
JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的。
JSONArray:代表 json 对象数组
内部是有List接口中的方法来完成操作的。
JSON代表 JSONObject和JSONArray的转化
JSON类源码分析与使用
仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间的相互转化。
以一个Demo测试fastjson的使用:
public class FastJsonController { public static void main(String[] args) { //创建一个对象 User user1 = new User("朱琳1号", 24); User user2 = new User("朱琳2号",24); User user3 = new User("朱琳3号", 24); User user4 = new User("朱琳4号",24); List list = new ArrayList(); list.add(user1); list.add(user2); list.add(user3); list.add(user4); System.out.println("*******Java对象 转 JSON字符串*******"); String str1 = JSON.toJSONString(list); System.out.println("JSON.toJSONString(list)==>"+str1); String str2 = JSON.toJSONString(user1); System.out.println("JSON.toJSONString(user1)==>"+str2); System.out.println("\n****** JSON字符串 转 Java对象*******"); User jp_user1=JSON.parseObject(str2, User.class); System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1); System.out.println("\n****** Java对象 转 JSON对象 ******"); JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2); System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name")); System.out.println("\n****** JSON对象 转 Java对象 ******"); User to_java_user = JSON.toJavaObject(jsonObject1, User.class); System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user); }}
至此,关于SpringMVC的基础知识介绍完毕。深入了解需要将Mybatis、Spring、SpringMVC即SSM整合。