利用SSH框架开发时遇到的各种Bug及解决方法
Posted babyyage
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用SSH框架开发时遇到的各种Bug及解决方法相关的知识,希望对你有一定的参考价值。
1、hibernate自动生成的配置文件 hibernate.cfg.xml 有时候是有问题的,会出现
org.hibernate.HibernateException: Could not parse configuration: /hibernate.cfg.xml
原因是自动生成的hibernate.cfg.xml第二个标签引号内容的最末尾有一个空格,删掉即可
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd ">
2、使用spring 3.x的时候最好使用hibernate3.x版本,不要使用4.1,否则可能也会出现下面的错误。
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sessionFactory‘ defined in file [E:\Workspaces\MyEclipse 10\Spring&Hibernate\src\applicationContext.xml]: Invocation of init method failed; nested exception is Java.lang.ExceptionInInitializerError
3、Exception starting filter struts2
Unable to load configuration. - bean - jar:file:/D:/Tomcat 5.5/webapps/LoginWeb/WEB-INF/lib/struts2-core-2.1.2.jar!/struts-default.xml:46:178
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)
....形如这样的一个错误,提示找不到struts-default.xml文件
原因是
<action name="login.action" class="org.action.LoginAction">中之前是class=”login”,本想通过spring注入的。但是这里报错了。 问题是没有导入struts支持Spring的库,Struts 2 Spring Libraries
4、
Messages: |
· antlr.collections.AST.getLine()I |
File: |
org/hibernate/hql/ast/HqlSqlWalker.java |
Line number: |
876 |
Stacktraces
java.lang.reflect.InvocationTargetException
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
问题出在struts包里面有也有个antlr_XXX.jar,与hibernate包里面的冲突了,我是用myclipse自带的类库,要把struts中低版本的antlr删掉
选择windows---preferences---在文本框中搜索struts 2(中间有空格)---选择struts 2---选择antlr-2.7.2.jar---Remove---OK
5、No result defined for action org.action.LoginAction and result success
把<action name="login.action" class="loginAction"> 和jsp里面的action
的name都改为login就好了, 真是坑爹。
6 、
Exception starting filter Struts2
Caught exception while loading file struts-default.xml - [unknown location]
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles(XmlConfigurationProvider.java:839)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadDocuments(XmlConfigurationProvider.java:131)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.init(XmlConfigurationProvider.java:100)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reload(DefaultConfiguration.java:130)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:52)
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:395)
严重: Exception starting filter struts2
Caught exception while loading file struts-default.xml - [unknown location]
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles(XmlConfigurationProvider.java:839)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadDocuments(XmlConfigurationProvider.java:131)
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.init(XmlConfigurationProvider.java:100)
那基本可断定是其他jar包有冲突, 应该是XML解析包有冲突.
检查发布后的WEB-INF/lib有两个XML解析包: xml-apis.jar和xerces-2.6.2.jar
这种错误真正原因不是JDK 6和Struts 2冲突, 而是 MyEclipse Hibernate 类库中多了两个包: xml-apis.jar和xerces-2.6.2.jar, 这两个包的功能和JDK的冲突了.
解决:删除 hibernate3.2 中的xerces-2.6.2.jar包,
选择windows---preferences---在文本框中搜索struts 2(中间有空格)---选择struts 2---hibernate---选择hibernate3.2---------删除xerces-2.3.2.jar------移除tomcat中的部署------重新部署——ok
7、
hibernate反向工程生成的实体类就不能正确放在指定的包路径下
描述:
使用hibernate反向工程生成实体类时,类文件可以正确生成在src的一级目录下但在二级或多级目录时就会生成在src的默认包下.例如:表 User,它有俩个字段username和password.在src下的一级目录为hibernate,存放User由反向工程生成的实体类User和 UserDao,这时是正确的.但是当存放位置为二级或多级目录时,反向工程生成的实体类就不能正确放在指定的包路径下:例如,在src下存在包 cn.com.test.hibernate 如果我想把生成的实体类放在此包下,当导入时已经指定了该包,可单击确定按钮后,生成的实体类却在src的default包下.
源文档 <;
解决:
在反向生成的最后一步,让你填写类名的时候,你需要把你的包名也包含进去。这样就可以在两层或者以上层存放了。
或者最后一步时,类名使用默认值,不做任何更改。
如果手动移动的话,会报Association references unmapped class错
8、type Exception report
message Could not execute JDBC batch update; SQL [insert into SCOTT.TEST (Value, Id) values (?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.springframework.dao.InvalidDataAccessResourceUsageException: Could not execute JDBC batch update; SQL [insert into SCOTT.TEST (Value, Id) values (?, ?)]; nested exception is org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:635)
org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)
java.sql.BatchUpdateException: ORA-00904: "ID": 标识符无效
Jsp 中获取requets、session、application 中的值,在Action则使用IoC实现接口比较常用
${requestScope.xx}
${sessionScope.xxx}
${applicationScope.xxx}
<%=request.getAttribute(“xxx”)%>
<%=session.getAttribute(“xxx”)%>
<%=application.getAttribute(“xxx”)%>
在struts标签中这样用也可以
Value=“%{#request.xxx}”
工作空间编码不能影响JSP文件的编码,必须单独设置,
Window-->Preferences-->MyEclipse-->Files and Editors-->JSP
Encoding下拉列表中选择ISO10646/Unicode(UTF-8)
Struts.i18n.encoding=UTF-8 指定Struts2 Web应用的默认编码集 ,可在struts.xml中用
<constant name=”xxx”, value=”xx”> 或web.xml中
<init-param>
<param-name>xxx</param-name>
<param-value>xxx</param-value>
<init-param>
取代
<!-- 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker 、velocity的输出 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开-->
<constant name="struts.action.extension" value="do"/>
<!-- 设置浏览器是否缓存静态内容,默认值为true-->
<constant name="struts.serve.static.browserCache" value="false"/>
<!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />
<!-- 默认的视图主题 -->
<constant name="struts.ui.theme" value="simple" />
<!– 与spring集成时,指定由spring负责action对象的创建 -->
<constant name="struts.objectFactory" value="spring" />
<!–该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false-->
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<!--上传文件的大小限制-->
<constant name="struts.multipart.maxSize" value=“10701096"/>
为action取名时,名字中尽量不要使用点号(.)和连接字符(_),否则会出现一些莫名其妙的问题。
可以使用!+方法名调用指定方法,可以这样调用:
/struts/test/helloworld!other.action
在result映射的配置中,在指定实际资源的位置时,可以使用绝对路径也可以使用相对路径。绝对路径是以斜杠(/)开头,相对于当前web项目的上下文路径,相对路径不以斜杠(/)开头,相对于当前执行的action路径。
由于处于chain中的action属于同一个http请求,共享一个ActionContext,故可以在上下文中获取,在页面上可以直接使用。
更新数据库是可以用chain
以上是关于利用SSH框架开发时遇到的各种Bug及解决方法的主要内容,如果未能解决你的问题,请参考以下文章
更新macOS Monterey后遇到的各种Bug及解决方法