代码之家  ›  专栏  ›  技术社区  ›  Noctis Skytower

将Java移植到Python中的更好方法?

  •  1
  • Noctis Skytower  · 技术社区  · 16 年前


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

    4 回复  |  直到 12 年前
        1
  •  2
  •   Frank Yu Pascal Thivent    9 年前

    这不是一个直接的答案,但是,有什么好的理由不使用 Webware 除其他功能外,它还提供以下功能(请参见 Overview

    • 小仆
        2
  •  7
  •   Travis Bradshaw    16 年前

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

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

    在Java中,然后编写Python代码 同样的事情。它几乎肯定不会以同样的方式出现,至少不会逐行出现。

        3
  •  3
  •   Community Mohan Dere    9 年前

    这不是翻译,不是端口吗?:)

    我只是 googled java2python a similar SO question .

    理想情况下,我认为你应该理解你在翻译什么,这样你就可以知道什么是要翻译的,什么是不需要翻译的。您需要对这两种语言有一个合理的理解,才能了解Java中的结构与Python中的类似结构之间的关系,以及库在翻译中的作用。

    语言之间的直接翻译通常不是一个好方法。我之所以提到这一点,仅仅是因为你问题中翻译的Python不是很像Python。还有一个原因是,相当多的Python关注HTTP服务器方面。Java代码并非如此。因此,为了生成一个“公平”的翻译,我将依赖于一个Python框架,该框架对Python的作用与Servlet容器对Java的作用相同。大概 Tornado / Django . 我的观点是,JavaServlet包含在一组重要的标准中,因此Python版本遵循类似的路线是有意义的,这至少可能意味着 WSGI .

        4
  •  2
  •   jbwoot    16 年前

    以这种方式创建pythonwebapp既令人困惑又不符合python。在Django中重写应用程序可能比从Java一行一行地移植要成功得多