乱码问题解决
创建一个表单页面:
让它跳转到Controller
Controller把前端页面接收到的值传给接收值的test页面中:
目前就是一个简单的利用Model获取前端参数的操作。我们去运行一下代码:
我们输入英文并没有什么异常。
当我们输入中文:
我们发现中文乱码。
我们再来看控制台:
由此可知,在java层面上,就已经发生乱码了。
因此我们要想办法处理乱码问题。
可能会有人想到用request.setCharacterEncoding方法,那我们看看能不能解决呢?
再次运行:
我们发现依然产生乱码。
因为当前端输入信息,到Controller层的方法中的括号里String name中传值时就已经产生乱码了,所以我们不能再前端设置utf-8来解决这个问题。
所以我们要利用过滤器解决乱码问题。
我们写一个过滤器工具类用于解决乱码:
我们已经写了Filter过滤器,那么我们就应该在web.xml中配置:
我们去运行一下:
我们发现我们的web.xml:
我们的url-pattern的路径是/ 是拦截所有,我们不应该拦截Jsp页面,所以我们把/改成/*:
再次运行:
我们发现不再乱码了。
我们改成用get:
再运行一下:
因此我们可以知道,这种过滤器的方法是可以解决SpringMVC中的乱码问题的。
如果是get请求的方式,我们的web.xml中的url-pattern如果是/的方式:
再去运行:
这也可以,这就比较神奇了。所以如果使用get,那么只要加Filter过滤器就可以了,但是如果是使用Post必须还得把web.xml中的url-pattern改成/*,不拦截jsp页面。
但是我们这是使用javaweb的filter方式,不是springmvc的方式,而且这种方式不够强大。我们建议使用SpringMVC自带的过滤器方式,直接在web.xml中配置即可。我们注释掉之前web.xml中的filter配置。使用SpringMVC推荐的方式:
学框架就是让我们的东西变得轻松。
我们先用Post请求运行一下:
依然乱码,我们把url-pattern改成/*:
乱码解决了。
我们换成Get方法:
我们现在使用的是get的方式,那么我们把url-pattern换成/呢:
在运行:
我们发现这个和之前的规律还是一样的,如果是get方法url-pattern写/或/*都可以,如果是post必须要写/*。
这种方式省去了写filter类的步骤。但是有时候对get过滤乱码支持不是很好。
如果这些方式都不好使,还有可能是tomcat里没有写上响应的设置:
Json
这部分很重要,学java后台,Json是必须掌握的一门技术。
先写一下javascript的代码,因为我们知道javascript对象和json对象可以互相转换:
运行:
我们发现上面的是字符串也就是json对象,下面的是正常的javascript对象。
Jackson的使用
新建子项目
1.在maven中加载jackson
web.xml里的内容是基本固定的:
然后我们去配置springmvc文件:
我们只需写扫描包和视图解析器即可:
我们新建一个类:
首先因为要使用lombok,我们要去在maven文件中引入lombok:
接下来我们写个Controller:
运行结果:
但是这只是字符串,并不是json对象。我们先不去解决这个乱码问题。
我们现在先创建出来一个json对象。看看json是什么样子的:
运行:
虽然仍然是乱码的形式,但是我们可以发现,是kv键值对的形式。已经输出了json对象形式。
所以现在我们就是要去解决一下乱码问题。
我们这个时候加上@RequestMapping里的乱码解析器:
我们再运行一下:
乱码解决了。但是我们发现这种方式是我们需要手动去写一些代码的,在SpringMVC框架中一定是有一种不需要我们手写的注解可以解决这个问题的。
我们在Controller中,不用去任何手动的代码:
我们在SpringMVC文件配置乱码:
这部分代码是固定的,以后我们用SpringMVC框架就可以直接把这部分配置出来。
运行一下:
我们这种不走视图解析器,直接返回字符串是用两个注解,@Controller和@ResponseBody来实现的。我们也可以只用一个注解 @RestController来实现:
我们以后如果是做前后端分离的项目,我们都不会让Controller去走视图解析器层,都会是去直接返回一个json字符串对象。
我们之前是用json去返回一个对象,如果我们想利用json去返回一个集合对象呢:
我们去运行一下:
我们接下来利用json去返回一个时间对象:
运行一下:
ObjectMapper时间解析后的默认格式为时间戳 Timestamp 1970年到现在的毫秒数
我们现在想要让时间返回的值是我们可以看得懂的:
我们知道java里有simpledateformat日期格式化类可以去做:
运行一下:
当然在SpringMVC中针对于json,也自带可以给日期格式化的方式,不需要使用时间戳,但是比较麻烦:
我们可以看到,我们没有使用时间戳 ,我们并没有利用日期格式化对象的format方法去格式化日期,我们只是把想要格式化的格式注入到mapper对象中,然后只要直接返回Date对象date就可以自动转成格式化的样子了。我们去运行验证一下:
之前我们也说过了,一段重复使用多次的代码尽量单独拿出来做成工具类,如果让代码重复太多,不符合开发习惯。我们可以看到在这段代码中,无论是把一个java类转换成json,还是把一个集合转换成json还是把一个日期类转换成json。都有两部分代码是重复使用的:
ObjectMapper对象的创建实例化和writeValueAsString()方法返回json对象。
所以我们接下来把这两个部分封装到一个工具类中,使用时就去调用就好了。
我们现在在Controller层就不需要写那么多代码了:
我们再去运行一下:
我们前两个方法也想用工具类,那么我么就需要再写一个方法在工具类中:
我们的工具类更改为:
我们直接使用方法的重载,若是传入一个参数就走上面的方法,若是传入两个参数就走下面的方法。
Controller层更改为:
我们只需要写功能,转成json格式的操作就交给工具类就好了。
运行一下:
总结:
第一步在maven中导入对应的包
第二步:在springmvc文件中配置乱码问题
第三步:写工具类 ObjectMapper对象的创建 ,writeValueAsString方法的调用
第四步:在Controller层写出具体把一个对象转换成json格式的代码 使用@RestController或者是使用@Controller和@ResponseBody
Fastjson的使用
1.在maven中导包:
我们去使用一下:
运行一下:
在我们向maven里导包的时候,要记得配置一下idea里的web-Artifact里的包加载进去。
这种方式更加便捷,我们发现我们甚至都不需要去写工具类了。
最后我们的fastjson里还有几个固定的写死的代码,我们可以去用:
运行: