1.Request

1.1 request对象和response对象的原理(了解)

  1. request对象和response对象是由服务器创建的,我们来使用他们即可
  2. request对象是用来回去请求信息,得到页面的请求,response对象是来设置响应消息,可以往页面传输写入数据

1.2 request对象继承体系结构(了解)

ServletRequest --接口

|继承

HttpServletRequest --接口

|实现

org.apache.catalina.connector.RequestFacade 类(Tomcat)

代码如下

package cn.itcast.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet({"/d4","/dd4","/ddd4","/demo4"})
//@WebServlet("/user/demo4")
//@WebServlet("*.do")
//*是指通配符
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo4.....");
System.out.println(req);
}
}

2.request获取请求消息

2.1 获取请求行数据

  • GET/day14/demo1?name=zhangsan HTTP/1.1
  • 方法:
  1. 获取请求方式:GET

    • String getMethod()
  2. (*)获取虚拟目录:/day14
    • String getContextPath()
  3. 获取Servlet路径:/demo1

    *String getServletPath()
  4. 获取get方式请求参数:name=zhangsan
    • String getQueryString()
  5. (*)获取请求url:/day14/demo1
  6. 获取协议及版本:HTTP/1.1
    • String getPortocol()
  7. 获取客户机的IP地址
    • String getRemoteAddr()

代码如下

package cn.itcast.web.request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* 演示request对象获取请求行数据
*/
@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
1.获取请求方式:GET
* String getMethod()
2.(*)获取虚拟目录:/day14
* String getContextPath()
3.获取Servlet路径:/demo1
*String getServletPath()
4.获取get方式请求参数:name=zhangsan
* String getQueryString()
5.(*)获取请求url:/day14/demo1
* String getRequestURI() /day14/demo1l
* StringBuffer getRequestURL() :http://localhost/day14/demo1
6.获取协议及版本:HTTP/1.1
* String getPortocol()
7.获取客户机的IP地址
* String getRemoteAddr()
*/
//1.获取请求方式:GET
String method=request.getMethod();
System.out.println(method);
//2.(*)获取虚拟目录:/day14
String contextPath=request.getContextPath();
System.out.println(contextPath);
//3.获取Servlet路径:/demo1
String servletPath=request.getServletPath();
System.out.println(servletPath);
//4.获取get方式请求参数:name=zhangsan
String queryString =request.getQueryString();
System.out.println(queryString);
// 5.(*)获取请求url:/day14/demo1
String requestURI =request.getRequestURI();
StringBuffer requestURL=request.getRequestURL();
System.out.println(requestURI);
System.out.println(requestURL);
// 6.获取协议及版本:HTTP/1.1
String protocol=request.getProtocol();
System.out.println(protocol);
// 7.获取客户机的IP地址
String remoteAddr=request.getRemoteAddr();
System.out.println(remoteAddr);
}
}

2.2 获取请求头数据

  • 方法

    • (*)String getHeader(String name):通过请求头的名称获取请求头的值

代码如下

package cn.itcast.web.request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration; @WebServlet("/RequestDemo2")
public class RequestDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//演示请求头数据
//1.获取所有请求头名称
Enumeration<String> headerNames=request.getHeaderNames();
//2.遍历
while(headerNames.hasMoreElements()){
String name=headerNames.nextElement();
//根据名称获取请求头的值
String value=request.getHeader(name);
System.out.println(name+"---"+value);
}
}
}
  • Enumeration getHeaderName():获取所有的请求头名称

代码如下

package cn.itcast.web.request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet("/RequestDemo3")
public class RequestDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// //演示请求头数据
// String agent=request.getHeader("user-agent");
// //判断agent的浏览器版本
// if(agent.contains("Chorme")){
// //谷歌
// System.out.println("谷歌来了.....");
// }else if(agent.contains("Firefox")){
// //火狐
// System.out.println("火狐来了.....");
// }
//演示请求头数据 referer
String referer = request.getHeader("referer");
System.out.println(referer);
//防盗链
if (referer != null) {
if (referer.contains("/04_Request_war_exploded")) {
//正常访问
// System.out.println("播放电影");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("播放电影....");
} else {
// 盗链
// System.out.println("想看电影么,来......");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("想看电影么,来......");
}
}
}
}

