【问题标题】:Jython and implementing HttpServlet.contextInitializedJython 和实现 HttpServlet.contextInitialized
【发布时间】:2010-02-12 23:59:32
【问题描述】:

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

如您所见,在最后一个&lt;servlet&gt; 条目中,我想使用上下文(我可以在其中启动调度程序)初始化servlet,但它似乎与Java servlet 的工作方式不同。

【问题讨论】:

    标签: servlets jython


    【解决方案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) {
            // ...
        }
    }
    

    ...在web.xml中定义为&lt;listener&gt;如下:

    <listener>
        <listener-class>com.example.MyServletContextListener</listener-class>
    </listener>
    

    这必须让您了解如何使用 Jython 来获取它。

    您还可以选择让您的 servlet 扩展 HttpServlet 并实现 ServletContextListener,如下所示:

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

    这样你就可以得到你发布的代码(不要忘记导入特定的接口并将你的类定义为 both servletlistener in web.xml )。但这并不总是被认为是一种好的做法。

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

    【讨论】:

    • 是的,对不起我的错。上下文方法确实由 ServletContextListener 接口实现。我有 Java 版本的工作,所以我知道这样做。但是,我想让它在 Jython 中工作。我已经使用包含的界面更新了我的示例代码。 PS:我了解包,我试图在这里避免冗长的示例。
    • 其他,如果你想钩住servlet的init和destroy而不是webapp的启动和关闭,那么你应该实现HttpServlet API提供的init()destroy()方法。
    • 据我了解,init 方法仅在第一次触发 servlet 时被调用。我希望在服务器启动时初始化我的 servlet。
    • 您已经通过将&lt;load-on-startup&gt; 设置为高于0 的值来做到这一点:)
    • 不,PyServlet 是解释器。它执行 Python 脚本,而不是我的 servlet。问题是服务器不明白如何处理 JythonServlet1(例如,将其交给解释器)。它认为 JythonServlet1 是一个 Java servlet,但它是一个 Python 脚本。
    【解决方案2】:

    您确实需要编写一些 java 引导程序,例如 PyServlet,它将 init() 调度到预定义的 python 脚本。

    或者..如果你想使用 ServletContextListener 接口,那么像 Pyservlet 之类的也实现了 ServletContextListner 并再次分派到一些 python 脚本。

    我正在寻找类似的解决方案,但看到 PyServlet 本身不提供类似的解决方案,我感到非常失望。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      相关资源
      最近更新 更多