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

发布于 2024-10-09 10:57:29 字数 1841 浏览 0 评论 0原文

我正在查看 jython servlet 教程并且一切正常。如何使 url 为

localhost:8080/jythondemo/JythonServlet1

而不是

localhost: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)

I'm looking at the jython servlet tutorial and have got everything working. How do I make the url be

localhost:8080/jythondemo/JythonServlet1

instead of

localhost:8080/jythondemo/JythonServlet1.py

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

Here is the relevant part from 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>

I've also tried with

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

It seems with the above changes pyservlet is getting the url JythonServlet1 but it does not know what to do with it. Here is the error message:

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

魂归处 2024-10-16 10:57:29

正如 @Jigar 所指出的,实际的 Jython Servlet 代码存在限制。但是,您可以通过创建一个简单的 URL 转换器来解决该问题。它由一个 Servlet 组成,该 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

As noted by @Jigar there's a restriction in the actual Jython Servlet code. However, you may get around that issue by creating a simple URL translator. It consists in a Servlet that internally forwards the request to the Py Servlet.

Use the following code for 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>

Create a new class, say, juanal.AliasServlet, with the following content:

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);
    }
}

So, for a URL like this: localhost:8080/jythondemo/JythonServlet1, it will internally forward the request to JythonServlet1.py

长安忆 2024-10-16 10:57:29

尝试这个

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

之后,每个请求都将由 PyServlet 处理

Try this

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

After that every request will be served by PyServlet

烟火散人牵绊 2024-10-16 10:57:29

看起来这个问题是 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 并在新的类中重新定义此行为。

It looks like the problem is inherent to PyServlet.java. PyServlet uses regular expressions to find the name of the Python class to load based on the path of the request. The regular expression used is defined as follows (line 245 in my copy of the source):

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

Unfortunately, this regular expression will break if the input URL path doesn't contain a ".py" extension - this raises the error that you saw. From line 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());
}

Since FIND_NAME is defined as private and final, I don't see a good way to override this behavior by just subclassing PyServlet - I think you'll have to make a copy of PyServlet and redefine this behavior in a fresh class.

阪姬 2024-10-16 10:57:29

我是蟒蛇新手。但如果你有 Apache,你可以重写所有 .py URL!

I'm new to python. But if you have Apache, you could rewrite all .py URLs!

简美 2024-10-16 10:57:29

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

Just for the record: @Juanal AliasServlet trick works nicely.
I just had to use request.getServletPath() instead of getRequestURI().
(working with Eclipse)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文