Servlet表单处理
HttpServletRequest
该接口继承ServletRequest,由Servlet容器来实现,用来封装用户请求的数据。
表单处理
用户通过页面请求数据主要有两种方式,一种是超链接,另一种是表单。超链接我们可以理解为一种弱化的表单
RequestDispatcher
请求转发。一个服务可能只完成一个请求的部分内容,那么其他的处理我们可以通过RequestDispatcher将请求转发给其他的Java Web组件。
HttpServletResponse
该接口继承ServletResponse,同样由Servlet容器来实现,用来响应客户。
HttpServletRequest
HttpServletRequest是继承ServletRequest、并基于HTTP协议提供对用户请求信息进行统一封装的接口。一般由servlet容器的提供者实现。
HttpServletRequest的生命周期
一个HttpServletRequest对象在用户向web服务器发送请求时,由servlet容器创建,并根据相关信息(请求头,请求主体)对其进行封装,然后传递给HttPServletRequest的使用者(通常是servlet)。
一个HttpServletRequest对象只能存活于servlet容器中。
在服务器响应客户后HttpServletRequest对象被销毁。
ServletRequest
常用方法介绍
方法 | 描述 |
---|---|
String getCharacterEncoding() | 返回此请求正文中使用的字符编码名称 |
setCharacterEncoding() | 重写此请求正文中使用的字符编码名称,这个方法一般在我们保存请求数据之前调用,如果已经获取了Request对象里面的数据在调用此方法是没有意义的,多数情况我们用来处理提交表单中的中文数据(因为可能出现乱码) |
String getContentType() | 返回请求正文中的MIME类型(如:text/html),如果该类型未知,则返回null |
ServletInputStream getInputStream() | 以二进制数据形式获取请求正文 |
String getParameter(String name) | 以String形式返回请求参数的值,如果该参数不存在,则返回null |
String[] getParameterValues(String name) | 返回包含给定请求参数拥有的所有值的String对象数组(因为表单中可能有多个元素的名字是一样的,如复选框) |
RequestDispatcher getRequestDispatcher(String s) | 返回一个RequestDispatcher对象,如果该路径以”/”开头,那么可以相对于当前上下文 |
int getContentLength() | 返回请求正文的长度(以字节为单位),如果长度未知,则返回-1,对于HttpServlet,返回值与CGI变量CONTENT_LENGTH相同 |
Object getAttribute(String name) | 以Object形式返回指定属性的值,如果不存在给定名称的属性,则返回null |
setAttribute(String name, Object value) | 以键值对的形式为给定的名称指定值 |
Enumeration< E > getAttributeNames() | 返回此请求可用属性的名称的Enumeration。如果该请求中没有可用的属性,则返回一个空的Enumeration |
表单处理
HttpServletRequest获取客户请求信息
在Servlet的doGet或doPost方法中,通过HttpServletRequest获取用户信息。一般处理超链接或者表单传递的信息。
表单处理
超链接传参
普通表单传参
带有文件上传的表单(此方式一般文件不宜太大,例如图片、小的压缩文件)
获取Request中的其他信息
处理示例
超链接传参使用” ? “传递,并可以使用” & “作为分隔符传递多个参数
HTML文件(index.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>超链接或普通表单传参数</title>
</head>
<body>
<!--
如果我们不在processing前面加一个/(斜杠),则当我们点进去链接时,
地址栏的URL地址为http://localhost:8080/ProcessingForms/processing
如果我们在processing前面加上一个/(斜杠),即:"/processing",
则当我们点进去链接时,地址栏的URL地址为http://localhost:8080/processing,可以看出这和我们当前的工程是没有任何关系的
因为没有明确地指明servlet的地址。
解决方法:
1、不加斜杠,就直接相当于我们当前工程的context(上下文)
2、把我们上下文的路径加进去,上下文路径在创建工程时在Web Module页面配置,默认是我们的工程名,
加入进去就是"/ProcessingForms/processing"。
-->
<a href="/ProcessingForms/processing?name=小李&age=20">Servlet处理超链接</a>
<!-- 传递参数使用问号,传递多个参数使用&作为分隔符,其中href与url-pattern有关 -->
<hr/>
<form action="processing" method="post">
姓名:<input type="text" name="name"><br/><br/>
年龄:<input type="text" name="age"><br/><br/>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
<hr/>
<!-- 有文件上传的表单需要设置enctype,如果不处理,获取文件数据时,将只得到文件名 -->
<form action="upload_processing" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="name"><br/><br/>
年龄:<input type="text" name="age">