ModelDriven停止在Struts2中工作

时间:2016-12-08 12:53:49

标签: java struts2 model-driven valuestack

我在我的Action类中使用了ModelDriven,以前它工作正常,现在它已经停止工作

当我在我的jsp中使用Struts的<s:debug>标签时,我发现了以下结果......

---------更新图片-----------

enter image description here

我正在jsp页面中访问值:

<s:property value="categoryName"/>
<s:property value="categoryId"/>       // I typed here

工作正常,如果我将它们视为:

<s:property value="category.categoryName"/>
<s:property value="category.categoryId"/>

我的问题是:

  1. 为什么我要两次获得物业?
  2. 如何避免多次出现?
  3. 我看到很多人建议避免 ModelDriven ,为什么?
  4. -------更新问题-------

    1. 实际上我有3次获得属性,我忘了突出第3个,Plz看看我的动作类

    2. 我没有定义Model class的单独属性在我的操作中,以1突出显示
      如何设置这些属性

    3. 有什么,我在实施ModelDriven时做错了吗?

    4. 这是我的模型 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>
      

      ____更新图片,了解我如何使用调试标签获取价值堆栈内容_____

      使用<s:debug/>后,我点击了[debug]链接,显示以下值:

      Update Image for How I got Value Stack Contents Using Debug Tag

      <s:debug/> 列表类别页面[debug]链接点击它,显示以下值:

      List Category Page

1 个答案:

答案 0 :(得分:1)

ModelDriven将模型推送到值堆栈的顶部,因此您在堆栈中同时拥有模型和操作。 ValueStack是Struts框架实现的接口,允许在处理请求时处理数据。如何运作,您可以阅读here

您可以在valueStack的不同级别找到具有相同名称/键的属性。从上到下搜索堆栈的顺序,直到找到该值。

ModelDriven操作简化了将表单字段映射到模型对象,但如果需要对同一个操作类执行多个模型,则可能会遇到困难。您可能在验证,类型转换以及与拦截器一起使用的Struts框架的其他功能方面遇到困难。如果无法解决您的问题而不是从已实现的接口中删除ModelDriven或重新配置拦截器堆栈以禁用modelDriven拦截器,那么您可以不使用ModelDriven