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

Kar*_*lek 2 servlets scala

我是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>
Run Code Online (Sandbox Code Playgroud)

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,servlet使用Jetty加载,我很高兴,我可以看到"hello world" 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")
        }
    }
Run Code Online (Sandbox Code Playgroud)

怎么能取胜呢?

Vic*_*ari 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>
Run Code Online (Sandbox Code Playgroud)

这样,请求/hello将由处理HelloWorldServlet,请求/goodbye将由处理GoodbyeWorldServlet.现在,它只是一个定义是否GET或POST更有意义,为您和实施相应的方法(之事doGetdoPost在你的servlet或两者).

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