【问题标题】:Why fieldStorage is empty in Jython Servlet post request为什么 Jython Servlet 发布请求中的 fieldStorage 为空
【发布时间】:2015-01-22 06:23:03
【问题描述】:

我用 doPost 方法创建了一个简单的 jython servlet 文件。我正在尝试发布表单,但在 servlet 中我没有得到发布值。下面是我正在尝试的代码。

Test.html
---------
<form action='Index.py' method='post'>
   <input type="text" name="username" value="ifti" />
   <input type="text" name="password" value="ifti1233" />
   <input type="submit" name="Submit" value="Submit" />
</form>

Index.py
--------

from javax.servlet.http import HttpServlet
import cgi, cgitb, os, sys, shutil
import urllib2
import org.python.util.PyFilter

cgitb.enable();

class Index(HttpServlet):
    def doPost(self,req,res):   
        res.setContentType("text/html")
        form = cgi.FieldStorage()
        out = res.getWriter()
        keys = form.keys()
        keys.sort()
        pageContent = "<br />number of keys: "+str(len(keys))
        for key in keys:
               pageContent += fieldStorage[ key ].value
        out.println(pageContent)

【问题讨论】:

    标签: java python servlets jython


    【解决方案1】:

    cgi.FieldStorage 期望其输入来自进程或其环境的标准输入。这就是 Web 服务器和 CGI​​ 请求处理程序合作服务 HTTP 请求的方式。

    但是,Servlet 使用不同的协议将原始 HTTP 请求从 Web 服务器传输到请求处理程序,并且 HTTP 请求不容易从标准输入/环境中读取。这就是您的cgi.FieldStorage() 未检测到任何帖子字段的原因。相反,处理后的请求在传递给doPost()HttpServletRequest 对象中提供。您可以调用HttpServletRequest上的方法来获取帖子字段和标题,例如

    import cgi
    from pprint import pformat
    from javax.servlet.http import HttpServlet
    
    class Index(HttpServlet):
        def doPost(self,req,res):
            res.setContentType("text/html")
            out = res.getWriter()
    
            out.println('<strong>Headers</strong>')
    
            headers = {}
            for n in req.headerNames:
                    headers[n] = req.getHeader(n)
            out.println('<pre>')
            out.println(pformat(headers))
            out.println('</pre><br />')
    
            out.println('<strong>Form fields</strong>')
    
            # get the POST data fields
            form = {}
            for field in req.parameterMap:
                    form[field] = list(req.parameterMap[field])
    
    #        # Alternative - if you *really* want a FieldStorage object, construct
    #        # one from the request body, headers and faked environment variables.
    #        # N.B. assumes that the request body is one line of POST data only.
    #        from StringIO import StringIO
    #        request_body = req.reader.readLine()
    #        form = cgi.FieldStorage(fp=StringIO(request_body),
    #                    headers=headers,
    #                    environ={'REQUEST_METHOD': 'POST',
    #                             'CONTENT_LENGTH': len(request_body)})
    
            out.println('<pre>%s</pre><br />' % pformat(form))
    

    使用您的测试表单,您应该会看到类似以下的输出:

    Headers
    
    {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
     'accept-encoding': 'gzip, deflate',
     'accept-language': 'en-au,en-us;q=0.7,en;q=0.3',
     'connection': 'keep-alive',
     'content-length': '45',
     'content-type': 'application/x-www-form-urlencoded',
     'host': 'localhost:8080',
     'referer': 'http://localhost:8080/jython-servlets/test.html',
     'user-agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0'}
    
    Form fields
    
    {'password': ['ifti1233'], 'Submit': ['Submit'], 'username': ['ifti']}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 2018-07-09
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多