Gwt 我的servlet的Url映射?

Gwt 我的servlet的Url映射?,gwt,Gwt,我将GWT与GAE一起使用。当用户输入以下任意URL时,我只想像往常一样为他们提供我的应用程序: http://www.mysite.com/ http://www.mysite.com/dog http://www.mysite.com/cat 默认情况下,第一种情况有效。我不知道如何让狗和猫的箱子工作。我想我必须修改url映射,才能在web.xml中使用它。基本上,我只是想让我的应用程序使用输入的任何url: http://www.mysite.com/* 我正在尝试一个全新的项目,因此

我将GWT与GAE一起使用。当用户输入以下任意URL时,我只想像往常一样为他们提供我的应用程序:

http://www.mysite.com/
http://www.mysite.com/dog
http://www.mysite.com/cat
默认情况下,第一种情况有效。我不知道如何让狗和猫的箱子工作。我想我必须修改url映射,才能在web.xml中使用它。基本上,我只是想让我的应用程序使用输入的任何url:

http://www.mysite.com/*
我正在尝试一个全新的项目,因此我的web.xml如下所示:

<!-- Servlets -->
<servlet>
  <servlet-name>greetServlet</servlet-name>
  <servlet-class>com.me.test.server.GreetingServiceImpl</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>greetServlet</servlet-name>
  <url-pattern>/test/greet</url-pattern>
</servlet-mapping>
public class SomeServlet extends HttpServlet {

    @Override
    protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
            throws ServletException,
            IOException {

        final InputStream is = getClass().getClassLoader().
                 getResourceAsStream("/com/example/MyApplication.html");
        final byte[] buffer = new byte[255];
        int len = 0;
        while ((len = is.read(buffer)) != -1) {
            response.getOutputStream().write(buffer, 0, len);
        }
        response.flushBuffer();

    }
}
我在这里的doGet()行上抛出了一个空指针异常:

getServletConfig().getServletContext().getRequestDispatcher("test.html").forward(request,response);
我错过了什么


谢谢

您可以发布您当前的web.xml吗?您应该能够添加如下servlet映射:

  <servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>com.example.MyServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
或者您也可以动态地生成内容,可以直接在servlet中生成,也可以在JSP中生成,或者使用您喜欢的任何技术生成——这通常非常有用

针对你的评论: 因为您希望将每条路径映射到servlet,所以会得到一个无止境的循环。具有InputStream的解决方案可能如下所示:

<!-- Servlets -->
<servlet>
  <servlet-name>greetServlet</servlet-name>
  <servlet-class>com.me.test.server.GreetingServiceImpl</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>greetServlet</servlet-name>
  <url-pattern>/test/greet</url-pattern>
</servlet-mapping>
public class SomeServlet extends HttpServlet {

    @Override
    protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
            throws ServletException,
            IOException {

        final InputStream is = getClass().getClassLoader().
                 getResourceAsStream("/com/example/MyApplication.html");
        final byte[] buffer = new byte[255];
        int len = 0;
        while ((len = is.read(buffer)) != -1) {
            response.getOutputStream().write(buffer, 0, len);
        }
        response.flushBuffer();

    }
}
将MyApplication.html文件放在包com.example的源文件夹中


如果您不想将html文件放在源文件夹中,还可以使用任何其他方法创建InputStream(例如,使用FileInputStream从任何文件创建)。

好的,我尝试按照指示进行更新,但一定是弄错了,因为servlet中出现了异常(但至少它是用通配符映射调用的,这太棒了!)@user291701:我想我忘记了“/MyApplication.html”中的正斜杠。但是想想看,这可能会导致一个不确定的循环,因为在你的例子中,“/MyApplication.html”servlet也将提供服务!因此在这种特殊情况下,可能最好通过使用InputStream或其他方式读取html文件来包含它。啊,是的,如果我使用“/MyApp.html”,我会得到stackoverflow错误,你是对的。你能详细说明“使用InputStream读取它”吗,或者这种技术叫什么,我不知道该搜索什么?谢谢
public class SomeServlet extends HttpServlet {

    @Override
    protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
            throws ServletException,
            IOException {

        final InputStream is = getClass().getClassLoader().
                 getResourceAsStream("/com/example/MyApplication.html");
        final byte[] buffer = new byte[255];
        int len = 0;
        while ((len = is.read(buffer)) != -1) {
            response.getOutputStream().write(buffer, 0, len);
        }
        response.flushBuffer();

    }
}