一、问题由来

  最近在测试Servlet的请求转发功能,准备抽取一个公共的PageJumpTestServlet,用来做页面跳转功能。

这样不用每次在测试的时候,都单独写一个Servlet用来做页面跳转。自己最初的设想时,在路径配置的

时候使用/toPage/*,访问地址示例http://localhost:8080/javaWeb/toPage/login,修改最后一级路径即可。

然后在doGet()方法中,截取最后一级路径,使用请求转发到指定的页面路径即可,完整代码如下

@WebServlet("/toPage/*")
public class PageJumpTestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String requestURL = req.getRequestURL().toString();
        if(requestURL != null && requestURL.lastIndexOf("/") > 0){
            String pagePath = requestURL.substring(requestURL.lastIndexOf("/"));
            System.out.println("pagePath-->" + "WEB-INF/pages" + pagePath + ".html");
            req.getRequestDispatcher("WEB-INF/pages" + pagePath + ".html").forward(req, resp);
            return;
        }

        // 错误提示信息
        resp.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.println("请求路径错误!");
        writer.flush();
    }
}

代码写好之后,自己就开始测试,一测试的时候就出现内存溢出。

如下图所示:

往后面翻看的时候,发现有内存溢出的问题.

 

这就是一个简单的页面跳转,怎么会出现这个奇怪的问题呢?让自己感到很困惑。然后自己去网上找答案,

使用百度开发者搜索,

用前面三行错误信息进行搜索,没有找到一圈没有找到自己想要的答案。

然后使用谷歌搜索。

找到一篇博客和自己遇到的问题非常类似,

提问题的博主同样在Servlet中配置路径时,配置了/*

并且同样是用来做页面转发,

和自己的情况非常类似。

好心的网友回答如下

使用百度翻译过来如下,

大致意思就是自己在配置路径时,配置的是/toPage/*,会匹配到所有包含/toPage/请求的路径,

访问地址http://localhost:8082/chapterNine/toPage/jqueryTest  时,Servlet的doGet()方法视图将请求转发到

自己配置的路径中。只是在转发过程中,根据路径的配置,又会被定向到当前的Servlet中,最终造成死循环。

自己还做了另外一个测试,把/toPage/*改成/*效果是一模一样的。最终造成内存溢出。问题找到后就好解决了

地址如下:

https://stackoverflow.com/questions/43505168/stackoverflowerror-when-try-to-access-web-application

三、解决方案

问题找到之后,就好解决。自己换了一种方式,将请求参数放在get请求的地址栏中,然后在后台动态获取参数,

然后在进行页面跳转。这样在配置访问路径时,就可以配置为精确匹配,很好地解决了这个问题。最终代码如下,

@WebServlet("/toPage")
public class PageJumpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String page = req.getParameter("page");
        if(page != null && !"".equals(page)){
            req.getRequestDispatcher("WEB-INF/pages/" + page + ".html").forward(req, resp);
            return;
        }
        // 错误提示信息
        resp.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.println("请求路径错误!");
        writer.flush();
    }
}

通过这一个Servlet就解决了页面跳转问题,大大地提升了效率。

Servlet中访问路径配置为/*时,使用请求转发造成内存溢出的更多相关文章

  1. servlet中web.xml配置

    常见的Servlet中url-pattren的配置 1.固定配置, 如:/hi 引入通配符 * 2.以"/XXX"开头,以"*"结尾 3.以"*&qu ...

  2. Win7中的IIS配置asp时出现“出现403 文件夹禁止訪问错误”!

    Win7中的IIS配置asp时出现"出现403 文件夹禁止訪问错误"! 在[默认文档]中设一下启动文件即可了.

  3. Servlet+JSP 对外访问路径配置

    servlet类似 servlet配置为: <servlet>    <servlet-name>Demo01_OutWrite</servlet-name>    ...

  4. servlet中web.xml配置详解

    Web.xml常用元素 <web-app> 所有部署描述符文件的顶层(根)元素 <display-name></display-name>定义了WEB应用的名字 & ...

  5. 七、SpringBoot项目集成JSP以及项目不同启动方式及访问路径配置

    1.创建JSP目录 在src/main目录下创建目录webapp/WEB-INF/jsp用于存放jsp页面,如下图: 然后再改文件夹下面我们创建JSP文件: 大家在使用IDEA 的new菜单创建JSP ...

  6. Servlet----------在 Servlet 中的xml配置

    今天弄了大半天,才弄好了,还是请教了别人,主要原因在于把web.xml文件放在了WEB-INF文件夹下面了,正常的情况是在WebRoot下面的. 还有一个,我是在MyEclipse中操作的,起初不知道 ...

  7. Servlet中关于路径的小结

    URL(统一 资源定位符).URI(统一资源标识符)都是由资源路径和资源名称组成.   访问路径按照路径是否可以独立完成资源准确定位的判别标准,可以将访问路径分为绝对路径与相对路径. 关系:绝对路径 ...

  8. Servlet中Web.xml配置详解(二)

    5.2 分配JSP初始化参数给JSP页面提供初始化参数在三个方面不同于给servlet提供初始化参数.1)使用jsp-file而不是servlet-class.因此,WEB-INF/web.xml文件 ...

  9. Jenkins访问路径配置自定义的相对路径

    Jenkins安装时没有配置自定义的相对访问路径,例如配置的端口是29957,那访问路径就是http://localhost:29957.以下介绍把访问路径改成http://localhost:299 ...

  10. Servlet中相对路径与绝对路径

    相对路径与绝对路径: 相对路径:相对路径指的是相对于当前文件所在目录的路径! http://localhost:8080/servlet01/ http://localhost:8080/servle ...

随机推荐

  1. 佳翼M2X16 PCIE4.0X16转4盘M.2NVME固态硬盘 - 我的硬件配置

  2. ElasticSearch7.3学习(十八)----多索引搜索

    1.multi-index 多索引搜索 多索引搜索就是一次性搜索多个index下的数据 /_search:所有索引下的所有数据都搜索出来 /index1/_search:指定一个index,搜索其下所 ...

  3. Linux--top命令解释

    top命令解释 1.1 系统运行时间和平均负载: top命令的顶部显示与uptime命令相似的输出 这些字段显示: 当前时间 系统已运行的时间 当前登录用户的数量 相应最近5.10和15分钟内的平均负 ...

  4. CF1902

    A 只要不是全 \(1\) 即可. B 二分完成天数. C \(x\) 取差的 \(gcd\),\(a_{n+1}\) 见缝插针. D 用一个 map 记录按原始操作序列,要走到 \((x,y)\) ...

  5. 即截即贴,推荐一个提升截图对比效率的工具Snipaste

    壹 ❀ 超好用的snipaste 你的图片是用座机(锁孔)拍的吗?我们常常会这样嘲讽那些不会使用截图工具,硬要用手机拍出高斯模糊特效的群友(对个焦怎么就这么难= =),其实不管是日常生活还是工作,QQ ...

  6. Python Split 函数用法

    一.split函数简介Python中split()函数,具体作用如下: 拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list):二.语法split() 方法语法: str.s ...

  7. logstash4j-用于日志的输入、转换处理、输出, java 开发者自己的 logstash

    项目简介 logstash4j 用于日志的输入.转换处理.输出, java 开发者自己的 logstash 特性 input output filter metric 开源地址 logstash4j ...

  8. XML和JSON的比较

    XML和JSON的比较 XML与JSON都可以用来描述或者存储数据,两者都有各自的优点,使用场景取决于需求. 描述 XML 可扩展标记语言Extensible Markup Language,是一种用 ...

  9. Object.definePropety

    defineProperty Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象,也就是说,该方法允许精确地添加或修改对象的属 ...

  10. C# EnumWindows示例代码

    代码开箱即用,唯一需要处理的就是要提供一个进程的pid. using System; using System.Collections.Generic; using System.Linq; usin ...