记录一下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配置文件中的driverClassjdbcUr是否写错。
  • 检查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个字节为单位的编码的数据就会出现切割,从而出现乱码。 按照网上给的解决方法:

  1. 将Mysql数据库的编码修改为utf8mb4
  2. 将数据表的编码修改为utf8mb4
  3. 修改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">