为什么ModelDriven停止在Struts 2中工作 [英] Why ModelDriven has stopped working in Struts 2
问题描述
我在 Action
类中使用了 ModelDriven
,以前它可以正常工作,现在已经停止工作了.
I have used ModelDriven
in my Action
class, previously it was working fine, now it has stopped working.
当我在JSP中使用Struts的< s:debug>
标记时,我发现了以下结果:
When I used <s:debug>
tag of Struts in my JSP I found following result:
Struts ValueStack
调试:
Struts ValueStack
Debug:
我在JSP页面中访问的值是:
I'm accessing values in my JSP page as :
<s:property value="categoryName"/>
<s:property value="categoryId"/> // I typed here
工作正常,如果我以以下方式访问它们:
working fine, If I accessed them as :
<s:property value="category.categoryName"/>
<s:property value="category.categoryId"/>
我的问题是:
- 为什么我要两次获得财产?
- 如何避免它们出现多次?
- 我看到很多人建议避免使用
ModelDriven
,为什么?
更新:
-
实际上,我获得了3处房产,但我忘了强调第3处了.请查看我的
Action
类.
我没有在操作中定义 Model
类的单独属性,突出显示1 ,如何设置这些属性?
I have not defined separate properties of Model
class in my action, highlighted by 1, how to set these properties ?
是什么,实现 ModelDriven
时我做错了吗?
这是我在 CategoryAction
中的模型:
Here is my model in CategoryAction
:
public class CategoryAction extends ActionSupport implements ModelDriven<Category>,
Preparable, SessionAware, ServletRequestAware, ServletContextAware {
private static final long serialVersionUID = 1L;
private Category category;
private Category [] categories;
private ServletContext servletContext;
private Map<String, Object> session;
private ServletRequest request;
@Override
public Category getModel() {
return this.category;
}
@Override
public void prepare() throws Exception {
this.category = new Category();
if( this.jmain == null )
this.jmain = new Jmain();
}
public void prepareCrudCategory() throws Exception {
this.categoryService = new CategoryService();
}
@Override
public String execute() throws Exception {
System.out.println("----------CategoryAction#execute()-----------");
if( this.category.getCategoryId() == 0)
this.category = this.jmain.getCategory( 1 ); //Get Main Category
else
this.category = this.jmain.getCategory( this.category.getCategoryId() );
System.out.println(this.category.toString());
return super.execute();
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
public Category[] getCategories() {
return categories;
}
public void setCategories(Category[] categories) {
this.categories = categories;
}
}
更新2:
这是我的JSP代码段:
<form action="add-category" id="id-add-id-entry-form" name="addIdEntry" method="post">
<input type="hidden" id="opType" name="opType" value='<s:property value="opType"/>'>
<br /> <br />
<center>
<span id="id-message-span">
<s:if test="hasActionMessages()">
<h3 style="font-size: 22px; color: #FD0006; text-shadow: 2px 2px 3px rgba(255, 255, 255, 0.1); margin-left: 330px;">
<s:actionmessage />
</h3>
</s:if>
<s:if test="hasActionErrors()">
<h3 style="font-size: 16px; color: #FD0006; text-shadow: 2px 2px 3px rgba(255, 255, 255, 0.1); margin-left: 330px;">
<s:actionerror />
</h3>
</s:if>
</span>
<div id="id-id-entry-div" class="class-id-entry-div class-center">
<fieldset style="height: 100%; border-style: solid; border-width: 2px; border-color: #FEC458;"
>
<legend class="PageTitleUpperCase"> Add Category </legend>
<table cellspacing="5" cellpadding="2" border="0" width="65%" class="class-center">
<tr>
<td>
<span style="color: red">*</span>
<label class="Label_Green"> Patent Category Name :</label>
<s:if test=""></s:if>
</td>
<td>
<s:property value="opType"/><br>
<s:property value="categoryId"/>
<s:property value="categoryName"/>
<s:if test="%{opType == 0}">
<%-- <s:property value="categoryName"/> --%>
<input type="hidden" name="parentCategoryId" value='<s:property value="categoryId"/>' >
<label class="Label_Green">
<s:property value="categoryName"/>
</label>
</s:if>
<s:else>
<%-- <s:property value="parentCategoryName"/> --%>
<input type="hidden" name="parentCategoryId" value='<s:property value="parentCategoryId"/>' >
<label class="Label_Green">
<s:property value="parentCategoryName"/>
</label>
</s:else>
</td>
</tr>
<tr>
<td>
<span style="color: red">*</span>
<label class="Label_Green"> Category Name :</label>
<s:if test=""></s:if>
</td>
<td >
<input type="hidden" name="categoryId"
<s:if test="%{opType == 0}">value='0'</s:if>
<s:else>value='<s:property value="categoryId"/>'</s:else>
>
<input id="id-category-name-text" type="text" name="categoryName"
required="required" size="40" placeholder="Enter Category Name Here..."
<s:if test="%{opType == 1}">value='<s:property value="categoryName"/>'</s:if> >
</td>
</tr>
<tr>
<td></td>
<td align="left"><input type="submit" id="submit_img"
<s:if test="opType != 0"> value='Update'</s:if>
<s:else> value='Submit' </s:else> >
</td>
</tr>
</table>
</fieldset>
</div>
<s:debug/>
</center>
</form>
如何使用调试标记获取 ValueStack
内容:
How I got ValueStack
Contents Using Debug Tag:
在使用< s:debug/>
后,单击它获得了 [debug]
链接,显示以下值:
After using <s:debug/>
, I got [debug]
link on clicking it, following values are shown :
< s:debug/>
,单击该链接时 [debug]
链接,显示以下值:
<s:debug/>
for List Category Page, [debug]
link on clicking it , following values are shown :
推荐答案
The modelDriven
interceptor pushes the model onto the top
of the ValueStack
, so you have both a model and action in the stack.
ValueStack
是Struts框架实现的接口,允许在处理请求时处理数据.您可以从此处中阅读.
ValueStack
is an interface implemented by Struts framework that allows to manipulate data while the request is processed. How it works you can read from here.
您可以在 ValueStack
的不同级别上找到具有相同名称/键的属性,搜索顺序是从 top
向下到堆栈,直到该值找到了.
You can find properties with the same name/key on the different levels of the ValueStack
, the order of searching is from the top
to down the stack until the value is found.
ModelDriven
操作简化了将表单字段映射到模型对象的操作,但是如果您需要对同一操作类进行多个模型操作,则可能会遇到困难.
ModelDriven
action simplifies mapping form fields to the model object, but you might have difficulties if you need to do multiple models to the same action class.
您可能在验证,类型转换以及Struts框架的其他与拦截器一起使用的功能方面遇到困难.
You might have difficulties with validation, type conversion, other features of the Struts framework that work with interceptors.
如果无法解决问题,而不是从已实现的接口中删除 ModelDriven
或重新配置拦截器堆栈以禁用
And if you can't resolve your problems rather than removing ModelDriven
from the implemented interfaces or reconfiguring the interceptor stack to disable modelDriven
interceptor, then you can live without ModelDriven
.
这篇关于为什么ModelDriven停止在Struts 2中工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!