struts2 validation+类型转换错误处理


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=必须是数字类型

这里的ageTestAction的一个属性。然后用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>
 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值