Spring MVC呈现的JSP在包含特殊字符时被截断

Spring MVC呈现的JSP在包含特殊字符时被截断,jsp,tomcat,spring-mvc,jstl,sitemesh,Jsp,Tomcat,Spring Mvc,Jstl,Sitemesh,如果我将带有扩展字符的变量传递给JSP,则呈现文件的结尾会被每个非ascii字符截断2个字节。为什么会这样?这里有一个例子 我的控制器: import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class Ch

如果我将带有扩展字符的变量传递给JSP,则呈现文件的结尾会被每个非ascii字符截断2个字节。为什么会这样?这里有一个例子

我的控制器

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class CharTestController {

    @RequestMapping(value="/chartest.do")
    public String handleRequest(ModelMap model) throws Exception {
        char var1=9829;     // Heart Char
        String var2="™";    // TM symbol
        model.addAttribute("var1", var1);
        model.addAttribute("var2", var2);
        return "chartest";
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
${var1} <c:out value="${var1}" />
${var2} <c:out value="${var2}" />
9876543210
♥ ♥ ™ ™ 98
我的JSP

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class CharTestController {

    @RequestMapping(value="/chartest.do")
    public String handleRequest(ModelMap model) throws Exception {
        char var1=9829;     // Heart Char
        String var2="™";    // TM symbol
        model.addAttribute("var1", var1);
        model.addAttribute("var2", var2);
        return "chartest";
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
${var1} <c:out value="${var1}" />
${var2} <c:out value="${var2}" />
9876543210
♥ ♥ ™ ™ 98

不管我是使用变量还是只打印变量,因为我打印了4个字符,所以末尾缺少8个字节。有什么想法吗?

您是否建议将Spring/Spring MVC排除在上下文之外时,一切都会正常工作

至少,尝试在JSP文件的最底部添加以下行以确定根本原因:

<% response.getWriter().flush(); %>


如果这解决了问题,那么问题可能确实存在于SpringMVC的servlet或过滤器中。如果不是,那么问题可能更多地出现在所讨论的servletcontainer中。您使用的是哪一个?

似乎是sitemesh的问题。我使用的是2.2.1版。在我的web.xml中,我有*.do页面通过sitemesh

<filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

网站
com.opensymphony.module.sitemesh.filter.PageFilter
网站
/*
出于某种原因,即使它与decorators.xml中的模式不匹配,我猜sitemesh仍在解析它

解决办法是:

  • 在文件的标记或标记中明确地从sitemesh中排除该文件
  • 将sitemesh升级到2.4.1

  • 希望这对将来的人有所帮助。

    谢谢你的回复。将您的建议添加到末尾会产生相同的结果。我正在运行tomcat(使用SpringSource工具套件)。我对JSP/Spring/Tomcat还相当陌生,所以我不知道如何独立测试这些部分。我假设某个地方的配置使用了错误的字符集,因此字符大小或输出缓冲区大小计算不正确,我只是不知道要检查哪些地方。我无法在Tomcat 6.0.24上的“普通”JSP/Servlet中重现您的问题。我在重写响应和sitemesh 2.4.2的自定义筛选器中遇到了类似的问题:(我猜sitemesh没有正确设置contentLength。将我的筛选器放在sitemesh one之后解决了这个问题,以防这对任何人都有用。我会在有时间时查看sitemesh代码。实际上,解决方法是不在我的筛选器中设置contentLength。