java web-7.2 Request_获取请求数据

request功能

一、获取请求消息数据
1.获取请求行数据
2.获取请求头数据
3. 获取请求体数据
二、其他功能
1.获取请求参数通用方式
2.请求转发
3.共享数据
4.获取ServletContext

一.获取请求消息数据

(1)获取请求行数据

GET /try/demo1?name=zhangsan HTTP/1.1

方法介绍
①获取请求方式 :GET String getMethod()
②获取虚拟目录:/try String getContextPath()
③获取Servlet路径 :/demo1 String getServletPath()
④获取get方式请求参数 :name=zhangsan String getQueryString()
⑤获取请求URI:
String getRequestURI(): try/demo1 URI:统一资源标识符 StringBuffer getRequestURL():http://localhost/try/demo1 URL:统一资源定位符
⑥获取协议及版本 :HTTP/1.1 String getProtocol()
⑦获取客户机的ip地址: String getRemoteAddr()
代码演示

package 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 {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doPost(req, resp);
    }
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // ①获取请求方式 :GET   `String getMethod()`
        String method = req.getMethod();
        System.out.println(method);

        //②获取虚拟目录:/try  `String getContextPath()`
        String contextPath = req.getContextPath();
        System.out.println(contextPath);

        //③获取Servlet路径 :/demo1   `String getServletPath()`
        String servletPath = req.getServletPath();
        System.out.println(servletPath);

        //④获取get方式请求参数 :name=zhangsan   `String getQueryString()`
        String queryString = req.getQueryString();
        System.out.println(queryString);

        /*
        ⑤获取请求URI:
     `String getRequestURI():    try/demo1
       StringBuffer getRequestURL():http://localhost/try/demo1`
         */
        String requestURI = req.getRequestURI();
        System.out.println(requestURI);
        StringBuffer requestURL = req.getRequestURL();
        System.out.println(requestURL);

        //⑥获取协议及版本 :HTTP/1.1   `String getProtocol()`
        String protocol = req.getProtocol();
        System.out.println(protocol);

        //⑦获取客户机的ip地址: `String getRemoteAddr()`
        String remoteAddr = req.getRemoteAddr();
        System.out.println(remoteAddr);
    }
}

注意:写在doGet中。
结果
启动,输入在这里插入图片描述
结果显示:
在这里插入图片描述
(2)获取请求头数据
方法

String getHeader(String name):通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames():获取所有的请求头名称

代码示例
示例1

package 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 {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //演示获取请求头数据
        //1.获取所有请求头名称
        Enumeration<String> headerNames = req.getHeaderNames();
        //2遍历
        while (headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            //根据名称获取请求头的值
            String value = req.getHeader(name);
            System.out.println(name+"---"+value);
        }
    }
}

结果
在这里插入图片描述
示例2:

 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //演示获取请求头数据user-agent
        String agent = req.getHeader("user-agent");
        //判断agent的浏览器版本
        if(agent.contains("Chrome")){
            System.out.println("谷歌哥哥哥哥");
        }else if(agent.contains("Firefox")){
            System.out.println("火狐呼呼呼");
        }
    }

结果:
在这里插入图片描述
示例3:

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //演示获取请求头数据:refer

        String refer = req.getHeader("referer");
        System.out.println(refer);
    }

这样的结果是null,应该从其他地方跳转到这个页面
在这里插入图片描述
添加一个login.html页面,使它跳转到这个页面获取referer

<body>

<form action="/demo3" method="GET">
    <input name = "username">
    <input type="submit" value="提交">
</form>
<hr>
 <a href="/pro1/requestDemo4">demo4</a>

</body>

启动服务器到login.html页面,点击demo4服务台会出现referer
在这里插入图片描述
服务台出现referer
在这里插入图片描述
可以通过referer完成防盗链

//防盗链
if(refer != null){
      //正常访问
      System.out.println("播放电影");
}else {
      //盗链
      System.out.println("i想看电影吗,来Uk");
 }

(3)获取请求体数据

