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

Posted

技术标签:

【中文标题】如何在 Struts 2 中提交区域感知值【英文标题】:How to submit locale-aware values in Struts 2 【发布时间】:2015-04-03 08:36:55 【问题描述】:

我希望通过 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),并且警告“参数:无效块被忽略”被写入日志。

我也试过这个:

<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 文档中的以下内容: “...类型转换是区域感知的。解决方案是再次使用上面定义的消息格式,通过使用 ActionSupport 的 getText 方法”

(见formatting-dates-and-numbers)

这表明使用 Struts 可以开箱即用地感知区域设置提交,但是如何实现呢?非常感谢任何帮助...

【问题讨论】:

您应该学习 Struts 2 基础知识,它与本地化无关,但您应该仔细阅读您发布的链接。它有代码示例,您可以自己尝试。如果你有一个具体的问题,你可以问它,但这个问题不能帮助未来的读者,因为它的当前状态是写的。 感谢您的反馈 RomanC。当然你是对的,我在这里遗漏了一些基本的东西。在发布之前,我确实尝试(很多)弄清楚该页面上的信息如何提供帮助,并且还浏览了几本书......但我没有找到有关如何以区域设置敏感的方式提交数据的信息。请您解释一下为什么它与本地化无关?用户应该能够根据他们的语言环境输入值... 本地化和 i18n 是 Struts 框架中的一个临时主题,也是开发人员多年来使用的一项简洁功能。在使用它之前,请确保所有其他部件都正常工作。该文档是为已经了解 Struts2 工作原理并且您遇到的问题与 i18n 无关的开发人员编写的。 感谢 RomanC。所有其他部分都工作正常 - 我有一个非常简单的 Struts2 示例,它带有一个表单,它只将一个值从一个文本字段提交到一个动作的(扩展 ActionSupport)Java 类型双属性。我想我需要了解的是,可以使用 i18n 将值反向格式化回双转换器预期的格式吗?或者,我是否需要自己实现反向格式化(在自定义拦截器或动作设置器中)?还是我需要实现自己的转换器?这通常是怎么做的? @RomanC - 我现在已经解决了这个问题,我的答案如下。双原语转换器似乎有一个错误,这解释了为什么即使是最简单的示例也不起作用(因此想知道是否需要使用其他一些机制,例如 i18n) 【参考方案1】:

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

“解决方案”是使用 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 类中将原始 double 更改为 Double,则提交工作正常,并且“3,4”正确写入 Double 属性(显然变为“3.4”)。

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

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

【讨论】:

以上是关于如何在 Struts 2 中提交区域感知值的主要内容,如果未能解决你的问题,请参考以下文章

如何在不提交表单的情况下使用struts2提交标签作为按钮?

在 Java 中打印/格式化具有“仅能区分”数字的区域感知浮点数

struts2 接口如何接收客户端提交的json数据

如何将 Struts 2 动作类中的 InputStream 值传递给 JSP 页面中的 Ajax 并将该值转换为 JSON 数组

如何在本页提交表单把提交的值显示在本页面上? 请高手把详细的讲解过程给我说一下。谢谢!

如何在 SqlAlchemy / Mysql 中存储时区感知日期时间值?