2016-12-08 7 views
0

Я использовал ModelDriven в моем классе действий, ранее он работал отлично, теперь он перестал работатьModelDriven перестал работать в Struts2

, когда я использовал <s:debug> тег Struts в моем JSP я нашел следующий результат ...

--------- Обновлено изображение -----------

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 раза?
  2. Как избежать их получения нескольких раз?
  3. Я видел много людей, предлагающих избегать ModelDriven, почему?

------- Обновление Вопрос -------

  1. На самом деле я получаю его свойства 3 раза, я забыл выделить 3-ий, Plz посмотреть на мой класс действия

  2. Я не определил отдельные свойств Model class В моем действии, подсвечивается 1,
    Как установить эти свойства?

  3. ничего, я делаю неправильно при реализации ModelDriven?

Вот моя модель 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 -------
это мой 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> 

____Update Изображения для Как я Значение стека содержимое с помощью Debug Tag_____

После использования <s:debug/>, я получил [debug] ссылки на мышь, следующие значения Показаны:

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

<s:debug/> для Списка категорий Страницы , [debug] ссылка на щелчок, следующие значения показаны:

List Category Page

+1

ModelDriven подталкивает модель к вершине стека значений после нажатия на действие. Свойства действия, например, 'model', все еще существуют - это не подталкивает модель * вместо * действия. Я вообще избегаю ModelDriven для всех, кроме самых простых случаев, потому что я не нашел его слишком полезным. –

+0

@DaveNewton plz проверить мое обновление и как установить свойства в ** выделены 1 **? –

ответ

1

ModelDriven подталкивает модель к вершине стека значений, поэтому у вас есть как модель, так и действие в стеке. ValueStack - это интерфейс, реализованный каркасом Struts, который позволяет манипулировать данными во время обработки запроса. Как это работает, вы можете читать от here.

Вы можете найти свойства с тем же именем/ключом на разных уровнях valueStack порядок поиска сверху вниз по стеку до тех пор, пока значение не будет найдено.

ModelDriven действие упрощает сопоставление полей формы объекта модели, но у вас могут возникнуть трудности, если вам нужно сделать несколько моделей для одного и того же класса действий. У вас могут возникнуть трудности с проверкой, преобразованием типов, другими функциями инфраструктуры Struts, которые работают с перехватчиками. И если вы не можете решить свои проблемы, а не удалить ModelDriven из реализованных интерфейсов или переконфигурировать стек перехватчика, чтобы отключить перехватчик modelDriven, вы можете жить без ModelDriven.

+0

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/130398/discussion-on-answer-by-roman-c-modeldriven-stopped-working-in-struts2). –