Servlets Jython和实现HttpServlet.contextInitialized

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

我希望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>

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 {
    // ...
}