1.request对象和response对象的原理
- (1). request和response对象是由服务器创建的。我们来使用它们
- (2). request对象是来获取请求消息,response对象是来设置响应消息
代码:request01
package com.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("/request01")
public class Request01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("request对象继承体系结构:request01访问了");
//通过键获取值
Object o=req.getAttribute("msg");
System.out.println(o);
}
}
2. request功能
2.1 获取请求消息数据
1.获取请求行数据
request02
package com.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;
/**
* 1. 获取请求行数据
* * GET /day14/demo1?name=zhangsan HTTP/1.1
* * 方法:
* (1). 获取请求方式 :GET
* * String getMethod()
* (2). (重要)获取虚拟目录:/Servlet_Test
* * String getContextPath()
* (3). 获取Servlet路径: /request02
* * String getServletPath()
* (4). 获取get方式请求参数:name=zhangsan
* * String getQueryString()
* (5). (重要)获取请求URI:/Servlet_Test/request02
* * String getRequestURI(): /Servlet_Test/request02
* * StringBuffer getRequestURL() :http://localhost:8080/Servlet_Test/request02
*
* * URL:统一资源定位符 : http://localhost:8080/Servlet_Test/request02 中华人民共和国
* * URI:统一资源标识符 : /Servlet_Test/request02 共和国
* (6). 获取协议及版本:HTTP/1.1
* * String getProtocol()
*
* (7). 获取客户机的IP地址:
* * String getRemoteAddr()
**/
@WebServlet("/request02")
public class Request02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求方式:GET
String method=request.getMethod();
System.out.println(method);//GET
//2.(*)获取虚拟目录:/Servlet_Test
String contextPath=request.getContextPath();
System.out.println(contextPath);// /Servlet_Test
//3.获取Servlet路径: /request02
String servletPath=request.getServletPath();
System.out.println(servletPath);// /request02
//4.获取get方式请求参数:name=zhangsan
String queryString=request.getQueryString();
System.out.println(queryString);// name=zhangsan
//5.(*)获取请求URI:/Servlet_Test/request02
String requestURI=request.getRequestURI();
System.out.println(requestURI);// /Servlet_Test/request02
StringBuffer requestURL=request.getRequestURL();
System.out.println(requestURL);// http://localhost:8080/Servlet_Test/request02
//6.获取协议及版本:HTTP/1.1
String protocol=request.getProtocol();
System.out.println(protocol);// HTTP/1.1
//7.获取客户机的IP地址:
String remoteAddr=request.getRemoteAddr();
System.out.println(remoteAddr);// 0:0:0:0:0:0:0:1 本机自己访问自己
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
2.获取请求头数据
方法:
- (重要)String getHeader(String name):通过请求头的名称获取请求头的值
- Enumeration getHeaderNames():获取所有的请求头名称
request03
package com.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("/request03")
public class Request03 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取所有的请求头名称
Enumeration<String> headerNames =request.getHeaderNames();
//2.遍历
while(headerNames.hasMoreElements()){
String name=headerNames.nextElement();
//根据请求头的名称获取请求头的值getHeader
String value = request.getHeader(name);
System.out.println(name+"---"+value);
}
//1.演示获取请求头数据:user-agent 浏览器版本
String agent=request.getHeader("user-agent");
//判断agent浏览器版本
if(agent.contains("Chrome")){
System.out.println("谷歌浏览器");
}else if (agent.contains("Firefox")){
System.out.println("火狐浏览器");//火狐浏览器
}
//2.演示获取请求头数据:referer 来源于哪个超链接
String referer=request.getHeader("referer");
System.out.println(referer);// http://localhost:8080/Servlet_Test/login.html
//防盗链
if (referer !=null){
if (referer.contains("Servlet_Test")){//Servlet_Test虚拟目录
//正常访问
System.out.println("播放电影....");//播放电影....
}else {
//盗链
System.out.println("盗版电影");
}
}
}
}
/**结果:
*host---localhost:8080
* user-agent---Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0
* accept---text/html,application/xhtml+xml,application/xml;q=0.9,;q=0.8
*accept-language---zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
*accept-encoding---gzip,deflate
*connection---keep-alive
*cookie---JSESSIONID=98A91725E294023264FA999EADCBDE54;Idea-a150c0e3=45cd6cc5-2034-493f-a937-8acb51b49de1
*upgrade-insecure-requests---1
*
* */
3. 获取请求体数据:
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
* 步骤:
1. 获取流对象
* BufferedReader getReader():获取字符输入流,只能操作字符数据;
* ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据;
* 在文件上传知识点后讲解。
2. 再从流对象中拿数据。
request04
package com.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("/request04")
public class Request04 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//post方法操作请求体
// 获取请求消息体--请求参数
//(1)获取字符流
BufferedReader br= request.getReader();
//(2)读取数据
String line =null;
while ((line=br.readLine())!=null){
System.out.println(line);// username=zhangsan&password=123
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册界面</title>
</head>
<body>
<form action="/Servlet_Test/request04" method="post">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="text" name="password" placeholder="请输入密码"><br>
<input type="submit" value="注册">
</form>
</body>
</html>
2.2 其他功能
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集合
方式1: String getParameter(String name):根据参数名称获取参数值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册界面2</title>
</head>
<body>
<form action="/Servlet_Test/request05" method="get">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="text" name="password" placeholder="请输入密码"><br>
<input type="submit" value="注册">
</form>
</body>
</html>
request05
注意:一定要在html文件中,保存一下更改的method,否则查看页面源码方法并不更改,仍然调用先前的请求方式,报405错误
package com.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("/request05")
public class Request05 extends HttpServlet {
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);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//post获取请求参数
//根据参数名称获取参数值
String username= request.getParameter("username");
System.out.println("post");
System.out.println(username);
}
}
方式2:String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>多选按钮注册</title>
</head>
<body>
<form action="/Servlet_Test/request06" method="get">
<input type="checkbox" name="interest" value="smoke"/>抽烟
<input type="checkbox" name="interest" value="drink"/>喝酒<br>
<input type="submit" value="注册">
</form>
</body>
</html>
request06
package com.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("/request06")
public class Request06 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("post");
this.doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("get");
//根据参数名称获取参数值的 数组: getParameterValues
String[] interests=request.getParameterValues("interest");
for(String interest1:interests){
System.out.println(interest1);
}
}
}
方式3:Enumeration getParameterNames():获取所有请求的参数名称,只能一对一获取,不能多对一
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- <form action="/Servlet_Test/request07" method="get"> -->
<form action="/Servlet_Test/request08" method="post">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="text" name="password" placeholder="请输入密码"><br>
<input type="checkbox" name="interest" value="smoke"/>抽烟
<input type="checkbox" name="interest" value="drink"/>喝酒
<input type="checkbox" name="interest" value="game"/>游戏<br>
<input type="submit" value="注册">
</form>
</body>
</html>
request07
package com.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("/request07")
public class Request07 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取所有请求的参数名称: getParameterNames(),只能一对一获取,不能一对多
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("-------------------");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
/*结果:
* username
zhangsan
-------------------
password
123
-------------------
interest
smoke
-------------------*/
方式4:Map<String,String[]> getParameterMap():获取所有参数的map集合
request08
package com.Request;
import javax.servlet.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;
import java.util.Map;
import java.util.Set;
@WebServlet("/request08")
public class Request08 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取所有参数的map集合,可以一对多的遍历,获取参数值
Map<String,String[]> parameterMap=request.getParameterMap();
//遍历集合
Set<String> keyset1=parameterMap.keySet();
//增强for循环(类型名 变量:集合名)
//对name参数名称进行遍历
for (String name:keyset1){
//获取键和值(键值对)
System.out.println(name);
String[] values=parameterMap.get(name);
//对values参数值进行遍历
for (String value:values){
System.out.println(value);
}
System.out.println("---------------");
}
}
}
/*
* 结果:username
zhangsan
---------------
password
1223
---------------
interest
smoke
drink
---------------
* */
2.请求中文乱码问题:
* get方式:tomcat 8 已经将get方式乱码问题解决了
* post方式:会乱码
* 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>解决post中文乱码</title>
</head>
<body>
<form action="/Servlet_Test/request09" method="post">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="text" name="password" placeholder="请输入密码"><br>
<input type="submit" value="注册">
</form>
</body>
</html>
request09
package com.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("/request09")
public class Request09 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String value=request.getParameter("username");
System.out.println(value);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
3.请求转发:一种在服务器内部的资源跳转方式
- 步骤:
(1)通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
(2)使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) - 特点:
(1) 浏览器地址栏路径不发生变化
(2)只能转发到当前服务器内部资源中。
(3)转发是一次请求 - 共享数据: (只用于请求转发)
(1) 域对象:一个有作用范围的对象,可以在范围内共享数据
(2) request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
(3)方法:
*void setAttribute(String name,Object obj):存储数据
*Object getAttitude(String name):通过键获取值
*void removeAttribute(String name):通过键移除键值对
request10跳转到request01,2个共享数据
package com.Request;
import javax.servlet.RequestDispatcher;
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("/request10")
public class Request10 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("request10被访问了....");
//2.在请求转发前,存储数据到request域中,进行共享数据
request.setAttribute("msg","hello");
//request.removeAttribute("msg"); 通过键移除键值对
//1.转发到request01资源,访问/request01的内容
/*RequestDispatcher requestDispatcher=request.getRequestDispatcher("/request01");
requestDispatcher.forward(request,response);*/
//访问不了外部资源,只能访问该项目下(Servlet-Test)的服务器资源
//request.getRequestDispatcher("http://www.baidu.com").forward(request,response);
request.getRequestDispatcher("/request01").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
/*结果:
request10被访问了....
request对象继承体系结构:request01访问了
hello
* */