我希望我的Jython servlet能够实现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>
正如您所看到的,在上一个<servlet>
条目中,我想用上下文初始化servlet(我可以在其中启动调度程序),但它似乎与Java的工作方式不同的servlet。
答案 0 :(得分:1)
我不做Jython,但HttpServlet
API中没有contextInitialized
或contextDestroyed
方法。您可能正在寻找ServletContextListener
接口,这通常是作为以下基于Java的示例实现的:
package com.example;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
// ...
}
public void contextDestroyed(ServletContextEvent event) {
// ...
}
}
...在<listener>
中定义为web.xml
,如下所示:
<listener>
<listener-class>com.example.MyServletContextListener</listener-class>
</listener>
这必须让你知道如何使用Jython拾取它。
您也可以选择让您的servlet扩展HttpServlet
并实现ServletContextListener
,如下所示:
public class MyServlet extends HttpServlet implements ServletContextListener {
// ...
}
这样您就可以得到您发布的代码了(不要忘记导入特定界面并将您的课程定义为 servlet
和listener
在web.xml
)。但这并不总是被认为是一种好习惯。
也就是说,您应该将类放在一个包中以避免可移植性问题。它可能在某些环境中有效,但在其他环境中则无效。 Sun还不鼓励在非原型设计环境中使用无包装类。它们通常不会被其他类本身导入。
答案 1 :(得分:1)
你真的需要编写一些类似于PyServlet的java引导程序,它将init()分派给预定义的python脚本。
或..如果你想使用ServletContextListener接口,那么像Pyservlet那样也会实现ServletContextListner,并再次发送到某些python脚本。
我正在寻找类似的解决方案,并且非常失望地看到PyServlet本身并没有提供这样的东西。