2015-04-03 47 views
3

我希望通过Struts 2文本字段输入double,但是要尊重当前语言环境。例如:对于“en”,它将被输入为“3.4”(使用一个点),在“de”中它将被输入为“3,4”(使用逗号)。如何在Struts 2中提交语言环境感知值

<s:url id="localeDE" namespace="/" action="locale" > 
<s:param name="request_locale" >de</s:param> 
</s:url> 

和数字格式“format.number”在连接定义和去属性文件

format.number ={0,number,#0.0##} 

在我的应用程序,该区域通过request_locale参数如设置

但我无法让它工作。我使用下面的输入数字尝试:

<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 [email protected] [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})}" /> 

但是我们怎样才能让的值提交 locale-aware?

我找不到任何关于此的示例/线程。我发现的唯一提示是struts doc中的以下内容: “... type conversion is locale aware。解决方法是再次使用上面定义的消息格式,通过使用getText ActionSupport方法”

(请参阅formatting-dates-and-numbers

这表明区域设置感知的提交对Struts来说可能是开箱即用的,但是如何实现?任何帮助非常感谢...

+0

您应该学习Struts 2的基础知识,它与本地化没有任何关系,但您应仔细阅读您发布的链接。它有代码示例,您可以自行尝试。如果你有一个具体的问题,你可以问这个问题,但这个问题不能帮助未来的读者,因为在它现在的状态下是写的。 – 2015-04-03 08:50:04

+0

感谢您的反馈RomanC。当然你是对的,我在这里错过了一些基本的东西。在发布之前,我曾尝试(很多)来弄清楚该页面上的信息如何提供帮助,同时也搜遍了几本书......但是我没有发现如何以区域敏感的方式提交数据。请你能解释为什么它不与本地化有关吗?用户应该能够根据其语言环境输入值... – Okuti 2015-04-03 08:59:37

+0

本地化和i18n是Struts框架中的一个addhoc主题,也是开发人员使用多年的整洁功能。在使用之前,确保所有其他部件都正常工作。这些文档是为已经知道Struts2是如何工作的开发人员编写的,而且您遇到的问题与i18n无关。 – 2015-04-03 09:14:34

回答

2

要回答我自己的问题: Struts自动处理本地化数据输入的转换,所以没有必要将格式应用于textfield标记,因为我在我的问题中尝试过。但是,在提交非本地化数据输入时使用原始双精度似乎存在一个错误...因此,我的简单表单提交不起作用,所以我想我必须应用格式化。

“解决方案”是使用Double而不是原始double,尽管我不确定这是更多解决Struts中可能的错误而不是解决方案的解决方法。

例如,这里是我的行动:

public class FinanceData extends ActionSupport { 

    private double myValue; 

    @Override 
    public String execute() { 
     return "SUCCESS"; 
    } 

    // getter and setter 
} 

这里是我的支柱构成:

<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”时,提交失败并显示以下消息: Inval字段“myValue”的id字段值。

如果原始double在Action类中更改为Double,则提交工作正常,“3,4”正确写入Double属性(显然变成“3.4”)。

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

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