Spring结合Tomcat解决Jsp乱码问题

Spring Boot应用从Tomcat迁移至东方通TongWeb的完整实践指南 在Java企业级应用开发中,Servlet容器作为Web应用运行的核心环境,负责处理HTTP请求、管理Servlet生命周期及会话。其工作原理是通过实现Java EE Servlet规范,为应用提供网络通信、并发处理和安全等基础服务。从技术价值看,选择合适的Servlet容器能显著提升应用性能、可靠性与可维护性。随着信创国产化趋势加强,将Spring Boot默认的Tomcat替换为国产中间件如东方通TongWeb,成为金融、政务等关键领域满足自主可控要求的常见应用场景。这一迁移过程涉及依赖管理、打包方式、 阅读详情

Spring结合Tomcat解决Jsp乱码问题

前置知识:使用SpringMVC来解析资源

分析Tomcat的 url 匹配优先级

private final void internalMapWrapper(ContextVersion contextVersion,
                                      CharChunk path,
                                      MappingData mappingData) throws IOException {

    int pathOffset = path.getOffset();
    int pathEnd = path.getEnd();
    boolean noServletPath = false;

    int length = contextVersion.path.length();
    if (length == (pathEnd - pathOffset)) {
        noServletPath = true;
    }
    int servletPath = pathOffset + length;
    path.setOffset(servletPath);

    // Rule 1 -- Exact Match
    MappedWrapper[] exactWrappers = contextVersion.exactWrappers;
    internalMapExactWrapper(exactWrappers, path, mappingData);

    // Rule 2 -- Prefix Match
    boolean checkJspWelcomeFiles = false;
    MappedWrapper[] wildcardWrappers = contextVersion.wildcardWrappers;
    if (mappingData.wrapper == null) {
        internalMapWildcardWrapper(wildcardWrappers, contextVersion.nesting,
                                   path, mappingData);
        if (mappingData.wrapper != null && mappingData.jspWildCard) {
            char[] buf = path.getBuffer();
            if (buf[pathEnd - 1] == '/') {
                /*
                 * Path ending in '/' was mapped to JSP servlet based on
                 * wildcard match (e.g., as specified in url-pattern of a
                 * jsp-property-group.
                 * Force the context's welcome files, which are interpreted
                 * as JSP files (since they match the url-pattern), to be
                 * considered. See Bugzilla 27664.
                 */
                mappingData.wrapper = null;
                checkJspWelcomeFiles = true;
            } else {
                // See Bugzilla 27704
                mappingData.wrapperPath.setChars(buf, path.getStart(),
                                                 path.getLength());
                mappingData.pathInfo.recycle();
            }
        }
    }

    if(mappingData.wrapper == null && noServletPath &&
            contextVersion.object.getMapperContextRootRedirectEnabled()) {
        // The path is empty, redirect to "/"
        path.append('/');
        pathEnd = path.getEnd();
        mappingData.redirectPath.setChars
            (path.getBuffer(), pathOffset, pathEnd - pathOffset);
        path.setEnd(pathEnd - 1);
        return;
    }

    // Rule 3 -- Extension Match
    MappedWrapper[] extensionWrappers = contextVersion.extensionWrappers;
    if (mappingData.wrapper == null && !checkJspWelcomeFiles) {
        internalMapExtensionWrapper(extensionWrappers, path, mappingData,
                true);
    }

    // Rule 4 -- Welcome resources processing for servlets
    if (mappingData.wrapper == null) {
        boolean checkWelcomeFiles = checkJspWelcomeFiles;
        if (!checkWelcomeFiles) {
            char[] buf = path.getBuffer();
            checkWelcomeFiles = (buf[pathEnd - 1] == '/');
        }
        if (checkWelcomeFiles) {
            for (int i = 0; (i < contextVersion.welcomeResources.length)
                     && (mappingData.wrapper == null); i++) {
                path.setOffset(pathOffset);
                path.setEnd(pathEnd);
                path.append(contextVersion.welcomeResources[i], 0,
                        contextVersion.welcomeResources[i].length());
                path.setOffset(servletPath);

                // Rule 4a -- Welcome resources processing for exact macth
                internalMapExactWrapper(exactWrappers, path, mappingData);

                // Rule 4b -- Welcome resources processing for prefix match
                if (mappingData.wrapper == null) {
                    internalMapWildcardWrapper
                        (wildcardWrappers, contextVersion.nesting,
                         path, mappingData);
                }

                // Rule 4c -- Welcome resources processing
                //            for physical folder
                if (mappingData.wrapper == null
                    && contextVersion.resources != null) {
                    String pathStr = path.toString();
                    WebResource file =
                            contextVersion.resources.getResource(pathStr);
                    if (file != null && file.isFile()) {
                        internalMapExtensionWrapper(extensionWrappers, path,
                                                    mappingData, true);
                        if (mappingData.wrapper == null
                            && contextVersion.defaultWrapper != null) {
                            mappingData.wrapper =
                                contextVersion.defaultWrapper.object;
                            mappingData.requestPath.setChars
                                (path.getBuffer(), path.getStart(),
                                 path.getLength());
                            mappingData.wrapperPath.setChars
                                (path.getBuffer(), path.getStart(),
                                 path.getLength());
                            mappingData.requestPath.setString(pathStr);
                            mappingData.wrapperPath.setString(pathStr);
                        }
                    }
                }
            }

            path.setOffset(servletPath);
            path.setEnd(pathEnd);
        }

    }

    /* welcome file processing - take 2
     * Now that we have looked for welcome files with a physical
     * backing, now look for an extension mapping listed
     * but may not have a physical backing to it. This is for
     * the case of index.jsf, index.do, etc.
     * A watered down version of rule 4
     */
    if (mappingData.wrapper == null) {
        boolean checkWelcomeFiles = checkJspWelcomeFiles;
        if (!checkWelcomeFiles) {
            char[] buf = path.getBuffer();
            checkWelcomeFiles = (buf[pathEnd - 1] == '/');
        }
        if (checkWelcomeFiles) {
            for (int i = 0; (i < contextVersion.welcomeResources.length)
                     && (mappingData.wrapper == null); i++) {
                path.setOffset(pathOffset);
                path.setEnd(pathEnd);
                path.append(contextVersion.welcomeResources[i], 0,
                            contextVersion.welcomeResources[i].length());
                path.setOffset(servletPath);
                internalMapExtensionWrapper(extensionWrappers, path,
                                            mappingData, false);
            }

            path.setOffset(servletPath);
            path.setEnd(pathEnd);
        }
    }


    // Rule 7 -- Default servlet
    if (mappingData.wrapper == null && !checkJspWelcomeFiles) {
        if (contextVersion.defaultWrapper != null) {
            mappingData.wrapper = contextVersion.defaultWrapper.object;
            mappingData.requestPath.setChars
                (path.getBuffer(), path.getStart(), path.getLength());
            mappingData.wrapperPath.setChars
                (path.getBuffer(), path.getStart(), path.getLength());
            mappingData.matchType = MappingMatch.DEFAULT;
        }
        // Redirection to a folder
        char[] buf = path.getBuffer();
        if (contextVersion.resources != null && buf[pathEnd -1 ] != '/') {
            String pathStr = path.toString();
            // Note: Check redirect first to save unnecessary getResource()
            //       call. See BZ 62968.
            if (contextVersion.object.getMapperDirectoryRedirectEnabled()) {
                WebResource file;
                // Handle context root
                if (pathStr.length() == 0) {
                    file = contextVersion.resources.getResource("/");
                } else {
                    file = contextVersion.resources.getResource(pathStr);
                }
                if (file != null && file.isDirectory()) {
                    // Note: this mutates the path: do not do any processing
                    // after this (since we set the redirectPath, there
                    // shouldn't be any)
                    path.setOffset(pathOffset);
                    path.append('/');
                    mappingData.redirectPath.setChars
                        (path.getBuffer(), path.getStart(), path.getLength());
                } else {
                    mappingData.requestPath.setString(pathStr);
                    mappingData.wrapperPath.setString(pathStr);
                }
            } else {
                mappingData.requestPath.setString(pathStr);
                mappingData.wrapperPath.setString(pathStr);
            }
        }
    }

    path.setOffset(pathOffset);
    path.setEnd(pathEnd);
}

