2010-01-16 7 views
1

Après plusieurs heures de travail sur le portage de ce programme, il semble finalement être dans un état de fonctionnement. Cependant, je me demandais si quelqu'un connaissait une meilleure façon ou un moyen plus complet de transférer des servlets Java dans Python. Le début du script Python contient beaucoup de code de support pour faciliter le portage du programme ligne par ligne directement dans Python. Est-ce que quelqu'un sait d'une meilleure façon de s'y prendre?Meilleure façon de porter Java en Python?


Java

// -------------------------------------------------------- 
// File: Hello.java 
// Description: A simple "Hello World" servlet 
// -------------------------------------------------------- 

import javax.servlet.*; 
import javax.servlet.http.*; 
import java.io.*; 
import java.util.*; 
import sun.servlet.http.HttpServer; 

public class Hello extends HttpServlet { 

    int count; 

    public void service(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

    // setup response 

    response.setContentType("text/html"); 
    PrintWriter out = response.getWriter(); 

    // send response 

    out.println("<html><body>"); 
    out.println("<h5>Stephen Paul Chappell (SPC)</h5>"); 
    out.println("<h5>:) (ZTD) Zero The Dragon :(</h5>"); 
    String name = request.getParameter("NAME"); 
    if (name != null && !name.equals("")) { 
     out.println("<h2>Hello, " + name + "</h2>"); 
    } else { 
     out.println(); 
     if (name != null && name.equals("")) { 
     out.println(" <h2>You didn't enter your name. Please enter your name. </h2>"); 
     } else { 
     out.println(" <h2>What's your name? </h2>"); 
     } 
     out.println(" <hr>"); 
     out.println(" <form action=\"http://127.0.0.1:8080/servlet/Hello\">"); 
     out.println(); 
     out.println(" Enter your name: <input type=\"text\" name=\"NAME\" value=\"Fred\"><br>"); 
     out.println(" <input type=\"submit\" value=\"Click for greeting\">"); 
     out.println(); 
     out.println(" </form>"); 
    } 
    String color = request.getParameter("FAVCOLOR"); 
    if (color != null) { 
     out.println("<h2>Why, " + color + " is my favorite color too!</h2>"); 
    } 

    count++; 
    out.println("This page has been hit " + count + " time(s)."); 

    out.print("</body></html>"); 
    } 

    // start web server 
    public static void main(String[] args) throws Exception { 
    HttpServer.main(args); 
    } 
} 

Python

import urllib.parse 
import http.server 
import cgitb 
import sys 
import io 

################################################################################ 

class HttpServlet(http.server.BaseHTTPRequestHandler): 

    __debug = False 

    @staticmethod 
    def debug(value): 
     HttpServlet.__debug = value 

    def do_GET(self): 
     if self.path == '/favicon.ico': 
      self.send_error(404) 
      return 
     request = HttpServletRequest(self.path) 
     response = HttpServletResponse() 
     try: 
      self.service(request, response) 
     except Exception: 
      if HttpServlet.__debug: 
       self.send_response(500) 
       self.send_header('Content-type', 'text/html') 
       self.end_headers() 
       klass, value, trace = sys.exc_info() 
       html = cgitb.html((klass, value, trace.tb_next)) 
       self.wfile.write(html.encode()) 
      else: 
       self.send_error(500) 
     else: 
      self.send_response(200) 
      self.send_header('Content-type', response._type) 
      self.end_headers() 
      self.wfile.write(response._value) 

    def service(self, request, response): 
     raise NotImplementedError() 

################################################################################ 

class HttpServletRequest: 

    def __init__(self, path): 
     query = urllib.parse.urlparse(path).query 
     self.__dict = urllib.parse.parse_qs(query, True) 

    def getParameter(self, name): 
     return self.__dict.get(name, [None])[0] 

################################################################################ 

class HttpServletResponse: 

    def __init__(self): 
     self.__content_type = 'text/plain' 
     self.__print_writer = PrintWriter() 

    def setContentType(self, content_type): 
     self.__content_type = content_type 

    def getWriter(self): 
     return self.__print_writer 

    @property 
    def _type(self): 
     return self.__content_type 

    @property 
    def _value(self): 
     return self.__print_writer.getvalue().encode() 

################################################################################ 

class PrintWriter(io.StringIO): 

    print = io.StringIO.write 

    def println(self, string): 
     self.write(string + '\r\n') 

################################################################################ 

class HttpServer(http.server.HTTPServer): 

    @staticmethod 
    def main(RequestHandlerClass, port=80): 
     server = HttpServer(('', port), RequestHandlerClass) 
     socket = server.socket.getsockname() 
     print('Serving HTTP on', socket[0], 'port', socket[1], '...') 
     try: 
      server.serve_forever() 
     except KeyboardInterrupt: 
      print('Keyboard interrupt received: EXITING') 
      server.server_close() 

################################################################################ 
################################################################################ 

## --------------------------------------------------------- 
## File: Hello.py 
## Description: A simple "Hello World" servlet 
## --------------------------------------------------------- 

