2012-04-03 55 views
2

我有一個條紋操作頁面。和頁面加載時,我想通過從一個對象(即setOriginalAssignee(userAction.getAssignee()))中分配它來保存原始的受權人,以便萬一如果對象的字段受讓人被更改,我將執行一些計算。這是我行動的bean:隱藏的字段在綁定條帶時變爲null actionbean

視圖-details.jsp頁面
@UrlBinding("/action/view-details.page") 
public class ActionListViewPage extends CustomAction { 
. 
. 
. 
private static final String ACTION_LIST_VIEW = "/action/view-details.jsp"; 
private static final String ACTION_HOME_PAGE="/action/dashboard.page"; 
private SecurityPerson originalAssignee; 
private UserAction userAction; 

    public UserAction getUserAction() { 
     return userAction; 
    } 

    public void setUserAction(UserAction userAction) { 
     this.userAction = userAction; 
    } 

    public SecurityPerson getOriginalAssignee() { 
     return originalAssignee; 
    } 

    public void setOriginalAssignee(SecurityPerson originalAssignee) { 
     this.originalAssignee = originalAssignee; 
    } 

@DefaultHandler 
    public Resolution showUserAction() { 


     if(userAction==null){ 
      flash("error", "Can't find the the specified User action."); 
      return new RedirectResolution(ACTION_HOME_PAGE); 
     } 

     setOriginalAssignee(userAction.getAssignee());// This one works fine and assigns the the assignee to originalAssignee for future reference 
     return new ForwardResolution(ACTION_LIST_VIEW); 
    } 
public Resolution saveUserAction() { 

     try { 

      if(!originalAssignee.equals(userAction.getAssignee())){ 
       userAction.setStatusEnum(StatusEnum.RE_ASSIGNED); 
       userAction.setAssignedBy(getCurrentUser(getRequest())); 
       userAction.setAssignedTimestamp(new Date()); 
      } 

      if (userAction.getStatusEnum() == null) { 
       userAction.setStatusEnum(FinAidActionStatusEnum.UNASSIGNED); 
      } 


      userAction.save(); 
      flash("ok", "User Action change has been saved to the database. "); 

     } 
     catch (Exception e) { 

      flash("error", "Error saving UserAction./n " + e.getMessage()); 
     } 
     return new RedirectResolution(ACTION_HOME_PAGE); 
    } 


} 

部分看起來像這樣

<stripes:form beanclass="${actionBean.class}" name="actionListForm" id="actionListForm" method="POST" 
           action="view-details.page?saveUserAction=1" 
           style="padding-left:20px;"> 
        **<stripes:hidden name="originalAssignee"/>** 

        <tr> 
         <td align="left"> Assign to:</td> 

         <td align="right"> 
          <stripes:select name="userAction.assignee" value="${actionBean.userAction.assignee}" 
              onchange="$('actionListForm').submit();"> 
           <stripes:option value=""> </stripes:option> 
           <stripes:options-collection collection="${actionBean.assigneeList}" 
                  label="person.name"/> 
          </stripes:select> 
         </td> 
         </br> </br> 
        </tr> 
        <tr> 
         <td> 
          Status: 
         </td> 
         <td> 
          <stripes:select name="userAction.statusEnum" onchange="$('actionListForm').submit();" 
              value="${actionBean.userAction.statusEnum}"> 
           <stripes:option value=""> </stripes:option> 
           <stripes:options-enumeration enum="uiowa.maui.biz.finaid.enums.FinAidActionStatusEnum"/> 
          </stripes:select> 
         </td> 

        </tr> 

        <stripes:hidden name="userAction"/> 


       </stripes:form> 

正如你可以從我的代碼,我用隱藏變量保持originalAssignee看到...但當調用saveUserAction方法時,它說原始的Assignee爲null。我不應該找出原因。我應該對Forward或Redirect解決方案做出改變嗎?

參考:userAction是一個hibernate持久對象。 謝謝。

+0

您是否已驗證隱藏字段是否在表單中正確設置?要麼查看源代碼或將其更改爲文本字段? – clmarquart 2012-04-04 13:11:45

+0

這就是當我看到源文件時我有的 然而,當我將「value =」$ {actionBean.originalAssignee}「」添加到隱藏的變量..它工作得很好。我不知道爲什麼原始代碼不起作用,但至少現在它解決了這個問題。 – WowBow 2012-04-04 16:41:43

回答

0

這是我當我看到源

<input type="hidden" value="" name="originalAssignee"> 

然而,當我添加「value="${actionBean.originalAssignee}"」的隱藏VAR ..它工作得很好。我不知道爲什麼原始代碼不起作用,但至少現在它解決了這個問題。

供參考:如果你能提供爲什麼前一個不工作,你的解決方案比我的更好,我會讓你的解決方案。所以,請隨時添加您的答案。

0

你的問題是類型轉換/格式。

在HTTP協議數據中只能表示爲字符串。因此,所有HTML表單值都需要格式化爲字符串值,並且當操作bean上的setter被稱爲類型轉換時需要。開箱即用的條紋有inttype converters/formatterslongdate

但在邏輯上可以條紋不知道如何格式化/轉換自己的自制類,因此您可能需要使用getter和setter字符串值(或任何其他已知類型),並將自己的類型映射到自己的類型。或者你需要提供自定義格式/類型轉換器來擴展類型轉換/格式化條紋的系統,並使用@Validate(轉換器= UserTypeConverter.class)

參見:http://www.stripesframework.org/display/stripes/Binding+Into+Domain+Modelshttp://www.stripesframework.org/display/stripes/Validation+Reference

BTW Stripersist包也包含將映射您的JPA實體的EntityTypeConverter/EntityFormatter

+0

謝謝您的回覆。 首先,我已經爲originalAssignee設置了setter和getter方法。其次,我們使用除String以外的任何類型的對象,並且它們工作正常。正如你可以看到userAction具有getter和setter方法,並且它的類型不是String,但它工作正常。 – WowBow 2012-04-09 14:25:45

+1

我更新了我的答案,希望它能幫助你找到你的問題。 – Kdeveloper 2012-04-09 19:12:55

0

的原因是因爲條紋默認輸入標籤人口戰略首先查看請求參數,然後在ActionBean中值:

退房https://stripesframework.atlassian.net/wiki/display/STRIPES/Tag+Library+Doc 部分輸入標籤人口與覆育」

DefaultPopulationStrategy搜索按以下順序爲 填充給定輸入標記時的第一個非空值:

  1. HttpServletRequest的參數的地圖爲匹配的 輸入標籤
  2. 的的ActionBean一個屬性或嵌套屬性
    匹配輸入標記的名稱
  3. 由標籤
    本身指定的值(可變的名稱值通過標籤;通常作爲值屬性,或者作爲身體標記的 )

可以通過使用BeanFirstPopulationStrategy全系統更改此行爲。還有一些方法可以將此行爲限制爲特定的bean:https://stripesframework.atlassian.net/wiki/display/STRIPES/Overriding+PopulationStrategy+per+ActionBean