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 时,新实例化的操作中没有数据,因此没有任何内容可显示。如果你想保留值,你需要将它保存在某个地方,例如数据库、会话、应用程序等。
我在部署 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 时,新实例化的操作中没有数据,因此没有任何内容可显示。如果你想保留值,你需要将它保存在某个地方,例如数据库、会话、应用程序等。