我是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/hello和http://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)
怎么能取胜呢?
首先,如果你想对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更有意义,为您和实施相应的方法(之事doGet或doPost在你的servlet或两者).
你的想法(比较servlet里面的URL的内容)也有效,但不是一个好的设计,因为你最终会得到一个巨大的if/then/else链,这在这种情况下听起来不错.
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |