Servlet:request请求

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. 步骤:
    (1)通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
    (2)使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
  2. 特点:
    (1) 浏览器地址栏路径不发生变化
    (2)只能转发到当前服务器内部资源中。
    (3)转发是一次请求
  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
* */
发布了71 篇原创文章 · 获赞 10 · 访问量 3393

猜你喜欢

转载自blog.csdn.net/JH39456194/article/details/104212181
今日推荐