赞
踩
在之前的service
方法中有两个参数request
对象和response
对象, request
和response
对象是由服务器创建的。
在我们向服务器发出请求时请求肯定会携带请求参数,在Tomcat中创建了Request
对象,这个对象中封装了请求消息数据;创建的Response
对象用来填充数据作为响应,这两个对象都将被作为参数传递给service
方法
request
对象继承体系结构:
ServletRequest – 接口
| 继承
|
HttpServletRequest – 接口
| 实现
|
org.apache.catalina.connector.RequestFacade 类(tomcat)
获取请求消息数据
获取请求行数据
示例:GET http://localhost:8080/web/demo3 HTTP/1.1
方法:
获取请求方式 :GET :String getMethod()
获取虚拟目录:/web String getContextPath()
获取Servlet路径:/demo3 String getServletPath()
获取get方式请求参数:name=qiangjingzhou String getQueryString()
获取请求URI:/web/demo3
String getRequestURI()
: /web/demo3
StringBuffer getRequestURL()
: http://localhost:8080/web/demo3
获取协议及版本:HTTP/1.1
1. String getProtocol()
获取客户机的IP地址:
1. String getRemoteAddr()
获取请求头数据
方法:
String getHeader(String name)
:通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames()
:获取所有的请求头名称
获取请求体数据:
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤:
获取流对象
BufferedReader getReader()
:获取字符输入流,只能操作字符数据ServletInputStream getInputStream()
:获取字节输入流,可以操作所有类型数据
再从流对象中拿数据
在之前的项目中在web目录下创建request目录,在该目录下创建RequestDemo1
类
该类的内容为
package com.westos.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; @WebServlet("/requestDemo1") public class RequestDemo1 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String method = request.getMethod(); System.out.println(method); String contextPath = request.getContextPath(); System.out.println(contextPath); String servletPath = request.getServletPath(); System.out.println(servletPath); String queryString = request.getQueryString(); System.out.println(queryString); String requestURI = request.getRequestURI(); StringBuffer requestURL = request.getRequestURL(); System.out.println(requestURI); System.out.println(requestURL); String protocol = request.getProtocol(); System.out.println(protocol); String remoteAddr = request.getRemoteAddr(); System.out.println(remoteAddr); } }
启动项目,启动后在浏览器访问该项目,访问URL为,这里我们偷了个懒,没有通过表单提交数据,直接在url后添加了请求参数
http://localhost:8080/web/requestDemo1?name=qiangjingzhou
注意:在访问前打开开发者工具
查看第一条请求
可以看到我们的请求数据,在IDEA 中查看控制台的输出
可以看到在控制台输出了请求头中的数据,可以通过这些数据做出相应的响应
获取的IP是IPV6版本的IP地址
这里需要注意一点,浏览器提交请求的方式默认是GET方式,当请求被提交到Servlet后,Servlet会根据请求方式是GET还是POST来执行相应的doGet还是doPost方法,我们需要将上面获得请求头数据的代码写到doGet方法中,如果写到doPost方法中就获取不到
在request目录下新建RequestDemo2,注意修改映射名
String getHeader(String name)
:通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames()
:获取所有的请求头名称
RequestDemo2中的内容为
package com.westos.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 { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取所有请求头名称 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()){ String name = headerNames.nextElement(); //根据请求头名称获取请求头的值 String value = request.getHeader(name); System.out.println(name + "----" + value); } } }
运行项目,在浏览器访问localhost:8080/web/requestDemo2
可以看到控制台输出的请求头是以键值对的形式存在
但是Enumeration<String> getHeaderNames()
方法用的比较少,因为我们一般在获取请求头的值的时候一般是知道请求头的名称的
可以获取user-agent
的内容,判断向服务器提交请求的浏览器的版本以及浏览器的种类来设置不同的响应来解决浏览器兼容的问题
对之前的项目做一些修改
package com.westos.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 { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取所有请求头名称 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()){ String name = headerNames.nextElement(); //根据请求头名称获取请求头的值 String value = request.getHeader(name); System.out.println(name + "----" + value); } String header = request.getHeader("user-agent"); if (header.contains("Firefox")){ System.out.println("火狐来了"); }else if (header.contains("Chrome")){ System.out.println("谷歌来了"); } } }
运行项目
在火狐浏览器上访问http://localhost:8080/web/requestDemo2
在谷歌浏览器上访问同样的url
前面的输出结果是因为我没有删除之前的获取请求头的代码,通过这样的方式可以解决浏览器兼容的问题
只有POST请求的方式才会有请求体,在请求体中封装的POST的请求参数
步骤:
获取流对象
BufferedReader getReader()
:获取字符输入流,只能操作字符数据ServletInputStream getInputStream()
:获取字节输入流,可以操作所有类型数据
再从流对象中拿数据
在web目录下创建register.html文档,文档的内容为
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/web/requestDemo3" method="post"> <input type="text" placeholder="请输入用户名", name="username"> <br> <input type="text" placeholder="请输入密码", name="password"> <br> <input type="submit" value="登录"> </form> </body> </html>
在request目录下创建 RequestDemo3
package com.westos.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.BufferedReader; import java.io.IOException; import java.util.Enumeration; @WebServlet("/requestDemo3") public class RequestDemo3 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BufferedReader reader = request.getReader(); String line = null; while((line = reader.readLine()) != null){ System.out.println(line); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
运行项目,在浏览器访问URL http://localhost:8080/web/register.html
输入用户名和密码
点击登录
可以在终端看到我们的请求参数
在request
中存在一些方法
获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
String getParameter(String name)
:根据参数名称获取参数值 username=qiangjingzhou&password=12138String[] getParameterValues(String name)
:根据参数名称获取参数值的数组 (多用于复选框)Enumeration<String> getParameterNames()
:获取所有请求的参数名称Map<String,String[]> getParameterMap()
:获取所有参数的map集合在web目录下创建register1.html文档
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/web/requestDemo4" method="post"> <input type="text" placeholder="请输入用户名", name="username"> <br> <input type="text" placeholder="请输入密码", name="password"> <br> <input type="submit" value="登录"> </form> </body> </html>
在request目录下创建RequestDemo4
package com.westos.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.BufferedReader; import java.io.IOException; @WebServlet("/requestDemo4") public class RequestDemo4 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); System.out.println("POST"); System.out.println(username); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); System.out.println("GET"); System.out.println(username); } }
在Servlet中获取请求参数username
的值,因为获取请求参数的方法在POST和GET是通用的,所以两种方法除了System.out.println("GET");
和System.out.println("POST");
的结果不同,其余如果在请求参数一致只有提交请求方式不同的情况下我们获取的参数的值是一样的
运行项目,在浏览器访问http://localhost:8080/web/register1.html
访问完成后,输入用户名和密码
可以看到请求的提交方式以及请求参数username的值
修改文档中的表单提交方式,运行项目,提交表单
可以看到提交方式发生改变,但是获取的参数和之前使用POST提交方式获取的参数一致,既然获取到的值是一致的并且代码也是一致通用的,就可以在doPost
方法中调用doGet
方法或者在doGet
方法中调用 doPost
方法
package com.westos.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.BufferedReader; import java.io.IOException; @WebServlet("/requestDemo4") public class RequestDemo4 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); System.out.println(username); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
这样可以节省许多代码,后续我们都会这样使用
接下来演示String[] getParameterValues(String name)
方法,这个方法主要应用于复选框,因为在复选框中一个名称对应多个请求参数的值
在web目录下创建register2.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/web/requestDemo4" method="get"> <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="study">学习 <br> <input type="submit" value="登录"> </form> </body> </html>
在request目录下创建RequestDemo5
package com.westos.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; @WebServlet("/requestDemo5") public class RequestDemo5 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String[] hobbies = request.getParameterValues("hobby"); for (String hobby : hobbies) { System.out.println(hobby); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
运行项目,在浏览器访问localhost:8080/web/register2.html
点击登录,可以看到控制台的输出
在上面的代码中添加
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
String s = parameterNames.nextElement();
System.out.println(s);
}
启动项目,在浏览器访问,随便输入一些参数,提交表单
获取到了请求参数的名称
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。