代码之家  ›  专栏  ›  技术社区  ›  Luke

Jython和实现httpservlet.ContextInitialized

  •  1
  • Luke  · 技术社区  · 15 年前

    我希望我的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 回复  |  直到 13 年前
        1
  •  1
  •   BalusC    15 年前

    我不做Jython,但没有办法 contextInitialized contextDestroyed 方法在 HttpServlet API . 你可能在找 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同时扩展 HTTPSServices 实施 servletContextListener 如下所示:

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

    这样你就可以得到你已经发布的代码(不要忘记导入特定的接口并将类定义为 二者都 servlet listener 在里面 Web.XML )但这并不总是被认为是一种好的做法。

    也就是说,应该将类放在包中以避免可移植性问题。它可以在某些环境中工作,但不能在其他环境中工作。Sun也不鼓励在非原型环境中使用无包类。通常,它们不能由包中本身的其他类导入。

        2
  •  1
  •   Robert McKay    13 年前

    您确实需要编写一些Java引导程序,如pyServices,它将iNIT()发送到预定义的Python脚本。

    或…如果您想使用servletContextListener接口,那么类似于pyservlet的东西也可以实现servletContextListner,然后再次发送到一些python脚本。

    我正在寻找类似的解决方案,看到Pyservlet本身没有提供类似的解决方案,我非常失望。