原文地址:ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段

ServletRequest 基本概念

 
JavaWeb中的 "Request"对象 
实际为   HttpServletRequest  或者  ServletRequest,   两者都为接口
服务器接收请求后,将请求数据进行对象封装

功能大致分类

request的功能可以分为以下几种:
  • 封装了请求头数据;
  • 封装了请求正文数据,如果是GET请求,那么就没有正文;
  • request是一个域对象,可以把它当成Map来添加获取数据;
  • request提供了请求转发和请求包含功能。

request是四大域对象之一
其他是ServletContext  Session  PageContext

Request的域方法

 
用来存储一个对象,也可以称之为存储一个域属性
void setAttribute(String name, Object value);
例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。
请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
用来获取request中的数据
Object getAttribute(String name);
当前在获取之前需要先去存储才行,
例如:
String value = (String)request.getAttribute(“xxx”);,获取名为xxx的域属性;
用来移除request中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
void removeAttribute(String name);
获取所有域属性的名称;
Enumeration getAttributeNames();

获取请求头数据

获取指定名称的请求头;
String getHeader(String name);
获取所有请求头名称;
Enumeration getHeaderNames();
获取值为int类型的请求头。
int getIntHeader(String name);

获取请求相关的其它方法

还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求URL相关的方法
获取请求体的字节数,GET请求没有请求体,没有请求体返回-1;
int getContentLength();
获取请求类型,如果请求是GET,那么这个方法返回null;
如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码;
String getContentType();
返回请求方法,例如:GET
String getMethod();
返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;
Locale getLocale();
获取请求体编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码;
String getCharacterEncoding();
设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!
void setCharacterEncoding(String code);
返回请求协议,例如:http;
String getScheme();

返回主机名,例如:localhost   或者 127.0.0.1
String getServerName();

返回服务器端口号,例如:8080
int getServerPort();

返回请求URI路径,例如:/servlet/ServletA
String getRequestURI();
返回请求URL路径,例如:http://localhost:8080/servlet/ServletA,
即返回除了参数以外的路径信息;
StringBuffer getRequestURL();
返回请求URL中的参数,例如:name=zhangsan&age=28
String getQueryString();
返回上下文路径,例如:/servlet
String getContextPath();
返回Servlet路径,例如:/ServletA
String getServletPath();
返回当前客户端的IP地址;
String getRemoteAddr();
返回当前客户端的主机名,但这个方法的实现还是获取IP地址;
String getRemoteHost();

上面的路径示例   假定请求地址为:
http://127.0.0.1:8080/servlet/ServletA?name=zhangsan&age=28


获取请求参数

最为常见的客户端传递参数方式有两种GET 和 POST:
浏览器地址栏直接输入:一定是GET请求;
超链接:一定是GET请求;
表单:可以是GET,也可以是POST,这取决与<form>的method属性值;

GET请求和POST请求的区别
GET请求:

请求参数会在浏览器的地址栏中显示,所以不安全;
请求参数长度限制长度在1K之内;
GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;
POST请求:
请求参数不会显示浏览器的地址栏,相对安全;
请求参数长度没有限制;
 
获取请求参数的具体方法
根据参数名称获取参数
public String getParameter(String name); 
 
页面一个超链接一个表单
<body><a href="/servlet/ServletA?name=zhangsan&age=28">超链接</a><hr/><form action="/servlet/ServletA" method="post">参数1:<input type="text" name="name"/><br/>参数2:<input type="text" name="age"/><br/><input type="submit" value="提交"/></form></body>

Servlet中java代码(doGet  doPost  都一样可以)
System.out.println("request.getParameter(\"name\"): " + request.getParameter("name"));System.out.println("request.getParameter(\"age\"): " + request.getParameter("age"));

打印结果:
当多个参数名称相同时,可以使用方法来获取
String[] getParameterValues(String name);
 

http://127.0.0.1:8080/servlet/ServletA?name=zhangsan&name=lisi
System.out.println("request.getParameter(\"name\"): " + request.getParameter("name"));String[] names = request.getParameterValues("name");System.out.println(Arrays.toString(names));

打印结果:
 
可以看得出来request.getParameter("name")  打印的是第一个
获取所有参数的名称
public Enumeration getParameterNames();
http://127.0.0.1:8080/servlet/ServletA?name=zhangsan&age=28&sex=male
Enumeration pNames = request.getParameterNames();while(pNames.hasMoreElements()) {System.out.println(pNames.nextElement());}

打印信息
获取所有参数封装到Map中,其中key为参数名,value为参数值
因为一个参数名称可能有多个值,所以参数值是String[],而不是String
public Map getParameterMap();
http://127.0.0.1:8080/servlet/ServletA?name=zhangsan&age=28&sex=male&name=lisi&age=18
//转换为MapMap<String,String[]> paramMap = request.getParameterMap();//获取键,根据键获取值数组for(String name : paramMap.keySet()) {String[] values = paramMap.get(name);System.out.println(name + ": " + Arrays.toString(values));}

打印结果:

请求转发和请求包含

RequestDispatcher        forward    include

无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。
请求转发与请求包含比较
1.如果在AServlet中请求转发到BServlet,那么在AServlet中就不允许再输出响应体,
即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成;
如果是使用请求包含,那么没有这个限制;
2.请求转发虽然不能输出响应体,但还是可以设置响应头的
例如:response.setContentType(”text/html;charset=utf-8”);
3.请求包含大多是应用在JSP页面中,完成多页面的合并;
4.请求转发大多是应用在Servlet中,转发目标大多是JSP页面;