请求体:只有post请求方式,才有请求体,在请求体中封装了post请求的请求参数
步骤:
①获取流对象

BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据

②再从流对象中拿数据

示例
1.写一个 regist页面

<body>
<form action="/pro1/requestDemo5" method="post">
    <input type="text" placeholder="请输入用户名" name="username"><br>
    <input type="text" placeholder="请输入密码" name="password"><br>

    <input type="submit" value="注册">
</form>
</body>

2.写一个requestDemo5

 @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求消息体--请求参数

        //1.获取字符流
        BufferedReader br = req.getReader();

        //2.读取数据
        String line = null;
        while((line = br.readLine()) != null){
            System.out.println(line);
        }
    }

3.启动服务器,输入用户名密码
在这里插入图片描述
4.看后台返回的参数
在这里插入图片描述

二.其他功能

1.获取请求参数通用方式 即无论是post还是get请求方式 都可以使用下列方法获取请求参数
(1)String getParameter(String name):根据参数名称获取参数值 username=zhangsan&password=123456
(2)String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=music&hobby=game
(3)Enumeration<String> getParameterNames():获取所有请求的参数名称
(4)Map<String,String[]> getParameterMap(): 获取所有参数的map集合

代码示例
①regist2

<body>
<form action="/pro1/requestDemo6" method="post">
    <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="music">音乐
    <br>

    <input type="submit" value="注册">
</form>
</body>

②RequestDemo6

@WebServlet( "/requestDemo6")
public class RequestDemo6 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //post 获取请求参数
        //根据参数名称获取参数值
        String username = req.getParameter("username");
        System.out.println("username");
        System.out.println("post"+username);
        System.out.println("========================================");
        
        //根据参数名称获取参数值的数组
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println("hobby");
            System.out.println(hobby);
        }
        System.out.println("============================================");
        
       // 获取所有请求的参数名称
        Enumeration<String> parameterNames = req.getParameterNames();
        while(parameterNames.hasMoreElements()){
            String s = parameterNames.nextElement();
            System.out.println(s);
            String value = req.getParameter(s);
            System.out.println(value);
            System.out.println("-------分隔符------");
        }
        System.out.println("========================================");
        //获取所有参数的map集合
        Map<String, String[]> parameterMap = req.getParameterMap();
        //遍历
        Set<String> keyset = parameterMap.keySet();
        for (String s : keyset) {
            String[] values = parameterMap.get(s);
            System.out.println(s);
            for (String value : values) {
                System.out.println(value);
            }
            System.out.println("+++++++分隔符++++++++++");
        }
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //get 获取请求参数
        /*
        //根据参数名称获取参数值
        String username = req.getParameter("username");
        System.out.println("post"+username);
         */
        this.doPost(req, resp);
    }
}

③启动服务器,输入用户名密码
在这里插入图片描述
④看后台结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:获取请求参数中文乱码问题
(1)get方式:tomcat8 已经将get方式乱码问题解决了
(2)post方式:会乱码
解决方法:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
2.请求转发一种在服务器内部的资源跳转方式
(1)步骤:
①通过request对象获取请求转发器对象:

RequestDispatcher getRequestDispatcher(String path)

②使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)

(2)特点
①地址栏路径不发生变化:访问了8也访问了9
②只能转发到当前服务器内部资源中
③转发是一次请求

3.共享数据
(1)域对象:一个有作用范围的对象,可以在范围内共享数据
(2)request域:代表一次请求的范围,一般用于请求转发的多个资源中共享的数据
(3)方法:
①void setAttribute(String name,Object obj):存储数据
②Object getAttribute(String name):通过键获取值
③void removeAttribute(String name):通过键移除键值对
例如:在demo8中
req.setAttribute("msg","hello"); req.getRequestDispatcher("/requestDemo9").forward(req,resp);

在demo9中

 Object msg = req.getAttribute("msg");
 System.out.println(msg);

4.获取ServletContext

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = req.getServletContext();
        System.out.println(servletContext);


    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值