如何在Struts 2中提交区域设置感知值

时间:2015-04-03 08:36:56

标签: struts2

我希望通过Struts 2文本字段输入double,但是尊重当前的语言环境。例如:对于“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),并且警告“参数:无效的块被忽略”被写入日志。

我也试过这个:

<s:textfield key="global.amount" name="%{getText('format.number',{myValue})}" />

这不起作用 - 提交不会失败,但是值没有分配给目标操作(它仍然是默认的0,0),并且警告“参数:无效的块被忽略”被写入日志。

尝试了这个:

<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})}" />

但是我们怎样才能允许提交区域设置?

我找不到任何关于此的示例/帖子。我发现的唯一提示是struts doc中的以下内容: “...类型转换是区域设置感知的。解决方案是通过使用ActionSupport的getText方法再次使用上面定义的消息格式”

(见formatting-dates-and-numbers

这表明提供语言环境的提交可以与Struts一起开箱即用,但是如何?任何帮助非常感谢...

1 个答案:

答案 0 :(得分:2)

回答我自己的问题: Struts自动处理本地化数据输入的转换,因此我不需要像我在问题中尝试那样将格式应用于textfield标记。但是,在提交非本地化数据输入时使用原始double时似乎存在一个错误...因此我的简单表单提交无效,因此我认为我必须应用格式。

&#34;解决方案&#34;是使用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>

这样,当提交&#34; 3,4&#34;的值时在德语会话语言环境中,提交失败并显示以下消息: 字段&#34; myValue&#34;。

的字段值无效

如果在Action类中将原始double更改为Double,则提交正常并且&#34; 3,4&#34;正确写入Double属性(显然变为&#34; 3.4&#34;)。

虽然排除故障我似乎记得在使用双转换器的struts中看到一些问题,但我无法再找到详细信息。

使用的Struts版本:2.3.20,浏览器Chrome。