1.XXX-validation.xml文件需要放在XXX类的同一个包里面,一般的IDE都会将他们最终放在同一个文件夹里面的。
2.struts2.1.8的validate不需要额外下一个common-validation.jar,这个功能已经内置了。
3.类型转换异常:
ognl.MethodFailedException,通常是如下的情况:
ognl.MethodFailedException: Method "setAge" failed for object test4.TestAction@156d7c8 [java.lang.NoSuchMethodException
通常是因为前端的表单输入了一个非法字符。
出现这种异常我们通常是要到前台的表单里面显示一下了,那么该如何配置呢?
Struts2的机制是如果是出现这种异常的话,Action返回的是一个input,只有配置result值为input的页面就可以了。我们是要跳到前台的当前页面来,可以配置如下:
<action name="TestAction" class="test4.TestAction"> <result name="error">/test4/error.jsp</result> <result name="input">/index.jsp</result> <result name="success">/test4/create.jsp</result> </action>
这里的index.jsp是我自己的表单页面。
然后这里不得不提的是这里存在一个令人很不爽的地方。通常我们要完成增删查改的操作,一般会有两个页面涉及到表单的输入:创建的页面和更新的页面。那现在一旦出错了,只有一个input返回,我该如何配置跳转到两个页面呢?
其实也有解决方案,就是所有的出错信息统一用一个页面来处理,这样就避免了上面的尴尬。不过老是要跳到另外一个页面感觉也不是很好,期待高手的指导。
4.如果不是使用struts2自带的标签库的话,是无法输出出错的信息的。这也是一件很无奈的事情。看什么时候可以研究Ajax+struts2.
5.如何不让控制台输出OGNL转型的错误?
网上的说法是通过更改log4j的配置文件,配置为当抛出的error时才输出。如下:
解决方法: 在log4j.properties 文件中加入:
log4j.logger.com.opensymphony.xwork2=ERROR
|
一开始我的测试是失败的,原因是没有添加log4j-XXX.jar文件,然后log4j.properties也没有写对。参考struts2官方的showcase,配置文件如下:
# Set root logger level to WARN and append to stdout
log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c:%L) - %m%n
# Print only messages of level ERROR or above in the package noModule.
log4j.logger.noModule=FATAL
# OpenSymphony Stuff
log4j.logger.com.opensymphony=INFO
log4j.logger.org.apache.struts2=DEBUG
log4j.logger.com.opensymphony.xwork2=ERROR
然后世界终于清净了。。。
6.如何让输出的错误信息中文化
转型失败的输出信息是英文的:
Invalid field value for field "age".
age是我表单的字段名称
方法同样来自网上,感谢伟大的Internet上面的所有开发者。
在Action对应的包里面新建一个Action名字.properties文件
如:下面的TestAction对应的TestAction.properties
里面写如下的内容:
invalid.fieldvalue.age=必须是数字类型 |
这里的age是TestAction的一个属性。然后用jdk的转码工具将中文转码。可以参考以下的链接:
http://xiehx163.blog.163.com/blog/static/61466796200922301110551/
下面是整个项目的结构图:
src--|
struts.xml
log4j.properties
test----|
TestAction.java
TestAction.properties
TestAction-validation.xml
package.properties
文档解析:
log4j.properties:控制控制台输出的
TestAction:Action:处理业务流程
TestAction.properties:国际化输出转型错误这里是中文
package.properties:国际化输出
TestAction-validation.xml:配置字段校验
log4j.properties:
# Set root logger level to WARN and append to stdout
log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c:%L) - %m%n
# Print only messages of level ERROR or above in the package noModule.
log4j.logger.noModule=FATAL
# OpenSymphony Stuff
log4j.logger.com.opensymphony=INFO
log4j.logger.org.apache.struts2=DEBUG
log4j.logger.com.opensymphony.xwork2=ERROR
TestAction.java:
public class TestAction extends ActionSupport{
private static final long serialVersionUID = -7505437345373234225L;
String name;
int age;
String answer;
//set和get方法
…
}
TestAction.properties:
#国际化输出系统里面的转型错误
invalid.fieldvalue.age=必须是数字类型
package.properties:
#国际化
required = ${getText(fieldName)} 是必填项.
number = ${getText(fieldName)}的长度必须大于13小于19
TestAction-validation.xml:
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="name">
<field-validator type="requiredstring">
<message key="required"></message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">13</param>
<param name="max">19</param>
<message key="number"></message>
</field-validator>
</field>
</validators>
前台的表单:
<s:form method="post" action="TestAction" namespace="/test4">
<s:textfield label="Name" name="name"/>
<s:textfield label="Age" name="age"/>
<s:textfield label="Favorite color" name="answer"/>
<s:submit/>
</s:form>