用于通配符请求的web.xml servlet映射

时间:2009-09-28 00:05:07

标签: java jsp java-ee

我希望我的一个servlet(test2)处理“/”请求(即http://localhost/),而另一个servlet(test1)处理所有其他请求(“/ *”)。

我在下面设置了我的web.xml,但问题是所有请求都转到test1.jsp(甚至是“/”请求)

有人可以告诉我如何做到这一点吗?

<servlet>
    <servlet-name>test1</servlet-name>
    <jsp-file>/test1.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>test1</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>test2</servlet-name>
    <jsp-file>/test2.jsp</jsp-file>
</servlet>
<servlet-mapping>
    <servlet-name>test2</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

---- ----- EDIT

我意识到我的问题有点不清楚且不完整。这是我想要完成的一个例子..

  1. http://mytestsite.com/ - &gt;映射到http://mytestsite.com/index.html
  2. http://mytestsite.com/servlet1 - &gt;运行com.mytestsite.servlet1
  3. http://mytestsite.com/ * - &gt;映射到http://mytestsite.com/catchall.jsp(我希望web.xml中未映射的所有其他请求都映射到catchall.jsp)
  4. 所以我的web.xml看起来如下:

    <servlet>
        <servlet-name>servlet1</servlet-name>
        <servlet-class>com.mytestsite.servlet1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servlet1</servlet-name>
        <url-pattern>/servlet1</url-pattern>
    </servlet-mapping>
    
    <servlet>
        <servlet-name>catchall</servlet-name>
        <jsp-file>/catchall.jsp</jsp-file>
    </servlet>
    <servlet-mapping>
        <servlet-name>catchall</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    

    所以我注意到一个奇怪的问题。当我请求http://mytestsite.com/时,它会被重定向到index.html之前转到catchall.jsp。然而,它发生得如此之快,我甚至没有注意到它击中了catchall.jsp(但是我在这个文件中放了一个System.out.println,它肯定会碰到它)。

4 个答案:

答案 0 :(得分:1)

我认为你的目标有点令人困惑和脆弱。但是,要回答您的问题,请尝试http://your-domain.com/请求的欢迎文件条目。

<welcome-file-list>
    <welcome-file>/test2.jsp</welcome-file>
</welcome-file-list>

最常见的是test2.jsp执行重定向或转发到应用程序中的其他“控制器”。这样,即使在http://your-domain.com/请求中,您的MVC也会被解雇。

如果您同意我的意见,那么您的欢迎文件应该是index.jsp(遵循常见约定)。 index.jsp中的代码然后是一个单行重定向到'welcome'servlet。

答案 1 :(得分:1)

使用转发过滤器而不是servlet。使用这种方法拦截“/”非常简单。

filter --> /*

servlet1 --> /_some_hidden_path_1_
servlet2 --> /_some_hidden_path_2_

答案 2 :(得分:0)

真的不确定,但也许你声明\ map你的servlet的顺序定义了优先级。首先尝试声明\ map test2并查看。

亲切的问候

答案 3 :(得分:0)

尝试不将/ request映射到任何东西(摆脱test2 servlet),而是使用欢迎文件:

<welcome-file-list>
  <welcome-file>
    test2.jsp
  </welcome-file>
</welcome-file-list>