如何使用jython从pyservlet的url中删除.py

时间:2010-12-30 17:21:19

标签: java servlets jython

我正在查看jython servlet教程,并且一切正常。如何制作网址

本地主机:8080 / jythondemo / JythonServlet1

而不是

本地主机:8080 / jythondemo / JythonServlet1.py

http://seanmcgrath.blogspot.com/JythonWebAppTutorialPart1.html

以下是web.xml的相关部分

<web-app>      
    <servlet>
        <servlet-name>ServletTest</servlet-name>
        <servlet-class>ServletTest</servlet-class>
    </servlet>
    <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>ServletTest</servlet-name>
        <url-pattern>/ServletTest</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>PyServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

我也试过

<servlet-mapping>
    <servlet-name>PyServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

看来上面的更改pyservlet正在获取url JythonServlet1,但它不知道如何处理它。以下是错误消息:

javax.servlet.ServletException: I can't guess the name of the class from /.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/testjython3/JythonServlet1
org.python.util.PyServlet.createInstance(PyServlet.java:202)
org.python.util.PyServlet.loadServlet(PyServlet.java:188)
org.python.util.PyServlet.getServlet(PyServlet.java:178)
org.python.util.PyServlet.service(PyServlet.java:155)

5 个答案:

答案 0 :(得分:2)

正如@Jigar所指出的,实际的Jython Servlet代码存在限制。但是,您可以通过创建简单的URL转换器来解决该问题。它包含一个Servlet,它在内部将请求转发给Py Servlet。

web.xml

使用以下代码
<web-app>      
    <servlet>
        <servlet-name>AliasServlet</servlet-name>
        <servlet-class>juanal.AliasServlet</servlet-class>
    </servlet>
    <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>AliasServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>PyServlet</servlet-name>
        <url-pattern>*.py</url-pattern>
    </servlet-mapping>
</web-app>

创建一个新类,例如 juanal.AliasServlet ,其中包含以下内容:

package juanal;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AliasServlet extends HttpServlet
{

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        String URI = request.getRequestURI();
        String newURI = URI + ".py";
        getServletConfig().getServletContext().getRequestDispatcher(newURI).forward(request, response);
    }
}

因此,对于这样的URL:localhost:8080 / jythondemo / JythonServlet1 ,它会在内部将请求转发给 JythonServlet1.py

答案 1 :(得分:1)

试试这个

<url-pattern>/*</url-pattern>

之后,PyServlet

将为每个请求提供服务

答案 2 :(得分:1)

看起来问题是PyServlet.java固有的。 PyServlet使用正则表达式根据请求的路径查找要加载的Python类的名称。使用的正则表达式定义如下(我的源副本中的第245行):

private static final Pattern FIND_NAME = Pattern.compile("([^/]+)\\.py$");

不幸的是,如果输入的URL路径不包含“.py”扩展名,这个正则表达式将会中断 - 这会引发您看到的错误。从第200行:

Matcher m = FIND_NAME.matcher(file.getName());
if (!m.find()) {
    throw new ServletException("I can't guess the name of the class from "
            + file.getAbsolutePath());
}

由于FIND_NAME被定义为privatefinal,我没有看到通过继承PyServlet来覆盖此行为的好方法 - 我认为你必须制作一个PyServlet的副本,并在一个新的类中重新定义这种行为。

答案 3 :(得分:0)

我是python的新手。但是如果你有Apache,你可以重写所有的.py网址!

答案 4 :(得分:0)

仅供记录:@Juanal AliasServlet技巧很好用。 我只需使用request.getServletPath()而不是getRequestURI()。 (使用Eclipse)