结论:

  1. Rule 1 – Exact Match:精确匹配
  2. Rule 2 – Prefix Match:前缀匹配
  3. Rule 3 – Extension Match:后缀匹配
  4. Rule 4 – Welcome resources processing for servlets:欢迎页
  5. Rule 7 – Default servlet:默认/匹配

所以Spring结合Tomcat也可以玩转jsp,只需要配置DispatcherServlet 的路径映射为/

// 添加 DispatcherServlet
DispatcherServlet dispatcherServlet = new DispatcherServlet(ctx);
dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
ServletRegistration.Dynamic springmvc = servletContext.addServlet("springmvc", dispatcherServlet);
// 给 DispatcherServlet 添加路径映射
springmvc.addMapping("/");
// 给 DispatcherServlet 添加启动时机
springmvc.setLoadOnStartup(1);

这样就先匹配到 jsp 处理的 servlet:JspServlet来进行视图渲染

如果匹配的DispatcherServlet 的路径映射为/*,那么会导致

RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath);

获取的 StandardWrapper 中的 Servlet 还是 DispatcherServlet 导致死循环,最终导致请求没有办法交给JspServlet 来渲染

SSM+JSP二手交易平台全解析:从部署到核心逻辑 在Web开发学习路径中,SSM(Spring+SpringMVC+MyBatis)作为经典后端框架组合,配合JSP视图技术,构成了大量教学项目与毕业设计的核心架构。该组合通过清晰的分层设计——Spring管理对象与事务、SpringMVC处理请求分发、MyBatis封装数据库操作、JSP直接渲染数据,完整展示了控制层、业务层、持久层的协作链路。这种轻量级技术栈尤其适合业务模型贴近真实场景的二手交易平台,覆盖用户注册登录、商品发布、图片上传、订单流转及后台管理等功能,既是理解Web工程实践的理想样本,也便于部 阅读详情

相关推荐

Tomcat环境下JSP中文乱码问题的解决

Tomcat环境下JSP中文乱码问题的解决

tomcat 下jsp乱码的原因分析

tomcat 下jsp乱码的原因分析。从jsp文件的编码、浏览器中页面的编码、以及tomcat本身对数据处理方式等各个方面一一阐述了乱码产生的原因以及解决乱码的基本的方法

jgwei的专栏 1万+

嵌入式开发必备:aarch64-linux-gnu-gcc交叉编译工具链保姆级安装指南(含常见错误解决)

本文详细介绍了aarch64-linux-gnu-gcc交叉编译工具链的安装与配置方法,涵盖从系统软件源安装到Linaro二进制包部署的全流程。针对嵌入式开发中常见的依赖错误、版本冲突等问题提供实用解决方案,并分享性能优化技巧与项目集成经验,帮助开发者高效完成ARM64设备的跨平台开发。

yoga7的博客 1028

Tomcat,jsp中文乱码问题解决

Tomcat, jsp中文乱码问题1,文件格式编码不对:1,eclipse设置项目工程设置为utf-8格式右键jsp文件 点击 properties2,IDEA设置中设置编码格式:2,Web.xml文件中:3,spring-mvc.xml文件中3,数据库配置文件中:4,jsp文件中:5,Controller层java文件中:6,数据库创建设置中:7,tomcat设置9,servlet转发jsp页面乱码1,在sevlet类doGet方法下加上2,删除 1,文件格式编码不对: 1,eclipse设置 项目工

城南秋夜的博客 5436

汽车工程师必看:从CAN到Ethernet,6种车载通信协议全解析(附应用场景对比)

本文全面解析了从CAN到Ethernet的6种车载通信协议,包括CAN、LIN、MOST、FlexRay等,并对比了它们的应用场景和技术特点。文章详细介绍了各协议的演进历程、技术优势及在现代汽车中的混合网络架构设计,为汽车工程师提供了实用的协议选型指南和未来通信技术发展趋势。

weixin_28683689的博客 488

Echarts之风力风速玫瑰图

风力风速玫瑰图前言改进之路代码如下总结导出与导入 前言 今天上班收到任务,我们老大让我研究一下这个“风速风向玫瑰图”,还说这个是百度的雷达图的变异体,于是乎我直接找的雷达图,但是雷达图没有这种柱形的,都是点线,然后我又找了好久,最后突然在echarts官网上面看到了图1-2,才终于有了思路,原来这个图不是雷达图的变异体,而是极坐标系下的堆叠柱状图,于是就开始我的“改进”之路了。 图1-1 改进之路...

qq_38776605的博客 1万+

Tomcat 中 jsp 中文乱码显示处理解决方案

JSP 中文乱码处理解决方案 初学JSP,尤其是Tomcat环境,经常会因为中文汉字字符集设置问题导致中文乱码,本文就这一问题提出解决方案,解决中文乱码问题,供各位参考,我采用的方案是统一字符集至UTF-8,同时避免GB2312所带来的中文字符集不够用的隐患,需注意的地方有三点,默认情况下是英文字符集。1、Tomcat 的 server.xml 文件,设置服务器端口工作方式2、Servlet 和 ...

NULL BLOG 2万+

从混乱到清晰:用QJsonObject重构你的Qt网络API数据解析层(避坑指南)

本文详细介绍了如何使用QJsonObject重构Qt网络API数据解析层,避免常见的JSON解析陷阱。通过安全解析模式、数据绑定和性能优化技巧,帮助开发者构建高效、健壮的解析逻辑,提升代码可维护性和可读性。特别适用于处理复杂嵌套的JSON响应数据场景。

weixin_29011667的博客 229

Tomcat部署jsp,出现乱码问题

一、Java中文问题的由来  Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。  首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编

shanzhizi的专栏 1万+

5个企业级SOC平台横向对比:IBM QRadar vs Splunk vs 奇安信NGSOC

本文深度对比了IBM QRadar、Splunk和奇安信NGSOC等五大企业级SOC平台的核心能力,从架构设计、威胁检测、运营效率、成本模型和行业适配度五个维度进行解析。文章特别强调安全运营中心(SOC)在现代企业中的关键作用,并提供了实战数据和优化建议,帮助企业选择最适合自身需求的SOC解决方案。

a1b2c的博客 660

【QT开发教程】如何在Qt中使用Protobuf进行高效数据序列化

Protocol Buffers(Protobuf)是Google开发的一种语言中立、平台中立、可扩展的序列化机制,常用于数据交换和存储。Qt作为一个跨平台的C++图形用户界面应用框架,可以与Protobuf结合使用,实现高效的数据序列化和反序列化。本文将介绍如何在Qt中集成和使用Protobuf,包括基本概念、安装步骤、使用示例以及实际应用。

科技改变人类,技术成就未来 1438

Tomcat JSP Web 开发中的乱码问题小结

1. 静态页面的乱码问题      文件的编码和浏览器要显示的编码不一致。      1)  检查文件原始的编码,  可以用记事本打开,  然后选择另存为来看;      2)  给当前页面加入一个指令来建议浏览器用指定的编码来显示文件字符内容.           3)  如果系统是英文 XP,没装东亚字符集支持,  也会显示乱码.  2. JSP 页

刘育文 430

连续相位调制通信调制方法的载波同步和定时同步研究及MATLAB仿真

本文将探讨CPM调制方法中的载波同步和定时同步问题,并提供MATLAB仿真源代码。本文讨论了连续相位调制通信中的载波同步和定时同步问题,并提供了相应的MATLAB仿真源代码。通过适当的载波同步和定时同步方法,可以实现对CPM信号的准确解调。希望本文对您理解连续相位调制通信调制方法的载波同步和定时同步问题有所帮助,同时也为您提供了一些MATLAB仿真实现的思路和示例代码。在CPM系统中,载波同步的主要任务是估计接收信号的载波频率偏移和相位偏移。在CPM系统中,常用的定时同步方法是基于自相关函数的峰值检测。

2301_79331230的博客 692

IDEA使用Tomcat服务器出现乱码问题排查和解决

做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!最近刚使用IDEA,在开发一个功能的时候,开始使用Jetty作为容器进行web项目开发,测试通过。...

阿飞云漫步 123

【YOLOv11】006、YOLOv11数据增强策略:Mosaic、MixUp等增强技术原理解析

摘要:YOLOv11在产线缺陷检测中遇到小尺寸瑕疵漏检问题,暴露了训练数据过于"干净"的缺陷。数据增强的核心是提升模型泛化能力,而非简单扩充数据。Mosaic增强通过多图拼接迫使模型处理多尺度目标,需注意边界框裁剪细节;MixUp通过线性插值使决策边界更平滑,但需避免类别冲突。自适应增强策略应随训练进度动态调整强度。实际应用中,需针对小目标、类别不平衡等场景调整增强参数,并确保验证与推理流程一致。数据增强应针对性解决具体问题,而非盲目尝试组合。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 363

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spring with Tomcat 中文编码问题的解决方案

由于各种原因,Java 应用中有关中文编码的问题总是层出不穷,即使是在 i18n 发展已久的今日,为了能够在 Java 应用中良好地使用中文,程序员们仍然要花费许多额外的力气来调试、设置以解决有关中文编码的问题。针对在 Tomcat 服务器上运行的 Spring 应用,我总结了一些相关的经验,希望能帮助其他人在处理该问题时能少走一些弯路。以下条目纯属个人在开发中摸索出来的经验,并不一定适用于所有情

I SEE STARS 2571

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

总结彻底解决Spring MVC+Mybatis中文乱码问题

Java对于新手最容易出现的问题就是中文乱码的问题。今天我就来总结一下彻底解决Spring mvc+Mybatis中文乱码的方案。 首先要看打一断点看一下Controller接收到参数值是否正常。如果不正常多半是因为Spring或者页面编码的设置问题。 一、Spring或页面编码问题 在JSP页面第一行加上下面代码: page language="java" im

爱越野的程序源 2万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java中文乱码破碎重组_总结彻底解决Spring MVC+Mybatis中文乱码问题

Java对于新手最容易出现的问题就是中文乱码的问题。今天我就来总结一下彻底解决Spring mvc+Mybatis中文乱码的方案。首先要看打一断点看一下Controller接收到参数值是否正常。如果不正常多半是因为Spring或者页面编码的设置问题。一、Spring或页面编码问题在JSP页面第一行加上下面代码:因为Springmvc采用默认的编码(ISO-8859-1)进行解析参数, 这时就会出现...

weixin_36215736的博客 240

Spring MVC与Veclocity结合中文问题及常用中文问题总结

文章出自:http://xiecc.itpub.net/post/1476/34635昨天在整合Spring MVC和Velocity,Sitemesh时,又碰到了久违的中文问题。唉,JSP, mysql, struts,每次都会碰到这样的问题,总是以为这种以后不会碰到这种看似初级的问题了,结果还是躲不过。网上没查到相关资料,于是开始动手跟踪Spring和Velocity的源码,弄了一天终于搞

HouYing 1003

本地mysql没有乱码远程有_Tomcat+ssh+Mysql本地正常,远程服务器中文乱码。(转)...

ssh2+mysql中文乱码解决方法(统一使用UTF-8编码)中文乱码,首先要区分是页面乱码、action乱码,还是数据库乱码。大致的原理是java使用unicode编码– >window使用gbk(gb2312的扩展集)–mysql默认使用utf-8(unicode的一种编码方法),这样转来转去就乱码了 ^_^。解决方法如下:1. 在struts2里面,最好将所有字符都设成utf-8。1....

weixin_32461163的博客 248

使用struts2+spring+tomcat+mysql数据库开发中文乱码解决

第一次使用mysql结合struts2和spring开发,接二连三碰到中文乱码和数据库查询异常问题,非常麻烦。理想下整个过程全部使用utf-8,中间不用转换编码。首先,mysql数据库字符集全部设成utf-8,没有问题。然后,struts.xml配置文件中加入jsp页面加入spring数据源配置(注意url)

学海无涯! 2068

使用struts2+spring+tomcat+mysql数据库开发中文乱码问题解决方案

第一次使用mysql结合struts2和spring开发,接二连三碰到中文乱码异常问题。 理想下整个过程全部使用utf-8,中间不用转换编码。 首先,mysql数据库字符集全部设成utf-8,没有问题。   然后,struts.xml配置文件中加入 [xhtml] view plaincopy constant name=

zaklway的专栏 517

JSP简历管理系统开发:小微企业招聘解决方案

简历管理系统是企业招聘流程中的核心工具,尤其在信息爆炸时代,高效处理非结构化数据成为技术难点。传统基于JSP+Servlet的Web开发技术,凭借其轻量级特性和低硬件要求,依然在特定场景下具有实用价值。通过结合Apache Tika实现文本解析、SimHash算法处理重复检测,这类系统能有效解决小微企业面临的简历管理痛点。在数据库设计上,针对性的反范式优化可显著提升查询性能,而Tomcat的线程配置调优则确保系统稳定运行。对于计算机专业学生而言,此类项目既能巩固JSP/Servlet基础,又能实践文件解析、

weixin_30883311的博客 421
上一篇: SpringMVC系列七:RequestMappingHandlerAdapter的初始化
下一篇: Tomcat处理请求的编解码
技术爱好者666
博客等级 码龄9年 4粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值