2.3 获取请求体数据

  • 请求体:只有post请求方式,才有请求体,在请求体中封装了post请求的请求参数
  • 步骤
    1. 获取流对象
    • BufferedReader getReader():获取字符输入流 只能操作字符数据
    • ServletInputStream getInputStream():获取字节输入流 可以操作所有类型数据
    1. 再从流对象中拿数据

代码如下

-------------------------页面----------------------
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/04_Request_war_exploded/RequestDemo5" method="post">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="text" placeholder="请输入密码" name="password"><br>
<input type="submit" value="注册">
</form>
</body>
</html>
-------------------------java--------------------
package cn.itcast.web.request; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException; @WebServlet("/RequestDemo5")
public class RequestDemo5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取请求消息体--请求参数
// 1.获取字符流
BufferedReader br = request.getReader();
// 2.读取数据
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }
}

3.request其他功能

3.1 获取请求参数通用方式 不论get还是post请求方式都可以使用下列方法来获取请求参数

  1. String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
  2. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
  3. Enumeration getParameterNames():获取所有请求的参数名称
  4. Map<String,String[]> getParameterMap():获取所有参数的Map集合
  • 中文乱码问题

    • get方式 Tomcat8 已经将get乱码方式问题解决了
    • post方式 会乱码
      • 解决:在获取请求参数前,设置流的编码:request.setCharacterEncoding("utf-8");

代码如下

-----------------------------index.jsp------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/04_Request_war_exploded/RequestDemo6" method="get">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="text" placeholder="请输入密码" name="password"><br>
<input type="checkbox" name="hobby" value="game">游戏
<input type="checkbox" name="hobby" value="study">学习
<br>
<input type="submit" value="注册">
</form>
</body>
</html>
-------------------------------java---------------------------------
package cn.itcast.web.request; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set; @WebServlet("/RequestDemo6")
public class RequestDemo6 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// post 获取请求参数
// 根据参数名称获取参数值
String username = request.getParameter("username");
// System.out.println("post");
// System.out.println(username);
//根据参数名称获取参数值的数组
String[] hobbies = request.getParameterValues("hobby");
// for (String hobby : hobbies) {
// System.out.println(hobby);
// }
// 获取所有请求的参数值名称
Enumeration<String> parameterNames = request.getParameterNames();
// while (parameterNames.hasMoreElements()) {
// String name = parameterNames.nextElement();
// System.out.println(name);
// String value = request.getParameter(name);
// System.out.println(value);
// System.out.println("-----------------------------------------");
// }
// 获取所有参数的map集合
Map<String, String[]> parameterMap = request.getParameterMap();
// 遍历
Set<String> keyset = parameterMap.keySet();
for (String name : keyset) {
//获取键获取值
String[] values = parameterMap.get(name);
System.out.println(name);
for (String value : values) {
System.out.println(value);
}
System.out.println("---------------------------------------");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// get 获取请求参数
// String username = request.getParameter("username");
// System.out.println("get");
// System.out.println(username);
this.doPost(request, response);
}
}

3.2 请求转发:一种在服务器内部资源跳转的方式

  1. 步骤

    1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatchar(String path)
    2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)
    • 例如: request.getRequestDispatcher("/RequestDemo9").forward(request, response);
  2. 特点:
    1. 浏览器地址栏路径没有发生变化
    2. 只能转发到服务器内部资源中
    3. 转发是一次请求

3.3 共享数据

  • 域对象:一个有作用范围的对象,可以在范围内共享数据
  • request域:代表一次请求的范围,一般用于请求转发的多个资源共享中共享数据
  • 方法
    1. void setAttribute(String name,Object obj):存储数据
    • 存储数据到request域中:request.setAttribute("msg", "hello");
    1. Object getAttitude(String name):通过键获取值
    • 获取数据:Object msg = request.getAttribute("msg");
    1. void removeAttribute(String name):通过键移除键值对

转发和共享代码如下

