学习HttpServletRequest

1.HttpServletRequest及其作用

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
1、概念:

HttpServletRequest对象代表客户端的请求,封装了请求信息;

2、request工作原理图
在这里插入图片描述
3、小结

1、HttpServletRequest对象:HttpServletRequest对象代表了客户端的请求,封装了请求信息;
2、HttpServletRequest对象的作用:封装请求数据(请求行,请求头和请求体)以及一些API;

2.Request常用API

request对象将请求数据封装并且提供了获取这些请求数据的API,这些API可以分为以下几类:

1. 获取请求行信息:请求方式,url和HTTP版本。
2. 获取请求头信息:浏览器类型,ip地址等。
3. 获取请求参数:url后面拼接的参数或者请求体中提交的参数;
2.1获取请求行信息

请求行中包含请求方式,url和协议/版本信息,以下API可或者这些信息。

方法说明
String getMethod()获取请求方式的类型
StringBuffer getRequestURL()获取客户端发出请求完整URL
String getRemoteAddr()获取IP地址
String getProtocol()获取当前协议的名称和版本

步骤:
1、创建一个Servlet类:RequestRowServlet;

2、设置映射路径为:/requestRowServlet;

3、在doGet方法中分别调用request的以下方法,并打印;

getMethod():获取请求方式
getRequestURL():获取请求的url
getRemoteAddr():获取请求的ip地址
getProtocol():获取当前协议的名称和版本

4、访问/requestRowServlet查看控制台上的打印信息:

实现: 使用request对象获取请求头信息
1、创建一个Servlet类:RequestRowServlet;

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;

/**
 * @author suyi
 * @version v1.0
 * @date 2018/12/8 20:34
 * @description TODO
 **/
@WebServlet(urlPatterns = "/requestRowServlet")
public class RequestRowServlet 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 {
    }
}

2、设置映射路径为:/requestRowServlet;

3、在doGet方法中分别调用request的以下方法,并打印;

getMethod():获取请求方式
getRequestURL():获取请求的url
getRemoteAddr():获取请求的ip地址
getProtocol():获取当前协议的名称和版本
@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求行的请求方式
        String method = request.getMethod();
        System.out.println("method = " + method);

        //获取请求行的请求URL
        StringBuffer requestURL = request.getRequestURL();
        System.out.println("requestURL = " + requestURL);

        //获取请求行的请求IP
        String remoteAddr = request.getRemoteAddr();
        System.out.println("remoteAddr = " + remoteAddr);

        //获取请求行的协议版本号
        String protocol = request.getProtocol();
        System.out.println("protocol = " + protocol);
    }

4、启动tomcat,访问这个servlet,查看控制台打印信息;

method = GET
requestURL = http://localhost:8080/httpRequestServlet
remoteAddr = 0:0:0:0:0:0:0:1
protocol = HTTP/1.1

小结:

1、获取请求行的API:
	获取请求方式:getMethod()
	获取请求url:getRequestURL()
	获取请求的ip:getRemoteAddr()
	获取请求的协议/版本号:getProtocol()
	
2、注意事项:
	当请求的ip为localhost的时候,getRemoteAddr方法获取的是IPv6的格式。
2.2 获取请求头信息

浏览器的请求头信息是由很多:形式的数据组成的。HttpServletRequest对象给我们提供了两个方法用来获取请求的头信息。

方法作用
String getHeader(String name)根据请求头的k关键字获取请求头信息
Enumeration getHeaderNames()返回此请求包含的所有头信息的枚举

【说明】请求头的k关键字如下表所示:

请求头key请求头value
referer浏览器通知服务器,当前请求来自何处,如果是直接访问,则不会有这个头。常用于:防盗链
cookie与会话有关技术,用于存放浏览器缓存的cookie信息。
user-agent浏览器通知服务器,客户端浏览器与操作系统相关信息
host请求的服务器主机名

步骤:
1、创建一个Servlet类RequestHeaderServlet,设置映射地址为/requestHeaderServlet;

2、在doGet方法中获取请求头user-agent的值和所有的请求头的name值;

3、将获取的结果打印输出到控制台上;

4、启动tomcat,访问该Servlet;

实现: 使用request对象获取常用请求头信息
1、创建一个Servlet类RequestHeaderServlet,设置映射地址为/requestHeaderServlet;

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;

/**
 * @author suyi
 * @version v1.0
 * @date 2018/12/8 21:09
 * @description TODO
 **/
@WebServlet(urlPatterns = "/requestHeaderServlet")
public class RequestHeaderServlet 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 {
       
    }
}

