HTTP 请求的构成

1、HTTP 请求行:

  • 请求方式,比如 GET 、POST 等
  • 本次请求的URI ,比如 /hello
  • 协议和版本号

2、 HTTP 请求报头: (头部/首部/请求头)

  • 请求头和请求正文之间用空行分隔
  • 常见的请求报头

3、 HTTP 请求正文:

  • 一种是 请求参数 ,比如 /hello?username=zhangsanfeng&password=wudang2017
  • 一种是 针对上传文件 等操作

HttpServletRequest 类型的对象

1、Servlet 容器响应Web 客户端请求的时序图

2、与HTTP请求行对应的方法

  • 请求方式:   String    getMethod()
  • URI :     String    getRequestURI()
  • 协议:      String        getProtocol()

3、与HTTP请求报头对应的方法

  • String    getHeader( String name ) 获取指定名称的请求报头的取值
  • Enumeration<String>    getHeaders( String name ) 获取指定名称的请求报头的取值(取值有多个,比如cookie)
  • long    getDateHeader( String name ) 获取指定名称的请求报头的取值 ( 返回以毫秒为单位的时间 )
  • int    getIntHeader( String name )  获取指定名称的请求报头的取值 ( 以 int 形式返回 )
  • Enumeration<String>    getHeaderNames() 获取所有的请求报头的名称

4、与HTTP请求正文对应的方法
获取请求参数:

  • String        getParameter( String name ) 获取指定的请求参数对应的值
  • String[]        getParameterValues( String name ) 获取指定的请求参数对应的值 ( 取值有多个,比如 checkbox )
  • Map< String , String[] >        getParameterMap() 获取所有的请求参数及取值( 取值是个数组 )
  • Enumeration<String>    getParameterNames() 获取所有的请求参数的名称

获取WEB客户端上传的数据:

  • ServletInputStream     getInputStream()  在 Servlet 3.0 之前获取上传数据的方法 ( 以字节形流式返回 )
  • BufferedReader        getReader() 在 Servlet 3.0 之前获取上传数据的方法 ( 以字符流形式返回 )
  • Part    getPart( String name ) 根据 名称 获得 一个 multipart/form-data POST request 中指定名称对应的 Part 对象

    <input type="file" name="upfile" > =========>  request.getPart( "upfile" )

  • Collection<Part>     getParts()  获取 multipart/form-data POST request 中对应的所有的 Part 对象

