为什么struts验证对我不起作用?

时间:2010-02-19 19:26:47

标签: validation struts2 struts-validation

我正在尝试使用Struts验证来检查用户输入的各个字段。如果有人能够帮助我看到我缺乏的东西,我将非常感激。这就是我所拥有的:

我将validation.xmlTestAction-validation.xml放入WEB-INF/classes/

以下是validation.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
    "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
    "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">

<validators>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    . . .
</validators>

以下是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="testInt">
    <field-validator type="int">
      <param name="min">0</param>
      <param name="max">9</param>
      <message>Number not in range</message>
    </field-validator>
  </field>
  <field name="testString">
    <field-validator type="stringlength">
      <param name="minLength">4</param>
      <message>String not long enough.</message>
    </field-validator>
  </field>
</validators>

我的struts.xml扩展了struts-default,我有一个非常简单的动作类TestAction,其扩展为ActionSupport并且包含字段testInttestString

从我读过的内容来看,这应该足以让Struts检查输入的值,但是没有发生。我错过了什么?

4 个答案:

答案 0 :(得分:6)

您有两种选择,基于每个模型或每个操作进行验证。要在Action级别进行验证,您只需创建一个名为{your action} -validation.xml的文件,并将其放在与Action类相同的包中。要在模型级别进行验证,您需要创建一个类似的文件,该文件采用模型对象的名称,然后根据模型验证文件中的规则指示您的Action验证文件进行验证。 (Reference

将validation.xml放在java源文件(默认包)的根目录中,并将TestAction-validation.xml放在TestAction.java文件所在的同一目录中。大多数IDE会自动将所有资源复制到将生成类文件的相应目录。

更新

http://struts.apache.org/2.x/docs/validation.html

How Validators of an Action are Found

答案 1 :(得分:4)

也许是因为dtd定义

http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd

不再存在

在struts2启动时,我收到此异常,我的验证拦截器不再工作

Line: 1436 - sun/net/www/protocol/http/HttpURLConnection.java:1436:-1
at com.opensymphony.xwork2.util.DomHelper.parse(DomHelper.java:115)
at com.opensymphony.xwork2.validator.DefaultValidatorFileParser.parseValidatorDefinitions(DefaultValidatorFileParser.java:118)
at com.opensymphony.xwork2.validator.DefaultValidatorFactory.retrieveValidatorConfiguration(DefaultValidatorFactory.java:195)
at com.opensymphony.xwork2.validator.DefaultValidatorFactory.parseValidators(DefaultValidatorFactory.java:184)
at com.opensymphony.xwork2.validator.DefaultValidatorFactory.<init>(DefaultValidatorFactory.java:55)

Caused by: java.io.IOException: Server returned HTTP response code: 403 for URL: http://opensymphony.com/xwork/xwork-validator-config-1.0.dtd
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1436)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source)
at org.apache.xerces.impl.XMLEntityManager.startDTDEntity(Unknown Source)
at org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)

答案 2 :(得分:4)

替换 &#34; <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">&#34; 使用新的新DTD

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

这是解决方案,它会起作用。

答案 3 :(得分:3)

可能有几件事情是我的头脑。

1)您是否使用默认拦截器堆栈 - 此堆栈具有验证拦截器,验证工作所需的验证拦截器,否则您必须在堆栈中手动指定验证拦截器。

2)TestAction-validation.xml应该在WEB-INF / classes / [package]下,所以如果动作是com.foo.TestAction那么TestAction-validation.xml应该在WEB-INF / classes / com / foo下/TestAction-validation.xml

3)尝试在验证程序xml文件的名称中使用TestAction类中提交的方法的名称。您可以使用TestAction- [method_to_be_validated] -validation.xml

希望有所帮助!