request概述(封装了客户端所有的请求数据)
 
 request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。
request对象的创建:
request是由tomcat服务器创建的。request对象是在发出请求的时候创建的,一次请求会伴着request对象的创建和失效
1、获取网络信息【HttpServletReuest对象】

>获取客户端IP:request.getRemoteAddr()
>获取客户端口号:request.getRemotePort()
>获取服务端IP:request.getLocalAddr()
>获取服务端口号:request.getLocalPort();
>请求方式,request.getMethod(),可能是POST也可能是GET
通过User-Agent识别用户浏览器类型

     public void getNetInfo(HttpServletRequest request,
HttpServletResponse response){
//获取客户端的ip
String remoteAddr = request.getRemoteAddr();
//获取客户端的端口号
int remotePort = request.getRemotePort();
//获取服务器的ip
String localAddr = request.getLocalAddr();
//获取服务器的端口号
int localPort = request.getLocalPort();
System.out.println("客户端ip和端口号:"+remoteAddr +"---"+remotePort);
System.out.println("服务器的ip和端口号:"+localAddr +"---"+localPort);
// 获取请求方法
String method = request.getMethod();
System.out.println("获取请求方式:"+method);
// 获取请求头信息
String userAgent = request.getHeader("User-Agent");
System.out.println(userAgent);// 获取名为User-Agent请求头
// 判断浏览器的类型
if(userAgent.toLowerCase().contains("chrome")){
System.out.println("注意:"+remoteAddr+"正在使用Google浏览器访问您的服务器");
}else if(userAgent.toLowerCase().contains("firefox")){
System.out.println("注意:"+remoteAddr+"正在使用火狐浏览器访问您的服务器");
}else if(userAgent.toLowerCase().contains("msie")){
System.out.println("注意:"+remoteAddr+"正在使用Internet Explorer浏览器访问您的服务器");
}else{
System.out.println("不知名的浏览器正在访问您的服务器");
}


测试访问:当别人输入你的网络地址就可以获取到是谁的IP访问的:http://192.168.58.82:8080/servlet02/login.html
2、获取请求行信息   请求的url
http://127.0.0.1:8080/servlet02/request01?uname=zhangsan&pwd=123456
>String getScheme():返回请求协议:http
>String getServerName():返回主机名:127.0.0.1
>int getServerPort():返回服务器端口号:8080
>String getContextPath():返回上下文路径(获取项目名):/servlet02
>String getServletPath():返回Servlet路径(对应的是url-pattern):/request01
>String getQueryString():返回请求URL中的参数:uname=zhangsan&pwd=123456
>String getRequestURI():返回请求URI路径(等于项目名+Servlet路径):/servlet02/request01
>StringBuffer getRequestURL():返回请求URL路径(除了参数以外的路径信息):http://127.0.0.1:8080/servlet02/request01
>String getMethod():返回请求方式:GET
代码:

 private void getRequestLine(HttpServletRequest request,
HttpServletResponse response) {
//request获取URL的相关信息
// 获取请求协议
String scheme = request.getScheme();
System.out.println("返回请求协议:"+scheme);
// 获取主机名
String serverName = request.getServerName();
System.out.println("返回请求协议:"+serverName);
// 获取服务器端口号
int serverPort = request.getServerPort();
System.out.println("返回获取端口号:"+serverPort);
// 获取上下文路径
String contextPath = request.getContextPath();
System.out.println("返回上下文路径(获取项目名):"+contextPath);
// 获取servlet路径
String servletPath = request.getServletPath();
System.out.println("返回Servlet路径(对应的是url-pattern):"+servletPath);
// 获取URL中的参数
String queryString = request.getQueryString();
System.out.println("参数信息(?后面的参数):"+queryString);
// 获取URI的路径
String requestURI = request.getRequestURI();
System.out.println("URI路径(等于项目名+Servlet路径):"+requestURI);
// 获取URL路径
StringBuffer requestURL = request.getRequestURL();
System.out.println("URL路径(除了参数以外的路径信息):"+requestURL);
// 获取请求方法
String method = request.getMethod();
System.out.println("获取请求方式:"+method);
}

截图

3、request获取请求参数
  请求参数是由客户端发送给服务器的!有可能是在请求体中(POST),也可能是在URL之后(GET)请求参数:有一个参数一个值的,还有一个参数多个值!
>String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数

 String uname = request.getParameter("uname");
String pwd = request.getParameter("pwd");
// 会出现乱码的现象,设置请求编码:必须在获取数据之前,login.html改成post请求
System.out.println("用户名:" + uname + "--->" + "密码:" + pwd);

获取所得的结果信息:用户名:小云云--->密码:123456
>String[] getParameterValues(String name):获取指定名称的请求参数值【当多个参数名称相同时】
eg:获取复选框的value值,前端提交的参数【name相同,值不同的一组参数】

 // 获取复选框的value值   ;  前端提交的参数【name相同 值不同 的一组参数】
String[] checkbox = request.getParameterValues("fav");
for(String fav : checkbox){
System.out.println("获取爱好的值:"+fav);
}

获得所得的结果信息

>Enumeration<String> getParameterNames():获取所有请求参数名称【表单的name值】

 Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
System.out.println(names.nextElement());
}

