java - 为什么 Jython Servlet post 请求中 fieldStorage 为空

标签 java python servlets jython

我使用 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)

最佳答案

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

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

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']}

关于java - 为什么 Jython Servlet post 请求中 fieldStorage 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28082442/

相关文章:

java - 将通用父类(super class)转换为子类

java - 贾斯珀报告 : JRViewer causes exception to be added in container in JInternalFrame

Python 返回 True 或 False

java - 在 servlet 环境中处理批处理作业的线程

java - GAE - 谷歌云存储 - 上传(acl : read-public and get the public shared url)

java Arrays.binarySearch() 在不区分大小写的搜索中无法找到字符串

java - 使用 Firebase Messaging 实现通知时出现空指针异常

python - 通过 Python 中的 WSGI 应用程序发送后的图像失真

python - test_size=0 的 train_test_split 对数据有何影响?

java - 完成 HttpServletResponse 但继续处理