我是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/hello
和http://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")
}
}
怎么能取胜呢?
答案 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上实现相应的方法(doGet
或doPost
或两者)。
你的想法(比较servlet中的URL的内容)也有效,但不是一个好的设计,因为你可能最终得到一个巨大的if / then / else链,这在这种情况下听起来不错