Как удалить .py из URL для pyservlet с помощью jython - PullRequest
2 голосов
/ 30 декабря 2010

Я смотрю учебник по сервлету jython, и все работает. Как мне сделать URL-адрес

локальный: 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 ]

2 голосов
/ 17 декабря 2012

Как отмечает @Jigar, в самом коде Jython Servlet есть ограничение.Однако вы можете обойти эту проблему, создав простой переводчик URL.Он состоит из сервлета, который внутренне перенаправляет запрос сервлету Py.

Используйте следующий код для 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 голос
/ 27 июля 2011

Похоже, что проблема присуща 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 определяется как private и final, я не вижу хорошего способа переопределить это поведение, просто создав подкласс PyServlet - я думаю, вынужно сделать копию PyServlet и переопределить это поведение в новом классе.

1 голос
/ 30 декабря 2010

Попробуйте это

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

После этого каждый запрос будет обслуживаться PyServlet

0 голосов
/ 06 мая 2014

Только для справки: трюк @Juanal AliasServlet работает хорошо. Я просто должен был использовать request.getServletPath() вместо getRequestURI(). (работает с Eclipse)

0 голосов
/ 30 декабря 2010

Я новичок в питоне.Но если у вас есть Apache, вы можете переписать все URL .py!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...