Лучший способ портировать Java в Python?

1

После нескольких часов работы над портированием этой программы она, похоже, наконец находится в рабочем состоянии. Тем не менее, мне было интересно, знает ли кто-нибудь о более качественном или более полном способе переноса сервлетов Java на Python. Начало Python script содержит много кода поддержки, чтобы упростить перенос программы прямо в 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 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()

В случае, если кто-то задается вопросом, какова цель этого проекта, оригинальная программа Java была дана в качестве вводного упражнения на курсах по информатике на уровне первокурсника. С тех пор прошло около шести лет с тех пор, как я работал с Java и просматриваю старые программы, перенося их на Python для решения проблем и обучения. Портирование сервлетов создает дополнительные трудности.

Теги:
servlets
porting

4 ответа

2
Лучший ответ

Не прямой ответ, но любая хорошая причина не использовать что-то вроде Webware, которое предлагает среди других функций (см. Overview):

  • сервлетов. Подобно сервлетам Java, они обеспечивают привычную основу для создания веб-приложений.
  • 0
    Еще один URL, который фильтр не позволяет ... Будьте благодарны за неограниченный доступ в интернет (если он у вас есть).
  • 0
    Я верю, что это, вероятно, библиотека для использования, если бы она была немедленно доступна. Спасибо за вашу помощь! Может быть, администраторы этой сети утвердят ссылку ...
5

Мое лучшее предложение - не писать строки по линейному порту. Python - это не Java, и вы сами задумываетесь, если просто пишете код стиля Java на языке Python.

Здесь стартер для распознавания некоторых общих различий/ошибок: http://dirtsimple.org/2004/12/python-is-not-java.html

Если вам посчастливилось работать с кодовой базой, которая содержит модульные тесты, отличный способ сделать это - перенести свои модульные тесты с Java на Python, а затем написать новый python для соответствия модульным тестам. Если это не то, что у вас есть, то гораздо важнее узнать, что делает программное обеспечение на Java, а затем написать код Python, который делает то же самое. Это почти наверняка не будет таким же образом, по крайней мере, не на уровне строки.

  • 0
    По какой-то причине фильтр моего колледжа не позволяет мне попасть на dirtsimple.org (без рубрики). Я знаю Python намного лучше, чем Java (не работал с Java в течение последних шести лет). Вот почему я пытаюсь найти лучший способ переноса этого старого вводного кода в сервлеты (написанные для класса) на Python. Это сложное упражнение, которое должно помочь мне и другим узнать больше.
  • 0
    Учитывая проблемы, возникающие у вас с интернет-фильтрацией, вам следует подумать о покупке недорогого веб-хостинга, который имеет доступ к оболочке. Затем вы можете использовать SSH-туннель за пределами фильтра вашего колледжа для доступа к нужным вам сайтам. Это отстой, что фильтр твоего колледжа мешает твоему обучению, ты определенно должен его обойти.
3

Разве это не перевод, а не порт?:)

Я просто googled и нашел java2python а также аналогичный вопрос SO.

В любом случае...

В идеале, я думаю, вы должны понимать, что вы переводите, чтобы вы могли знать, что переводить и что вам не нужно переводить. Вам нужно разумное понимание обоих языков, чтобы знать, как конструкции в Java относятся к аналогичному в Python и как библиотеки играют роли в переводах.

Прямой перевод между языками часто не является хорошим подходом. Я упоминаю об этом просто потому, что переведенный Python в ваш вопрос не очень Pythonic. А также потому, что справедливое количество Python связано с аспектами HTTP-сервера. Это не относится к Java-коду. Поэтому, чтобы произвести "справедливый" перевод, я бы опирался на структуру Python, которая делает для Python то, что делают контейнеры Servlet для Java. Возможно, Tornado/Django. Я полагаю, что Java Servlet завершен в значительном наборе стандартов, поэтому имеет смысл, что версия Python соответствует аналогичному маршруту, что, как минимум, означает WSGI.

2

Создание python webapp таким образом запутанно и не является пифоническим. Возможно, вам удастся лучше переписать ваше приложение в Django, а не портировать его по строкам из Java

Ещё вопросы

Сообщество Overcoder
Наверх
Меню