Servlet的request对象

request对象的继承关系

1.HttpServletRequest接口继承了ServletRequest接口,对其父接口进行了扩展,可以处理满足所有http协议的请求

2.HttpServletRequest和ServletRequest都是接口,不能创建对象,因此在tomcat底层定义实现类并创建实现类对象

public class RequestFacade implements HttpServletRequest{}

tomcat底层创建门面类RequestFacade对象

ServletRequest request=new RequestFacade();多态 

request对象的API方法

获取请求行

String getMethod()

Get the request method, e.g. GET, POST, etc.

获取请求方法

 public String getContextPath()

访问虚拟目录(项目访问路径)就是我们在Tomcat配置的位置设置的路径,是虚拟的,就是随便定义的 如果设置虚拟路径位置是/ 那么该方法获取的内容是空字符串

public StringBuffer getRequestURL()

返回的 URL 包含一个协议、服务器名称、端口号、服务器路径,但是不包含查询字符串参数(获取的是请求资源的绝对路径,包含三要素(IP协议,IP地址,端口号)),没有请求参数
 

public String getRequestURI()

获取的是请求资源的绝对路径,但是不包含三要素,没有请求参数
 

public String getQueryString()

返回包含在请求 URL 中路径后面的查询字符串。如果 URL 没有查询字符串,则此方法返回 null只能获取GET请求的请求参数(因为get请求的请求参数在URL后面)
 

测试

浏览器页面

@WebServlet("/requestDemo1")
public class requestDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求方法
        String method = request.getMethod();
        System.out.println(method);//GET

        //访问虚拟目录
        String contextPath = request.getContextPath();
        System.out.println(contextPath);//如果是/ 则为空字符串

        //获取URL路径(资源的URL路径,包含三要素)
        StringBuffer requestURL = request.getRequestURL();
        //StringBufffer和StringBuilder都是字符串缓冲区 ,字符可以改变
        //StringBuilder线程不安全,效率高
        //StringBuffer线程安全,效率低
        String rs = requestURL.toString();
        System.out.println(rs);//http://localhost:8080/requestDemo1

        //获取URI路径(不包含三要素的URL路径)
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);///requestDemo1

        //获取请求参数(GET方式适用)
        String queryString = request.getQueryString();
        System.out.println(queryString);//username=aa&pwd=bb


    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

获取请求头

public String getHeader(String name)

String 的形式返回指定请求头的值。如果该请求不包含指定名称的头,则此方法返回 null。如果有多个具有相同名称的头,则此方法返回请求中的第一个头。头名称是不区分大小写的。可以将此方法与任何请求头一起使用。

name指定头名称的 String
return包含请求头的值的 String,如果该请求没有该名称的头,则返回 null

 name就是冒号左边的标识

获取请求体(POST请求)

 public ServletInputStream getInputStream()

获取字节和字符数据

public java.io.BufferedReader getReader()

获取字符数据

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>POST请求</h2>
<form action="/requestDemo2" method="post">
    <input type="text" name="username"/> <br>
    <input type="text" name="password"/> <br>
    <input type="submit" value="提交"> <br>
</form>
</body>
</html>

@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取输入流对象
        BufferedReader reader = request.getReader();
        String line=null;
        while((line=reader.readLine())!=null){
            System.out.println(line);//username=hhhh&password=123456
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

浏览器:


获取请求参数的通用方式

get请求是getQueryString()方法

post请求是getReader(),getInputStream() 

目录

request对象的继承关系

request对象的API方法

获取请求行

String getMethod()

 public String getContextPath()

public StringBuffer getRequestURL()

public String getRequestURI()

public String getQueryString()

获取请求头

public String getHeader(String name)

获取请求体(POST请求)

 public ServletInputStream getInputStream()

public java.io.BufferedReader getReader()

获取请求参数的通用方式

public java.util.MapgetParameterMap(),>

String[] getParameterValues(String name)

 String getParameter(String name)


通用方法

public java.util.Map<String, String[]>getParameterMap()

获取所有请求参数的map集合 

String[] getParameterValues(String name)

根据参数名字获取参数值(数组)

name是前端请求参数的等号左边的key 

 String getParameter(String name)

根据参数名字获取参数值(单个值)

注意:如果参数name有多个值,取第一个

前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/requestDemo3" method="post">
        用户:<input type="text" name="username"> <br>
        密码:<input type="password" name="pwd"> <br>
        爱好:<input type="checkbox" name="hoppy" value="1">爬山
        <input type="checkbox" name="hoppy" value="2">游泳<br>
        <input type="submit" value="提交">
        
    </form>

</body>
</html>

@WebServlet("/requestDemo3")
public class requestDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("前端提交数据的方式是"+request.getMethod());
        //获取所有请求参数的map对象
        Map<String, String[]> map = request.getParameterMap();
        map.forEach((key,value)-> System.out.println(key+"--->"+ Arrays.toString(value)));

        //获取指定name的参数值(数组)
        String[] usernames = request.getParameterValues("username");
        System.out.println(Arrays.toString(usernames));

        // //获取指定name的参数值(单个值)
        String hoppy = request.getParameter("pwd");
        System.out.println(hoppy);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

浏览器

结果:

前端提交数据的方式是POST
username--->[hhhh]
pwd--->[aa]
hoppy--->[1, 2]
[hhhh]
aa 

POST请求 如果输入的值有中文就会出现乱码的问题 

前端提交数据的方式是POST
username--->[?????????]
pwd--->[qqq]
hoppy--->[1, 2]
[?????????]
qqq 

解决方法

        //方法一:
        //使用request对象调用方法
        request.setCharacterEncoding("UTF-8");//告知tomcat使用UTF-8进行解码
        //注意:解决请求体数据的乱码(解决POST乱码的)

        //方法二:
        //使用javase的API方法
        String username = request.getParameter("username");
        username = URLEncoder.encode(username, "ISO-8859-1");//编码
        username = URLDecoder.decode(username,"UTF-8");//解码
        System.out.println(username);

        //方法三:
        //使用javase的API解决即String类
        byte[] bytes = username.getBytes("ISO-8859-1");//编码
        String s = new String(bytes,"UTF-8");//解码
        System.out.println(s);

request对象的生命周期

何时创建?

浏览器第一次访问tomcat服务器的时候

谁创建?

tomcat服务器

创建request对象干什么?

浏览器第一次访问tomcat服务器时,tomcat服务器创建request和reponse对象,传递给servlet中的service方法,然后我们就可以在servlet中使用request对象调用方法获取请求数据,然后处理业务逻辑,处理完毕后响应给浏览器,浏览器收到数据响应之后,tomcat会销毁request和reponse对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落落落sss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值