Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何获得指向同一servlet的不同URL?_Scala_Servlets - Fatal编程技术网

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

Scala 如何获得指向同一servlet的不同URL?,scala,servlets,Scala,Servlets,我对Servlet技术非常陌生,这是一个非常基本的问题,但我对那些对我来说太复杂的教程感到困惑 我有一个新的servletHelloWorldServlet。在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

我对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>
到目前为止还不错,servlet是使用Jetty加载的,我很高兴,我可以在
http://localhost:8080/HelloWorldServlet

现在,我希望servlet能够响应请求,比如,
http://localhost:8080/HelloWorldServlet/hello
http://localhost:8080/HelloWorldServlet/goodbye
并以不同的方式对这两个问题进行处理。例如like(伪代码)


如何实现这一点?

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

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

在开发实际应用程序时,您的代码可能会变得更加复杂,因此,如果您将职责划分为两个servlet,代码会更加简洁。如果您同意这种方法,只需在
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>

HelloWorldServlet
cz.hello.HelloWorldServlet
再见,沃尔德小酒店
cz.hello.GoodbyeWorldServlet
HelloWorldServlet
/你好
再见,沃尔德小酒店
/再见
这样,对
/hello
的请求将由
HelloWorldServlet
处理,对
/bye
的请求将由
GoodbyeWorldServlet
处理。现在只需定义GET或POST是否对您更有意义,并在您的servlet上实现相应的方法(
doGet
doPost
,或两者)


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

哦,好的。因此,推荐的设计是为不同类型的职责提供更多的类,好吗?(邮递是一个错误)这是肯定的。假设您的应用程序是一个简单的CRUD,例如处理用户和组。您将有两个URL(/users和/groups),由两个servlet处理。在这些servlet中,您将实现doGet(用于检索用户/组)、doDelete(用于删除)、doPut(用于创建)和doPost(用于更新)。这只是一个愚蠢的例子,可以让你理解这个想法背后的基本原理。不,这是一个很好的例子,也是我需要的。
    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")
        }
    }
<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>