0x01、Request

什么是request

在Servlet API中,定义了一个HttpServletRequest接口,它继承自ServletRequest接口,专门用来封装HTTP请求消息。由于HTTP请求消息分为请求行、请求头和请求体三部分,因此,在HttpServletRequest接口中定义了获取请求行、请求头和请求消息体的相关方法.

​ Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。

1、操作请求行和请求头

操作请求行

  • getMethod();获取请求方式
  • getRemoteAddr() ;获取客户机的IP地址(知道是谁请求的)
  • getContextPath(); 获得当前应用工程名(部署的路径);
  • getRequestURI();获得请求地址,不带主机名
  • getRequestURL();获得请求地址,带主机名
  • getServerPort();获得服务端的端口
  • getQueryString();获的请求参数(get请求的,URL的?后面的. eg:username=zs&password=123456)

实例代码:

@WebServlet("/demo01")
public class ServletDemo01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用request对象获取请求行的信息:
//1. 获取请求的方式(可能会用)
String method = request.getMethod();
//System.out.println("请求方式为:" + method); //2. 获取客户端的ip地址
String remoteAddr = request.getRemoteAddr();
//System.out.println("客户端的ip地址是:" + remoteAddr); //3. 获取项目部署的路径(以后可能用到)
String contextPath = request.getContextPath();
//System.out.println("项目部署路径是:" + contextPath); //4. 获取请求的url: 统一资源定位符 http://localhost:8080/requestDemo/demo01
String url = request.getRequestURL().toString();
//System.out.println("此次请求的url是:" + url); //5. 获取请求的uri: 统一资源标识符,在url的基础上省略了服务器路径"http://loaclhost:8080"
String uri = request.getRequestURI();
System.out.println(uri);
}
}

操作请求头

  • User-Agent: 浏览器信息
  • Referer:来自哪个网站(防盗链)
  • 等等
@WebServlet("/demo02")
public class ServletDemo02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据请求头的name获取value
//目标:获取name为user-agent的请求头的信息
String header = request.getHeader("user-agent");
System.out.println("获取的请求头agent为:" + header);
}
}

2、操作请求参数

  • 获得请求参数
  • 请求参数乱码的处理
  • 使用BeanUtils封装请求参数到JavaBean
法名 描述
String getParameter(String name) 获得指定参数名对应的值。如果没有则返回null,如果有多个获得第一个。 例如:username=jack
String[] getParameterValues(String name) 获得指定参数名对应的所有的值。此方法专业为复选框提供的。 例如:hobby=抽烟&hobby=喝酒&hobby=敲代码
Map<String,String[]> getParameterMap() 获得所有的请求参数。key为参数名,value为key对应的所有的值。

乱码设置:

  1. get方式, 我们现在使用的tomcat>=8.0了, 乱码tomcat已经处理好了
  2. post方式, 就需要自己处理
void setCharacterEncoding(String env); //设置请求体的编码

代码实例:

@WebServlet("/demo03")
public class ServletDemo03 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//1. 根据参数名,获取一个参数值
String username = request.getParameter("username");
//System.out.println("获取的请求参数username=" + username); //2. 根据参数名,获取多个参数值:比如说注册时候的兴趣爱好的复选框
String[] hobbies = request.getParameterValues("hobby");
/*for (String hobby : hobbies) {
System.out.println(hobby);
}*/ //3. 获取所有的请求参数
//getParameterMap()获取所有请求参数,请求参数的参数名就是map的key,请求参数的参数值就是map的value
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历出每一个请求参数
Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
for (Map.Entry<String, String[]> entry : entries) {
String parameterName = entry.getKey();
String[] values = entry.getValue();
for (String value : values) {
System.out.println("参数名:" + parameterName + ",参数值:" + value);
}
}
}
}

使用BeanUtils封装

​ BeanUtils是Apache Commons组件的成员之一,主要用于 简化JavaBean封装数据 的操作。

