Spring属性编辑器只适用于表单吗?

时间:2010-06-17 18:02:20

标签: java spring

我正在开发一个Spring应用程序,它只搜索一组数据以查找符合某些条件的内容。有两个主要视图:一个是允许用户配置搜索条件的简单表单,另一个是以表格形式显示结果。

其中一个搜索字段是一组封闭的选项(大约10个)。在代码中降低,我想将其作为枚举类来处理。 Web表单包含一个下拉列表,允许用户从该集合中选择一个选项。我使用了一个表单:选择这样做,填充一组描述值的字符串。

为了保持表示和业务逻辑分离,枚举类对这些字符串一无所知,所以我创建了一个Property Editor来在两者之间进行转换。当我加载表单时,select控件被设置为与我给它的枚举值相关联的字符串;提交表单时,字符串将转换回我的枚举类型。这一切都很好。

对于结果页面(不是表单),我只需将要显示的数据添加到ModelMap中。目前,我必须在将其添加到地图之前将我的枚举类型显式转换为字符串。我想要做的只是将枚举添加到地图中并让属性编辑器在后台为我转换它,就像它对表单一样。我怎么也弄不清楚。是否有可能做到这一点?也许我错过了一些非常明显的东西?

1 个答案:

答案 0 :(得分:3)

您可以使用Spring Tablib

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>

并使用转换标记

<!--If you have a command which command name is account-->
<!--Default command name used in Spring is called command-->
<spring:bind path="account.balance">${status.value}</spring:bind>

或者

<spring:bind path="account.balance">
    <spring:transform value="${account.balance}"/>
</spring:bind>

或者

<!--Suppose account.balance is a BigDecimal which has a PropertyEditor registered-->
<spring:bind path="account.balance">
    <spring:transform value="${otherCommand.anotherBigDecimalProperty}"/>
</spring:bind>

关于价值属性

  

可以是普通值进行转换(JSP或JSP表达式中的硬编码字符串值),或要评估的JSP EL表达式(转换表达式的结果)。与Spring的所有JSP标记一样,此标记能够在任何JSP版本上解析EL表达式。

其API

  

使用BindTag 中适当的自定义PropertyEditor(只能在BindTag中使用)提供变量到String的转换

如果您使用MultiActionController,我建议您使用Dummy Command类,如下所示

public class Command {

    public BigDecimal bigDecimal;
    public Date date;
    /**
      * Other kind of property which needs a PropertyEditor
      */

    // getter's and setter's

}

在MultiActionController中

public class AccountController extends MultiActionController {

    @Autowired
    private Repository<Account, Integer> accountRepository;

    public AccountController() {
        /**
          * You can externalize this WebBindingInitializer if you want
          *
          * Here it goes as a anonymous inner class
          */
        setWebBindingInitializer(new WebBindingInitializer() {
            public void initBinder(WebDataBinder dataBinder, WebRequest request) {
                binder.registerCustomEditor(BigDecimal.class, new CustomNumberEditor(BigDecimal.class, numberFormat, true));
                binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true));
            }
        });
    }

    public ModelAndView(HttpServletRequest request, HttpServletResponse response) throws Exception {
        return new ModelAndView()
                   .addAllObjects(
                       createBinder(request, new Command())
                      .getBindingResult().getModel())
                   .addObject(accountRepository.findById(Integer.valueOf(request.getParameter("accountId"))));
    }

}

在JSP中

<c:if test="{not empty account}">
   <!--If you need a BigDecimal PropertyEditor-->
   <spring:bind path="command.bigDecimal">
       <spring:transform value="${account.balance}"/>
   </spring:bind>
   <!--If you need a Date PropertyEditor-->
   <spring:bind path="command.date">
       <spring:transform value="${account.joinedDate}"/>
   </spring:bind>
</c:if>

当您的Target命令未提供需要在另一个命令中使用的PropertyEditor 时,非常有用。