JavaJSP/Servlet:抛出著名堆栈溢出的控制器Servlet

JavaJSP/Servlet:抛出著名堆栈溢出的控制器Servlet,java,jsp,servlets,Java,Jsp,Servlets,我读过好几份文件,但我不明白:我知道我做错了什么,但我不明白是什么。我有一个完全动态生成的网站:几乎没有任何静态内容 为了理解JSP/Servlet,我编写了自己的“前端控制器”,截取每个查询,如下所示: <servlet-mapping> <servlet-name>defaultservlet</servlet-name> <url-pattern>/*</url-pattern> </serv

我读过好几份文件,但我不明白:我知道我做错了什么,但我不明白是什么。我有一个完全动态生成的网站:几乎没有任何静态内容

为了理解JSP/Servlet,我编写了自己的“前端控制器”,截取每个查询,如下所示:

<servlet-mapping>
        <servlet-name>defaultservlet</servlet-name>
        <url-pattern>/*</url-pattern>
</servlet-mapping>
当我使用url模式(在web.xml中)时,比如说,
*.html
,一切正常。但当我把它改为
/*
(真正拦截一切)时,我进入了一个无休止的循环,结果是。。。堆栈溢出:)

发送请求时,URI“../WEB-INF/jsp/index.jsp”本身是否与我设置的WEB.xml过滤器/*匹配

编辑显然不是,因为这是到index.jsp的精确映射,因此它绕过了web.xml url模式。所以我还是不明白我怎么能进入那个无休止的循环

如果我想使用/*url模式截取所有内容,并且能够分派/转发/,该怎么办

这里我并不是在问specs/Javadocs:我真的对大局感到困惑,我需要一些关于可能发生的事情的解释

难道我不应该拦截所有的东西吗


如果我可以截获所有内容,那么关于转发/分派,我应该注意什么?

尝试使用内置前端控制器模式的struts。这里有一个action类,可以在struts配置文件中定义转发,使用它可以轻松地管理转发


完成教程。希望这对您有所帮助。

不幸的是,Serlvet规范不允许创建servlet映射来只匹配传入请求,而不匹配转发。但是,可以对筛选器映射执行此操作(默认情况下,筛选器映射只匹配传入的请求)

因此,使用单个servlet拦截所有内容的典型解决方案是使用:


这种方式还允许您为静态文件指定
/*
映射的异常。

相关:@leonbloy:oh dang谢谢。。。我懂了。根据BalusC的回答,显然在servlet映射中使用“/*”不是一个好主意:(请转储完整的堆栈跟踪/类代码here@techzen:这不是必需的。原因很明显。
url模式是
/*
。servlet一次又一次地将请求转发给自己。@Nooz:确实,当您想要转发和忘记(即仅直接处理传入的请求)时,您希望使用筛选器默认情况下,servlets会拦截每个请求(直接传入、转发、包含、错误)。可通过web.xml中的
条目(仅默认为
请求
)对此单独配置筛选器。我不是在追求一个框架。我正在尝试学习我的问题中提到的JSP/Servlet。此外,我的印象是Struts有点像上世纪的技术,从零开始的人应该投资于Spring MVC等框架:)尝试使用**(没有空格)此外,roseindia.net是一个来源。它只教坏习惯。不要将该网站用作学习来源。
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jsp/index.jsp");
dispatcher.forward(req, resp);
<filter>
    <filter-name>urlRewrite</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>

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

<servlet>
    <servlet-name>application</servlet-name>
    <servlet-class>...</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>application</servlet-name>
    <url-pattern>/app/*</url-pattern>
</servlet-mapping>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite
    PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
    "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">

<urlrewrite default-match-type="wildcard">
    <rule>
        <from>/**</from>
        <to>/app/$1</to>
    </rule>
    <outbound-rule>
        <from>/app/**</from>
        <to>/$1</to>
    </outbound-rule>    
</urlrewrite>