使用步骤:

  1. 导入jar
  2. 使用BeanUtils.populate(user,map)
  • 表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<form action="/requestDemo/demo04" method="post">
用户名<input type="text" name="username"><br>
密码<input type="text" name="password"><br>
性别<input type="radio" name="gender" value="male">男
<input type="radio" name="gender" value="female">女
<br>
兴趣爱好
<input type="checkbox" name="hobby" value="basketball">篮球
<input type="checkbox" name="hobby" value="football">足球
<input type="checkbox" name="hobby" value="ppball">乒乓球
<input type="checkbox" name="hobby" value="yumaoball">羽毛球
<br>
<input type="submit" value="注册">
</form>
</body>
</html>
  • User.java

需要有getter和setter,无参/有参方法、toString重写

public class User implements Serializable {
private String username;
private String password;
private String gender;
private String[] hobby; public User() {
} public User(String username, String password, String gender, String[] hobby) {
this.username = username;
this.password = password;
this.gender = gender;
this.hobby = hobby;
} @Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", gender='" + gender + '\'' +
", hobby=" + Arrays.toString(hobby) +
'}';
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} public String[] getHobby() {
return hobby;
} public void setHobby(String[] hobby) {
this.hobby = hobby;
}
}
  • ServletDemo01
@WebServlet("/demo04")
public class ServletDemo04 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//1. 获取所有的请求参数
Map<String, String[]> parameterMap = request.getParameterMap();
//2. 将请求参数封装到User对象中
User user = new User();
//3. 使用BeanUtils框架自动将map中的数据封装到对象中
try {
BeanUtils.populate(user,parameterMap); System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
}
}
}
  • 如果请求参数有多个需要封装到JavaBean里面, 建议先获得Map, 再使用BeanUtils封装到JavaBean对象

注意: JavaBean属性需要和Map的key一致 说白了也就是JavaBean属性需要和表单的name一致

3、请求转发

格式:

request.getRequestDispatcher("url").forward(request, response);//转发
  • 请求转发的作用:跳转页面,比如说添加完数据之后跳转到数据的展示页面,删除完数据之后跳转到展示页面

  • 请求转发的特征

    • 跳转操作是由服务器执行的,所以客户端地址栏不会发生变化
    • 跳转操作不会发起新的请求
    • 可以跳转到WEB-INF中的资源,但是不能跳转到其它项目的资源

4、作为域对象存取值

ServletContext: 范围 整个应用(无论多少次请求,只要是这个应用里面的都是可以共享的)

​ request范围: 一次请求有效

​ 域对象是一个容器,这种容器主要用于Servlet与Servlet/JSP之间的数据传输使用的。

  • Object getAttribute(String name) ;
  • void setAttribute(String name,Object object) ;
  • void removeAttribute(String name) ;

常用方法

Object getAttribute(String name) ;  取值
void setAttribute(String name,Object object) ; 存值
void removeAttribute(String name) ; 移除

一次请求有效(转发可以使用)

实例代码

  • ServletDemo01
// 目标: 在ServletDemo02中获取ServletDemo01中的变量username的值
// 要求只能是由ServletDemo01跳转到ServletDemo02的时候才能获取
String username = "周杰棍"; //将username存储到request域对象中
request.setAttribute("name",username); //请求转发跳转到ServletDemo07
request.getRequestDispatcher("/demo07").forward(request, response);
  • ServletDemo02
 System.out.println("在ServletDemo07中获取username的值:"+request.getAttribute("name"));

