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