测试案例:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1"> <servlet>
<servlet-name>ParseRequestServlet</servlet-name>
<servlet-class>ecut.request.ParseRequestServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>ParseRequestServlet</servlet-name>
<url-pattern>/parse</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>FirstUploadServlet</servlet-name>
<servlet-class>ecut.request.FirstUploadServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>FirstUploadServlet</servlet-name>
<url-pattern>/upload/first</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>SecondUploadServlet</servlet-name>
<servlet-class>ecut.request.SecondUploadServlet</servlet-class> <!-- 启用 Servlet 3.x 所支持的文件上传方式 -->
<multipart-config>
<location>D:/files</location>
</multipart-config>
<!-- location 指定的是文件上传后的存储位置 -->
</servlet> <servlet-mapping>
<servlet-name>SecondUploadServlet</servlet-name>
<url-pattern>/upload/second</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>ThirdUploadServlet</servlet-name>
<servlet-class>ecut.request.ThirdUploadServlet</servlet-class> <!-- 启用 Servlet 3.x 所支持的文件上传方式 -->
<multipart-config>
<location>D:/files</location>
</multipart-config>
<!-- location 指定的是文件上传后的存储位置 -->
</servlet> <servlet-mapping>
<servlet-name>ThirdUploadServlet</servlet-name>
<url-pattern>/upload/third</url-pattern>
</servlet-mapping> </web-app>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Request</title>
</head>
<body> <a href="/Servlet/parse?username=Amy&password=123456" >访问 ParseRequestServlet</a> <h5>GET</h5>
<form action="/Servlet/parse" method="get" >
<input type="text" name="username" placeholder="用户名">
<br>
性别:
<input type="radio" name="gender" value="女"> 我是靓女
<input type="radio" name="gender" value="男"> 我是靓仔 <br>
爱好:
<input type="checkbox" name="hobby" value="eat">吃饭
<input type="checkbox" name="hobby" value="sleep">睡觉
<input type="checkbox" name="hobby" value="wc">上厕所
<br>
<input type="submit" value="提交">
</form> <h5>POST</h5>
<form action="/Servlet/parse" method="post" >
<input type="text" name="username" placeholder="用户名">
<br>
性别:
<input type="radio" name="gender" value="女"> 我是靓女
<input type="radio" name="gender" value="男"> 我是靓仔 <br>
爱好:
<input type="checkbox" name="hobby" value="eat">吃饭
<input type="checkbox" name="hobby" value="sleep">睡觉
<input type="checkbox" name="hobby" value="wc">上厕所
<br>
<input type="submit" value="提交">
</form> <h5>文件上传(古代)</h5>
<!-- method 必须是 POST ,enctype 必须是 multipart/form-data enctype默认是对数据进行 application/x-www-form-urlencoded编码-->
<form action="/Servlet/upload/first" method="post" enctype="multipart/form-data">
<input type="file" name="upfile" >
<input type="submit" value="上传" >
</form> <h5>文件上传( 从 Servlet 3.0 开始 )</h5>
<!-- method 必须是 POST ,enctype 必须是 multipart/form-data -->
<form action="/Servlet/upload/second" method="post" enctype="multipart/form-data">
<input type="file" name="upfile" >
<input type="submit" value="上传" >
</form> <h5>文件上传( 从 Servlet 3.0 开始 )</h5>
<!-- method 必须是 POST ,enctype 必须是 multipart/form-data -->
<form action="/Servlet/upload/third" method="post" enctype="multipart/form-data">
<input type="file" name="upfile1" >
<br>
<input type="file" name="upfile2" >
<br>
<input type="file" name="upfile3" >
<br>
<input type="file" name="upfile4" >
<br>
<input type="submit" value="上传" >
</form> </body>
</html>
package ecut.request;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ParseRequestServlet extends HttpServlet { private static final long serialVersionUID = 5473447295646845596L; @Override
protected void service( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
request.setCharacterEncoding( "UTF-8" );
response.setCharacterEncoding( "UTF-8" );
response.setContentType( "text/html;charset=UTF-8" );
PrintWriter p =response.getWriter();
// 获取 HTTP HTTP 请求行中的相关信息
String method = request.getMethod();
String uri = request.getRequestURI() ;
String protocol = request.getProtocol() ;
System.out.println( "HTTP 请求行:");
System.out.println("\t请求方式 = " + method);
System.out.println("\tURI = " + uri);
System.out.println("\t协议/版本号= " + protocol);
p.println("<p>HTTP 请求行:</p>");
p.println("<p style='text-indent:2em;'>请求方式 = " + method+"</p>");
p.println("<p style='text-indent:2em;'>URI = " + uri+"</p>");
p.println("<p style='text-indent:2em;'>协议/版本号 = " + protocol+"</p>");
// 获取HTTP 请求报头
Enumeration<String> headerNames = request.getHeaderNames();
System.out.println( "HTTP 请求报头:" );
p.println( "<p>HTTP 请求报头:"+"</p>" );
while( headerNames.hasMoreElements() ) {
String name = headerNames.nextElement(); // 获取单个的HTTP 请求报头的名称
String value = request.getHeader( name ) ; // 获得指定名称对应的HTTP 请求报头的值
System.out.println( "\t" + name + " = " + value );
p.println("<p style='text-indent:2em;'>" + name + " = " + value +"</p>");
} // 获取HTTP 请求参数
Map<String,String[]> paramMap = request.getParameterMap(); Set< Entry<String, String[]> > entrySet = paramMap.entrySet();
System.out.println( "HTTP 请求参数:" );
p.println( "<p>HTTP 请求参数:" );
for( Entry<String, String[]> e : entrySet ){
String name = e.getKey() ;
String[] value = e.getValue() ;
System.out.println( "\t" + name + " : " + Arrays.toString( value ) );
p.println( "<p style='text-indent:2em;'>" + name + " : " + Arrays.toString( value ) +"</p>");
} } }

