Spring MVC在包含特殊字符时将JSP截断

时间:2010-08-05 16:06:22

标签: 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 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";
    }
}

我的JSP

<%@ 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个字节。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

似乎是一个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>

由于某种原因,即使它与decorators.xml中的模式不匹配,我猜sitemesh仍在解析它。

解决方案是:

  1. 专门从其标记或
  2. 中的sitemesh中排除该文件
  3. 将sitemesh升级到2.4.1
  4. 希望这将有助于将来的人。

答案 1 :(得分:0)

当你将Spring / Spring-MVC置于上下文之外时,你是否建议这一切都有效?

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

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

如果这解决了问题,那么问题可能确实存在于Spring MVC的servlet或过滤器中。如果没有,那么问题可能在servletcontainer中更多。你在用哪一个?