记录一下Java Web项目遇到的问题
前言
最近对Java Web应用感兴趣,之前从来没接触过,所以写了篇博文记录自己遇到的问题和解决办法,便于自己回顾复习。
关于反射机制中的BeanUtils开发包
在利用BeanUtils开发包封装数据到Bean对象的过程中,特殊对象日期不能直接封装到Bean对象中,需要手动注册一个日期转换器对Date对象进行转换。
ConvertUtils.register(new DateLocaleConverter(), Date.class);
如果按照上面的代码,则会出现类似错误
org.apache.commons.beanutils.ConversionException: Error parsing date '2019-10-10' at position=4
原因是没有给转换器设置对应的地区区域日期格式。查看源码发现DateLocaleConverter类有构造函数DateLocaleConverter(Locale locale, String pattern),最终解决方法:
DateLocaleConverter converter = new DateLocaleConverter(Locale.getDefault(),"yyyy-MM-dd");
converter.setLenient(true);//实现日期自动转换,如输入类似'2019-14-30'的日期时,会自动转换成'2020-03-1'
ConvertUtils.register(converter, Date.class);
关于C3P0连接池的配置和使用
使用C3P0连接池链接数据库进行增删改查时出现警告:
com.mchange.v2.c3p0.cfg.C3P0Config.getUnspecifiedUserProperties named-config with name 'mysql' does not exist. Using default-config.
并抛出异常:
java.sql.SQLException: No suitable driver
原因:c3p0 获取不到配置文件的内容,使用了默认配置,导致找不到对应的数据库链接。 解决办法:
- 检查xml配置文件中的driverClass和jdbcUr是否写错。
- 检查c3p0-config.xml是否正确存在于src目录下。
- 检查c3p0-config.xml第一行是否为空。
关于Mysql插入中文时数据库显示乱码
在使用c3p0连接池对中文数据进行插入时出现:
Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x80\xE3\x80...' for column 'show_content' at row 1
Google 了一下,原因在于Mysql中的utf-8编码是按三个字节一个单位编码的,遇到以4个字节为单位的编码的数据就会出现切割,从而出现乱码。 按照网上给的解决方法:
- 将Mysql数据库的编码修改为utf8mb4
- 将数据表的编码修改为utf8mb4
- 修改c3p0连接池中Mysql连接配置代码
由于我使用的开发环境是idea+navicat,上述修改十分方便,然而还是不能解决我的问题。 我最后的解决办法:修改表中字段的字符集为utf8mb4。
关于jsp页面无法使用EL表达式
在使用String MVC开发过程中,使用Model类中的函数addAttribute向前端jsp页面传值时出现无法解析问题,抛出的异常如下:
java.lang.NumberFormatException: For input string: "${begin }"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
at java.base/java.lang.Integer.parseInt(Integer.java:644)
at java.base/java.lang.Integer.valueOf(Integer.java:989)
at org.apache.jasper.compiler.JspUtil.coerceToInt(JspUtil.java:560)
抛出的异常显示对字符串**${begin }**的格式转换错误,于是找到该变量在jsp文件中的位置如下:
<c:forEach begin="${begin }" end="${end }" var="i">
<c:choose>
<c:when test="${i eq pageInfo.pageNum }">
<a class="page-numbers current">${i}</a>
</c:when>
<c:otherwise>
<a class="page-numbers" href="${pageUrlPrefix}=${i}">${i}</a>
</c:otherwise>
</c:choose>
</c:forEach>
显然jsp页面无法将EL表达式中的**${begin }**解析为int。 原因如下:使用了老的JSP 1.2 声明,在JSP 1.2 声明中EL表达式默认是关闭的。 解决办法:使用新的JSP声明替换掉旧的声明。找到webapp/WEB-INF路径下的web.xml文件,将约束头替换成新的版本。 各版本约束头如下:
web-app 3.1
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
- jdk版本1.7以上
web-app 3.0
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
- jdk版本1.6以上,支持jsp-config配置
web-app 2.5
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
- jdk版本1.5以上
web-app 2.4
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">