Servlets Jython和实现HttpServlet.contextInitialized
我希望Jython servlet实现Servlets Jython和实现HttpServlet.contextInitialized,servlets,jython,Servlets,Jython,我希望Jython servlet实现HttpServlet.contextInitialized方法,但我不确定如何在web.xml中表达这一点。我目前拥有的是: from javax.servlet import ServletContextListener; from javax.servlet.http import HttpServlet class JythonServlet1 ( HttpServlet, ServletContextListener ): de
HttpServlet.contextInitialized
方法,但我不确定如何在web.xml
中表达这一点。我目前拥有的是:
from javax.servlet import ServletContextListener;
from javax.servlet.http import HttpServlet
class JythonServlet1 ( HttpServlet, ServletContextListener ):
def contextInitialized( self, event ):
print "contextInitialized"
context = event.getServletContext()
def contextDestroyed( self, event ):
print "contextDestroyed"
context = event.getServletContext()
def doGet( self, request, response ):
print "doGet"
def doPost( self, request, response ):
print "doPost"
我的web.xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>JythonTest</display-name>
<servlet>
<servlet-name>PyServlet</servlet-name>
<servlet-class>org.python.util.PyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>PyServlet</servlet-name>
<url-pattern>*.py</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>JythonServlet1</display-name>
<servlet-name>JythonServlet1</servlet-name>
<servlet-class>JythonServlet1</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
JythonTest
PyServlet
org.python.util.PyServlet
1.
PyServlet
*白痴
JythonServlet1
JythonServlet1
JythonServlet1
1.
正如您所看到的,在最后一个
条目中,我想用上下文初始化servlet(在这里我可以启动一个调度程序),但它的工作方式似乎与Java servlet不同。我不使用Jython,但在中没有contextInitialized
或contextdestromed
方法。您可能正在寻找接口,该接口通常按照以下基于Java的示例实现:
package com.example;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
// ...
}
public void contextDestroyed(ServletContextEvent event) {
// ...
}
}
…在web.xml
中定义为
,如下所示:
<listener>
<listener-class>com.example.MyServletContextListener</listener-class>
</listener>
这样,您就可以得到发布的代码(不要忘记导入特定的接口,并在web.xml
中将类定义为中的servlet
和listener
)。但这并不总是被认为是一种好的做法
也就是说,您应该将类放在包中以避免可移植性问题。它可能在某些环境中工作,但在其他环境中不起作用。Sun还不鼓励在非原型环境中使用无包类。它们通常不会被包中的其他类导入。您确实需要编写一些java引导程序,比如PyServlet,将init()分派给预定义的python脚本 或者。。如果您想使用ServletContextListener接口,那么类似于Pyservlet的东西也会实现ServletContextListner,并再次分派给一些python脚本
我正在寻找类似的解决方案,看到PyServlet本身没有提供类似的解决方案,我感到非常失望。是的,对不起,我的不好。上下文方法实际上是由ServletContextListener接口实现的。我有Java版本,所以我知道怎么做。然而,我想让它在Jython工作。我已经更新了包含接口的示例代码。PS:我理解软件包,我在这里尽量避免使用冗长的示例。另外,如果您想挂接servlet的init和destroy而不是webapp的启动和关闭,那么您应该实现
HttpServlet
API提供的init()
和destroy()
methods。正如我正确理解的那样,init
方法仅在第一次触发servlet时才被调用。我希望在服务器启动时初始化我的servlet。您已经通过将
设置为高于0
:)的值来初始化了。不,PyServlet是解释器。它执行Python脚本,而不是我的servlet。问题是服务器不理解如何使用JythonServlet1(例如,将其交给解释器)。它认为JythonServlet1是一个Javaservlet,但它是一个Python脚本。
public class MyServlet extends HttpServlet implements ServletContextListener {
// ...
}