我正在尝试使用Struts验证来检查用户输入的各个字段。如果有人能够帮助我看到我缺乏的东西,我将非常感激。这就是我所拥有的:
我将validation.xml
和TestAction-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
并且包含字段testInt
和testString
。
从我读过的内容来看,这应该足以让Struts检查输入的值,但是没有发生。我错过了什么?
答案 0 :(得分:6)
您有两种选择,基于每个模型或每个操作进行验证。要在Action级别进行验证,您只需创建一个名为{your action} -validation.xml的文件,并将其放在与Action类相同的包中。要在模型级别进行验证,您需要创建一个类似的文件,该文件采用模型对象的名称,然后根据模型验证文件中的规则指示您的Action验证文件进行验证。 (Reference)
将validation.xml放在java源文件(默认包)的根目录中,并将TestAction-validation.xml放在TestAction.java文件所在的同一目录中。大多数IDE会自动将所有资源复制到将生成类文件的相应目录。
更新
答案 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
希望有所帮助!