我正在查看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)
答案 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
被定义为private
和final
,我没有看到通过继承PyServlet来覆盖此行为的好方法 - 我认为你必须制作一个PyServlet的副本,并在一个新的类中重新定义这种行为。
答案 3 :(得分:0)
我是python的新手。但是如果你有Apache,你可以重写所有的.py网址!
答案 4 :(得分:0)
仅供记录:@Juanal AliasServlet技巧很好用。
我只需使用request.getServletPath()
而不是getRequestURI()
。
(使用Eclipse)