在项目期间遇到的问题记录一下,方便查看
1、问题:MyEclipse启动tomcat时报错"A Configuration error occurred during startup."
解决方法:命令行中执行 netsh
2、hibernate懒加载问题
hibernate3中默认lazy="true",即默认是懒加载的。比如说部门关联上级部门,若是lazy="false",则它会将对应的上级部门都加载出来,而默认是不会加载的,若是要显示上级部门的信息,则会出现懒加载异常。
如图,service结束后事务提交,关闭session,而现在要显示数据,则取不到数据
解决方法:通过配置一个过滤器的方法,让其合适的关闭session(也可以将lazy设置为false)
配置:在web.xml中配置
<!-- 配置Spring的用于解决懒加载问题的过滤器 -->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
3、不小心删除了依赖的jar包
4、问题:我写了一个用于安装的类(就是初始化数据一些数据),之后再访问就报实体类的错误
原因:因为安装类中到一个User的构造函数,在User类中重载了,默认的构造函数就没有了,所以在映射时就报错了
解决方法:在User类中声明默认的构造函数
5、问题:如何得到全局作用域的数据(网站启动即取得一些固定数据,不需要用的时候再去查询了)
方法1:直接从全局作用域application中去拿
方法2:继承ServletContextAware接口,
定义 ServletContext 对象
实现get、set方法
取得数据
6、问题:重启tomcat 需要重新登录的问题
原因:在tomcat的work目录下,每次关闭tomcat会生成一个session的文件,将数据写入到本地磁盘中,启动时再次读入,然后对应取得数据。
解决方法:实体类实现序列化接口。
7、问题:删除checkbox选中的记录,但是每次我用alert弹出的信息与预想的不同
原因:因为界面中还有select,所以每次也有checked
解决方法:在checked前加input即可。
8、问题:更新记录时报错
原因:操作的不是源对象
解决方法:更新操作,先取出源对象,设置属性,然后再更新
9、问题:我定义了一个用户登录表和用户详细信息表,用户登录表中存有用户详细信息的Id主键,管理用户时操作的是用户详细信息表,但是根据用户详细信息找对应的用户信息总是对应的不对,调试发现详细信息表中得到的user属性为null
原因:在详细信息的hibernate映射文件中,没有指定要关联的用户登录表中的外键字段,默认关联的是主键
解决方法:修改如下,增加property_ref属性,关联登录表外键
10、问题:UML类图自动生成代码报错
解决方法:Ctrl+F8弹出对话框,将所需要的Include进去就行了
11、问题:使用Gson将对象集合转Json错误,栈溢出
原因:我要根据部门查找对应的班级,但是班级还关联了其他的类,由于使用了hibernate它会级联加载
解决方法:
JsonConfig jc=new JsonConfig();
//过滤掉不想要的属性,避免json死循环
jc.setJsonPropertyFilter(new PropertyFilter() {
public boolean apply(Object class_, String property, Object proValue) {
if (property.equals("department")||property.equals("students")) {
return true;
}
else{
return false;
}
}
});
//如果有关联属性,需取消延迟加载将映射文件内的lazy设置成false
JSONArray jsonArray = JSONArray.fromObject(classList,jc);
12、问题:SSH框架,删除第二层查找的数据仍要求返回第二层界面(比如第一层是所有课程列表,第二层是根据课程id查找的课程章节和文档的列表,在第二层删除操作仍然返回这一层)
解决方法:
界面增加个参数(第一层查找的课程的Id传递到第二层界面,执行action时就可以将参数传递过去)
<s:a action="spiderCourse_deleteDocument?documentId=%{id}&courseId=%{courseId}" οnclick="return window.confirm('您确定要删除吗?')">
<span style="white-space:pre"> </span><img style=" border:0px;" src="${pageContext.request.contextPath}/style/images/del.gif" />
</s:a>
Action中设置需要的参数(用于准备显示到第二层的数据)
setCourseId(model.getId());
struct配置中可以携带参数(界面执行action时就将courseId传递过去,执行第一层跳转到第二层的方法)
<result name="toCourseInfoList" type="redirectAction">spiderCourse_listCourseInfo?id=${courseId}</result>
<s:form action="judgement_bulkImport" method="post" id="form_questionBank" enctype="multipart/form-data">
14、问题:struts.xml中result里带多个参数,&不能使用,会报错。
解决方法:在xml中使用&需要进行转义为&
<result name="autoMakeQuestion" type="redirectAction">teacher_myCourseUI?courseId=${courseId}&doInfo=${doInfo}</result>
15、问题:使用hibernate执行插入操作时,报不能插入的错误
原因:我定义了一个字段是desc与mysql中的关键字冲突了.
解决方法:重新命名desc字段,下面是网上找的mysql的关键字
ADD | ALL | ALTER |
ANALYZE | AND | AS |
ASC | ASENSITIVE | BEFORE |
BETWEEN | BIGINT | BINARY |
BLOB | BOTH | BY |
CALL | CASCADE | CASE |
CHANGE | CHAR | CHARACTER |
CHECK | COLLATE | COLUMN |
CONDITION | CONNECTION | CONSTRAINT |
CONTINUE | CONVERT | CREATE |
CROSS | CURRENT_DATE | CURRENT_TIME |
CURRENT_TIMESTAMP | CURRENT_USER | CURSOR |
DATABASE | DATABASES | DAY_HOUR |
DAY_MICROSECOND | DAY_MINUTE | DAY_SECOND |
DEC | DECIMAL | DECLARE |
DEFAULT | DELAYED | DELETE |
DESC | DESCRIBE | DETERMINISTIC |
DISTINCT | DISTINCTROW | DIV |
DOUBLE | DROP | DUAL |
EACH | ELSE | ELSEIF |
ENCLOSED | ESCAPED | EXISTS |
EXIT | EXPLAIN | FALSE |
FETCH | FLOAT | FLOAT4 |
FLOAT8 | FOR | FORCE |
FOREIGN | FROM | FULLTEXT |
GOTO | GRANT | GROUP |
HAVING | HIGH_PRIORITY | HOUR_MICROSECOND |
HOUR_MINUTE | HOUR_SECOND | IF |
IGNORE | IN | INDEX |
INFILE | INNER | INOUT |
INSENSITIVE | INSERT | INT |
INT1 | INT2 | INT3 |
INT4 | INT8 | INTEGER |
INTERVAL | INTO | IS |
ITERATE | JOIN | KEY |
KEYS | KILL | LABEL |
LEADING | LEAVE | LEFT |
LIKE | LIMIT | LINEAR |
LINES | LOAD | LOCALTIME |
LOCALTIMESTAMP | LOCK | LONG |
LONGBLOB | LONGTEXT | LOOP |
LOW_PRIORITY | MATCH | MEDIUMBLOB |
MEDIUMINT | MEDIUMTEXT | MIDDLEINT |
MINUTE_MICROSECOND | MINUTE_SECOND | MOD |
MODIFIES | NATURAL | NOT |
NO_WRITE_TO_BINLOG | NULL | NUMERIC |
ON | OPTIMIZE | OPTION |
OPTIONALLY | OR | ORDER |
OUT | OUTER | OUTFILE |
PRECISION | PRIMARY | PROCEDURE |
PURGE | RAID0 | RANGE |
READ | READS | REAL |
REFERENCES | REGEXP | RELEASE |
RENAME | REPEAT | REPLACE |
REQUIRE | RESTRICT | RETURN |
REVOKE | RIGHT | RLIKE |
SCHEMA | SCHEMAS | SECOND_MICROSECOND |
SELECT | SENSITIVE | SEPARATOR |
SET | SHOW | SMALLINT |
SPATIAL | SPECIFIC | SQL |
SQLEXCEPTION | SQLSTATE | SQLWARNING |
SQL_BIG_RESULT | SQL_CALC_FOUND_ROWS | SQL_SMALL_RESULT |
SSL | STARTING | STRAIGHT_JOIN |
TABLE | TERMINATED | THEN |
TINYBLOB | TINYINT | TINYTEXT |
TO | TRAILING | TRIGGER |
TRUE | UNDO | UNION |
UNIQUE | UNLOCK | UNSIGNED |
UPDATE | USAGE | USE |
USING | UTC_DATE | UTC_TIME |
UTC_TIMESTAMP | VALUES | VARBINARY |
VARCHAR | VARCHARACTER | VARYING |
WHEN | WHERE | WHILE |
WITH | WRITE | X509 |
XOR | YEAR_MONTH | ZEROFILL |
16、问题:Timestamp类型转为json是日期对应问题,如下图,year=116对应2016年,month=4对应5月,date=19就是19号,这样前台处理很麻烦
解决方法:定一个格式化时间的类,如下
package com.hhit.util;
import java.text.SimpleDateFormat;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
public class DateJsonValueProcessor implements JsonValueProcessor {
private String format;
public DateJsonValueProcessor(String format) {
this.format = format;
}
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return null;
}
public Object processObjectValue(String key, Object value,
JsonConfig jsonConfig) {
if (value == null) {
return "";
}
if (value instanceof java.sql.Timestamp) {
String str = new SimpleDateFormat(format)
.format((java.sql.Timestamp) value);
return str;
}
if (value instanceof java.util.Date) {
String str = new SimpleDateFormat(format)
.format((java.util.Date) value);
return str;
}
return value.toString();
}
}
格式化日期,Timestamp类型的会过滤为yyyy-MM-dd HH:mm:ss类型的时间字符串
//过滤掉对象List关联的外键
public static JSONArray jsonListFilter(List objList, String[] filterNames){
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setIgnoreDefaultExcludes(false);
jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT); //防止自包含
jsonConfig.registerJsonValueProcessor(java.sql.Timestamp.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
if(filterNames != null){
//这里是核心,过滤掉不想使用的属性
jsonConfig .setExcludes(filterNames) ;
}
JSONArray jsonArray = JSONArray.fromObject(objList, jsonConfig);
return jsonArray;
}
测试结果如下: