Struts2 没有将文本字段从 JSP 正确映射到操作 Class

Struts2 isn't mapping correctly textfield from JSP to Action Class

我在部署 Struts2 2.3.28 J2EE webapp 并 运行 进入 Apache Tomcat 8 时遇到问题。我有一个 JSP 文件,其中有一个表单存在并且它包含一个带有某个名称的文本字段:

classificazioni.jsp:

<s:form action="editCategorie" >
<s:textfield label="Nome" name="namedCat" value="ciao"/>
<!--
    <s:textfield label="Nome" name="catBean.namedCat" value="ciao"/>
-->

...

我想将此文本字段值访问到相应的 ActionClass 中,我在其中提供了 属性 的声明以及 getter 和 setter:

EditCategorie.java:

private String namedCat;

public String getNamedCat() {
    return namedCat;
}

public void setNamedCat(String namedCat) {
    this.namedCat = namedCat;
}

/*
private CatBean catBean;


public CatBean getCatBean() {
    return catBean;
}

public void setCatBean(CatBean catBean) {
    this.catBean = catBean;
}
*/

public String execute()
{
    return SUCCESS;
}

public String display()
{
    System.out.println(getNamedCat());
    // System.out.println(getCatBean().getNamedCat());
    return NONE;    
}

我知道这样 webapp 应该可以正常工作并在调用 display 方法时打印 namedCat 文本字段值。这是我 struts.xml 感兴趣的部分:

<interceptors>
    <interceptor-stack name="mystack">
        <interceptor-ref name="defaultStack" />
    </interceptor-stack>
</interceptors>

<action name="editCategorie" class="it.unisalento.se.actions.EditCategorie">
        <interceptor-ref name="mystack"/>
        <result name="success" type="tiles">classificazioni</result>
    </action>

    <action name="showCategorie" class="it.unisalento.se.actions.EditCategorie" method="display">
        <interceptor-ref name="mystack"/>
        <result name="none" type="tiles">classificazioni</result>
    </action>

我刚刚尝试了两种不同的方法,正如您在阅读代码时注意到的那样,但是当我尝试将 namedCat 打印到 EditCategorie 的显示方法中时,控制台显示 'null',而使用 Bean 方法时,尽管我知道 Struts2 应该使用正确的填充属性自动实例化 bean class 本身,但这并没有发生,显然当我尝试访问 catBean 实例的 namedCat 属性 时我得到一个 NullPointerException。

最后这也是CatBean.java class:

public CatBean()
{

}

private String namedCat;

public String getNamedCat() {
    return namedCat;
}

public void setNamedCat(String namedCat) {
    this.namedCat = namedCat;
}

我在这里多次读到主要 Struts2 优点是避免使用直接 Servlet 的逻辑,而且我在这里读到这两种方法应该有效。我知道我也可以使用 ModelDriven 方法(这在其他操作中非常有效),但我必须处理参数文本字段,所以情况并非如此。

Struts 每个请求实例化了 2 个动作。

当您点击 showCategorie URL 时,新实例化的操作中没有数据,因此没有任何内容可显示。如果你想保留值,你需要将它保存在某个地方,例如数据库、会话、应用程序等。