Jython и реализация HttpServlet.contextInitialized - PullRequest
1 голос
/ 13 февраля 2010

Я бы хотел, чтобы мой сервлет Jython реализовал метод 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> я хотел бы инициализировать сервлет с контекстом (где я могу запустить планировщик), но он, похоже, не работает так же, как с сервлетом Java.

Ответы [ 2 ]

1 голос
/ 08 июля 2011

Вам действительно нужно написать некоторый загрузчик Java, такой как PyServlet, который отправляет init () в предопределенный скрипт Python.

Или ... если вы хотите использовать интерфейс ServletContextListener, то что-то вроде Pyservlet, который также реализует ServletContextListner и снова, отправляет некоторый скрипт на python.

Я ищу подобное решение и был очень разочарован, увидев, что PyServlet сам не предлагает ничего подобного.

1 голос
/ 13 февраля 2010

Я не делаю 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.

При желании вы также можете разрешить сервлету расширять HttpServlet и реализовывать ServletContextListener следующим образом:

public class MyServlet extends HttpServlet implements ServletContextListener {
    // ...
}

, чтобы вы могли получить код, который вы разместили (не забудьте импортировать определенный интерфейс и определить свой класс как и servlet и listener в web.xml) , Но это не всегда считается хорошей практикой.

Тем не менее, вы должны помещать классы в пакет, чтобы избежать проблем с переносимостью. Это может работать в некоторых средах, но не в других. Sun также не рекомендует использовать классы без пакетов в средах без прототипов. Обычно они не могут быть импортированы другими классами, которые находятся в пакете.

...