gpt4 book ai didi

java - 使用 ModelDriven 时如何执行 XML 验证?

转载 作者:数据小太阳 更新时间:2023-10-29 03:01:50 24 4
gpt4 key购买 nike

我创建了一个 Struts2 项目,我在其中使用了基于 XML 的验证。模型类 RegistrationForm 如下所示

package com.projects;

import com.opensymphony.xwork2.ActionSupport;

public class RegistrationForm implements Serializable{

private static final long serialVersionUID = 1L;
private String fname;
private String lname;
private int numbr;

public int getNumbr() {
return numbr;
}
public void setNumbr(int numbr) {
this.numbr = numbr;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
}

RegistrationFormAction.Java

package com.projects;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class RegistrationFormAction extends ActionSupport implements ModelDriven<RegistrationForm> {
private RegistrationForm registrationForm;
public RegistrationForm getRegistrationForm() {
return registrationForm;
}
public void setRegistrationForm(RegistrationForm registrationForm) {
this.registrationForm = registrationForm;
}

public RegistrationForm getModel(){
registrationForm=new RegistrationForm();
return registrationForm;
}
public String execute(){
return "success";
}
}

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

<constant name="struts.devMode" value="true" />
<package name="dd" extends="struts-default">

<interceptors>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception" />
<interceptor-ref name="alias" />
<interceptor-ref name="servletConfig" />
<interceptor-ref name="prepare" />
<interceptor-ref name="i18n" />
<interceptor-ref name="chain" />
<interceptor-ref name="debugging" />
<interceptor-ref name="profiling" />
<interceptor-ref name="scopedModelDriven" />
<interceptor-ref name="modelDriven" />
<interceptor-ref name="params"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="fileUpload" />
<interceptor-ref name="checkbox" />
<interceptor-ref name="staticParams" />
<interceptor-ref name="conversionError" />
<interceptor-ref name="workflow"/>
</interceptor-stack>
</interceptors>

<action name="submitForm" class="com.projects.RegistrationFormAction">
<interceptor-ref name="defaultStack" />
<result name="success">/WelcomePage.jsp</result>
<result name="input">/RegistrationForm.jsp</result>
</action>
</package>
</struts>

RegistrationFormAction-validation.xml

<!DOCTYPE validators PUBLIC 
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>
<field name="registrationform">
<field-validator type="visitor">
<param name="appendPrefix">false</param>
<message/>
</field-validator>
</field>

</validators>

RegistrationForm-validation.xml

 <!DOCTYPE validators PUBLIC 
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>
<field name="fname">
<field-validator type="requiredstring">
<message>First Name can't be blank</message>
</field-validator>
</field>

<field name="lname">
<field-validator type="requiredstring">
<message>Last Name can't be blank</message>
</field-validator>
</field>
<field name="numbr">
<field-validator type="int">
<param name="min">1</param>
<param name="max">10</param>
<message>Number between 1 to 10</message>
</field-validator>
</field>
</validators>

但验证不起作用。

最佳答案

这里有很多事情要做!我将按照问题中出现的顺序发布它们:

  1. 永远不要让 POJO 扩展 ActionSupport:

    public class RegistrationForm extends ActionSupport {

    必须成为

    public class RegistrationForm implements Serializable {
  2. 返回更好 SUCCESS"success"防止打字错误(但这是次要的);

  3. intercetpor栈定制有四个问题:

    • 您正在覆盖现有的 basicStack ,这有违反 POLA 的风险,特别是如果其他人将在这个项目上工作;最好改用自定义名称,例如。 myStack ;

    • 您只使用了三个拦截器,这是可疑的;虽然可以删除许多默认拦截器,但应始终保留许多其他拦截器,尤其是涉及验证时,例如。 ConversionError拦截器,或 Workflow拦截器等Read how the whole thing works .通常,只有当您确切知道拦截器的作用并且您绝对确定您不需要(也不会)需要它时,您才应该删除拦截器。

    • 使用 ModelDriven 时(这通常不被推荐,因为当不是专家时基本上没用和问题的根源),你需要把 ModelDriven拦截器之前 Parameters拦截器,否则当参数拦截器运行时,模型还不会被推送,并且将在 Action 上搜索 setter ,例如。 setFname() ,而不是在模型上(导致模型中的空属性和警告

      Unexpected Exception caught setting 'fname' on 'class RegistrationFormAction: Error setting expression 'fname' with value ['Sumit', ]

      因为 Action 中缺少 setter)。

    • 最后,如果您真的在使用您发布的代码,那么您就没有使用您创建的错误 堆栈,因为 1) 默认堆栈是 defaultStack , 而不是 basicStack ,如此压倒一切basicStack没有效果,并且 2) 你没有使用 <default-interceptor-ref>更改默认堆栈引用,也没有使用 <interceptor-ref><action>里面标记仅为该操作指定不同的拦截器堆栈。
  4. 您在 XML 验证文件的 DOCTYPE 中混合使用 1.0.2 和 1.0.3,将所有内容设为 1.0.3(并注意它们从 OpenSymphony 迁移到 Apache);然后改变:

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

    <!DOCTYPE validators PUBLIC 
    "-//Apache Struts//XWork Validator 1.0.3//EN"
    "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
  5. 确保 RegistrationFormAction-validation.xml文件位于操作文件夹中,而 RegistrationForm-validation.xmlRegistrationForm.java文件夹。

  6. 考虑避免使用 ModelDriven,因为正如 Stephen Young 所说,

    You Must Tame Complexity to Become a Better Programmer

  7. 正如 AleksandrM 的评论所指出的,

    <field name="registrationform"> 

    应该是

    <field name="registrationForm">

关于java - 使用 ModelDriven 时如何执行 XML 验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30746955/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com