获得所得的结果信息

>Map<String,String[]> getParameterMap():获取所有参数封装到Map中,其中key为参数名,value为参数值,因为一个参数名称可能有多个值,所以参数值是String[],而不是String

 Map<String, String[]> map = request.getParameterMap();
for(String value:map.keySet()){
String[] strings = map.get(value);
System.out.println(value+":"+Arrays.toString(strings));
}


汇总代码【1、获取网络信喜、2、获取请求行信息、3、request获取请求参数】

login.html

 <!DOCTYPE html>
<html>
<head>
<title>login.html</title>
<!-- 设置编码集 -->
<meta charset="utf-8">
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body>
This is my HTML page. <br><hr>
<!-- 提交服务器URL-->
<form action="request01" method="post">
用户名:<input type="text" id="uname" name="uname" /> <br />
密码:<input type="password" id="pwd" name="pwd" /> <br />
爱好:
<input type="checkbox" name="fav" value="001">看电影
<input type="checkbox" name="fav" value="002">听小曲
<input type="checkbox" name="fav" value="003">打游戏
<input type="checkbox" name="fav" value="004" checked="checked">抽烟、喝酒、烫头
<br>
<input type="submit" value="登录" /> <br />
</form>
</body>
</html>

request01.java

 package boom.request;

 import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.Map; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 测试 request对象
* @author Administrator
*
*/
public class request01 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置编码集
request.setCharacterEncoding("utf-8");
// 1 获取网络连接信息
//getNetInfo(request, response); // 2获取请求行的信息
getRequestLine(request,response); // 3获取请求参数
//getRequestData(request, response); // service方法会调用 父类的doGet方法
response.getWriter().println("test request.....");
} /**
* 3,获取请求参数 例如 form表单提交的内容
* @param request
* @param response
* @throws UnsupportedEncodingException
*/
private void getRequestData(HttpServletRequest request,
HttpServletResponse response) throws UnsupportedEncodingException { //获取请求参数 前端页面发送的请求参数
//form表单提交的参数 用户名:name="uname" 密码 :name="pwd"
//注意: form表单域 用户名和密码 必须有name属性 //1、获取指定名称的请求参数值,适用于单值请求参数
/*String uname = request.getParameter("uname");
String pwd = request.getParameter("pwd");
// 会出现乱码的现象,设置请求编码:必须在获取数据之前,login.html改成post请求
System.out.println("用户名:" + uname + "--->" + "密码:" + pwd);*/ //2、获取指定名称的请求参数值
// 获取复选框的value值 ; 前端提交的参数【name相同 值不同 的一组参数】
/*String[] checkbox = request.getParameterValues("fav");
for(String fav : checkbox){
System.out.println("获取爱好的值:"+fav);
}*/ //3、获取所有请求参数名称
/*Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
System.out.println(names.nextElement());
}*/
//4、获取所有参数封装到Map中
Map<String, String[]> map = request.getParameterMap();
for(String value:map.keySet()){
String[] strings = map.get(value);
System.out.println(value+":"+Arrays.toString(strings));
}
//获取父页面的url
String Referer = request.getHeader("Referer");
System.out.println("防止别人盗链我们的网址:"+Referer);
} /**
* 2,请求行信息 请求的url
*/ private void getRequestLine(HttpServletRequest request,
HttpServletResponse response) {
//request获取URL的相关信息
// 获取请求协议
String scheme = request.getScheme();
System.out.println("返回请求协议:"+scheme);
// 获取主机名
String serverName = request.getServerName();
System.out.println("返回请求协议:"+serverName);
// 获取服务器端口号
int serverPort = request.getServerPort();
System.out.println("返回获取端口号:"+serverPort);
// 获取上下文路径
String contextPath = request.getContextPath();
System.out.println("返回上下文路径(获取项目名):"+contextPath);
// 获取servlet路径
String servletPath = request.getServletPath();
System.out.println("返回Servlet路径(对应的是url-pattern):"+servletPath);
// 获取URL中的参数
String queryString = request.getQueryString();
System.out.println("参数信息(?后面的参数):"+queryString);
// 获取URI的路径
String requestURI = request.getRequestURI();
System.out.println("URI路径(等于项目名+Servlet路径):"+requestURI);
// 获取URL路径
StringBuffer requestURL = request.getRequestURL();
System.out.println("URL路径(除了参数以外的路径信息):"+requestURL);
} /**
* 1,获取网络信息【当别人输入你的网络地址就可以获取到是谁的IP访问的】
* http://192.168.58.82:8080/servlet02/login.html
*
*/
public void getNetInfo(HttpServletRequest request,
HttpServletResponse response){
//获取客户端的ip
String remoteAddr = request.getRemoteAddr();
//获取客户端的端口号
int remotePort = request.getRemotePort();
//获取服务器的ip
String localAddr = request.getLocalAddr();
//获取服务器的端口号
int localPort = request.getLocalPort();
System.out.println("客户端ip和端口号:"+remoteAddr +"---"+remotePort);
System.out.println("服务器的ip和端口号:"+localAddr +"---"+localPort);
// 获取请求方法
String method = request.getMethod();
System.out.println("获取请求方式:"+method);
// 获取请求头信息
String userAgent = request.getHeader("User-Agent");
System.out.println(userAgent);// 获取名为User-Agent请求头
// 判断浏览器的类型
if(userAgent.toLowerCase().contains("chrome")){
System.out.println("注意:"+remoteAddr+"正在使用Google浏览器访问您的服务器");
}else if(userAgent.toLowerCase().contains("firefox")){
System.out.println("注意:"+remoteAddr+"正在使用火狐浏览器访问您的服务器");
}else if(userAgent.toLowerCase().contains("msie")){
System.out.println("注意:"+remoteAddr+"正在使用Internet Explorer浏览器访问您的服务器");
}else{
System.out.println("不知名的浏览器正在访问您的服务器");
}
}
}

