java web-7.2 Request_获取请求数据

电玩女神 2023-07-25 11:28 98阅读 0赞

request功能

一、获取请求消息数据
1.获取请求行数据
2.获取请求头数据

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

一.获取请求消息数据

(1)获取请求行数据

  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()
代码演示

  1. package web.request;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. /* 演示request对象获取请求行数据 */
  9. @WebServlet( "/requestDemo1")
  10. public class RequestDemo1 extends HttpServlet {
  11. @Override
  12. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. //super.doPost(req, resp);
  14. }
  15. @Override
  16. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  17. // ①获取请求方式 :GET `String getMethod()`
  18. String method = req.getMethod();
  19. System.out.println(method);
  20. //②获取虚拟目录:/try `String getContextPath()`
  21. String contextPath = req.getContextPath();
  22. System.out.println(contextPath);
  23. //③获取Servlet路径 :/demo1 `String getServletPath()`
  24. String servletPath = req.getServletPath();
  25. System.out.println(servletPath);
  26. //④获取get方式请求参数 :name=zhangsan `String getQueryString()`
  27. String queryString = req.getQueryString();
  28. System.out.println(queryString);
  29. /* ⑤获取请求URI: `String getRequestURI(): try/demo1 StringBuffer getRequestURL():http://localhost/try/demo1` */
  30. String requestURI = req.getRequestURI();
  31. System.out.println(requestURI);
  32. StringBuffer requestURL = req.getRequestURL();
  33. System.out.println(requestURL);
  34. //⑥获取协议及版本 :HTTP/1.1 `String getProtocol()`
  35. String protocol = req.getProtocol();
  36. System.out.println(protocol);
  37. //⑦获取客户机的ip地址: `String getRemoteAddr()`
  38. String remoteAddr = req.getRemoteAddr();
  39. System.out.println(remoteAddr);
  40. }
  41. }

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

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

代码示例
示例1

  1. package web.request;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.util.Enumeration;
  9. @WebServlet( "/requestDemo2")
  10. public class RequestDemo2 extends HttpServlet {
  11. @Override
  12. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. //super.doPost(req, resp);
  14. }
  15. @Override
  16. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  17. //演示获取请求头数据
  18. //1.获取所有请求头名称
  19. Enumeration<String> headerNames = req.getHeaderNames();
  20. //2遍历
  21. while (headerNames.hasMoreElements()){
  22. String name = headerNames.nextElement();
  23. //根据名称获取请求头的值
  24. String value = req.getHeader(name);
  25. System.out.println(name+"---"+value);
  26. }
  27. }
  28. }

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

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

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

  1. @Override
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. //演示获取请求头数据:refer
  4. String refer = req.getHeader("referer");
  5. System.out.println(refer);
  6. }

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

  1. <body>
  2. <form action="/demo3" method="GET">
  3. <input name = "username">
  4. <input type="submit" value="提交">
  5. </form>
  6. <hr>
  7. <a href="/pro1/requestDemo4">demo4</a>
  8. </body>

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

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

(3)获取请求体数据

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

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

②再从流对象中拿数据

示例
1.写一个 regist页面

  1. <body>
  2. <form action="/pro1/requestDemo5" method="post">
  3. <input type="text" placeholder="请输入用户名" name="username"><br>
  4. <input type="text" placeholder="请输入密码" name="password"><br>
  5. <input type="submit" value="注册">
  6. </form>
  7. </body>

2.写一个requestDemo5

  1. @Override
  2. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. //获取请求消息体--请求参数
  4. //1.获取字符流
  5. BufferedReader br = req.getReader();
  6. //2.读取数据
  7. String line = null;
  8. while((line = br.readLine()) != null){
  9. System.out.println(line);
  10. }
  11. }

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

  1. <body>
  2. <form action="/pro1/requestDemo6" method="post">
  3. <input type="text" placeholder="请输入用户名" name="username"><br>
  4. <input type="text" placeholder="请输入密码" name="password"><br>
  5. <input type="checkbox" name="hobby" value="game">游戏
  6. <input type="checkbox" name="hobby" value="music">音乐
  7. <br>
  8. <input type="submit" value="注册">
  9. </form>
  10. </body>

②RequestDemo6

  1. @WebServlet( "/requestDemo6")
  2. public class RequestDemo6 extends HttpServlet {
  3. @Override
  4. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  5. //post 获取请求参数
  6. //根据参数名称获取参数值
  7. String username = req.getParameter("username");
  8. System.out.println("username");
  9. System.out.println("post"+username);
  10. System.out.println("========================================");
  11. //根据参数名称获取参数值的数组
  12. String[] hobbies = req.getParameterValues("hobby");
  13. for (String hobby : hobbies) {
  14. System.out.println("hobby");
  15. System.out.println(hobby);
  16. }
  17. System.out.println("============================================");
  18. // 获取所有请求的参数名称
  19. Enumeration<String> parameterNames = req.getParameterNames();
  20. while(parameterNames.hasMoreElements()){
  21. String s = parameterNames.nextElement();
  22. System.out.println(s);
  23. String value = req.getParameter(s);
  24. System.out.println(value);
  25. System.out.println("-------分隔符------");
  26. }
  27. System.out.println("========================================");
  28. //获取所有参数的map集合
  29. Map<String, String[]> parameterMap = req.getParameterMap();
  30. //遍历
  31. Set<String> keyset = parameterMap.keySet();
  32. for (String s : keyset) {
  33. String[] values = parameterMap.get(s);
  34. System.out.println(s);
  35. for (String value : values) {
  36. System.out.println(value);
  37. }
  38. System.out.println("+++++++分隔符++++++++++");
  39. }
  40. }
  41. @Override
  42. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  43. //get 获取请求参数
  44. /* //根据参数名称获取参数值 String username = req.getParameter("username"); System.out.println("post"+username); */
  45. this.doPost(req, resp);
  46. }
  47. }

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

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

  1. RequestDispatcher getRequestDispatcherString 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中

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

4.获取ServletContext

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

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,98人围观)

还没有评论,来说两句吧...

相关阅读