运行结果如下:

控制台输出文件的内容。

获取指定的请求参数对应的值取值有多个的测试案例:

运行结果如下:

HTTP 请求行:
请求方式 = GET
URI = /Servlet/parse
协议/版本号= HTTP/1.1
HTTP 请求报头:
host = localhost:8080
user-agent = Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0
accept = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-language = zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
accept-encoding = gzip, deflate
referer = http://localhost:8080/Servlet/pages/request/index.html
connection = keep-alive
upgrade-insecure-requests = 1
HTTP 请求参数:
username : [AmyZheng]
gender : [男]
hobby : [eat, sleep]

文件上传测试案例一:

package ecut.request;

import java.io.BufferedReader;
import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class FirstUploadServlet extends HttpServlet { private static final long serialVersionUID = -7777691027208490971L; @Override
protected void doGet( HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException {
throw new RuntimeException( "不支持GET方式上传" );
} @Override
protected void doPost( HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException { request.setCharacterEncoding( "UTF-8" ); // 上传文件时,只考虑文本文件,不考虑其它文件
BufferedReader reader = request.getReader();
//InputStream in = request.getInputStream(); String s ;
while( ( s = reader.readLine() ) != null ){
System.out.println( s );
} } }

运行结果如下:

页面跳转到http://localhost:8080/Servlet/upload/first

控制台输出文件内容

-----------------------------296501829912081
Content-Disposition: form-data; name="upfile"; filename="Http.txt"
Content-Type: text/plain
文件内容省略 -----------------------------296501829912081--

文件上传测试案例二:

package ecut.request;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part; public class SecondUploadServlet extends HttpServlet { private static final long serialVersionUID = 4485463572490572537L; @Override
protected void doGet( HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException {
throw new RuntimeException( "不支持GET方式上传" );
} @Override
protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { // String username = request.getParameter( "username" ) ; // <input type="text" name="username" > Part part = request.getPart( "upfile" ) ; // <input type="file" name="upfile" >
System.out.println( part ); /* Servlet 3.0 中获得文件名的做法
String cd = part.getHeader( "Content-Disposition" );
System.out.println( cd );
String s = "filename=\"";
int index = cd.indexOf( s );//找到filename的位置
String name = cd.substring( index + s.length() , cd.length() - 1 );//获取文件名
System.out.println( name );
*/ // part.getName() ; // name="upfile"
String filename = part.getSubmittedFileName(); // Servlet 3.1 开始出现的方法 part.write( filename ); } }

运行结果如下:

页面跳转到http://localhost:8080/Servlet/upload/second

D:\files目录下增加了一个文件


文件上传测试案例三:

package ecut.request;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part; public class ThirdUploadServlet extends HttpServlet { private static final long serialVersionUID = 4485463572490572537L; @Override
protected void doGet( HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException {
throw new RuntimeException( "不支持GET方式上传" );
} @Override
protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
upfile("upfile1",request);
upfile("upfile2",request);
upfile("upfile3",request);
upfile("upfile4",request);
} void upfile(String upfile,HttpServletRequest request) throws ServletException, IOException{
Part part = request.getPart( upfile) ;
String filename = part.getSubmittedFileName();
part.write( filename );
} }

运行结果如下:

页面跳转到http://localhost:8080/Servlet/upload/third

D:\files目录下增加了四个文件

转载请于明显处标明出处

http://www.cnblogs.com/AmyZheng/p/8761234.html

Servlet 学习(三)的更多相关文章

  1. Servlet学习三——传输文件

    最先在考虑传输文件时,想通过java写一个文件上传案例,传给Servlet,Servlet再保存至数据库中,但苦于一直没找到实例,听说Flex有实际的例子,就直接用Flex例子来测试了.本文的顺序为: ...

  2. jsp/servlet学习三之会话管理初解

    由于http的无状态性,使得会话管理或会话跟踪成为web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.例如,一个web邮件应用要求用户登陆后才能查看邮件 ...

  3. Servlet学习(三)——实例:用户登录并记录登陆次数

    1.前提:在Mysql数据库下建立数据库web13,在web13下创建一张表user,插入几条数据如下: 2.创建HTML文件,命名为login,作为登录界面(以post方式提交) <!DOCT ...

  4. Servlet学习三:不允许直接访问jsp处理方式一过滤器

    转自:http://zy19982004.iteye.com/blog/1755189

  5. Servlet学习:(三)Servlet3.0 上传文件

    转: Servlet学习:(三)Servlet3.0 上传文件 2018年08月03日 11:57:58 iDark_CSDN 阅读数:362   一.注意事项 客户端(浏览器) 表单的提交方法必须是 ...

  6. Servlet学习笔记(三)

    目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...

  7. Javaweb学习(三):Servlet程序

    好了,既然开发环境已经配置好了.那么我们首先要搞定得便是servlet了,至于为什么不先去研究jsp,这是因为jsp与servlet本就是一体两面,jsp其本身经过编译.载入.转化等步骤最终会成为se ...

  8. java之servlet学习基础(一)

    这一阵子在学java三大框架.却在学习过程中发现前面的知识已经忘记了.所以决定写一篇博客来总结回顾之前的学习. 1.Servlet是什么? servlet是一个运行在服务器端的小应用程序.通过HTTP ...

  9. Java开发学习(三十七)----SpringBoot多环境配置及配置文件分类

    一.多环境配置 在工作中,对于开发环境.测试环境.生产环境的配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 mysql ,连接自己电脑上的 mysql 即可,但是项目开发完毕后要上线就需要该配 ...

  10. HTTP学习三:HTTPS

    HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...

随机推荐

  1. vs rdlc 设置Tablix 在新页面重复表头

    设置方法: 1.选中Tablix控件 2.点开三角形 3.选择高级模式 4.在行组 下 选择静态,然后看右边的属性 5.将属性设置为如下 就可以让Tablix控件实现在新页中带表头

  2. MySQL数据完整性

    数据完整性 一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中 在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型.约束 ...

  3. 归并非递归、快排递归及非递归的C++实现及时间效率对比。。

    今天看剑指offer突然发现下学期都要去面试了,还没自己实现过快排非递归和归并非递归,这怎么能行呢,于是就写了一下. (虽然有点卡壳,又回去翻了下算导,还是顺利写出来了) 先放图: 一亿数据量: #p ...

  4. Unity生成的WebGL如何在浏览器中运行

    前言:以为在学完了COMP30019后,应该不会再接触Unity了,没想到之后实习让我去做把一个Unity项目转到WebGL,而关于Unity的WebGL资料很少,基本除了Unity的Manual就只 ...

  5. acm数论之旅--唯一分解定理

    题目: 给出n,问n = b^p中p符合该等式的最大值 分析: 先求出所有n的质因子,然后对这m个质因子分类统计,比如 n = 36时,可以分成 2个2,2个3,然后求出所有这些基数的 最大公因数gc ...

  6. 1、json背景

    教程链接 链接:http://pan.baidu.com/s/1mil4M1M 密码:vwsn JSON (JavaScript对象表示法)是一种轻量级的基于文本的开放标准,被设计用于可读的数据交换, ...

  7. flask 前端 分页 显示

    # flask 前端 分页 显示 1.分页原理 web查询大量数据并显示时有有三种方式: 从数据库中查询全部,在view/客户端筛选/分页:不能应对记录大多的情况,一般不使用: 分页查询,每次在数据库 ...

  8. 交换机出现err-disable的原因及解决方法

    转:https://www.2cto.com/net/201303/198724.html 交换机出现err-disable的原因及解决方法 LOG示例: 21w6d: %ETHCNTR-3-LOOP ...

  9. [蓝桥杯2017初赛]青蛙跳杯子 BFS

    题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...

  10. MAC平台基于Python的Appium环境搭建

    前言 最近笔者要为python+appium课程做准备,mac在2019年重新安装了一次系统,这次重新在mac下搭建appium环境,刚好顺带写个文稿给大家分享分享搭建过程. 一.环境和所需软件概述 ...