我的servlet发生了一些奇怪的事情,我想我已经找到了原因,但我更加困惑。我使用Netbean6.7开发了一个Paypal IPN(即时支付通知)消息servlet,它默认在端口8080上监听Paypal IPN消息。我在它的网站上使用了一些示例Java代码,但是当它运行时,只有大约十分之一的消息通过,它们看起来是正确的,但为什么十分之一?不是100%还是没有?
所以我在这里问了一些问题并得到了一些建议,其中一个特别指出了Google的App Engine,所以我下载了它并运行了演示留言簿,而我的IPN servlet仍在Netbeans上运行,奇怪的事情发生在我之后从命令提示符输入“appengine-java-sdk-1.3.2 \ bin \ dev_appserver.cmd appengine-java-sdk-1.3.2 \ demos \ guestbook \ war”,我在浏览器中找到了以下网址“{{ 3}}“,我以为我会看到Google演示留言板页面,不,我看到的是我2年前开发的另一个servlet:”Web Academy“,在线课程注册应用程序。
怎么会发生这种情况?我从来没有开始过,多年来我都没有接触过这个项目。我猜是因为它也在监听端口8080,所以现在我明白了为什么IPN消息只通过了10次,因为另一个servlet也在监听该端口并且可能已经获得了用于IPN的消息,或者一些如何知道这两个消息servlet的进程混乱,因此无法正确响应Paypal,并且失败了。为了验证我的一些猜测。
我关闭Netbeans,并在提示符下再次运行Google留言簿,这次是在我的浏览器http://localhost:8080/上指向演示留言板页面。
我的网址看起来像这样:
现在,我的问题是:
答案 0 :(得分:4)
首先:Servlet!= Webserver。 servlet是一个Java应用程序编程接口,应该在servletcontainer中运行。 servletcontainer通常是Java Web服务器的一部分,如Apache Tomcat和Glassfish。 Web服务器通常在某个端口上侦听HTTP请求。 servletcontainer在启动时创建并实例化servlet。 URL与servlet的url-pattern
匹配的每个请求都将让servletcontainer执行servlet。
第二名:Netbeans!=网络服务器。 Netbeans是一个集成开发环境(IDE)。它只是一个带有一堆向导的开发工具,可以简化开发。您可以使用cmd.exe和notepad.exe以及独立服务器和IDE一样完美地开发。你只需知道你在做什么。
关于你的实际问题:你可能以前在Netbeans中开发了“Web Academy”项目,并将其部署为相关网络服务器的“ROOT”项目。 GAE可能无法启动,因为Netbeans管理的网络服务器正在使用该端口(您是否注意到GAE启动期间的任何错误消息?)。关闭Netbeans(这有点戏剧性,关闭Netbeans管理的网络服务器已经足够了)会释放端口。
说实话,老实说,所有这些混乱似乎都归结为你从未单独学习过基本的Java / Servlet概念,并立即潜入深洞,使用一体化IDE,你必须完全学习1000种不同的东西在一个地方,并假设它是“唯一正确”的地方。我强烈建议暂停并重新开始逐一学习基本概念。得到一些好书,花时间把它弄好。分别学习Java SE。分别学习Servlet。分别学习Netbeans。分别学习网络服务器。等等。然后做数学。祝你好运。
答案 1 :(得分:3)
你的问题中有很多问题混杂在一起,我不知道从哪里开始。可以肯定的是,您需要回到基础知识并花些时间来了解工作原理。 Servlets 是打包在 Web应用程序中的代码片段,它部署在 servlet容器(服务器)中。我们来看看你如何访问它们:
http://<host>:<port>/<context>/<url-pattern>
A B C D
其中:
.war
扩展名的Web存档的名称,但是webapp可以映射到“/”,也就是根上下文)。 现在,让我们试着回答你的问题:
为什么运行Paypal servlet时“Web Academy”servlet是自动启动的?
我的猜测是,这个旧的应用程序仍然部署在您在NetBeans下使用的服务器上(可能是NetBeans内置服务器)。因此,当您“启动”新应用程序(实际上是服务器)时,也可以访问旧应用程序。
如果我将IPN侦听端口更改为8083,这是否意味着我可以同时在我的PC上同时运行它们而不会相互影响?
正如我们所看到的,这没有意义,服务器正在侦听端口,而不是servlet。
但是我仍然不明白,[A]和[B]看起来不一样,如果[A]的页面被刷新,它应该显示Paypal内容,另一页看[B]应该显示Web学院内容,这正是我开始运行Netbeans运行Paypal servlet时所发生的事情,两个页面正确地并排显示各自的内容而不会相互干扰,为什么IPN消息无法在100%的时间内完成?
URL [A]指向PayPal_App的PayPal_Servlet。 URL [B]指向映射到根上下文的Web应用程序的默认页面。换句话说,两个URL都指向不同的应用程序。
在Netbeans中如何将8080分配给servlet [A]并将端口8083分配给servlet [B]?
很抱歉再说一遍,但这没有意义。您很可能更改在NetBeans中启动的服务器使用的端口,但是,两个servlet仍将由同一服务器提供服务,并在新端口上运行。
如何关闭Netbeans自动启动Web Academy?
我不确定但是在部署应用程序的目录(使用tomcat,检查webapps
目录)或server.xml
中进行一些清理。很难说没有关于配置,安装内容等的详细信息
答案 2 :(得分:1)
Servlet被映射到唯一的URL,其中包括端口,所以让几个servlet监听相同的端口号是完全可以的。当您拥有一个带有多个与单个URL关联的servlet / JSP的Web上下文时,这种情况很常见。
您的上下文的网址通常如下所示:
http://host:port/context-name
在您的情况下,主机是localhost,端口是8080.但是context-name是一个“PayPal_App”,另一个是root。我认为你应该为你的其他应用程序而不是根上下文使用“demo”等其他上下文。您的应用不属于那里。
答案 3 :(得分:1)
您无法将端口分配给servlet。您为servlet容器分配了一个端口(Tomcat,Jetty,Glassfish,JBoss等).servlet只是javax.servlet.Servlet
的一个实例,而不是整个服务器。
如果您希望在服务器中运行多个servlet,则需要创建一个servlet(我认为您需要扩展javax.servlet.http.HttpServlet
)并在web.xml
中为您配置它应用。只要你的血统的名字没有冲突,你应该没事。
答案 4 :(得分:1)
我猜你要么有一个外部运行的servlet容器而你只是配置了NB来使用它,或者你已经导入了所有旧的NB项目,并且它们都以某种方式部署了。您看到注册应用程序的原因是您没有看到您的GAE日志文件,所以当它无法侦听端口时您没有注意到它已经死亡。您也没有为应用分配唯一的URL,因此转到根目录的请求由注册应用程序处理。这些都没有解释为什么你的PayPal请求被丢弃,我会启动snoop / wireshark / whatever并检查你的HTTP流量。我的猜测是你的应用有一个bug。检查servlet容器日志文件可能会显示一些线索。要取消部署您的注册应用程序,请找出您的应用服务器存储Web应用程序的位置,并删除war文件或包含注册应用程序文件的目录。