【问题标题】:CharacterEncoding DispatcherServlet Spring Boot MVC Response jspCharacterEncoding DispatcherServlet Spring Boot MVC 响应 jsp
【发布时间】:2018-09-07 13:31:33
【问题描述】:

我正在使用 Spring Boot MVC 启动,并使用 DispatcherServlet。我知道,它有很多实现。 问题是,当一个带有 POST 的表单(选择具有不同字符如 ü、ë、è 的足球俱乐部)时,这些对控制器没有很好的响应。 我用在jsp的UTF-8,我猜到处都是(RootContext,tomcat(可能没有),jsp的字符编码设置为UTF-8。 那么问题来了,如何更改响应的字符编码?

如果您愿意或需要,我可以添加很多来源......

向jsp发送输入的控制器:

@RequestMapping(value = "zoekenclubsduels", method = RequestMethod.POST)
public ModelAndView tonenVanClub(@RequestParam("land1") String land1, @RequestParam("land2") String land2) {
    LocalDate ld = LocalDate.now();
    String contextPath = context.getContextPath();
    List<Club> clubs1 = this.clubManager.getAllByClland(land1);
    if (clubs1 == null) {
        return new ModelAndView("redirect:/clubs/zoekenlandenduels");
    }
    Collections.sort(clubs1);
    List<Club> clubs2 = this.clubManager.getAllByClland(land2);
    if (clubs2 == null) {
        return new ModelAndView("redirect:/clubs/zoekenlandenduels");
    }
    Collections.sort(clubs2);
    ModelAndView modelAndView = new ModelAndView("clubs/zoekenclubsduels");
    modelAndView.addObject("clubs1", clubs1);
    modelAndView.addObject("clubs2", clubs2);
    modelAndView.addObject("contextPath", contextPath);
    modelAndView.addObject("ld", ld);
    return modelAndView;
}

jsp:

    <%@page contentType="text/html" pageEncoding="UTF-8" session="false"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<c:set var="contextPath"
    value="${pageContext.servletContext.contextPath}" />
<!doctype html>
<html lang="nl">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Select Clubs</title>
        <link rel="stylesheet" href="<c:url value="/styles/reset.css"/>" />
        <link rel="stylesheet" href="<c:url value="/styles/default.css"/>" />
        <link rel="stylesheet" href="<c:url value="/styles/responsive.css" />" />
        <link rel="stylesheet" href="<c:url value="/styles/menu.css" />" />

        <script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
        <script type="text/javascript">window.jQuery|| document
                        .write('<script type="text/javascript" src="/EuropeanCupFootball\/scripts\/vendor\/1.7.2.jquery.min.js"><\/script>')
        </script>
        <script src="${contextPath}/scripts/vendor/jquery.slides.min.js"></script>
        <script src="${contextPath}/scripts/scriptslidejs.js"></script>
        <script src="${contextPath}/scripts/script_menu.js"></script>
        <!-- script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script-->
    </head>
    <body>
        <!-- body style="background-image: url(${contextPath}/images/page_bg.jpg)"-->
        <header>
            <c:import url="/WEB-INF/jsp/header.jsp" />
        </header>
        <br>
        <h2>Select Clubs for mutual Results</h2>
        <br> <br>
        <div class="pageczld">
            <c:if test="${not empty clubs1}">
                <form action="<c:url value='/clubs/toonuitslagenduels'/>"
                    method="post">
                    <label>Club 1 : <select required name="club1" size="15">
                            <c:forEach items="${clubs1}" var="club1">
                                <option value="${club1.clNaam}"
                                    ${club1.clNaam == param.club1.clNaam ? 'selected="selected"' : ''}>
                                    ${club1.clNaam}</option>
                            </c:forEach>
                    </select>
                    </label> <label>Club 2 : <select required name="club2" size="15">
                            <c:forEach items="${clubs2}" var="club2">
                                <option value="${club2.clNaam}"
                                    ${club2.clNaam == param.club2.clNaam ? 'selected="selected"' : ''}>
                                    ${club2.clNaam}</option>
                            </c:forEach>
                    </select>
                    </label> <input type="submit" value="OK" /> ${fout}
                </form>
            </c:if>
        </div>
        <footer>
            <c:import url="/WEB-INF/jsp/footer.jsp" />
        </footer>
        <div style="clear: both;"></div>
    </body>
</html> 

从jsp(java)接收输出的控制器:

    @RequestMapping(value = "toonuitslagenduels", method = RequestMethod.POST)
public ModelAndView toonUitslagenDuels(@RequestParam("club1") String club1string,
        @RequestParam("club2") String club2string) {
    // List<UitslagClub> uitslagclubs =
    // this.clubManager.getByClNaamUitslagclubs(clubstring);
    LocalDate ld = LocalDate.now();
    String contextPath = context.getContextPath();
    Club clubByName1 = this.clubManager.getByClNaam(club1string);
    Club club1 = this.clubManager.getOne(clubByName1.getClNr());
    if (club1 == null) {
        return new ModelAndView("redirect:/clubs/zoekenlandenduels");
    }
    Club clubByName2 = this.clubManager.getByClNaam(club2string);
    Club club2 = this.clubManager.getOne(clubByName2.getClNr());
    if (club2 == null) {
        return new ModelAndView("redirect:/clubs/zoekenlandenduels");
    }
    List<Uitslag> uitslagen = new ArrayList<Uitslag>();
    List<UitslagClub> uitslagclubs = new ArrayList<UitslagClub>();
    List<UitslagClub> uitslagclub1 = club1.getUitslagclubs();
    List<UitslagClub> uitslagclub2 = club2.getUitslagclubs();
    Iterator<UitslagClub> iter1 = uitslagclub1.iterator();
    while (iter1.hasNext()) {
        UitslagClub uc1 = (UitslagClub) iter1.next();
        Iterator<UitslagClub> iter2 = uitslagclub2.iterator();
        while (iter2.hasNext()) {
            UitslagClub uc2 = (UitslagClub) iter2.next();
            if (uc2.getUcUiNr() == uc1.getUcUiNr()) {
                Uitslag uitslag = this.uitslagManager.getUitslag(uc2.getUcUiNr());
                uitslagen.add(uitslag);
                uitslagclubs.add(uc1);
            }
        }
    }
    int awed = 0;
    int awinst = 0;
    int agelijk = 0;
    int averlies = 0;
    int dpvoor = 0;
    int dptegen = 0;
    Iterator<UitslagClub> ucIter = uitslagclubs.iterator();
    while (ucIter.hasNext()) {
        UitslagClub uc = ucIter.next();
        awed++;
        if (uc.getUcThuisOfUit().equals("t")) {
            if (uc.getUitslag().getUiThDoelpunten() > uc.getUitslag().getUiUitDoelpunten()) {
                awinst++;
                dpvoor = dpvoor + uc.getUitslag().getUiThDoelpunten();
                dptegen = dptegen + uc.getUitslag().getUiUitDoelpunten();
            }
            else if (uc.getUitslag().getUiThDoelpunten() == uc.getUitslag().getUiUitDoelpunten()) {
                agelijk++;
                dpvoor = dpvoor + uc.getUitslag().getUiThDoelpunten();
                dptegen = dptegen + uc.getUitslag().getUiUitDoelpunten();
            }
            else {
                averlies++;
                dpvoor = dpvoor + uc.getUitslag().getUiThDoelpunten();
                dptegen = dptegen + uc.getUitslag().getUiUitDoelpunten();
            }
        }
        else {
            if (uc.getUitslag().getUiThDoelpunten() < uc.getUitslag().getUiUitDoelpunten()) {
                awinst++;
                dpvoor = dpvoor + uc.getUitslag().getUiUitDoelpunten();
                dptegen = dptegen + uc.getUitslag().getUiThDoelpunten();
            }
            else if (uc.getUitslag().getUiThDoelpunten() == uc.getUitslag().getUiUitDoelpunten()) {
                agelijk++;
                dpvoor = dpvoor + uc.getUitslag().getUiThDoelpunten();
                dptegen = dptegen + uc.getUitslag().getUiUitDoelpunten();
            }
            else {
                averlies++;
                dpvoor = dpvoor + uc.getUitslag().getUiUitDoelpunten();
                dptegen = dptegen + uc.getUitslag().getUiThDoelpunten();
            }
        }
    }
    if (uitslagen.isEmpty()) {
        ModelAndView modelAndView = new ModelAndView("clubs/geenuitslagenduels", "contextPath", contextPath);
        modelAndView.addObject("ld", ld);
        modelAndView.addObject("club1", club1);
        modelAndView.addObject("club2", club2);
        return modelAndView;
    } else {
        int aantalUitslagen = uitslagen.size();
        ModelAndView modelAndView = new ModelAndView("clubs/toonuitslagenduels", "uitslagen", uitslagen);
        modelAndView.addObject("contextPath", contextPath);
        modelAndView.addObject("ld", ld);
        modelAndView.addObject("aantalUitslagen", aantalUitslagen);
        modelAndView.addObject("club1", club1);
        modelAndView.addObject("club2", club2);
        modelAndView.addObject("awed", awed);
        modelAndView.addObject("awinst", awinst);
        modelAndView.addObject("agelijk", agelijk);
        modelAndView.addObject("averlies", averlies);
        modelAndView.addObject("dpvoor", dpvoor);
        modelAndView.addObject("dptegen", dptegen);
        return modelAndView;
    }
}

【问题讨论】:

  • 这些字符是如何出现的以及出现在哪里?在控制器中?
  • 当它进入时,它就像拜仁慕尼黑,当它进入我的控制器时,它从 jsp 回到控制器,它是拜仁慕尼黑 ...
  • 这意味着它被输入为UTF-8,但在某些时候它被解释为单字节编码,很可能是ISO-8859-1或其变体。可以编辑问题并包含来自 JSP 和正在输入/接收数据的控制器的 sn-ps?
  • 添加了询问的来源,我猜...
  • 有没有人能解答一下???

标签: java jsp spring-mvc spring-boot


【解决方案1】:

您在任何地方都在使用UTF-8,然后在您的JSP 页面的&lt;head&gt; 中声明内容是ISO-8859-1

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

您还想更喜欢shorter version 所以

<meta charset="utf-8" />

【讨论】:

  • 我看到当我发布源并删除它时......但问题仍然存在。但我猜/认为元标记中的所有信息都是信息性的,所以这无关紧要。
  • @rolandl 仍然有点不清楚你在哪里看到它为Bayern München。你的意思是在控制器内部和代码中一样吗?如果是这样,您如何看待该值(毕竟您无法用肉眼“看到”控制器内部)?还是您的意思是您在 JSP 中看到了乱码?
  • 好吧,所有的俱乐部都出了问题,比方说,他们的名字中有一个特殊字符,比如 é、ö、ü 等。我在调试时看到它,并设置一个断点,当代码到达控制器时,它必须搜索这两个俱乐部之间的结果....一般来说,在我可以/必须选择一个带有特殊字符的俱乐部的每个菜单选项中都会出错...
  • 嗯,菜单选项是关于在欧洲杯(与杯赛无关)中搜索 2 个俱乐部之间的结果。首先我选择国家,然后我选择这些国家中的 2 个俱乐部(在这两个国家中,所有曾经参加过欧洲杯的俱乐部都会显示出来,并且您在一个表格中选择了 2 个不同的选项列表中的 2 个(方法=发布))。因此,在这个 (jsp) 中,拜仁慕尼黑被显示为它必须是并且在数据库中也是已知的......但是当我选择拜仁慕尼黑时......它作为 Bayern München 进入控制器。
  • 我在互联网上搜索了非常不同的选项,但找不到可能的答案或尝试了一些所谓的选项,但没有成功。我在 server.xml 中将 URIEncoding="UTF-8" 添加到 HTTP 和 AJP。以及搜索中提到的其他可能性
猜你喜欢
  • 2019-05-12
  • 2015-08-10
  • 2018-06-26
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 2014-07-11
相关资源
最近更新 更多