Jython并实现了HttpServlet.contextInitialized

时间:2010-02-12 23:59:32

标签: servlets jython

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

2 个答案:

答案 0 :(得分:1)

我不做Jython,但HttpServlet API中没有contextInitializedcontextDestroyed方法。您可能正在寻找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 {
    // ...
}

这样您就可以得到您发布的代码了(不要忘记导入特定界面并将您的课程定义为 servletlistenerweb.xml)。但这并不总是被认为是一种好习惯。

也就是说,您应该将类​​放在一个包中以避免可移植性问题。它可能在某些环境中有效,但在其他环境中则无效。 Sun还不鼓励在非原型设计环境中使用无包装类。它们通常不会被其他类本身导入。

答案 1 :(得分:1)

你真的需要编写一些类似于PyServlet的java引导程序,它将init()分派给预定义的python脚本。

或..如果你想使用ServletContextListener接口,那么像Pyservlet那样也会实现ServletContextListner,并再次发送到某些python脚本。

我正在寻找类似的解决方案,并且非常失望地看到PyServlet本身并没有提供这样的东西。