`

Servlet Jsp中得到表单数据的3种方法

阅读更多

本文地址:http://www.haogongju.net/art/800477

 

 大家经常用servlet和jsp,但是对request.getInputStream()和request.getReader()比较陌生。
request.getParameter()
request.getInputStream()
request.getReader()
这三个方法都是从request对象中得到提交的数据,但是用途不同,要根据<form>表单提交数据的编码方式选择不同的方法。


HTML中的form表单有一个关键属性enctype=application/x-www-form-urlencoded 或multipart/form-data。

enctype=application/x-www-form-urlencoded是默认的编码方式,这种编码方式很简单,编码后的结果通常是field1=value2&field2=value2&… 的形式,如 name=aaaa&Submit=Submit。这种编码的具体规则可以在 rfc2231 里查到, 通常使用的表单也是采用这种方式编码的,Servlet 的 API 提供了对这种 编码方式解码的支持,只需要调用 ServletRequest 类中的getParameter()方法就可以得到用户表单中的字段和数据。

这种编码方式( application/x-www-form-urlencoded )虽然简单,但对于传输大块的二进制数据显得力不从心,对于传输这类数据,浏览器采用了另一种编码方式,即 "multipart/form-data" 的编码方式,采用这种方式,浏览器可以很容易将表单内的数据和文件放在一起发送。这种编码方式先定义好一个不可能在数据中出现的字符串作为分界符,然后用它将各个数据段分开,而对于每个数据段都对应着 HTML 页面表单中的一个 Input 区,包括一个 content-disposition 属性,说明了这个数据段的一些信息,如果这个数据段的内容是一个文件,还会有 Content-Type 属性,然后就是数据本身,如果以这种方式提交数据就要用request.getInputStream()或request.getReader()得到提交的数据,用request.getParameter()是得不到提交的数据的。

通过下面的代码可以输出采用multipart/form-data的编码提交的数据内容:
//1
int len = request.getContentLength();
byte buffer[] = new byte[len];
 
 //2
InputStream in = request.getInputStream();
int total = 0;
int once = 0;
while ((total < len) && (once >=0)) {
      once = in.read(buffer,total,len);
      total += once;
}
 
//3
OutputStream out=new BufferedOutputStream(new FileOutputStream("c:\\Receive.log",true));
byte[] breaker="\r\nNewLog: -------------------->\r\n".getBytes();
System.out.println(request.getContentType());
out.write(breaker,0,breaker.length);
out.write(buffer);
out.close();
 
从指定的文件( Receive.log )中可以看到如下的内容:
-----------------------------7d137a26e18
Content-Disposition: form-data; name="name"
123
-----------------------------7d137a26e18
Content-Disposition: form-data; name="introduce"
I am...
  I am..
-----------------------------7d137a26e18
Content-Disposition: form-data; name="file3"; filename="C:\Autoexec.bat"
Content-Type: application/octet-stream
@echo off
prompt $d $t [ $p ]$_$$
SET PATH=d:\pf\IBMVJava2\eab\bin;%PATH%;D:\PF\ROSE98I\COMMON
-----------------------------7d137a26e18--
上面是用 IE 进行测试的结果,通过request.getInputStream()或request.getReader()可以得到form表单中提交的数据,但是还要对数据进行分析才能得到form表单提交的每个参数的值。

最后注意request.getParameter()、request.getInputStream()、request.getReader()这三种方法是有冲突的,因为流只能被读一次。
比如:
当form表单内容采用enctype=application/x-www-form-urlencoded编码时,先通过调用request.getParameter()方法得到参数后,再调用request.getInputStream()或request.getReader()已经得不到流中的内容,因为在调用request.getParameter()时系统可能对表单中提交的数据以流的形式读了一次,反之亦然。

当form表单内容采用enctype=multipart/form-data编码时,即使先调用request.getParameter()也得不到数据,但是这时调用request.getParameter()方法对request.getInputStream()或request.getReader()没有冲突,即使已经调用了request.getParameter()方法也可以通过调用request.getInputStream()或request.getReader()得到表单中的数据,而request.getInputStream()和request.getReader()在同一个响应中是不能混合使用的,如果混合使用就会抛异常。
分享到:
评论

相关推荐

    对于JSP中表单数据存储的一种通用方法

    1. 对每个表单单独编写代码:这种方法要求在JSP、JavaBean或Servlet中使用`request.getParameter()`获取表单提交的数据。然后,手动创建SQL语句(如INSERT、UPDATE、DELETE),并调用`executeUpdate()`方法执行。...

    servlet接收form表单提交的数据

    当我们需要从HTML表单(form)中获取用户输入的数据并在网页上显示时,Servlet扮演着关键角色。本篇将详细介绍如何使用Servlet来接收form表单提交的数据,并将其在网页上呈现。 一、Servlet生命周期 Servlet具有三个...

    jsp+servlet做的form表单元素的提交

    在Servlet中,我们可以通过`HttpServletRequest`对象的`getParameter()`方法获取表单数据: ```java import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; public class ...

    servlet与jsp中文乱码处理

    - **请求乱码**:当用户通过表单提交包含中文的数据时,需要在`doGet`或`doPost`方法中设置请求编码。 ```java request.setCharacterEncoding("UTF-8"); ``` - **响应乱码**:在输出响应内容时,确保响应的编码...

    十分全的servlet获取表单数据

    在这个主题“十分全的servlet获取表单数据”中,我们将深入探讨如何利用Servlet来处理客户端提交的表单信息,这包括各种输入控件如文本框、密码框、选择框、单选框、复选框以及文本域的数据获取。 1. **表单基础** ...

    jsp,servlet普通表单+文件上传

    1. **创建JSP表单**: 在`jsp`文件中,定义一个HTML表单,包括普通输入字段(如文本框、下拉框等)和文件输入字段。文件上传通常使用`&lt;input type="file"&gt;`标签实现。例如: ```html 姓名: ...

    servlet和jsp学习指南

    第14章讨论Servlet3中的一项新特性,用来处理异步的操作;第15章阐述如何通过声明和编程方式来保护Java的Web应用程序;第16章讨论Servlet/JSP应用程序的部署过程,以及部署描述符中的元素;第17章阐述Servlet3中的两...

    JSP+Servlet实现简易购物车功能

    在Web开发领域,JSP(JavaServer Pages)和Servlet是常用的两种技术,它们结合使用能够构建动态、交互式的Web应用程序。本项目“JSP+Servlet实现简易购物车功能”就是一个典型的示例,它展示了如何利用这两者来创建...

    解决jsp+servlet开发中的中文乱码问题

    当用户通过表单提交中文数据时,如果没有正确地设置字符集,那么在JSP页面或Servlet中读取这些数据时将可能出现乱码。这是因为默认情况下,`request`对象会使用ISO-8859-1字符集来处理POST请求的数据,而这个字符集...

    纯servlet+jsp后台管理 无任何框架1

    3. **Servlet + JSP**:Servlet通常用于处理业务逻辑,而JSP则负责视图展示,两者结合可以实现MVC模式的简单版本,即Servlet作为Controller,JSP作为View。 4. **无任何框架**:意味着项目不依赖任何成熟的Web开发...

    Servlet+JSP购物车

    在本文中,我们将深入探讨如何使用Servlet和JSP技术实现一个基本的购物车系统。Servlet是Java服务器端编程的一种核心技术,常用于处理HTTP请求,而JSP(JavaServer Pages)则是一种动态网页技术,用于展示数据。...

    Servlet JSP深入详解 基于Tomcat的Web开发

    通过本文对Servlet和JSP技术的深入讲解,我们可以看到这两种技术在Java Web开发中的重要地位。Servlet负责处理业务逻辑,而JSP则专注于展示数据。结合使用Tomcat作为部署平台,开发者可以构建出功能强大且易于维护的...

    学生信息管理系统jsp+servlet

    在JSP+Servlet模型中,JSP负责展示数据,Servlet负责处理请求和控制流程。 二、系统架构 该学生信息管理系统采用MVC(Model-View-Controller)设计模式,使得代码结构清晰,职责分明。Model层处理数据模型,View层...

    jsp+servlet小项目

    【jsp+servlet小项目】是一个基于Java Web技术的实践项目,主要使用了Servlet和JSP两种核心技术,旨在实现数据的增、删、改、查(CRUD)功能,并且涉及到了复选框的操作。这个项目对于初学者或者希望深入理解Java ...

    JspServlet官方中文教程

    而JSP则是一种简化了Servlet编程的网页技术,允许在HTML文档中嵌入动态脚本。 ### Servlet的功能与用途 Servlet的主要功能包括读取客户程序发送的显式和隐式数据,如表单数据和请求头信息,生成响应结果,并将数据...

    Servlet和JSP技术简述(英文翻译)

    Servlet和JSP(JavaServer Pages)是Java平台上的两种核心技术,主要用于构建动态Web应用程序。它们在Web开发中的角色至关重要,尤其在处理客户端请求和生成响应方面。以下是对Servlet和JSP技术的详细解释。 1.1 ...

    servlet读取数据库代码到jsp页面表格示例

    本示例结合了Servlet、JSP和MySQL数据库,演示了如何从数据库读取数据并展示在网页表格中,同时实现了基本的数据操作功能:增、删、改、查。以下是关于这个示例的详细解释和相关知识点: 1. **Servlet**: Servlet是...

    jsp实验报告4-servlet.zip

    在本实验中,我们编写了一个Servlet来接收JSP表单提交的数据。Servlet通过重写`doPost`或`doGet`方法来响应HTTP POST或GET请求。当用户提交表单时,Servlet会接收到字符串,然后使用`split()`方法将其分拆为一个整数...

    JSP servlet简单实用

    Servlet可以将数据存储在request或session对象中,然后转发到JSP页面,JSP再根据这些数据生成动态内容。 **四、接口转换** 在Java Web开发中,“接口转换”通常指的是将用户界面(如HTML表单)提交的数据转换为...

    Java+Servlet和JSP教程

    - **便捷性**:Servlet 提供了一套丰富的 API 和工具方法,如自动解析 HTML 表单数据、读取和设置 HTTP 头、处理 Cookie、跟踪会话状态等,这些都极大地方便了开发者的工作。 - **强大的功能**:Servlet 能够与 Web...

Global site tag (gtag.js) - Google Analytics