如何使用 jython 从 pyservlet 的 url 中删除 .py
我正在查看 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
正如 @Jigar 所指出的,实际的 Jython Servlet 代码存在限制。但是,您可以通过创建一个简单的 URL 转换器来解决该问题。它由一个 Servlet 组成,该 Servlet 在内部将请求转发到 Py Servlet。
对 web.xml 使用以下代码:
创建一个新类,例如 juanal.AliasServlet,其中包含以下内容:
因此,对于这样的 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:
Create a new class, say, juanal.AliasServlet, with the following content:
So, for a URL like this: localhost:8080/jythondemo/JythonServlet1, it will internally forward the request to JythonServlet1.py
尝试这个
之后,每个请求都将由
PyServlet
处理Try this
After that every request will be served by
PyServlet
看起来这个问题是 PyServlet.java 固有的。 PyServlet 使用正则表达式根据请求的路径查找要加载的 Python 类的名称。使用的正则表达式定义如下(我的源代码副本中的第 245 行):
不幸的是,如果输入 URL 路径不包含“.py”扩展名,则此正则表达式将中断 - 这会引发您看到的错误。从第 200 行开始:
由于
FIND_NAME
被定义为private
和final
,我没有看到通过子类化 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):
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:
Since
FIND_NAME
is defined asprivate
andfinal
, 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.我是蟒蛇新手。但如果你有 Apache,你可以重写所有 .py URL!
I'm new to python. But if you have Apache, you could rewrite all .py URLs!
仅供记录:@Juanal AliasServlet 技巧效果很好。
我只需使用
request.getServletPath()
而不是getRequestURI()
。(与 Eclipse 一起使用)
Just for the record: @Juanal AliasServlet trick works nicely.
I just had to use
request.getServletPath()
instead ofgetRequestURI()
.(working with Eclipse)