java之 Request的更多相关文章

  1. java获取request中的参数、java解析URL问号后的参数

    java获取request中的参数.java解析URL问号后的参数.有时候我们需要从request中获取参数,或者获取拼接在Url后面的参数,有时候一个一个去拿有点麻烦,一起拿出来放在一个map里面需 ...

  2. ajax传JSON时设置的contenttype导致JAVA中request.getParameter("")怎么也接收不到数据

    ajax传JSON时设置的contenttype默认值是application/x-www-form-urlencoded, 当ajax传JSON时设置的contenttype 如果是applicat ...

  3. java读取request中的xml

    java读取request中的xml   答: // 读取xml InputStream inputStream; StringBuffer sb = new StringBuffer(); inpu ...

  4. java修改request的paramMap

    最近做项目,发现要修改request的参数内容.因为想要在request的paramMap里面默认注入,modifier和modifierName,这些内容.但是这个Map是不能修改的.所以采用了如下 ...

  5. java中request,application,session三个域及参数简单示例

    直接上代码: java代码: public class HelloAction implements Action { @Override public String execute() throws ...

  6. JAVA如何request没有参数的post提交

    过去做网页的时候 post过来的值都是带参的 我就request.getParameter("")来获取 现在过来的不带参 就一串字符串 我应该怎么获取? //用获取数据流的方式, ...

  7. Java Web----------response&&request

    1.response 代表响应, 可以理解为一个空的箱子,我们在里面填入要发送到浏览器的内容. 服务器会把这些内容组装成http响应. 1.1 响应首行 协议/版本号 状态码 状态码描述 添加状态码 ...

  8. JAVA中request.getParameterMap()用法笔记

    一. 根据Java规范:request.getParameterMap()返回的是一个Map类型的值,该返回值记录着前端(如jsp页面)所提交请求中的请求参数和请求参数值的映射关系.这个返回值有个特别 ...

  9. [Java][Web]Request 实现转发和 MVC 设计模式

    String data = "aaaaa"; request.setAttribute("data",data); // 将数据存在 request reque ...

  10. java获取request的头信息

    1.获取全部头信息: //get request headers private Map<String, String> getHeadersInfo() { Map<String, ...

随机推荐

  1. K-NN(最近邻分类算法 python

    # algorithm:K-NN(最近邻分类算法)# author:Kermit.L# time: 2016-8-7 #======================================== ...

  2. Python利用openpyxl带格式统计数据(2)- 处理mysql数据

    上一篇些了openpyxl处理excel数据,再写一篇处理mysql数据的,还是老规矩,贴图,要处理的数据截图: 再贴最终要求的统计格式截图: 第三贴代码: 1 ''' 2 #利用openpyxl向e ...

  3. CCNP第二天之复习CCNA

    1.静态路由的扩展配置: (1).环回接口: 在设备上用于测试TCP/IP协议栈能否正常使用.默认没有.需要手工创建   R1(config)#interface loopback 1         ...

  4. 使用Attribute限制Action只接受Ajax请求

    原博文 https://www.cnblogs.com/h82258652/p/3939365.html 代码 /// <summary> /// 仅允许Ajax操作 /// </s ...

  5. double 转为long类型

    System.out.println(new Double(234314.999999999).longValue());//234314  System.out.println(new Double ...

  6. Oracle数据库常见sql

    -新建表:create table table_name( id varchar2(300) primary key, name varchar2(200) not null); --插入数据 ins ...

  7. mybatis实现MySQL数据库的增删改查之二

    这里直接附上代码: 1 package com.qijian.pojo; 2 3 import org.apache.ibatis.type.Alias; 4 5 6 public class Use ...

  8. 如何组织一场JAVA技能大练兵

    近期,公司为了锻炼开发人员技能,举办了一场涵盖多个技术线的技能大练兵,我有幸受邀负责java技术方向的出题和评审工作.下面从以下几个方面回顾下整个过程: 题目设计 程序要求 测试方法 题目设计 题目设 ...

  9. Turtlebot3新手教程-应用-跟随

    本文针对如何利用Turtlebot3可实现的各种应用进行讲解 具体步骤如下: [Remote PC]安装应用包 cd ~/catkin_ws/src git clone https://github. ...

  10. java内部类笔记

    内部类 1.   普通内部类 <pre name="code" class="java">class className{ [private|pro ...