4、request域【request对象存取数据】
Servlet中三大域对象:request、session、application
request的域方法:
>void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性
>object getAttribute(String name):用来获取request中的数据,当前在获取之前需要先去存储。
>void removeAttribute(String name):用来移除request中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做
>Enumeration getAttributeNames():获取所有域属性的名称;
注:同一请求范围内使用request.setAttribute()、request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。

 //request对象  进行存取值
//request对象 对应的一次请求和响应 ,对象也可以存取数据 // 存对象
request.setAttribute("name", "zhangsan");
// 取对象【获取参数取值】
Object name = request.getAttribute("name");
System.out.println("删除属性前name:"+name); //移除属性值 ,是 在request对象中存取
request.removeAttribute("name"); Object removeName = request.getAttribute("name");
System.out.println("删除属性后name:"+removeName);


测试request对象存取值
requset.html

 <!DOCTYPE html>
<html>
<head>
<title>request.html</title>
<meta charset="utf-8">
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body>
<div>
<a href="request02">测试request对象存取值</a>
<hr>
</div>
</body>
</html>

request02.java

 package boom.request;

 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 request02 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 设置响应编码
response.setContentType("text/html;charset=utf-8");
//request对象 进行存取值
//request对象 对应的一次请求和响应 ,对象也可以存取数据 // 存对象
request.setAttribute("name", "zhangsan");
// 取对象【获取参数取值】
Object name = request.getAttribute("name");
System.out.println("删除属性前name:"+name); //移除属性值 ,是 在request对象中存取
request.removeAttribute("name"); Object removeName = request.getAttribute("name");
System.out.println("删除属性后name:"+removeName); response.getWriter().println("这是乱码的。。。。。haha。。。。已解决");
//3 秒后跳转到index.jsp页面
response.addHeader("refresh","3;http://www.baidu.com");
} }

5、编码集的设置注意点:
客户端发送给服务器端的数据【设定 分为 get/post】
1、post请求 代码中添加编码设置
req.setCharacterEncoding("utf-8");
2、get请求 req.setCharacterEncoding("utf-8");
tomcat ----conf -----server.xml 文件 端口号后 + 设置 URIEncoding="utf-8" useBodyEncodingForURI="true" 
<Connector connectionTimeout="20000" port="8080" URIEncoding="utf-8" useBodyEncodingForURI="true" protocol="HTTP/1.1" redirectPort="8443" />
提交的服务器地址 url 
get请求 url 后边的参数 会被 form表单的参数值覆盖 ,但是直接在地址栏 添加 url?cmd=add 在后端servlet是可以获取到的
<a href ="url?cmd=add">地址栏直接输入url</a> 超链接是get请求
post请求:url后边的参数会提交,form表单的参数会在请求体中也会提交 。一般form表单提交用post请求
服务器端响应给客户端的数据:
设定浏览器打开文件的方式 text/html 
设定编码集 charset=utf-8
// 设置响应编码
response.setContentType("text/html;charset=utf-8");
注:所有的请求编码设置必须在获取数据之前
补充:定时刷新:

 //3 秒后跳转到index.jsp页面
