Grails拦截表单提交修改params

时间:2012-07-23 12:43:54

标签: grails interceptor

为什么我需要这个:

我正在开展一个项目,该项目允许用户选择Nepali Bikram Sambat Date格式的日期(与JavaSQL's“DATE”不兼容)。我是通过修改org.codehaus.groovy.grails.plugins.web.taglib.FormTagLib班级的datePicker tagLibrary来完成的。并修改脚手架模板list.gsp

enter image description here

我的问题:

当用户从浏览器中选择尼泊尔日期并提交表单时,我想阅读[day, month, year]并将其转换为Java Date对象并保存到数据库中。 (当日期显示在视图中时,日期将转换回尼泊尔比克拉姆桑巴特)。

我试图在控制器中打印参数,但是所有参数都已经映射/包装到相应的对象中 - 以及我的尼泊尔日期。所以我从下面的代码中得到Java的日期sysout:

println params.date

我想知道如何拦截表单提交请求并将日期参数修改为英语日期。我看到一个解决方案 - 在表单提交之前使用JavaScript(并将我的转换代码重写为JavaScript)来转换参数。并且只是想确认是否有一种简单的方法 - 如拦截器/过滤器等。

2 个答案:

答案 0 :(得分:1)

您可以创建一个CustomEditorRegistrar,它可以在包装到对象之前更改日期格式。像这样:

public class CustomDateEditorRegister implements PropertyEditorRegistrar {

    public void registerCustomEditors(PropertyEditorRegistry registry) {

        String dateFormat = 'dd/MM/yyyy'
        registry.registerCustomEditor(Date, new CustomDateEditor(new SimpleDateFormat(dateFormat), true))
    }


}

你的日期编辑器可能是这样的:

class CustomSimpleDateEditor extends CustomDateEditor {

    public CustomSimpleDateEditor(SimpleDateFormat formatter, boolean allowEmpty) {
        super(formatter, allowEmpty);
    }

    public String getAsText() {
        Date date = (Date)getValue();
        try {
            String dateText = new SimpleDateFormat("dd/MM/yyyy").parse(date);
            return dateText;
        } 
        catch(Exception e) {
            e.printStackTrace();
            return "";
        }
    }

}

您的params.date将在传递给对象并保存到数据库之前进行转换。无论如何,here是解释它的好链接。

希望它有所帮助!

答案 1 :(得分:1)

好吧,假设您使用带有标准grails datepicker的输入字段,您应该在params映射中使用不同名称传递的字段。在接收请求的操作中写一个“println params”,并查找datepicker字段的名称。它应该带给你一些类似的东西(datepicker字段的名称,比如* + _year,年份,* + _month表示月份等)。