ServletA中代码如下:
response.getWriter().println("ServletA");//获取“调度器”,其中参数为BServlet绑定的URL,即BServlet的<url-pattern>值。RequestDispatcher rd = request.getRequestDispatcher("/ServletB");rd.forward(request, response);

B中仅仅响应信息
请求http://127.0.0.1:8080/servlet/ServletA
页面数据为:
可以看得到,虽然A中有response.getWriter().println("ServletA");  但是没有任何的结果,请求直接被转发了
请求 http://127.0.0.1:8080/servlet/ServletA
ServletA中代码如下:
response.getWriter().println("ServletA");//获取“调度器”,其中参数为BServlet绑定的URL,即BServlet的<url-pattern>值。RequestDispatcher rd = request.getRequestDispatcher("/ServletB");rd.include(request, response);

页面数据为:
此时A和B    Servlet的响应都可以正常输出,也就是响应进行了合并

请求转发与重定向比较

请求转发是一个请求,而重定向是两个请求;
请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;
请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;
请求转发对ServletA和ServletB的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;
重定向的第二个请求一定是GET;

转载于:https://www.cnblogs.com/JonaLin/p/11090010.html

ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段...相关推荐

  1. onsize里获取的对话框大小有时会包含滚动条_Python实战分析:获取数据

    这是 利用Excel学习Python 系列的第8篇文章 想用一个完整的案例讲解Python数据分析的整个流程和基础知识,实际上以一个数据集为例,数据集是天池上的一个短租数据集. 先来想一下数据分析的流 ...

  2. Go发起Http请求及获取相关参数

    关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿! golang要请求远程网页,可以使用net/http包中的client提供的方法实现.查看了官方网站有一些示例,没有太全面的 ...

  3. HTTP协议漫谈 - HTTP协议请求方法

    前言 在上一篇文章<HTTP协议漫谈 - HTTP协议历史和报文结构>中介绍了HTTP协议的历史和版本变化,以及HTTP协议报文的总体结构. 按照HTTP/1.1 RFC文档中的定义,HT ...

  4. springboot 获取控制器参数的几种方式

    这里介绍springboot 获取控制器参数有四种方式 1.无注解下获取参数 2.使用@RequestParam获取参数 3.传递数组 4.通过URL传递参数 无注解下获取参数 无注解下获取参数,需要 ...

  5. Net Core 2.1Filter里面获取Controller、Action,请求方法,请求头部,请求参数

    最近做net core 2.1框架,在过滤器里面获取请求信息做全局的缓存,有些获取信息方式跟之前的asp.net mvc有些不同,记录下来 获取请求Controller名 string control ...

  6. html js发送http请求数据格式,JS获取url参数,JS发送json格式的POST请求方法

    一.获取url所有参数值 function US() { var name, value; var str = location.href; var num = str.indexOf("? ...

  7. Spring/SpringBoot 过滤器修改、获取http 请求request中的参数 和 response返回值,比如修改请求体和响应体的字符编码

    通过自定义filter,RequestWrapper,ResponseWrapper 处理请求和响应数据,比如修改请求体和响应体的字符编码 1.request 和 response 中的数据都是 存在 ...

  8. Get和Post请求和对应的参数获取

    1.get和post的请求方式 <!DOCTYPE html> <html lang="en"> <head><meta charset= ...

  9. ServletContext的应用(共享数据、获取初始化参数、请求转发、读取资源文件)【源码解析】

    ServletContext应用 1.共享数据 我在这个Servlet中保存的数据,可以在另外一个Servlet中拿到 public class HelloServlet extends HttpSe ...

最新文章

  1. as查看SHA1和MD5
  2. 国际C语言乱码大赛(IOCCC)经典之作
  3. UNIX V6内核源码剖析——unix v6 全貌
  4. Boost:align对齐的测试程序
  5. dotNet 5 中执行 Node.js
  6. VBA 读写文本文件的几种方法
  7. golang解析IP到城市jsonRPC服务教程
  8. 想学高级软件测试去哪里学,软件测试要学多久
  9. VS2019下安装NumCpp库小结
  10. 防止xss(脚本攻击)的方法之过滤器
  11. 循环数组实现队列的四种方式
  12. Louvain 算法原理 及设计实现
  13. 威纶通屏幕(HMI)开发基本教程一:如何获得学习资料来源
  14. 必应(Bing)的站内搜索 site:<域名> <搜索内容>
  15. asp.net930-绿能店电动车租赁系统
  16. VS Code中将自定义的Snippets绑定到自定义的快捷键上
  17. 图像分析之直方图分析
  18. html圆形图片切换,jQuery和CSS3炫酷圆形图片切换特效
  19. 随笔备忘记录-UI自动化测试-操作配置文件、封装公共类
  20. wps怎么删除分隔符号 分栏

热门文章

  1. 【第二届】Erlang Fans交流会(补充事宜)
  2. 12日疯人认证百度云_12月15日上海实习汇总(百度、美图、哔哩哔哩等)
  3. 在jsp文件中通过超链接访问servlet_Eclipse中创建Servlet
  4. qq2009显ip版怎么用_毛孔粗大怎么破?用对方法,轻松改善显皮肤嫩滑
  5. 山东自考c语言程序设计停考了吗,2018山东自考停考专业有哪些
  6. JavaScript学习随记——Function
  7. 靶场练习第十天~vulnhub靶场之dc-2
  8. 线段分割法实现微信抢红包
  9. [Reverse] - 百度杯”CTF比赛 2017 二月场-CrackMe-1
  10. 【C++基础】重抛异常与异常的使用场景