---------------------存储转发---------------------------
package cn.itcast.web.request; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet("/RequestDemo8")
public class RequestDemo8 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo8888被访问了.....");
//存储数据到request域中
request.setAttribute("msg", "hello");
//转发到demo9资源
// RequestDispatcher requestDispatcher = request.getRequestDispatcher("/RequestDemo9");
// requestDispatcher.forward(request, response);
request.getRequestDispatcher("/RequestDemo9").forward(request, response);
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// get 获取请求参数
// String username = request.getParameter("username");
// System.out.println("get");
// System.out.println(username);
this.doPost(request, response);
}
}
---------------------提取显示---------------------------
package cn.itcast.web.request; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet("/RequestDemo9")
public class RequestDemo9 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取数据
Object msg = request.getAttribute("msg");
System.out.println(msg);
System.out.println("demo9999被访问了....."); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// get 获取请求参数
// String username = request.getParameter("username");
// System.out.println("get");
// System.out.println(username);
this.doPost(request, response);
}
}

案例

  • 用户登录案例需求

    1. 编写login.html登录页面

      username&password两个输入框
    2. 使用Druid数据库连接池技术,操作mysql,day14数据库中user表
    3. 使用jdbcTemplate技术封装JDBC
    4. 登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
    5. 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误

分析

  • 输入框内容用request的String getParameter(String name):根据参数名称获取参数值
  • 然后数据库里面的账号密码用集合包揽起来,之后比对与request中的数据,最后存储自己的用户昵称,然后转发到页面中

3.4 获取ServletContext

  • ServletContext getServletContext()

代码如下

package cn.itcast.web.request;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebServlet("/RequestDemo10")
public class RequestDemo10 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取数据
ServletContext servletContext = request.getServletContext();
System.out.println(servletContext);
System.out.println("demo1010被访问了....."); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// get 获取请求参数
// String username = request.getParameter("username");
// System.out.println("get");
// System.out.println(username);
this.doPost(request, response);
}
}
  1. 概念:代表整个web应用,可以和程序的容器(服务器)来通信
  2. 功能
    1. 获取MINE类型

      • MIME类型:在互联网通信过程中定义的一种文件数据类型

        • 格式 大类型/小类型 text/html image/jepg
      • 获取:String getMimeType(String file)
    2. 域对象:共享数据
      1. setAttribute(String name,Object value)
      2. getAttribute(String name)
      3. removeAttribute(String name)
      • ServletContext对象范围:所有用户所有请求的数据
    3. 获取文件的真实(服务器)路径
      1. 方法:String getRealPath(String path)
  3. 获取:
    1. 通过request对象获取

      request.getServletContext()
    2. 通过HttpServlet获取

      this.getServletContext();

4.BeanUtils工具类

  • 要求:类必须被public修饰,必须提供空参的构造器,成员变量必须使用private修饰,提供公共setter和getter
  • 功能:封装数据
  • 概念:成员变量,属性:setter和getter方法截取后的产物 例如:getUsername()->Username->username
  • 方法:
    • setProperty()
    • getProperty()
    • populate(Object obj,Map map):将map集合的键值对信息,封装到对应的JavaBean对象中

代码演示

Map<String,String[]> map=req.getParameterMap()或者是一个map集合就可以
User user=new User()
BeanUtils.populate(user,map)//进行转换

