2010-12-30 3 views
2

私はjythonサーブレットのチュートリアルを見ています。 8080/jythondemo/JythonServlet1jythonを使ってpyservletのURLから.pyを削除するには

代わりの

はlocalhost:どのように私はURLが

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> 

私はまた、それが上記の変更のpyservletがURL JythonServlet1を取得していると思わ

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

で試してみたが、それはそれで何をすべきかを知りません。ここでは、エラーメッセージは次のとおりです。

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) 

答えて

1

は、すべての要求がPyServlet

+0

次のエラーが発生します。javax.servlet.ServletException:/org.eclipse.wst.server.core/tmp0/wtpwebapps/testjython/JythonServlet1からクラス名を推測できません \t org.python.util.PyServlet.createInstance(PyServlet.java:202) \t org.python.util.PyServlet.loadServlet(PyServlet.java:188) \t org.python.util.PyServlet.getServlet(PyServlet。 java:178) \t org.python.util.PyServlet.service(PyServlet.java:155) – Sad

+0

あなたはより可読性の高いログを更新してください。 –

+0

はい、 '/ *'だけでなく '/' –

0

によって提供されますその後、私は、Pythonに新たなんだ、この

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

を試してみてください。しかし、Apacheをお使いの場合は、すべての.py URLを書き換えることができます!

1

PyServlet.javaには問題があるようです。 PyServletは、正規表現を使用して、要求のパスに基づいてロードするPythonクラスの名前を検索します。次のように使用する正規表現は、(元の私のコピーでライン245)に定義されます。入力されたURLパスが「の.py」拡張子が含まれていない場合

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

残念ながら、この正規表現は解除されます - このあなたが見たエラーが発生します。ライン200から:FIND_NAMEprivatefinalのように定義されているので

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

、私はちょうどPyServletをサブクラス化することで、この動作を無効にするための良い方法が表示されない - 私はあなたがPyServletのコピーを作成する必要があると思うし、新しいクラスでこの振る舞いを再定義してください。

2

@ Jigarに記載されているように、実際のJythonサーブレットコードには制限があります。ただし、簡単なURLトランスレータを作成することで、この問題を回避できます。これは、内部的に要求をPyサーブレットに転送するサーブレットで構成されます。

使用のweb.xmlため、次のコード:

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

ので、用:以下の内容で

<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、 localhost:8080/jythondemo/JythonServlet1のように、内部的に要求をに転送します。JythonServlet1 。py

+0

このパッケージファイルは、どこにubuntuのtomcat設定に置かれるべきですか? – koriander

0

@Juanal AliasServletトリックはうまく動作します。 getRequestURI()の代わりにrequest.getServletPath()を使用しました。 (Eclipseで作業中)

関連する問題