如何在 Struts 2 中提交区域感知值
How to submit locale-aware values in Struts 2
我希望通过 Struts 2 文本字段输入双精度值,但要尊重当前的语言环境。示例:对于 "en" 它将输入为“3.4”(使用点),在 "de" 中将输入为“3,4”(使用逗号)。
在我的应用程序中,语言环境是通过 request_locale 参数设置的,例如:
<s:url id="localeDE" namespace="/" action="locale" >
<s:param name="request_locale" >de</s:param>
</s:url>
并且数字格式 "format.number" 在 en 和 de 属性文件中定义为
format.number ={0,number,#0.0##}
但我无法让它工作。我试过使用以下方法输入号码:
<s:textfield key="global.amount" name="%{getFormatted('format.number','myValue')}" />
这不起作用 - 提交没有失败,但值未分配给目标操作(它仍然是默认值 0,0),并且警告 "Parameters: Invalid chunk ignored" 被写入日志。
我也试过这个:
<s:textfield key="global.amount" name="%{getText('format.number',{myValue})}" />
这不起作用 - 提交没有失败,但值未分配给目标操作(它仍然是默认值 0,0),并且警告 "Parameters: Invalid chunk ignored" 被写入日志。
并尝试了这个:
<s:textfield key="global.amount" name="myValue" />
提交失败,重新显示输入页面,向浏览器写入如下内容(当然是因为期望的是3.4,不是3,4):
Invalid field value for field "myValue"
The following is written to the logs:
Apr 03, 2015 9:58:18 AM com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
Avertissement: Error setting expression 'myValue' with value '[Ljava.lang.String;@8a9396'
ognl.MethodFailedException: Method "setMyValue" failed for object com.planet.user.action.FinanceData@326ce2 [java.lang.NoSuchMethodException: com.planet.user.action.FinanceData.setMyValue([Ljava.lang.String;)]
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1285)
at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1474)
显示当前语言环境中的值很容易,使用:
<s:textfield key="global.amount" value="%{getText('format.number',{myValue})}" />
但是我们如何才能允许值被提交区域感知?
我找不到任何关于此的 example/thread。我发现的唯一提示是 struts 文档中的以下内容:
“...类型转换是区域设置感知的。解决方案是再次使用上面定义的消息格式,通过使用 ActionSupport 的 getText 方法
(参见 formatting-dates-and-numbers)
这表明使用 Struts 可以开箱即用地进行区域设置感知提交,但是如何呢?非常感谢任何帮助...
回答我自己的问题:
Struts 自动处理本地化数据输入的转换,因此无需像我在问题中尝试的那样对文本字段标记应用格式。但是,在提交非 en 本地化数据输入时使用 primitive double 时似乎存在错误......因此我的简单表单提交不起作用,所以我认为我必须应用格式。
"solution" 是使用 Double 而不是原始 double,尽管我不确定这是否更多是针对 Struts 中可能存在的错误的解决方法而不是解决方案。
例如,这是我的操作:
public class FinanceData extends ActionSupport {
private double myValue;
@Override
public String execute() {
return "SUCCESS";
}
// getter and setter
}
这是我的 struts 表格:
<s:form action="saveData" namespace="/user">
<s:textfield key="global.amount" name="myValue"/>
<s:submit/>
</s:form>
这是我的 struts.xml:
<struts>
<constant name="struts.custom.i18n.resources" value="global" />
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="saveData" class="com.planet.user.action.FinanceData">
<result name="SUCCESS">/dataSummary.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
</struts>
因此,在德语会话区域设置中提交值“3,4”时,提交失败并显示消息:
字段 "myValue".
的字段值无效
如果在 Action class 中将原始 double 更改为 Double,提交工作正常并且“3,4”正确写入 Double 属性(显然变为“3.4” ).
在进行故障排除时,我似乎记得在 struts 中看到了双转换器的一些问题,但我找不到更多细节了。
Struts 使用的版本:2.3.20,浏览器 Chrome.
我希望通过 Struts 2 文本字段输入双精度值,但要尊重当前的语言环境。示例:对于 "en" 它将输入为“3.4”(使用点),在 "de" 中将输入为“3,4”(使用逗号)。
在我的应用程序中,语言环境是通过 request_locale 参数设置的,例如:
<s:url id="localeDE" namespace="/" action="locale" >
<s:param name="request_locale" >de</s:param>
</s:url>
并且数字格式 "format.number" 在 en 和 de 属性文件中定义为
format.number ={0,number,#0.0##}
但我无法让它工作。我试过使用以下方法输入号码:
<s:textfield key="global.amount" name="%{getFormatted('format.number','myValue')}" />
这不起作用 - 提交没有失败,但值未分配给目标操作(它仍然是默认值 0,0),并且警告 "Parameters: Invalid chunk ignored" 被写入日志。
我也试过这个:
<s:textfield key="global.amount" name="%{getText('format.number',{myValue})}" />
这不起作用 - 提交没有失败,但值未分配给目标操作(它仍然是默认值 0,0),并且警告 "Parameters: Invalid chunk ignored" 被写入日志。
并尝试了这个:
<s:textfield key="global.amount" name="myValue" />
提交失败,重新显示输入页面,向浏览器写入如下内容(当然是因为期望的是3.4,不是3,4):
Invalid field value for field "myValue"
The following is written to the logs:
Apr 03, 2015 9:58:18 AM com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
Avertissement: Error setting expression 'myValue' with value '[Ljava.lang.String;@8a9396'
ognl.MethodFailedException: Method "setMyValue" failed for object com.planet.user.action.FinanceData@326ce2 [java.lang.NoSuchMethodException: com.planet.user.action.FinanceData.setMyValue([Ljava.lang.String;)]
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1285)
at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1474)
显示当前语言环境中的值很容易,使用:
<s:textfield key="global.amount" value="%{getText('format.number',{myValue})}" />
但是我们如何才能允许值被提交区域感知?
我找不到任何关于此的 example/thread。我发现的唯一提示是 struts 文档中的以下内容: “...类型转换是区域设置感知的。解决方案是再次使用上面定义的消息格式,通过使用 ActionSupport 的 getText 方法
(参见 formatting-dates-and-numbers)
这表明使用 Struts 可以开箱即用地进行区域设置感知提交,但是如何呢?非常感谢任何帮助...
回答我自己的问题: Struts 自动处理本地化数据输入的转换,因此无需像我在问题中尝试的那样对文本字段标记应用格式。但是,在提交非 en 本地化数据输入时使用 primitive double 时似乎存在错误......因此我的简单表单提交不起作用,所以我认为我必须应用格式。
"solution" 是使用 Double 而不是原始 double,尽管我不确定这是否更多是针对 Struts 中可能存在的错误的解决方法而不是解决方案。
例如,这是我的操作:
public class FinanceData extends ActionSupport {
private double myValue;
@Override
public String execute() {
return "SUCCESS";
}
// getter and setter
}
这是我的 struts 表格:
<s:form action="saveData" namespace="/user">
<s:textfield key="global.amount" name="myValue"/>
<s:submit/>
</s:form>
这是我的 struts.xml:
<struts>
<constant name="struts.custom.i18n.resources" value="global" />
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="saveData" class="com.planet.user.action.FinanceData">
<result name="SUCCESS">/dataSummary.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
</struts>
因此,在德语会话区域设置中提交值“3,4”时,提交失败并显示消息: 字段 "myValue".
的字段值无效如果在 Action class 中将原始 double 更改为 Double,提交工作正常并且“3,4”正确写入 Double 属性(显然变为“3.4” ).
在进行故障排除时,我似乎记得在 struts 中看到了双转换器的一些问题,但我找不到更多细节了。
Struts 使用的版本:2.3.20,浏览器 Chrome.