`
rslee
  • 浏览: 4428 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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>
 

 

 

 

 

  • 大小: 4.7 KB
分享到:
评论
4 楼 哥的传说 2011-01-13  
如果 这样写: <s:textfield label="age" name="user.age"/>
在TestAction.properties 中是否该这样写呢:
invalid.fieldvalue.user.age=必须是数字类型
3 楼 hy036630 2010-05-08  
      原来是jar包加错了加的是common-logging-api.jar 和log4j-xx.jar
   按照你的jar包就可以了
    非常感谢
2 楼 rslee 2010-05-07  
首先是确认你的log4j.properties文件在你的classpath里面,这里是WEB-INF/classes文件夹里面
源码我是用netbeans开发的,发到你邮箱去了,你看一下吧
1 楼 hy036630 2010-05-07  
             楼主 你好 看了你的文章我又点困惑.我完全按照你的来 .但是我的后台仍然打印了很多错误信息.


WARN (com.opensymphony.xwork2.ognl.OgnlValueStack:49) - Error setting expression 'id' with value '[Ljava.lang.String;@a2a38'
   ognl.MethodFailedException: Method "setId" failed for object com.UserAction@6c5356 [java.lang.NoSuchMethodException: com.UserAction.setId([Ljava.lang.String;)]
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1265)
at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1454)
at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:85)
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:162)
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:28)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
at com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor.setProperty(CompoundRootAccessor.java:65)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
at ognl.ASTProperty.setValueBody(ASTProperty.java:127)





在网上找了很久也不能解决 .不知道楼主可不可以发一份源代码给我 84051563@qq.com 附上邮箱 
          不胜感激 .谢谢了

相关推荐

    struts2自定义数据类型转换练习

    Struts2作为一款流行的Java Web框架,其在处理用户输入数据时扮演着重要角色。...在练习中,你可以尝试创建不同的自定义转换器,并理解它们在处理不同类型数据时的作用,从而加深对Struts2数据处理机制的理解。

    struts2类型转换 拦截器 校验的例子

    通过分析这些文件,你可以更深入地了解Struts2如何处理请求,执行类型转换,应用拦截器以及进行数据校验。 总结来说,Struts2的类型转换、拦截器和校验机制是构建健壮、可维护的Java web应用程序的重要工具。理解并...

    struts2 类型转换 数据校验

    3. **转换异常**:当类型转换失败时,Struts2会抛出`ConversionException`,并根据配置决定如何处理这个异常,如显示错误消息,或者重定向到特定页面。 **数据校验(Data Validation)** 数据校验则是在类型转换后...

    Struts+Spring+Hibernate练习

    它简化了Web应用的开发过程,提供了表单处理、错误处理和业务逻辑封装等功能。 2. **Spring框架**:Spring是一个轻量级的控制反转(IoC)和面向切面编程(AOP)容器,它管理对象的生命周期和配置,同时提供数据访问...

    Struts2中的validation_多国语言版 国际化i18n+struts2数据校验.zip

    总的来说,这个压缩包提供了一个全面的学习资源,涵盖了Struts2框架中的关键功能:数据校验、前端和后端校验策略、国际化处理以及错误信息的样式定制。通过深入研究这些文档和示例,开发者可以有效地提升其在Struts2...

    struts+spring+hibernate实例

    - 使用`native2ascii`工具将中文资源文件转换为GBK编码,以避免乱码问题。 - 设置Eclipse的编码格式为GBK,确保编辑过程中不出现乱码。 #### 总结 通过以上步骤,我们不仅实现了Struts、Spring 和 Hibernate 的...

    Struts+Spring+Hibernate练习(完整)

    Struts 作为 MVC 模式中的控制器部分,负责处理用户请求并将数据发送到视图;Spring 作为一个轻量级的容器,主要用来管理应用对象的生命周期和依赖关系;而 Hibernate 是一个全功能的对象关系映射(ORM)解决方案,...

    struts+hibernate+spring 登录开发实例

    由于在Tomcat发布后可能出现乱码问题,作者创建了一个批处理文件`properties2GBK.bat`,可能用到了`native2ascii`工具来将非ASCII字符转换为适合Java的字节表示,以解决中文乱码问题。 总结来说,这个开发实例展示...

    Struts2+Spring2.5+jdbc+Ext+json实例的lib包

    在Struts2和Spring中,可以通过Action或Controller将Java对象转换为JSON,然后返回给Ext前端进行渲染。 在"Struts2+Spring2.5+jdbc+Ext+json实例的lib包"中,可能包含了上述技术的相应库文件,如Struts2的struts2-...

    struts+hibernate+Spring面试题

    - 动作拦截器:Struts2使用拦截器处理请求,拦截器链允许自定义业务逻辑和验证规则。 - 表单验证:通过Validation.xml和ActionForm类实现客户端和服务器端验证。 - 结果映射:定义了Action执行后的跳转路径,可以...

    struts2简单例子源码

    这样,当Struts2处理表单提交时,就会自动调用这个转换器来转换用户输入。 验证框架是Struts2中的另一大亮点,它提供了一种有效的方式来检查用户输入的合法性,防止非法数据进入系统。Struts2支持两种验证方式:...

    Struts2全部jar包

    10. **类型转换**:Struts2提供了类型转换机制,自动将请求参数转换为Action类的属性类型,简化开发工作。 在使用Struts2全部jar包时,开发者需要将这些库文件加入到项目的类路径中,通常包括Struts2的核心库、依赖...

    Struts2输入校验总结

    2. **异常处理与错误封装**:如果类型转换过程中遇到问题,如无法正确转换数据类型,会抛出异常。这些异常会被捕获并封装到`fieldError`对象中,存储在`ActionContext`中,以便后续的拦截器处理。 3. **反射调用...

    Struts2的转换器与验证框架

    在处理用户表单提交的数据时,Struts2提供了一套完善的转换器(Converter)和验证(Validation)框架,使得类型转换和数据验证变得更加便捷和高效。 ### 1. Struts2 内置转换器 Struts2 自带了一系列内置转换器,...

    Strut2 + il8n + validation 源码完整版

    它在Java社区中广泛使用,因为它提供了强大的动作调度、类型转换、异常处理和丰富的插件支持。在这个"Strut2 + il8n + validation 源码完整版"项目中,我们看到开发者已经整合了Struts2框架与国际化(i18n)和验证功能...

    struts2基本类库

    Struts2自动将请求参数转化为Action属性的类型,但也可以自定义类型转换器以处理特殊的数据格式。 9. **Struts2的安全问题**: 虽然Struts2强大且灵活,但也曾曝出过安全漏洞,如S2-005、S2-016等。开发者应当...

    struts2笔记

    Struts2的Validation框架使用XML或注解进行字段验证规则的定义,并能方便地处理验证错误。 **五、国际化** Struts2支持多语言环境,通过资源包(Properties文件)实现国际化。开发者可以创建不同的资源包文件,每...

    struts2验证框架简单示例

    在Struts2中,验证框架是处理用户输入验证的关键部分,它确保了从客户端接收到的数据的质量和准确性。本示例将深入探讨Struts2验证框架的基本用法,特别适合初学者理解和掌握。 ### 一、Struts2验证框架概述 ...

    Struts2的输入校验

    1. 类型转换器:Struts2将接收到的字符串参数转换为相应的数据类型,并将这些值赋给Action的属性。如果在此过程中发生异常,异常信息会被保存并由`conversionError`拦截器处理。 2. 客户端校验:Struts2支持在...

    如何自定义Struts2表单验证后的错误信息显示格式/样式

    Struts2支持两种主要的验证方式:基于注解的验证(Annotation-based validation)和基于XML的验证(XML-based validation)。这两种方式都可以在Action类或者单独的Validator XML文件中定义验证规则。 1. **基于...

Global site tag (gtag.js) - Google Analytics