Java-Request对象是用来回去请求信息,得到页面的请求的更多相关文章

  1. 获取用户的相关请求信息, 以及包括请求头 request.environ

    #在index文件中 1. print(type(request)) #看出所属库 2. from django.core.handlers.wsgi import WSGIRequest #查看WS ...

  2. javaweb学习总结十九(http协议概述以及http请求信息分析)

    一:http协议概述 1:http协议定义 2:使用telnet程序连接web服务器,获取资源 3:http协议:超文本传输协议,它是基于tcp/ip协议,就是建立在tcp/ip之上工作的, http ...

  3. JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求

    JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求 哇,一看标题怎么这么长啊,其实意思很简单,哥讨厌用HTTP Client做POST与GET提交 觉得那个毕竟是别人写 ...

  4. 【转】jmeter 进行java request测试

    本周使用jmeter进行一个远程dubbo接口的性能测试,因为没有访问页面,本来开发可以写一个页面,进行http请求的调用,不过已经看到jmeter可以直接对java request进行测试,所以尝试 ...

  5. JMeter入门(4):Java Request实例

    目的:对Java程序进行测试: 一.核心步骤 1.创建一个Java工程: 2.将JMeter的lib目录下的jar文件添加进此工程的Build Path: 3.创建一个类并实现JavaSamplerC ...

  6. Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求

    Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 >>>>>>>>>>>>>>&g ...

  7. HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端

    协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...

  8. jmeter之Java request报错:java.lang.NoClassDefFoundError: redis/clients/jedis/Jedis

    今天在学习Jmeter的java request,请求内容是连接redis并获取其中的一个字段值.结果在运行时报如下错误: 2018/05/24 13:08:20 ERROR - jmeter.thr ...

  9. JMeter入门:Java Request实例 (转)

    转自:http://blog.csdn.net/czp11210/article/details/26174969 目的:对Java程序进行测试:   一.核心步骤   1.创建一个Java工程: 2 ...

  10. (转)Java发送http请求(get 与post方法请求)

    本文转载于:http://bijian1013.iteye.com/blog/2166855 package com.bijian.study; import java.io.BufferedRead ...

随机推荐

  1. PHP 中使用 ElasticSearch 的最佳实践 (中)

    引言 在上一篇文章当中,我们介绍了如何在 ElasticSearch 中创建索引以及建立字段映射关系. 接下来的这篇文章,我们将在 Laravel 中对商品信息进行增删改查及搜索. 记得 Elasti ...

  2. LTSC系统,唯一未被微软宣传过,却备受用户赞誉,CPU占用暴降

    微软拥有多款操作系统,如Windows XP.Windows 7.Windows 10以及最新的Windows 11等. 其中,Windows XP和Windows 7因其稳定性和用户友好性而广受好评 ...

  3. 剑指Offer-52.正则表达式匹配(C++/Java)

    题目: 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式. ...

  4. ConfigurationManager 读取的不是最新值

    用 ConfigurationManager 修改配置后,ConfigurationManager 读取的不是最新值. 解决方法: 第一种: ConfigurationManager.RefreshS ...

  5. Cursor是什么?基于ChatGPT代码编辑器的cursor如何使用?VS Code如何迁移到Cursor的步骤

    Cursor是什么 Cursor 是一个基于 Visual Studio Code(VS Code)技术构建的高级代码编辑器,专为提高编程效率并更深度地整合 AI 功能而设计.它不仅继承了 VS Co ...

  6. leetcode | 107. 二叉树的层序遍历 II | javascript实现 | c++实现

    题目 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 . (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 思路 题目的要求相当于是求层序遍历数组的转置,我们只需利用js的 ...

  7. JVM性能分析与故障排查

    引言 JVM调优 程序在上线前的测试或运行中有时会出现一些大大小小的JVM问题,比如cpu load过高.请求延迟.tps降低等,甚至出现内存泄漏(每次垃圾收集使用的时间越来越长,垃圾收集频率越来越高 ...

  8. 【解决方案】Java 互联网项目中消息通知系统的设计与实现(上)

    目录 前言 一.需求分析 1.1发送通知 1.2撤回通知 1.3通知消息数 1.4通知消息列表 二.数据模型设计 2.1概念模型 2.2逻辑模型 三.关键流程设计 本篇小结 前言 消息通知系统(not ...

  9. Shell脚本实现Linux回收站

    前言 到目前为止,非图形化的Linux还没有回收站的命令. 那么,我们如果不小心将某一个文件删掉了,那就只能数据恢复了.如果这也不行,那就等着哭吧. 最新代码在我的github:https://git ...

  10. Java面试知识点(四)重写和重载

    重写override 在 java 中有很多的继承,继承下来的有变量.方法.在有一些子类要实现的方法中,方法名.传的参数.返回值跟父类中的方法一样,但具体实现又跟父类的不一样,这时候我们就需要重写父类 ...