2、在doGet方法中获取请求头user-agent的值和所有的请求头的name值;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //请求头学习
        //获取user-agent 对应value值
        String header = request.getHeader("user-agent");
        System.out.println("user-agent = " + header);

        //获取所有请求key信息
        Enumeration<String> headerNames = request.getHeaderNames();

        while (headerNames.hasMoreElements()){
            System.out.println(headerNames.nextElement());
        }
    }

3、将获取的结果打印输出到控制台上;

4、启动tomcat,访问该Servlet,查看控制台上的打印信息;

user-agent = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
host
connection
cache-control
upgrade-insecure-requests
user-agent
accept
accept-encoding
accept-language
cookie

小结:

1、获取指定请求头的信息: request.getHeader("name");
2、获取所有的请求头的key值:request.getHeaderNames();
3、常用请求头:user-agent
2.3 获取请求数据【重要】

由于get和post请求提交数据的格式都是name=value,request给我们提供了getParameter(name)方法,获取指定name属性值的标签提交的value值。

request获取请求数据的API如下:

方法名描述
String getParameter(String name)getParameter获得指定参数名对应的值。如果没有返回null,如果只有多个获得第一个。 例如:username=jack
String[] getParameterValues(name)getParameterValues[] 获取请求数据key相同的多个数据
request.getParameterMap();获得所有表单的数据,封装到map中

步骤:
1、编写注册页面register.html;

2、编写Servlet类接收注册页面提交的数据;

3、在Servlet类中分别使用上述3个API获取表单提交的数据,并打印到控制台上;

4、启动tomcat,访问注册页面,填写数据并提交。在后台控制台中查看打印信息;
实现: 使用request对象的API获取表单提交的数据
1、编写注册页面register.html;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/registerServlet" method="post">
    用户名:<input type="text" name="username"/><br/>
    密码:<input type="password" name="password"/><br/>
    爱好:<input type="checkbox" name="hobby" value="basketball"/>篮球
          <input type="checkbox" name="hobby" value="football"/>足球
          <input type="checkbox" name="hobby" value="pingpang"/>乒乓球<br/>
    学历:<select name="education">
            <option value="gaozhong">高中</option>
            <option value="dazhuan">大专</option>
            <option value="benke">本科</option>
        </select>
        <br>
    <input type="submit" value="post提交"/>
</form>
</body>
</html>

2、编写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.Arrays;
import java.util.Map;

/**
 * @author suyi
 * @version v1.0
 * @date 2018/12/8 21:33
 * @description TODO
 **/
@WebServlet(urlPatterns = "/registerServlet")
public class RegisterServlet 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 {
        //非常重要API  请求参数/请求体API
        //获取用户名
        System.out.println("============getParameter方法获取指定name的value值===================");
        String username = request.getParameter("username");
        System.out.println("username = " + username);
        String password = request.getParameter("password");
        System.out.println("password = " + password);
        //请求爱好
        System.out.println("===============getParameterValues根据name获取多个value值===================");
        String[] hobbies = request.getParameterValues("hobby");
        String s = Arrays.toString(hobbies);
        System.out.println("s = " + s);

        //获取表单所有信息
        System.out.println("===============getParameterMap获取所有的数据封装到map中==================");
        Map<String, String[]> parameterMap = request.getParameterMap();
        //获取用户输入所有值
        for (String key : parameterMap.keySet()) {
            System.out.println(key+"="+Arrays.toString(parameterMap.get(key)));
        }
    }
}

3、在Servlet类中分别使用上述3个API获取表单提交的数据,并打印到控制台上;

4、启动tomcat,访问注册页面,填写数据并提交。在后台控制台中查看打印信息;
在这里插入图片描述
小结:

1、根据name值获取value值: request.getParameter();
2、根据name值获取多个value值:request.getParameterValues();
3、获取所有的请求数据,封装到map中:request.getParameterMap();
注意事项:
	请求数据的获取都是根据表单项的name值获取,如果表单项中没有name属性,数据将不会被提交到服务器,后台也就无法获取。

【注意事项】中文乱码问题

描述:post请求提交的中文数据,在Servlet中获取会乱码

1、POST请求提交数据乱码问题:
	原因:tomcat接收post请求数据采用的编码是ISO-8859-1,而我们的整个编码环境都是UTF-8。所以会导致乱码。
	解决方法:
		1、将tomcat编码改为UTF-8;
		2、Servlet中获取数据前,将request编码设置为UTF-8:request.setCharacterEncoding("UTF-8");

2、GET请求提交的中文数据乱码问题已经被tomcat处理:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值