Java Web学习(六)HttpServletRequest(客户端请求)
一、定义
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
二、常用方法
/**
* 通过request对象获取客户端请求信息
*/
public class RequestDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //客户端是以UTF-8编码提交表单数据的,所以需要设置服务器端以UTF-8的编码进行接收,否则对于中文数据就会产生乱码
request.setCharacterEncoding("UTF-8");//设置接收数据时的编码格式,要与被提交表单的编码格式相同 /**
* 1.获得客户机信息
*/
String requestUrl = request.getRequestURL().toString();//得到请求的URL地址
String requestUri = request.getRequestURI();//得到请求的资源
String queryString = request.getQueryString();//得到请求的URL地址中附带的参数
String remoteAddr = request.getRemoteAddr();//得到来访者的IP地址
String remoteHost = request.getRemoteHost();//返回发出请求的客户机的完整主机名。
int remotePort = request.getRemotePort();//返回客户机所使用的网络端口号。
String method = request.getMethod();//得到请求URL地址时使用的方法
String localAddr = request.getLocalAddr();//获取WEB服务器的IP地址
String localName = request.getLocalName();//获取WEB服务器的主机名 /**
* 2.获得客户机请求头
*/
Enumeration<String> reqHeadInfos = request.getHeaderNames();//获取所有的请求头
while (reqHeadInfos.hasMoreElements()) {
String headName = reqHeadInfos.nextElement();//获取请求头的名称
String headValue = request.getHeader(headName);//根据请求头的名字获取对应的请求头的值
} /**
* 3.获得客户机请求参数(客户端提交的数据)
* PS:方法参数中,入参是表单里文本框的名字,对应input框中的name属性
*/
String userid = request.getParameter("userid");//获取单个属性值
String[] hobbies = request.getParameterValues("hobbies");//获取多个属性值
Enumeration<String> parameterNames = request.getParameterNames();//获取所有属性名
Map<String, String[]> parameterMap = request.getParameterMap();//获取请求属性的映射关系(map只读) //设置将字符以"UTF-8"编码输出到客户端浏览器
response.setCharacterEncoding("UTF-8");
//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
response.setHeader("content-type", "text/html;charset=UTF-8"); } }
三、交互乱码解决
POST请求
如果提交方式为post,只需要在服务器端设置request对象的编码即可,客户端以哪种编码提交的,服务器端的request对象就以对应的编码接收。
比如客户端是以UTF-8编码提交的,那么服务器端request对象就以UTF-8编码接收(request.setCharacterEncoding("UTF-8"))
GET请求
如果提交方式为get,设置request对象的编码是无效的,request对象还是以默认的ISO8859-1编码接收数据,因此要想不乱码,只能在接收到数据后再手工转换,步骤如下:
//1).获取获取客户端提交上来的数据,得到的是乱码字符串,data="???è?????"
String data = request.getParameter("paramName"); //2).查找ISO8859-1码表,得到客户机提交的原始数据的字节数组
byte[] source = data.getBytes("ISO8859-1"); //3).通过字节数组以指定的编码构建字符串,解决乱码
data = new String(source, "UTF-8");
通过字节数组以指定的编码构建字符串,这里指定的编码是根据客户端那边提交数据时使用的字符编码来定的,如果是GB2312,那么就设置成data = new String(source, "GB2312"),如果是UTF-8,那么就设置成data = new String(source, "UTF-8")
四、请求转发
定义:一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
实例:在Servlet中实现请求转发的两种方式:
//1、通过ServletContext的getRequestDispatcher(String path)方法,该方法返回一个RequestDispatcher(请求调度器)对象,调用这个对象的forward方法可以实现请求转发。
RequestDispatcher reqDispatcher =this.getServletContext().getRequestDispatcher("/test.jsp");
reqDispatcher.forward(request, response); //2、通过request对象提供的getRequestDispatche(String path)方法,该方法返回一个RequestDispatcher(请求调度器)对象,调用这个对象的forward方法可以实现请求转发。
request.getRequestDispatcher("/test.jsp").forward(request, response);
五、请求重定向
定义:一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源进行处理。
实例:
//重定向到一个新地址
response.sendRedirect(URL地址)
六、request对象
定义:request对象是一个域对象(Map容器),开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。(如请求controller后转发到页面去处理数据)
常用方法:request对象作为一个域对象(Map容器)使用时,主要是通过以下的四个方法来操作
- setAttribute(String name,Object o)方法,将数据作为request对象的一个属性存放到request对象中,例如:request.setAttribute("data", data);
- getAttribute(String name)方法,获取request对象的name属性的属性值,例如:request.getAttribute("data")
- removeAttribute(String name)方法,移除request对象的name属性,例如:request.removeAttribute("data")
- getAttributeNames方法,获取request对象的所有属性名,返回的是一个,例如:Enumeration<String> attrNames = request.getAttributeNames();
七、请求重定向和请求转发的区别
请求转发(307):一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,地址栏中的URL地址不会改变。
请求重定向(302):一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源进行处理,地址栏的URL地址会改变。
Java Web学习(六)HttpServletRequest(客户端请求)的更多相关文章
- Java Web学习(1): 客户端请求、服务器响应及其HTTP状态码
一JSP客户端请求 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信 息头的一部分来传送的.我们可以查阅HTTP协议来获得更多的信息. 下表列出了浏 ...
- java web 学习六(servlet开发2)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- java web学习总结(一) -------------------基本概念
一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...
- Java web 学习之旅
java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户 ...
- java web 学习一
一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...
- java web 学习笔记 编码问题总结
java web 学习笔记 编码问题总结 1.非form表单中提交的中文参数---------------------------传递给Servlet服务器时,默认以iso-8859-1解码 ...
- Java Web 学习笔记 1
Java Web 学习笔记 1 一.Web开发基础 1-1 Java Web 应用开发概述 1.1.1 C/S C/S(Client/Server)服务器通常采用高性能的PC机或工作站,并采用大型数据 ...
- Java Web学习总结(1)——JavaWeb开发入门
一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...
- Java Web学习笔记之---JSP
Java Web学习笔记之---JSP (一)JSP常用语法 (1)HTML注释 <!--所要注释的内容 --> 在客户端显示一个注释. (2)隐藏注释 <%--所要注释的内容--% ...
随机推荐
- CSS动画实例:行星和卫星
设页面中有<div class=" planet "></div>,用来绘制一个行星和卫星图形.这个图形包括三部分:行星.卫星和卫星旋转的轨道.定义. pl ...
- df卡死和fork:cannot allocate memory报错
早上到了公司,发现docker资源池的某一台主机根文件系统写满. 检查后发现该主机/data目录未挂载文件系统,直接放在了根目录下.于是联系业务方将应用迁移,联系主机工程师为/data挂载80G的存储 ...
- Networks of Spiking Neurons: The Third Generation of Neural Network Models
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 顺便安利一下同组的大佬做的SNN教程:https://spikingflow.readthedocs.io/zh_CN/latest/Tu ...
- KNN手写数字识别
import numpy as np import matplotlib .pyplot as plt from sklearn.neighbors import KNeighborsClassifi ...
- lammps-MD整体思路
1.收敛性测试 (1)由不同尺寸模型(不同的原子数)和E的关系曲线,再确定尺寸n*n*n: 2.优化结构(nve-nvt-npt) 系综的实现方式(相关命令):https://www.cnblogs. ...
- 区块链入门到实战(24)之以太坊(Ethereum) – 网络节点
用途: 全节点:用于区块和交易的校验 轻节点:电子钱包 以太坊(Ethereum)网络是一个公共的区块链网络,网络中包含2种网络节点: 全节点 轻节点 全节点 包含了从初始区块开始的全部区块,这些区块 ...
- 洛谷 P3951 NOIP 2017 小凯的疑惑
洛谷 P3951 NOIP 2017 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付 ...
- Appium框架
1.通过TestNG单元测试框架管理/执行测试用例 2.TestNG参数化,App启动的四个配置存到Testng.xml中 3.通过page object (PO)设计模式,测试用例和页面元素分离,页 ...
- 使用tensorflow2识别4位验证码及思考总结
在学习了CNN之后,自己想去做一个验证码识别,网上找了很多资料,杂七杂八的一大堆,但是好多是tf1写的,对tf1不太熟悉,有点看不懂,于是自己去摸索吧. 摸索的过程是异常艰难呀,一开始我直接用capt ...
- 人到中年的程序员,请提前准备好 Plan B
中年程序员的生存现状已经是老生常谈的话题了,有多老呢?十年前,就有一位名叫"johnfx"的程序员谈过这个话题,并且专门为此写了一篇文章.随着中年程序员生存现状的话题再次成为热点, ...