class Hello(HttpServlet): 

    count = 0 

    def service(self, request, response): 

     # Setup for a response. 
     response.setContentType('text/html') 
     out = response.getWriter() 

     # Send an appropriate response. 
     out.println('''\ 
<html> 
    <head> 
     <title>Java to Python servlet</title> 
    </head> 
    <body> 
     <h5>Stephen Paul Chappell (SPC)</h5> 
     <h5>:) (ZTD) Zero The Dragon :(</h5>''') 
     name = request.getParameter('NAME') 
     if name: 
      out.println('''\ 
     <h2>Hello, {}!</h2>'''.format(name)) 
     else: 
      if name == '': 
       out.println('''\ 
     <h2>You did not enter your name.</h2> 
     <h3>Please enter your name.</h3>''') 
      else: 
       out.println('''\ 
     <h2>What is your name?</h2>''') 
      out.println('''\ 
     <form> 
      <fieldset> 
       <legend>About Yourself</legend> 
       <label for='NAME'>Enter your name:</label> 
       <input id='NAME' name='NAME' type='text' value='John Doe' /> 
       <br /> 
       <input type='submit' value='Click me!' /> 
      </fieldset> 
     </form>''') 
     color = request.getParameter('FAVCOLOR') 
     if color: 
      out.println('''\ 
     <h2>Why, {} is my favorite color too!</h2>'''.format(color)) 

     Hello.count += 1 
     out.println('''\ 
     This page has been hit {} times.'''.format(Hello.count)) 

     out.print('''\ 
    </body> 
</html>''') 

# Start the web server. 
def main(): 
    HttpServlet.debug(True) 
    HttpServer.main(Hello) 

################################################################################ 

if __name__ == '__main__': 
    main() 

Dans le cas où quelqu'un se demande ce que le but de ce projet est, le programme Java original a été donné comme un exercice d'introduction au cours de science-informatique de première année. Depuis, il y a environ six ans que j'ai travaillé avec Java et que je passe en revue les anciens programmes, les transférant à Python pour le défi et l'expérience d'apprentissage. Le portage des servlets présente des difficultés supplémentaires.

Répondre

2

Pas une réponse directe mais, une bonne raison de ne pas utiliser quelque chose comme Webware qui offre, entre autres caractéristiques (voir le Overview):

  • Servlets. Similaires aux servlets Java, ils fournissent une base familière pour les applications Web de construction.
+0

Encore une autre URL que le filtre ne permet pas ... Soyez reconnaissant pour un accès illimité à Internet (si vous l'avez). –

+0

Je crois que c'est probablement la bibliothèque à utiliser si elle était immédiatement accessible. Merci de votre aide! Peut-être que les admins de ce réseau vont approuver le lien ... –

5

Ma meilleure suggestion est pas écrire une ligne par port de ligne. Python n'est pas Java et vous vous bloquez si vous écrivez simplement du code de style Java dans le langage Python.

est ici une entrée pour reconnaître certaines des différences/erreurs les plus courantes: http://dirtsimple.org/2004/12/python-is-not-java.html

Si vous êtes assez chanceux pour travailler avec une base de code qui contient des tests unitaires, un excellent moyen d'aller à ce sujet est au port de votre effectue des tests unitaires de Java vers Python, puis écrit un nouveau python pour faire correspondre les tests unitaires. Si ce n'est pas quelque chose que vous avez, alors il est beaucoup plus important de reconnaître ce que le logiciel fait en Java, puis d'écrire du code Python que fait la même chose. Ce ne sera certainement pas de la même manière, du moins pas au niveau ligne par ligne.

+0

Pour une raison quelconque, le filtre de mon collège ne me permet pas d'accéder à dirtsimple.org (non classé). Je connais beaucoup mieux Python que Java (je n'ai pas travaillé avec Java depuis six ans). C'est pourquoi j'essaie de trouver le meilleur moyen de transférer ce vieux code introductif aux serlets (écrits pour une classe) sur Python. C'est un exercice stimulant qui devrait m'aider, moi et les autres, à en apprendre davantage. –

+0

Considérant les problèmes que vous rencontrez avec le filtrage Internet, vous devriez envisager d'acheter un service d'hébergement Web peu coûteux qui a un accès shell. Ensuite, vous pouvez tunnel SSH en dehors du filtre de votre collège pour accéder aux sites dont vous avez besoin. Il craint que le filtre de votre collège entrave votre apprentissage, vous devriez certainement le contourner. –

3

N'est-ce pas une traduction et pas un port? :)

J'ai seulement googled et trouvé java2python ainsi que a similar SO question.

... Quoi qu'il en soit

Idéalement, je pense que vous devez comprendre ce que vous traduisez, vous pouvez donc savoir quoi traduire et ce que vous ne devriez pas besoin de traduire. Vous avez besoin d'une compréhension raisonnable des deux langages pour savoir comment les constructions en Java se rapportent aux similarités en Python et comment les bibliothèques jouent des rôles dans les traductions.

Une traduction directe entre les langues n'est souvent pas une bonne approche. Je mentionne cela simplement parce que le Python traduit dans votre question n'est pas très Pythonien. Et aussi parce qu'une bonne partie de Python est concernée par les aspects du serveur HTTP. Ce n'est pas le cas avec le code Java. Donc, pour produire une traduction "juste", je me serais appuyé sur un framework Python qui fait pour Python ce que les conteneurs de servlets font pour Java. Peut-être Tornado/Django. Mon point étant, une servlet Java est enveloppée dans un ensemble important de normes, donc il est logique que la version Python suit une route similaire, ce qui, au minimum, signifie probablement WSGI.

2

Créer une webapp python de cette manière est confus et non pythonique. Vous pourriez avoir mieux réussi à réécrire votre application dans Django plutôt que de la porter ligne par ligne depuis Java.

Questions connexes