Spring Roo的强大之处在于它处理困难的东西。
问题:如果有一个很好的最佳实践和实施方法,告诉每个用户,他住在这个星球上的哪个地方,当地时间的日期。
问题: 当用户输入日期并转到"列出所有访问时#34;如果他/她与OpenShift服务器位于不同的时区,他/她将看到完全不同的日期。例如我在GMT + 1(西欧)时区。
我的情况:
要求:
重现:
当你在与Openshift服务器不同的时区时,你会得到类似上面的内容
答案 0 :(得分:0)
考虑到这个问题,我认为我有一个干净的解决方案来实现Timezone支持,而不会影响当前的项目。
我的出发点是解决方案应向后兼容,不应破坏当前项目。此外,变化应该尽可能少。
我测试了它并且它也有效,当我的网络应用程序在Openshift上运行时,它在TimeZone GMT-5:00和我住在西欧,GMT +1:00
请告诉我你的意见。
我将描述 show.jspx 视图的解决方案/提案。但同样,它也可以为其他视图实现。
更改的本质是我将timeZone添加到 WEB-INF / tags / form / fields / column.tagx / display.jspx 中的fmt:formatDate ..语句:
旧:
<fmt:formatDate value="${object[field]}" pattern="${fn:escapeXml(dateTimePattern)}" />
新:
<fmt:timeZone value="${timeZone}">
<fmt:formatDate value="${object[field]}" pattern="${fn:escapeXml(dateTimePattern)}" timeZone="${timeZone}" />
</fmt:timeZone>
为此,我还在未使用时添加了声明和默认的timeZone设置。
<jsp:root xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:fmt="http://java.sun.com/jsp/jstl/fmt" xmlns:spring="http://www.springframework.org/tags" xmlns:form="http://www.springframework.org/tags/form" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:output omit-xml-declaration="yes" />
<jsp:directive.attribute name="id" type="java.lang.String" required="true" rtexprvalue="true" description="The identifier for this tag (do not change!)" />
<jsp:directive.attribute name="object" type="java.lang.Object" required="true" rtexprvalue="true" description="The form backing object" />
<jsp:directive.attribute name="field" type="java.lang.String" required="true" rtexprvalue="true" description="The field name" />
<jsp:directive.attribute name="label" type="java.lang.String" required="false" rtexprvalue="true" description="The label used for this field, will default to a message bundle if not supplied" />
<jsp:directive.attribute name="date" type="java.lang.Boolean" required="false" rtexprvalue="true" description="Indicate that this field is of type java.util.Date" />
<jsp:directive.attribute name="calendar" type="java.lang.Boolean" required="false" rtexprvalue="true" description="Indicate that this field is of type java.util.Calendar" />
<jsp:directive.attribute name="dateTimePattern" type="java.lang.String" required="false" rtexprvalue="true" description="The date / time pattern to use if the field is a date or calendar type" />
========== Added declaration
<jsp:directive.attribute name="timeZone" type="java.lang.String" required="false" rtexprvalue="true" description="The timezone to use if the field is a date or calendar type" />
========== End
<jsp:directive.attribute name="render" type="java.lang.Boolean" required="false" rtexprvalue="true" description="Indicate if the contents of this tag and all enclosed tags should be rendered (default 'true')" />
<jsp:directive.attribute name="z" type="java.lang.String" required="false" description="Used for checking if element has been modified (to recalculate simply provide empty string value)" />
<c:if test="${empty render or render}">
<c:if test="${not empty object and empty label}">
<spring:message code="label_${fn:toLowerCase(fn:substringAfter(id,'_'))}" var="label" htmlEscape="false" />
</c:if>
<c:if test="${empty dateTimePattern}">
<c:set value="MM/dd/yyyy" var="dateTimePattern" />
</c:if>
========== Added default setting. Taking the timezone of the server!
<c:if test="${empty timeZone}">
<jsp:scriptlet>
jspContext.setAttribute("timeZone", java.util.TimeZone.getDefault().getID());
</jsp:scriptlet>
</c:if>
========== End
<div id="_${fn:escapeXml(id)}_id">
<label for="_${fn:escapeXml(field)}_id">
<c:out value="${label}" />
:
</label>
<div class="box" id="_${fn:escapeXml(id)}_${fn:escapeXml(field)}_id">
<c:choose>
<c:when test="${date}">
<spring:escapeBody>
========== Changed: added timeZone support for Date
<fmt:timeZone value="${timeZone}">
<fmt:formatDate value="${object[field]}" pattern="${fn:escapeXml(dateTimePattern)}" timeZone="${timeZone}" />
</fmt:timeZone>
========== End
</spring:escapeBody>
</c:when>
<c:when test="${calendar}">
<spring:escapeBody>
========== Changed: added timeZone support for Calendar
<fmt:timeZone value="${timeZone}">
<fmt:formatDate value="${object[field].time}" pattern="${fn:escapeXml(dateTimePattern)}" timeZone="${timeZone}" />
</fmt:timeZone>
========== End
</spring:escapeBody>
</c:when>
<c:otherwise>
<spring:eval expression="object[field]" />
</c:otherwise>
</c:choose>
</div>
</div>
<br />
</c:if>
</jsp:root>
添加/更改这几行时,所有旧代码都将继续有效。 您还必须将这些更改也应用于 WEB-INF / tags / form / fields / column.tagx 文件。
我使用gvNIX JQuery也应该应用相同的更改。
这是你必须做的所有改变!!!!
在所有show.jspx文件中添加时区支持: 1)为任何日期添加额外的时区选项。
旧:
<field:display date="true" dateTimePattern="${fileUpload_uploaddate_date_format}" field="uploadDate" id="s_com_myproject_onlineviewer_domain_FileUpload_uploadDate" object="${fileupload}" z="user-managed"/>
新:
<field:display date="true" dateTimePattern="${fileUpload_uploaddate_date_format}" field="uploadDate" id="s_com_myproject_onlineviewer_domain_FileUpload_uploadDate" object="${fileupload}" timeZone="${fileUpload_uploaddate_date_timezone}" z="user-managed"/>
2)在你的控制器中指定你的时区,如:
uiModel.addAttribute("fileUpload_uploaddate_date_timezone", "Europe/Amsterdam");
本着Spring Roo的数据格式 addDateTimeFormatPatterns(uiModel); 我添加了 addTimeZone(uiModel); 。
在此方法中,您可以指定时区的来源。 在我的Web应用程序中,我要求用户在reigster时指定他/她的时区。所有其他解决方法都失败了。
void addTimeZone(Model uiModel) {
uiModel.addAttribute("fileUpload_uploaddate_date_timezone", UserUtils.geTimeZone());
}
BTW,AspectJ控制器中的 addTimeZone 默认方法可以如下面的示例所示,让程序员能够推入并更改它。
void FileUploadController.addTimeZone(Model uiModel) {
uiModel.addAttribute("fileUpload_uploaddate_date_timezone", TimeZone.getDefault().getID());
}