2

我是 Servlet 技术的新手,这绝对是个基本问题,但我对那些对我来说太复杂的教程感到困惑。

我有一个新的 servlet HelloWorldServlet。在web.xml,我有这个

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
     PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
     "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app>
     <servlet>
         <servlet-name>HelloWorldServlet</servlet-name>
         <servlet-class>cz.hello.HelloWorldServlet</servlet-class>
     </servlet>

     <servlet-mapping>
         <servlet-name>HelloWorldServlet</servlet-name>
         <url-pattern>/HelloWorldServlet</url-pattern>
     </servlet-mapping>
</web-app>

HelloWorldServlet.scala(我更喜欢 scala 到 java)看起来像这样

package cz.hello

import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

 class HelloWorldServlet extends HttpServlet {
    override def doGet(req: HttpServletRequest, resp: HttpServletResponse) = {
        resp.setContentType("text/plain")
        resp.getWriter.println("Hello, world")
    }
}

到目前为止一切顺利,servlet 是使用 Jetty 加载的,我很高兴,我可以在http://localhost:8080/HelloWorldServlet.

现在,我希望 servlet 能够以不同的方式对 GET 请求做出反应,例如,http://localhost:8080/HelloWorldServlet/hellohttp://localhost:8080/HelloWorldServlet/goodbye它们两者做出反应。例如像(伪代码)

    override def doGet(req: HttpServletRequest, resp: HttpServletResponse) = {
        resp.setContentType("text/plain")
        if (req.isAddress("/hello") {
            resp.getWriter.println("Hello, world")
        } else {
            resp.getWriter.println("Goodbye, world")
        }
    }

怎么能达到呢?

4

1 回答 1

5

首先,如果你想对 POST 请求做出反应,你应该实现doPost方法,而不是doGet.

其次,我建议您考虑在不同的 servlet 中处理每个 URL,除非您的代码与您提供的示例一样简单。

在开发实际应用程序时,您的代码可能会变得更加复杂,因此如果您将职责分成两个 servlet,它会更加简洁。如果您同意这种方法,只需在您的 中创建另一个<servlet>和另一个<servlet-mapping>对象web.xml,如下所示:

<web-app>
 <servlet>
     <servlet-name>HelloWorldServlet</servlet-name>
     <servlet-class>cz.hello.HelloWorldServlet</servlet-class>
 </servlet>
 <servlet>
     <servlet-name>GoodbyeWorldServlet</servlet-name>
     <servlet-class>cz.hello.GoodbyeWorldServlet</servlet-class>
 </servlet>

 <servlet-mapping>
     <servlet-name>HelloWorldServlet</servlet-name>
     <url-pattern>/hello</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
     <servlet-name>GoodbyeWorldServlet</servlet-name>
     <url-pattern>/goodbye</url-pattern>
 </servlet-mapping>
</web-app>

这样,对的请求/hello将由 处理HelloWorldServlet,对的请求/goodbye将由 处理GoodbyeWorldServlet。现在只需定义 GET 还是 POST 对您更有意义,并在您的 servlet 中 实现相应的方法(doGet或或两者)。doPost

您的想法(比较 servlet 中 URL 的内容)也有效,但不是一个好的设计,因为您最终可能会得到一个巨大的 if/then/else 链,在这种情况下这听起来是个坏主意。

于 2012-07-09T23:55:15.747 回答