JavaEE 项目常见错误解决方案
- 最近的实训中,练了一个比较基础的项目,
JSP
+Servlet
+JavaBean
,完成两张表的CRUD
操作,前端使用Bootstrap
和JQuery
,交互使用AJAX
,IDE
选用Eclipse
,在时间比较仓促的情况下完成整个项目。 - 这个项目比较基础,但是麻雀虽小,五脏俱全,基本覆盖到了方方面面,在这过程中,我也踩了很多以前踩过的坑。
数据库连接
-
在
MySQL
中,MySQL 5.7
和MySQL 8.0
使用不同的驱动,前者使用以往的com.mysql.cj.jdbc.Driver
,而后者使用新的驱动com.mysql.cj.jdbc.Driver
-
时区问题,这是数据库和系统时区差异造成的。低版本的
MySQL
驱动不会存在时区问题。
报错如下:The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more than one time zone.
推荐解决方案:数据库连接的
URL
修改为以下格式jdbc:mysql://${地址}:3306/${库}?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&useAffectedRows=true
JavaBean获取不到数据库字段值或出现意料之外的值
- 在使用
JDBC
进行开发时,没有使用标准JavaBean
建议使用实体生成工具自动JavaBean
,防止出现字段名拼错,大小写等问题。 - 字段使用了基本类型中的类型
因为它们除了char
没有默认值,其它的都有默认值,很可能在我们对数据库进行更新的时候,将数据错误的更新了。
业务中出现 null或 “”
DAO=>Service
原因:查询结果为空,返回了null
值
解决方案:- 对于意料之外的空结果集,抛出
RuntimeException
- 使用
Optional
处理空值
- 对于意料之外的空结果集,抛出
View=>Service
原因:JSON
转换时将空值解析为""
,可以自定义JSON
转换器或者使用靠谱的JSON
序列化工具- 数据未校验,前端在传递数据前应做好数据校验工作
404 NOT FOUND
在 JSP
转到 Servlet
或者从 Servlet
重定向、请求转发时容易出现
解决方案:
- 检查访问路径是否正确,检查文件的层次关系,使用相对路径进行路径跳转
- 拼接项目的绝对路径
String basePath = request.getScheme()+"://"+request.getServerName()+":" +request.getServerPort()+request.getContextPath()+"/";
GET 请求中文乱码
GET
方式提交在 Web
中是非常常用的方式,有时候我们在使用 GET
方式提交请求不得不提交中文参数值,但是 tomcat
对于GET
请求存在编码问题
原因: tomcat
的默认使用编码方式是 ISO8859-1
解决方案:
- 在后台代码中进行转码
String val = new String(value.getByte(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
- 修改
tomcat
下的conf/server.xml
文件
//找到下面的配置进行修改
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
修改成
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
- 前端使用
encodeURIComponent()
函数对参数进行编码,
后端使用URIDecoder.decode(value,StandardCharsets.UTF_8);
进行解码
form 表单提交中文乱码
form
表单默认不支持中文,再加上如果JSP
的编码不是UTF-8
,很可能不知道在哪里出错。
解决方案:
放弃表单直接 submit
,使用 http
库或 API
(AJAX
、Axios
、Fetch
等等)进行交互