为什么通过grails控制器中的参数从视图中提取日期这么难?
我不想像这样用手提取日期:
instance.dateX = parseDate(params["dateX_value"])//parseDate is from my helper class
我只想使用instance.properties = params
。
在模型中,类型为java.util.Date
,并且在参数中包含所有信息:[dateX_month: 'value', dateX_day: 'value', ...]
我在网上搜索,没有发现任何相关信息。我希望Grails 1.3.0可以帮助但仍然是同样的事情。
我不能也不会相信手工提取日期是必要的!
答案 0 :(得分:84)
Config.groovy
中的设置定义了将参数绑定到Date
时将在整个应用范围内使用的日期格式
grails.databinding.dateFormats = [
'MMddyyyy', 'yyyy-MM-dd HH:mm:ss.S', "yyyy-MM-dd'T'hh:mm:ss'Z'"
]
grails.databinding.dateFormats
中指定的格式将按照列表中包含的顺序进行尝试。
您可以使用@BindingFormat
import org.grails.databinding.BindingFormat
class Person {
@BindingFormat('MMddyyyy')
Date birthDate
}
我不能也不会相信手工提取日期是必要的!
你的固执得到了回报,可以在Grails 1.3之前很久就直接绑定日期。步骤是:
(1)创建一个注册日期格式编辑器的类
import org.springframework.beans.PropertyEditorRegistrar
import org.springframework.beans.PropertyEditorRegistry
import org.springframework.beans.propertyeditors.CustomDateEditor
import java.text.SimpleDateFormat
public class CustomDateEditorRegistrar implements PropertyEditorRegistrar {
public void registerCustomEditors(PropertyEditorRegistry registry) {
String dateFormat = 'yyyy/MM/dd'
registry.registerCustomEditor(Date, new CustomDateEditor(new SimpleDateFormat(dateFormat), true))
}
}
(2)通过在grails-app/conf/spring/resources.groovy
beans = {
customPropertyEditorRegistrar(CustomDateEditorRegistrar)
}
(3)现在,当您以foo
格式在名为yyyy/MM/dd
的参数中发送日期时,它将自动绑定到名为foo
的属性使用:
myDomainObject.properties = params
或
new MyDomainClass(params)
答案 1 :(得分:14)
Grails 2.1.1在params中有一个新方法,可以轻松进行空安全解析。
def val = params.date('myDate', 'dd-MM-yyyy')
// or a list for formats
def val = params.date('myDate', ['yyyy-MM-dd', 'yyyyMMdd', 'yyMMdd'])
// or the format read from messages.properties via the key 'date.myDate.format'
def val = params.date('myDate')
在doc here
中找到它答案 2 :(得分:11)
您可以在application.yml中设置遵循以下语法的日期格式:
grails:
databinding:
dateFormats:
- 'dd/MM/yyyy'
- 'dd/MM/yyyy HH:mm:ss'
- 'yyyy-MM-dd HH:mm:ss.S'
- "yyyy-MM-dd'T'hh:mm:ss'Z'"
- "yyyy-MM-dd HH:mm:ss.S z"
- "yyyy-MM-dd'T'HH:mm:ssX"
答案 3 :(得分:2)
您是否尝试使用任何Grails日期选择器插件?
我对calendar plugin有很好的体会。
(使用日历插件时)提交日期选择请求时,您可以自动将查询参数绑定到要用请求填充的域对象。
E.g。
new DomainObject(params)
你也可以像这样解析“yyyy / MM / dd”日期字符串......
new Date().parse("yyyy/MM/dd", "2010/03/18")
答案 4 :(得分:2)
@Don感谢您的回答。
这是自定义编辑器的替代方案,可以检查首次日期时间和日期格式。
Groovy,只需为java添加半冒号
import java.text.DateFormat
import java.text.ParseException
import org.springframework.util.StringUtils
import java.beans.PropertyEditorSupport
class CustomDateTimeEditor extends PropertyEditorSupport {
private final java.text.DateFormat dateTimeFormat
private final java.text.DateFormat dateFormat
private final boolean allowEmpty
public CustomDateTimeEditor(DateFormat dateTimeFormat, DateFormat dateFormat, boolean allowEmpty) {
this.dateTimeFormat = dateTimeFormat
this.dateFormat = dateFormat
this.allowEmpty = allowEmpty
}
/**
* Parse the Date from the given text, using the specified DateFormat.
*/
public void setAsText(String text) throws IllegalArgumentException {
if (this.allowEmpty && !StringUtils.hasText(text)) {
// Treat empty String as null value.
setValue(null)
}
else {
try {
setValue(this.dateTimeFormat.parse(text))
}
catch (ParseException dtex) {
try {
setValue(this.dateFormat.parse(text))
}
catch ( ParseException dex ) {
throw new IllegalArgumentException ("Could not parse date: " + dex.getMessage() + " " + dtex.getMessage() )
}
}
}
}
/**
* Format the Date as String, using the specified DateFormat.
*/
public String getAsText() {
Date value = (Date) getValue()
return (value != null ? this.dateFormat.format(value) : "")
}
}
答案 5 :(得分:1)
Grails版本> = 2.3
localeAware 版本,用于将字符串转换为日期
在src / groovy中:
package test
import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
import org.grails.databinding.converters.ValueConverter
import org.springframework.context.MessageSource
import org.springframework.web.servlet.LocaleResolver
import javax.servlet.http.HttpServletRequest
import java.text.SimpleDateFormat
class StringToDateConverter implements ValueConverter {
MessageSource messageSource
LocaleResolver localeResolver
@Override
boolean canConvert(Object value) {
return value instanceof String
}
@Override
Object convert(Object value) {
String format = messageSource.getMessage('default.date.format', null, "dd/MM/yyyy", getLocale())
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format)
return simpleDateFormat.parse(value)
}
@Override
Class<?> getTargetType() {
return Date.class
}
protected Locale getLocale() {
def locale
def request = GrailsWebRequest.lookup()?.currentRequest
if(request instanceof HttpServletRequest) {
locale = localeResolver?.resolveLocale(request)
}
if(locale == null) {
locale = Locale.default
}
return locale
}
}
在conf / spring / resources.groovy:
beans = {
defaultDateConverter(StringToDateConverter){
messageSource = ref('messageSource')
localeResolver = ref('localeResolver')
}
}
豆子的名字&#39; defaultDateConverter&#39;非常重要(覆盖默认日期转换器)