为什么ModelDriven停止在Struts 2中工作 [英] Why ModelDriven has stopped working in Struts 2

查看:53
本文介绍了为什么ModelDriven停止在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"/>

我的问题是:

  1. 为什么我要两次获得财产?
  2. 如何避免它们出现多次?
  3. 我看到很多人建议避免使用 ModelDriven ,为什么?

更新:

  1. 实际上,我获得了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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