2012-04-03 54 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