【问题标题】:Strings with double quotes in messages.properties are not displayed correctlymessages.properties 中带双引号的字符串无法正确显示
【发布时间】:2014-05-31 05:25:09
【问题描述】:

我正在做一个 Spring Web 应用程序。在我的messages.properties文件中,有一行字符串如下:

label.name.tooltip=The "name" field ...

我的 JSP 文件显示这个字符串如下:

<spring:message code="label.name.tooltip" />

但是,显示的文字只有“The”,这意味着“name”的部分被剪切了。

我不知道为什么会这样。谷歌搜索以及在双引号前添加反斜杠等方法不起作用。

问候和感谢!

更新

整个问题是我使用A标签的title属性中的字符串引起的,如下:

a href="#" data-toggle="tooltip" title="<spring:message code="label.name.tooltip" />

正如 Bossie 所暗示的,浏览器会删除从双引号开始的字符串内容。

Misha 做了相当多的解释,这有助于我更多地了解消息的工作原理。谢谢,米莎!!!

我在 SO 找到了一个解决方案,在我的情况下,使用“名称”而不是双引号。希望这对其他人有帮助。

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

    Spring 使用MessageSource 解析消息代码,而后者又使用MessageSourceSupport 对象。如果您的消息是应用MessageFormat 规则(定义为here)的受害者,您可以使用一些单引号来转义双引号:

    The '"'name'"' field should not be null, empty, or start with an integer.
    

    不幸的是,MessageFormat 没有说明双引号是特殊字符,所以这实际上只是在黑暗中拍摄。

    编辑:

    好的。我去试了一下。按原样加载双引号没有问题。我的messages.properties 有一行:

    test.message = "Hello, world!"
    

    我的测试是这样的:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = TestConfiguration.class)
    public class TestQuotes {
    
        @Autowired
        private MessageSource source;
    
        @Test
        public void test() {
            assertEquals(
                "\"Hello, world!\"", 
                source.getMessage("test.message", null, Locale.US));
        }
    }
    

    因此,唯一的结论是.jsp 处理器消耗了你的双引号——它绝对不是消息源相关的对象。我不知道是什么对象呈现你的.jsp,但你应该仔细看看它在解析注入值方面有什么规则(也许可以试试双双引号之类的)。

    【讨论】:

    • 嗨 Misha,非常感谢您帮助我。我试过你的单引号转义,但它不起作用。我更新了我的帖子。
    • 我做了一个简短的测试,双引号的消息解析本身似乎有效(刚刚确认这不是消息源问题)。几乎可以肯定是将字符串注入 JSP 的任何东西。
    • 或者浏览器不能正确显示字符串,因为双引号会弄乱 HTML。当您单击“查看源代码”(或浏览器中的任何等效项)时,它看起来还好吗?
    • 我没有要求它渲染到 JSP。查看this 问题,如果您希望浏览器正确呈现它们,可以替换您的双引号。
    • Misha,非常感谢您确认这不是 Spring 问题。感谢您的测试和解释。你的测试真的让我想到了别的事情。而且确实是另外一回事。
    【解决方案2】:

    在属性文件中使用 HTML 转义字符而不是双引号可能会有所帮助: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

    所以在你的情况下是这样的:

    label.name.tooltip=The &#34;name&#34; field ...
    

    【讨论】:

      【解决方案3】:

      Spring 消息提供了一种方法来转义包含双引号、换行符等的消息。
      只需将以下内容放入 HTML 文档中:

      <a href="#" title="<spring:message htmlEscape='true' code='label.myLabel'/>" />
      

      或将以下内容放入 Javascript 块中:

      <script>
          function myFunction() {
              alert("<spring:message javaScriptEscape='true' code='label.myLabel' />");
          }
      </script>
      

      这样就不必在messages.properties 文件中放置HTML 转义字符或其他内容。

      更多详情请访问this post

      【讨论】:

        【解决方案4】:

        为此,您可以使用“\” 在应用程序属性中

        files.check={hello:'\"hi\"',bello:'bye'}
        

        控制器代码:

        @Value("#{${files.check}}")
        private Map<String, String> propertyname;
        
        @GetMapping("/check")
        public void authUser() {
                System.err.println(propertyname);
        }
        

        输出:{hello="hi", bello=bye}

        【讨论】:

          猜你喜欢
          • 2014-08-03
          • 1970-01-01
          • 2017-08-21
          • 1970-01-01
          • 1970-01-01
          • 2014-02-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多