response.addHeader("refresh","3;http://www.baidu.com");

03-【request对象获取请求的数据 & request对象存取值】的更多相关文章

  1. 入门servlet:request获取请求行数据

    /** * 演示Request对象获取请求行数据 */ @WebServlet("/test") public class RequestDemo1 extends HttpSer ...

  2. 入门servlet:request获取请求头数据

    @WebServlet("/RequestDemo2") public class RequestDemo2 extends HttpServlet { protected voi ...

  3. request.getParameter()获取不到数据

    HTML中的form表单有一个关键属性 Content-Type=application/x-www-form-urlencoded 或multipart/form-data. 1. Content- ...

  4. request.getParameter()获取不到数据的问题

    最近做项目时,发现手机客户端通过http协议post方式上传数据到服务端,在服务器端通过request.getInputStream()能获取到相应的数据,但用request.getParameter ...

  5. mitmproxy 获取请求响应数据

    比较好的一个介绍是:https://blog.wolfogre.com/posts/usage-of-mitmproxy/ mitproxy 获取请求响应数据的代码如下: # -*- coding: ...

  6. resultset 对象获取行字段数据时报:java.sql.SQLException: Column 'id' not found.

    resultset 对象获取行字段数据时报:java.sql.SQLException: Column 'id' not found. 代码: String sql="SELECT d.co ...

  7. setCharacterEncoding 是在request.getParameter获取参数之前 设置request的编码格式 一步到位

    setCharacterEncoding 是在request.getParameter获取参数之前 设置request的编码格式 一步到位

  8. Python+requests 发送简单请求--》获取响应状态--》获取请求响应数据

    Python+requests 发送简单请求-->获取响应状态-->获取请求响应数据 1.环境:安装了Python和vscode编译器(Python自带的编译器也ok).fiddler抓包 ...

  9. ajax post 请求 ,java端使用 request.getParameter 获取不到数据问题

    js端 $.ajax({ type:'POST', data:{a:1}, url:_this.apiUrl+url, dataType:'json',//使用jsonp方式请求 contentTyp ...

随机推荐

  1. Java集合(7):散列与散列码

    散列的价值在于速度.我们使用数组来保存键的信息,这个信息并不是键本身,而是通过键对象生成一个数字(散列码),作为数组下标.由于数组的容量是固定的,而散列容器的大小是可变的,所以不同的键可以产生相同的数 ...

  2. Fabric1.4 链码开发,开发模式下的测试

    关闭之前已启动的网络环境 sudo docker-compose -f docker-compose-cli.yaml down 进入devmode目录:  cd ~/go/src/github.co ...

  3. PHP SQL注入

    开发者容易遗漏的输入点: HTTP头 X-Forwarded-For   获取用户ip User-Agent            获取浏览器 Referer                  获取之 ...

  4. 【VS开发】CFormView

    原文地址:CFormView作者:罗纳尔多 CFormView是MFC使用无模式对话框的一个典型例子.CFormView是基于对话框模板创建的视,它的直接基类是CSrcollView,CSrcollV ...

  5. JS 自定义字典对象

    <script type="text/javascript" language="javascript"> //自定义字典对象 function D ...

  6. day18 time、datetime、calendar、sys、os、os.path模块

    今日内容 时间模块 time模块 datetime模块 calendar模块 系统模块 sys模块 os模块 os.path模块 time模块: 在 time 模块中使用最多的方法有: time() ...

  7. VUE 1.0

    现代开发模式:vue/react. 20%的时间花在了表现层 传统开发模式:jquery. 80%的时间花在了表现层 MVC——数据.表现.行为分离 视图层(表现层)<----->数据层 ...

  8. [计蒜客T2237]魔法_树

    魔法 题目大意: 数据范围: 题解: 这个题挺好玩的 可以用反证法,发现所有叶子必须都得选而且所有叶子都选了合法. 故此我们就是要使得,一次操作之后使得叶子的个数最少. 这怎么弄呢? 我们发现,如果一 ...

  9. redis 学习(20)-- 常见的持久化开发与运维问题

    常见的持久化开发与运维问题 fork 操作 fork 操作是一个同步操作,若执行较慢会阻塞 redis 主线程 执行时间与内存量相关:内存越大,耗时越长:虚拟机较慢,真机较快 查看 fork 执行时间 ...

  10. exclipe怎么设置编码为UTF-8

    如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码.然而,Eclipse工作空间(workspace)的缺省字符编码是操作系统缺省的编码,简 ...