如何获得指向同一个servlet的不同URL?

时间:2012-07-09 23:34:11

标签: scala servlets

我是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")
    }
}

到目前为止,使用Jetty加载了servlet,我很高兴,我可以在http://localhost:8080/HelloWorldServlet看到“hello world”。

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

    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")
        }
    }

怎么能取胜呢?

1 个答案:

答案 0 :(得分: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上实现相应的方法(doGetdoPost或两者)。

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