java web项目开发难点_Java程序员必看 使用ssm框架开发web项目时遇到的那些坑!...

计算机中数据类型的概念有两种为位bits和bytes字节,一个字节有8位。二进制的计算机系统则只能读懂0和1,人类只能读懂characters 文字,而在现实生活中我们需要借助计算机来显示文字信息,而不同国家的人使用的文字时不一样的,于是人们为了让每个国家的人都能够通过计算机读懂自己想表达的意思,就需要将文字转换成计算机认识的数据类型,字节。而每个国家的语言都不是同的,他们使用的计算机也是不同语言的,因此每台计算的的编码集也是不同的,中国人的编码集为GBK国标码或者GBK-2312等,GBK编码只能解析中国文字。而其他国家也有相应的编码集也只能解析自己国家的文字,这时候中国人使用GBK编码集对其他国家的人发送一串字符串,而其他国家的人没有GBK,而是使用另一种编码集来进行解码,这时候就会出现乱码。

那我们应该如何解决乱码问题呢,一个伟大的组织叫做Unicode,他们发明了一种特殊的编码集,该编码集有多特殊呢。他涵盖了世界上任意一个国家的语言,包括少数民族和土著人,这样一来全世界的人都使用Unicode编码就能够为任意一个国家的语言进行编码和解码工作,那么世界上最主流的编码集UTF-8和Unicode是什么关系,UTF-8属Unicode下的一个分支,UTF-8同样涵盖任意国家的语言与之不同的是,UTF-8不包含少数民族语言与甲骨文等等这种偏僻语言,这样它的体积就会大大减轻了。

在web项目开发中,我们的数据库为了统一编码,都采用UTF-8编码集,我们的spring-mvc框架接收参数的时候,也是由将网线内的二进制信息按照UTF-8的编码规则进行解析的,唯独一个地方用的不是UTF-8,也是最关键的地方,用户使用的浏览器。现代的浏览图通常不支持在HTTP request header中告诉服务器,我使用哪种编码集对用户输入内容进行编码的,浏览器被没有被用户设置之前不但不会告诉服务器自己使用哪种编码集进行编码默认情况下还偷偷地使用IOS-8859-1这个编码集进行编码。这时候服务器还傻乎乎的使用utf-8的规则进行解码呢, 这时候就会出现乱码,我们需要在浏览器传过来的参数到达controller之前对request的编码集转换成utf-8,这里就需要用到filter过滤器了。

77a39b9013d199cfdb393381ee9b04dd.png

这里是spring提供的字符编码集过滤器,使用这个过滤器时要注意两点,init-param一定要写,不然过滤器不知道要将字符集设定为哪种,第二就是url-pattern必须为/*全匹配模式,我之前曾经犯过一个错误,我的过滤器和dispatcherServlet用同一个url-pattern:/,结果就是每次jsp页面提交的中文数据都是乱码,明明配置了过滤器也指定encoding=utf-8了,为什么还是乱码呢?在网上找了很多资料也找不到答案,知道我点开了stackOverFlow,其中一个老外的答案为我指明了方向。

608669e018c8c0302274ac6459c5250a.png

字符集过滤器的url-pattern必须为/*全匹配,如果只有/则不对jsp页面进行过滤,这就是为什么每次jsp提交的中文参数都是乱码的。我们在web开发时除了需要解决乱码问题之外还需要解决数据格式问题,比如说对日期格式化或者去重,去空格,前后空格中间空格,还要防止恶意代码的xss攻击,如果用户上传了一段字符串java代码把你的服务器给关机了怎么办?我们需要自定义对参数进行处理

c0758d26fb963d3ac6fee1ba9faccc0f.png

在web配置文件给中添加如图所示,mvc:annotation-driven conversion-service="fcsf"启动id为fcfs的转换器的服务,该转换器也是由spring提供。它能够实现自定义参数处理,这里很像Struts2的自定义拦截器。首先除了要将FormattingConversionServiceFactoryBean注册到spring容器外,还需要对converters用到的bean进行注册,为什么是converters呢,看源码

9499caf392b34468a1e96fe3943dfb5c.png

看名字就知道这是一个工厂类,他来帮我们创建converter实例,那我们就需要将自己编写的converters的bean注入至它提供的set集合即可。下面我们使用java代码创建converter。

42597682be29deeb4a61bf972a2eeae3.png

我们需要给converter实现Converter接口,该接口要求传入两个泛型,S和T,S表示页面提交进来的参数类型,T表示我们需要转换成什么样的类型。然后重写接口的convert方法,红框中的if可以不写,通常我们在js代码中做是否为空的处理,然后使用SimpleDateFormat类对日期进行格式化,将结果返回。时间格式转换器只是众多转换器中的一种,converters是一种set集合,我们在项目中会用到很多转换器,全部装入converters集合里面。

以上介绍两种我们开web开发中需要程序员完成的事情,而根据项目需求不同我们还需要做更多的处理,对参数处理的逻辑也会更加复杂。让我们在以后的文章中慢慢深入学习吧!大家学会了吗,请在下方留言吧,如果有不明白的地方在评论区留下问题我会回复的!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值