Struts2开发中遇到的错误及解决方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
笔者记录下自己在开发过程中所遇到的一些常见的错误和警告,以供参考:
1、警告:Settings: Could not parse struts.locale setting, substituting default VM locale
分析及解决方法:
这是默认环境没有设置好,有两种方法可以解决。
在WEB-INF/classes/struts.properties或者src/struts.properties文件中如下配置:struts.locale=en_GB;或者在struts.xml中如下配置:<constant name="struts.locale" value="en_GB" />
2、警告:No configuration found for the specified action: 'sum.action' in namespace: ''. Form
action defaulting to 'action' attribute's literal value.
分析及解决方法:
由于jsp文件中标签<s:form action=”sum.action”/>它对应的源文件是<form action=”/context/sum.action”>,sturts把action属性值当成了一个action name了,但这也不影响使用;但是对于使用了动态方法调用(struts.enable.DynamicMethodInvocation = true)就没有那么幸运了,提交时就会得到HTTP Status 404 - /context/sum错误。
对于以上情况,可以把标签写成<s:form action=”sum”/>及<s:form action=”sum!save”/><s: namespace=”your value”
action=”sum!save” />
3、ERROR:Cannot create JDBC driver of class '' for connect URL 'null'
分析及解决方法:
这是由于tomcat下的server.xml里的<Resource>没有配置好或没有相应的<Resource>配置,可按如下配置:
<Resource name=”userDatabase” auth="Container" type="javax.sql.DataSource"
maxActive="50" maxIdle="30" maxWait="10000"
logAbandoned="true" username="sa" password="nenu"
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;DatebaseName=st"/>
4、ERROR:Cannot load JDBC driver class 'com.microsoft.jdbc.sqlserver.SQLServerDriver'
分析及解决方法:
这是由于JDBC的驱动没有装,可将sqlserver需要的三个驱动包msbase.jar,mssqlserver.jar,msutil.jar拷贝到tomcat的安装目录下的 common\lib文件夹下面即可。
5、ERROR:Cannot create resource instance
分析及解决方法:
这是由于<Resource .../>里type属性设置不正确,按不同的数据库相应的做出调整就好了。
6、ERROR:NotFoundException: Name jdbc is not bound in this Context
分析及解决方法:
这个很明显,上下文中找不到所给的jdbc名称,仔细查看纠正一下就好了
7、严重: Exception starting filter struts2、Error filterStart、Context [/struts2] startup failed
due to previous errors
分析及解决方法:
(1)在struts.xml中action中的包路径出错
(2)在工程中导入一个commons-fileupload的包
8、java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对象名 'info'
无效
分析及解决方法:
出现这情况由两种可能性:
(1)配置的数据库中没有info表或者是表名写错了,这是就要将其更改为info表所在的数据库名或
表名;
(2)程序当前打开的数据库并非是我们所配置的数据库,虽然机率很小,但是在以不同用户身份登录时就可能出现这种情况,因为server默认打开的是master数据库。
这时可以将你要使用的数据库设置为默认或者是在sql语句中打开数据库(如:”use st select * from info”)
9、struts2中使用datetimePicker组件时的乱码显示
分析及解决方法:
参考datetimePicker的使用.docx
10、log4j:WARN No appenders could be found for logger(mons.digester.Digester.sax)
log4j:WARN Please initialize the log4j system properly
分析及解决方法:
由于缺少log4j.properties文件引起的,或是该文件位置放置不正确。
可以按要求格式创建一个log4j.properties文件,放到src目录下(会自动拷贝到WEB-INF\classes 目录下)或直接放到WEB-INF\classes
11、在struts2表单验证过程中,当遇到验证错误或者类型转换错误时,struts2框架自动生成一条错误
信息,并且将该错误信息放到addFieldError里面, 最后这个信息会显示在相应的错误页中.
有时我们不希望这些错误出现在页面中,而是用自己的方式来表达,可以通过以下操作实现:
1)表单标签有一个theme(主题)属性, 默认主题是使用表格; 还有Ajax等主题, 这里换为simple主
题, 表示不再用表格封装这个标签;这样就可以消除自动错误提示了
2)可以使用<s:fielderror/>来显示错误,如果错误时ActionError,就需要<s:actionerror/>标签来显示
3)在表单提交失败时,希望原来填过的值可以保留,struts2的s标签自动有保留功能,html标签需要通过request的el表达式实现保留
12、Struts2环境下,使用自己定义的拦截器时,报HTTP-500错误
分析及解决方法:
HTTP-500是指内部服务器错误,所以错误处在运行的环境配置中;如果这时报NullPointerException,那错误很可能就是因为action.xml中忘记配置<interceptor-ref name="defaultStack" />,这样就会导致struts2默认拦截器不能使用,给程序运行造成严重影响
13、INFO:The Apache Tomcat Native library which allows optimal performance in production
environments was not found on the java.library.path
分析及解决方法:
这时由于tomcat没能成功加载APR,可以到http://tomcat.heanet.ie/native/下载tcnative-1.dll 文件,这里需要注意的是tcnative-1.dll有32位和64位两种,根据自己的JDK选择合适的
tcnative-1.dll,放到%JDK-home%\bin目录下,再重启tomcat就能加载APR了
14、[SQLServer]当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'person' 中的标识列插入显式值
分析及解决方法:
由于标识列是自动增长类型,在默认情况下是不能插入显式值,也就是IDENTITY_INSERT默认为OFF; 15、使用Hibernate时,表中字段(例如:zd)的默认值失效
分析及解决方法:
由于hibernate通过session.save()来进行数据添加动作,如果程序中zd没有赋值,那么程序将会使用它的数据类型的默认值来进行添加,从而取代了数据库中配置好的默认值。
可以通过以下操作来实现表中默认值生效:1)在相关表的映射XML文件的class项增加:dynamic-insert="true";2)同时需要在相关字段设置:not-null=”false”
16、ids for this class must be manually assigned before calling save(): hibernate.Person
分析及解决方法:
hibernate出现这个错误的原因有可能因为,你的表中有个主键。
但是你插入的(调用save)时那个值是null.
如果主键是int、short或long类型,可以设置generator class为native;如果是char类型,可以在其对应的Person.hbm.xml里的id标签里添加unsaved-value="null";或者在数据表里给主键添加默认值,然后在对应的id标签里添加dynamic-insert="true"
17、JSP中out.print("<script
language='javascript'>Response.Redirect('login.jsp')</script>");语句跳转不成功:
分析及解决方法:
貌似没有问题,其实Response.Redirect()是asp中的跳转方法,可以使用JavaScript中的
location.href='login.jsp'来替换,或者直接用java中的response.sendRedirect(‘url’)
18、Exception:Underlying input stream returned zero bytes
分析及解决方法:
由于数据表中有个字段为text类型的,不能将一个"NULL"值和一个""(empty)存储在text类型的字段中。
否则查询时就会出现[Microsoft][SQLServer 2000 Driver for JDBC]Underlying input stream returned zero bytes 的异常了。
可以将这个字段设个默认值,如””,就能解决这个bug了
19、运用JS通过idName.submit()或getElementById(idName).submit()控制弹出层tdiv里表单提交不
成功,弹出层里的内容由隐藏层ydiv提供(即tdiv.innerHTML=ydiv.innerHTML),提示对象不可用或提交后取得表单元素属性值为空
分析及解决方法:
ydiv的display属性为none,虽然IE不会进行预读取,但其他浏览器却会这么做,这样就id为idName 的表单就有两个了,通过getElementById(idName).submit()提交的是隐藏层中的表单;通过
idName.submit()提交就会提示说对象不可用,这里idName是个对象数组了。
解决方法有两种:一是用form自己的提交按钮;而是用document.idName[1].submit()来提交就好了20、Access restriction: The type JPEGImageEncoder is not accessibl e due to restriction on required
library:%java_home%\jre\lib\rt.jar
分析及解决方法:
Such errors indicate use of non-API classes and those access rules are defined by Eclipse JDT(Joint Design Team)
You can change compiler settings to not fail on those restrictions in workspace settings in Window \/ Preferences \/ Java \/ Compiler \/ Errors/Warnings \/ Deprecated and restricted API \/ Forbidden reference (access rules) \/ Warnings; or per-project from Project \/ Properties \/ Java Compiler \/ Errors\/Warnings \/ Deprecated and restricted API \/ Forbidden reference (access rules) \/ Warnings"
21、Tomcat5.0环境下运行struts2,出现下述异常,Exception starting filter struts2:
javax.xml.transform.TransformerFactoryConfigurationError: Provider
org.apache.xalan.processor.TransformerFactoryImpl not found,at
javax.xml.transform.TransformerFactory.newInstance(Unknown Source)
分析及解决方法:
${tomcat.home}\common\endorsed目录下缺省serializer.jar、xalan.jar、xercesImpl.jar、xml-apis.jar包或版本不合适,/xml/xalan-j/可下载
22、Tomcat5.0环境下运行Struts2,出现Unable to load configuration. - bean -
jar:file:/${work.dir}/WEB-INF/lib/struts2-core-2.1.8.1.jar!/struts-default.xml:47:178 分析及解决方法:
struts2除了它的5个核心jar包外,common-io-x.x.x.jar和common-fileupload-x.x.x.jar这两个jar包也必须放到lib目录下
23、Tomcat5.5环境下,出现WARNING: Security role name private used in an <auth-constraint>
without being defined in a <security-role>
分析及解决方法:
由于在项目web.xml里配置了auth-constraint,但是没有在%tomcat_dir%\conf\web.xml中定义<security-role>标签。
例如项目web.xml里这样引用
<auth-constraint><role-name>yourname</role-name></auth-constraint >,那么在tomcat下的web.xml就要增加如下标签:<security-role><role-name>yourname</role-name></security-role>。