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

Struts2 如何在Struts 2中提交区域设置感知值,struts2,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> </

我希望通过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>
但是我不能让它工作。我尝试使用以下方法输入数字:

<s:textfield key="global.amount" name="%{getFormatted('format.number','myValue')}" />
在当前区域设置中显示值很容易,可以使用:

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

但是,我们如何允许提交的值具有区域设置意识

我找不到任何与此相关的示例/线程。我在struts文档中找到的唯一提示如下: “…类型转换具有区域设置意识。解决方案是使用ActionSupport的getText方法再次使用上面定义的消息格式”

(见附件)

这表明,使用Struts可以即时提交区域设置,但是如何实现呢?非常感谢您的帮助……

回答我自己的问题: Struts自动处理本地化数据输入的转换,因此不需要像我在问题中尝试的那样对textfield标记应用格式。然而,在提交非en本地化数据输入时使用原语double时似乎存在错误。。。因此,我的简单表单提交不起作用,所以我认为我必须应用格式

“解决方案”是使用Double而不是primitive Double,尽管我不确定这是否是解决Struts中可能存在的bug的一种方法,而不是解决方案

例如,以下是我的行动:

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>

/dataSummary.jsp
/index.jsp
这样,在德语会话区域设置中提交值“3,4”时,提交失败,并显示以下消息: 字段“myValue”的字段值无效

如果在Action类中将原语double更改为double,submit工作正常,“3,4”被正确写入double属性(显然变成了“3.4”)

在进行故障排除时,我似乎记得在struts中看到了一些使用双转换器的问题,但我再也找不到详细信息了


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

您应该学习Struts 2基础知识,它与本地化无关,但您应该仔细阅读您发布的链接。它有代码示例,您可以自己尝试。如果你有一个具体的问题,你可以问它,但这个问题不能帮助未来的读者,因为它目前的状态是书面的。谢谢你的反馈。你肯定是对的,我缺少一些基本的东西。在发帖之前,我尝试了(很多)去弄清楚页面上的信息是如何起到帮助作用的,同时我也翻阅了几本书。。。但是我没有找到关于如何以地区敏感方式提交数据的信息。请你解释一下为什么这与本地化无关?用户应该能够根据自己的语言环境输入值……本地化和i18n是Struts框架中的一个附加主题,也是开发人员多年来使用的一个整洁的特性。使用前,请确保所有其他部件工作正常。本文档是为已经知道Struts2如何工作的开发人员编写的,您遇到的问题与i18n无关。感谢RomanC。所有其他部分都工作正常-我有一个非常简单的Struts2示例,其中有一个表单,它只将一个值从textfield提交给Action的(ExtendesActionSupport)Java类型double属性。我想我需要了解的是,i18n是否可以用于将值的格式反转回双转换器期望的格式?或者,我是否需要自己实现反向格式化(在自定义拦截器或动作设置器中)?或者我需要实现自己的转换器吗?这通常是怎么做到的?@RomanC-我现在已经解决了这个问题,我的答案如下。双原语转换器似乎存在一个bug,这解释了为什么即使是最简单的示例也无法工作(因此怀疑是否需要使用其他机制,例如i18n)
<s:textfield key="global.amount" value="%{getText('format.number',{myValue})}" />
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>
    <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>