【问题标题】:Hidden field becomes null when binding it in stripes actionbean在条纹actionbean中绑定隐藏字段时变为空
【发布时间】:2012-04-03 18:43:29
【问题描述】:

我有一个条纹操作页面。并且当页面加载时,我想通过从一个对象(即 setOriginalAssignee (userAction.getAssignee()))分配它来保存 originalAssignee,这样如果对象的字段受让人发生更改,我将进行一些计算。这是我的动作 bean:

@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);
    }


}

view-details.jsp 页面的一部分看起来像这样

<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 方法时,它说 originalAssignee 为空。我不应该弄清楚原因。我应该对转发或重定向分辨率进行更改吗?

仅供参考:userAction 是一个休眠的持久对象。 谢谢。

【问题讨论】:

  • 您是否验证过表单中的隐藏字段设置正确?查看源代码还是将其更改为文本字段?
  • 这是我看到源代码时所拥有的 但是,当我添加“ value="${actionBean.originalAssignee} “”到隐藏的 var .. 它工作得很好。我不知道为什么原始代码不起作用,但至少现在它解决了问题。

标签: hibernate binding action hidden-field stripes


【解决方案1】:

这是我看到源代码时所拥有的

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

但是,当我将“value="${actionBean.originalAssignee}"”添加到隐藏的 var 时,它运行良好。我不知道为什么原始代码不起作用,但至少现在它解决了问题。

仅供参考:如果您能提供上一个不起作用的原因,并且您的解决方案比我的更好,我会让您的解决方案。因此,请随时添加您的答案。

【讨论】:

    【解决方案2】:

    您的问题在于类型转换/格式化。

    在 HTTP 协议中数据只能表示为字符串。所以所有的 HTML 表单值都需要格式化为 String 值,并且当 action bean 上的 setter 被调用时需要进行类型转换。开箱即用的 Stripes 有 type converters / formatters 用于 intlongdate 等。

    但从逻辑上讲,Stripes 不知道如何格式化/转换您自己制作的类,因此您需要使用带有字符串值(或任何其他已知类型)的 getter 和 setter,并自己映射到您自己的类型.或者您需要通过提供自定义 Formatter/TypeConverters 并使用 @Validate(converter=UserTypeConverter.class) 来扩展 Stripes 的类型转换/格式化系统

    另请参阅:http://www.stripesframework.org/display/stripes/Binding+Into+Domain+Modelshttp://www.stripesframework.org/display/stripes/Validation+Reference

    顺便说一句 Stripersist 包还包含一个 EntityTypeConverter / EntityFormatter 将映射您的 JPA 实体。

    【讨论】:

    • 感谢您的回复。首先,我已经有了 originalAssignee 的 setter 和 getter 方法。其次,我们使用除 String 之外的任何类型的对象,它们都可以正常工作。正如你所看到的,userAction 有 getter 和 setter 方法,它的类型不是 String,但它工作正常。
    【解决方案3】:

    原因是因为 Stripes 默认输入标签填充策略首先查看请求参数,然后查看 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      相关资源
      最近更新 更多