Skip to main content
 首页 » 编程设计

java之将 Java 移植到 Python 的更好方法

2025年05月04日20www_RR

经过数小时的移植工作,它似乎终于可以正常工作了。但是,我想知道是否有人知道将 Java servlet 移植到 Python 中的更好或更完整的方法。 Python 脚本的开头包含大量支持代码,以便更轻松地将程序逐行直接移植到 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() 

如果有人想知道这个项目的目的是什么,原始的 Java 程序是作为大一计算机科学类(class)的入门练习提供的。从那时起,我已经有大约六年没有使用 Java 了,我正在研究旧程序,将它们移植到 Python 以接受挑战和学习经验。移植 servlet 带来了额外的困难。

请您参考如下方法:

我最好的建议是不要逐行写端口。 Python 不是 Java,如果您只是用 Python 语言编写 Java 风格的代码,那您就是在伤自己的筋骨。

这是识别一些常见差异/错误的入门:http://dirtsimple.org/2004/12/python-is-not-java.html

如果您有幸使用包含单元测试的代码库,一个很好的方法是将您的单元测试从 Java 移植到 Python,然后编写新的 Python 来匹配单元测试。如果这不是您拥有的东西,那么更重要的是识别软件在 Java 中做什么,然后编写做同样事情的 Python 代码。它几乎肯定不会以相同的方式出现,至少在逐行级别上不会。