ModelDriven stopped working in Struts2

拥有回忆 提交于 2019-12-12 04:13:38

问题


I have used ModelDriven in my Action class, previously it was working fine, Now it has stopped working

when I used <s:debug> tag of Struts in my jsp I found following result...

---------Updated Image-----------

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"/>

My questions are :

  1. Why I'm getting properties 2 times ?
  2. How to avoid them getting multiple times ?
  3. I have saw many people suggesting to avoid ModelDriven, why ?

-------Update Question-------

  1. Actually I'm getting properties 3 times, I forgot to highlight 3rd one , Plz look at my Action class

  2. I have not defined separate properties of Model class In my action, highlighted by 1,
    how to set these properties ?

  3. Is anything, I'm doing wrong when implementing ModelDriven ?

Here is my model 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;
    }

}

-------Update 2-------
this is my JSP code snippet

<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>

____Update Image for How I got Value Stack Contents Using Debug Tag_____

After using <s:debug/>, I got [debug] link on clicking it , following values are Shown :

<s:debug/> for List Category Page, [debug] link on clicking it , following values are Shown :


回答1:


ModelDriven pushes the model onto the top of the value stack, so you have both a model and action in the stack. 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.

You can find properties with the same name/key on the different levels of the valueStack the order of searching from top to down the stack until the value is found.

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. You might have difficulties with validation, type conversion, other features of the Struts framework that work with interceptors. And if 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.



来源:https://stackoverflow.com/questions/41040018/modeldriven-stopped-working-in-struts2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!