当前位置:   article > 正文

Javaweb中的Request(请求)和Response(响应)_java结合maven使用request

java结合maven使用request

目录

一、概念

二、请求(Request)

1.例子简介

2.Request继承体系

3.Request获取请求数据  

(1)请求行

(2)请求头

(3)请求体 

4.优化请求体参数的获取

5.解决请求参数乱码问题 

6.请求转发 

请求转发的特点

三、响应(Response)

1.Response继承体系

2.设置响应数据功能介绍

(1)响应行

(2)响应头

(3)响应体 

3.重定向

(1)实现方式:

(2)重定向特点 

4.资源路径问题 

(1)怎么判断谁使用?

(2)怎么使用虚拟目录呢?

5.Response响应字符数据

6.Response响应字节数据


一、概念

1.当我们用浏览器访问服务器的时候,服务器(tomcat)会用servlet方法去处理我们的请求并做出响应

二、请求(Request)

1.例子简介

用户使用get(地址栏可以看到具体信息)或者post(地址栏可以看到具体信息)请求访问时候里面都会携带很多数据,例如账户名密码这些,那么Request就会获取这些数据。

2.Request继承体系

爷爷----SevletRequest:Java对象提供的请求对象根接口

父亲----HttpServleRequest:Java提供的对Http协议封装的请求对象接口

儿子----RequestFacade:Tomcat定义的实现类 

ps:使用Request时候使用HttpServleRequest就好了

3.Request获取请求数据  

请求数据分为3部分

(1)请求行

获取请求方式(GET):getMethod

获取虚拟目录(项目访问路径):getContextPath

获取URL(统一资源定位符):getRequestURL

获取URI(统一资源标识符):getRequestURI

获取请求参数(GET方式):getQueryString

(2)请求头

获取请求头:getHeader

(3)请求体 

字节或者字符输入流读取,具体看要要求参数 

 具体代码

调用方式就是用注解调用ddd

  1. package com.project.JavaScript;
  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.BufferedReader;
  8. import java.io.IOException;
  9. @WebServlet("/ddd")
  10. public class aa extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. //一、获取请求行
  14. //1.getMethod:获取请求方式:GET
  15. String method = req.getMethod();
  16. System.out.println(method);
  17. //2.getContextPath:获取虚拟目录
  18. String contextPath = req.getContextPath();
  19. System.out.println(contextPath);
  20. //3.getRequestURL:获取URL(统一资源定位符)
  21. StringBuffer requestURL = req.getRequestURL();
  22. System.out.println(requestURL);
  23. //4.getRequestURI:获取统一资源标识符
  24. String requestURI = req.getRequestURI();
  25. System.out.println(requestURI);
  26. //5.getQueryStrin:获取请求参数(GET方式)
  27. String queryString = req.getQueryString();
  28. System.out.println(queryString);
  29. //二获取请求头
  30. // 6.获取请求头:user-agen--浏览器的版本信息
  31. String agent = req.getHeader("user-agent");
  32. System.out.println(agent);
  33. //三、获取请求体
  34. //1.获取字节输入流
  35. BufferedReader reader = req.getReader();
  36. //2.读取数据
  37. String line = reader.readLine();
  38. System.out.println(line);
  39. }
  40. @Override
  41. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  42. //如果有post请求就让它去doGet里面找吧
  43. this.doGet(req,resp);
  44. }
  45. }

 如下是为了第三的请求体有东西调用而写的一个html表单

调用方式:运行的网页地址加上这个html名字(req.html)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <!--第一个填虚拟目录名称:/maven_java_war/ddd,第二个填的是发送的是get还是post-->
  9. <form action="/maven_java_war/ddd" method="post">
  10. <!--账号输入框-->
  11. <input type="text" name="username">
  12. <!--密码输入框-->
  13. <input type="password" name="password">
  14. <!--提交按钮-->
  15. <input type="submit">
  16. </form>
  17. </body>
  18. </html>

运行结果

POST
/maven_java_war
http://localhost:8080/maven_java_war/ddd
/maven_java_war/ddd
null


Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46


username=666&password=666666 

4.优化请求体参数的获取

上面在获取请求体的时候还不是很好,现在要优化,把请求体中的数据放到Map集合中,再通过map集合的方式获取出来

获取全部Map集合的方法:getParameterMap

获取数组Map集合的方法:getParameterValues

获取单个Map集合的方法:getParameter

被获取的HTML代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <!--第一个填虚拟目录名称:/maven_java_war/ddd,第二个填的是发送的是get还是post-->
  9. <form action="/maven_java_war/ddd" method="post">
  10. <!--账号输入框-->
  11. <input type="text" name="username">
  12. <!--密码输入框-->
  13. <input type="password" name="password">
  14. <!-- 选项框 -->
  15. <input type="checkbox" name="hobby" value="1">睡觉
  16. <!--提交按钮-->
  17. <input type="submit">
  18. </form>
  19. </body>
  20. </html>

获取代码

  1. package com.project.JavaScript;
  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.Map;
  9. @WebServlet("/ddd")
  10. public class aa extends HttpServlet {
  11. @Override
  12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. //一、获取全部
  14. //1.获取所有参数的Map集合
  15. Map<String,String[]> map = req.getParameterMap();
  16. //2.遍历快捷键:iter+回车
  17. for (String key : map.keySet()) {
  18. System.out.println("key为:"+key);
  19. //3.获取值
  20. String[] values = map.get(key);
  21. //4.遍历快捷键:iter+回车
  22. for (String value : values) {
  23. System.out.println("map集合的全部为:"+value);
  24. }
  25. }
  26. System.out.println("===========分界线===============");
  27. //二、根据key,也就是键获取数组
  28. String[] hobbies = req.getParameterValues("hobby");
  29. for (String hobby : hobbies) {
  30. System.out.println("这是第二种方式的运行结果"+hobby);
  31. }
  32. System.out.println("===========分界线===============");
  33. //三、根据key,获取单个值
  34. String username = req.getParameter("username");
  35. String password = req.getParameter("password");
  36. System.out.println("用户名为:"+username);
  37. System.out.println("密码为:"+password);
  38. }
  39. @Override
  40. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  41. //如果有post请求就让它去doGet里面找吧
  42. this.doGet(req,resp);
  43. }
  44. }

运行结果

key为:username
map集合的全部为:zhangsan
key为:password
map集合的全部为:1433223dadqw
key为:hobby
map集合的全部为:1
===========分界线===============
这是第二种方式的运行结果1
===========分界线===============
用户名为:zhangsan
密码为:1433223dadqw

 

5.解决请求参数乱码问题 

解决请求参数中文乱码(post和get)_云边的快乐猫的博客-CSDN博客

 

6.请求转发 

请求转发(forward):一种在服务器内部的资源跳转方式。当访问了资源A,资源A处理了一部分,然后在转发给资源B处理。

请求转发的特点

(1)浏览器地址栏路径不发生变化

(2)只能转发到当前服务器的内部资源

(3)一次请求,可以在转发的资源使用request共享数据

转发的代码

//tt是下一步要转到的目标类的注解

request.getRequestDispatcher("tt").forward(request,response);

 其他方法

void setAttribute(String name,Object o);//储存数据到request域中

Object getAttribute(String name);//根据key,获取值

void removeAttribute(String name);//根据key,删除键值对

三、响应(Response)

1.Response继承体系

爷爷----SevletResponse:Java对象提供的请求对象根接口

父亲----HttpServleResponse:Java提供的对Http协议封装的请求对象接口

儿子----ResponseFacade:Tomcat定义的实现类 

ps:使用Request时候使用ttpServleResponse就好了

2.设置响应数据功能介绍

(1)响应行

例子:HTTP/1.1 200 OK 

ps:HTTP/1.1是服务器版本,200是响应状态码,OK就是没问题

设置响应状态码:void setStatus(int sc);

(2)响应头

例子:Content-Type:text/html

设置响应头键值对:void setHeads(String name,String value);

(3)响应体 

例子:<html><head>head><body><body></html>

获取字符输出流:PrintWriter  getWriter();

获取字节输出流:ServletOutputStream();

3.重定向

一种资源跳转方式(例如访问资源A,A说我处理不了,我告诉你资源B的地址,你去找它处理吧)。那怎么处理不了怎么通知对方呢,就是用状态码302代表说我处理不了,对方地址是:响应头location:xxxxxx 

(1)实现方式:

resp.setStatus(302);

resp.setHeader("location","资源B的路径"); 

这是简写方式 

  1. //重定向
  2. //设置响应头:baidu是跳转目标类的注解
  3. response.sendRedirect("baidu");

(2)重定向特点 

浏览器地址栏路径发生变化

可以重定向到任意位置的资源(服务器内外部都可以)

两次请求,不能在多个资源使用request共享数据 

4.资源路径问题 

浏览器使用:需要加虚拟目录(项目访问路径)

服务端使用:不需要加虚拟目录

(1)怎么判断谁使用?

有请求(request)或者响应(response)这些都是服务端使用。但是转发是个例外。其余的都是浏览器使用(标签什么的)

(2)怎么使用虚拟目录呢?

一般在pom.xml文件配置的path里面可以设置,但是一般不建议,这样耦合度太高

所以要把里面我的默认访问/a删掉。 然后在要访问的类里面设置一个动态虚拟访问路径语句

  1. //重定向
  2. //动态获取虚拟目录
  3. String contextPath = request.getContextPath();
  4. //设置响应头:baidu是跳转目标类的注解。然后动态虚拟目录+注解
  5. response.sendRedirect(contextPath+"/baidu");

5.Response响应字符数据

  1. //1.设置字符集编码解析
  2. response.setContentType("text/html;charset=utf-8");
  3. //2.获取字符输入流
  4. PrintWriter writer = response.getWriter();
  5. //写入中文
  6. writer.write("你好");
  7. //写入标签
  8. writer.write("<h1>aa</h1>");

6.Response响应字节数据

(1) 相对复杂写法

  1. //1.字节输入流读取文件
  2. FileInputStream fis = new FileInputStream("D:\\图片\\个人\\杂物\\小图片.png");
  3. //2.获取response字节输出流
  4. ServletOutputStream os = response.getOutputStream();
  5. //3.完成流的复制
  6. byte[] bytes = new byte[1024];
  7. int len = 0;
  8. while ((len = fis.read(bytes))!=-1){
  9. os.write(bytes,0,len);
  10. }

(2)简单的写法

  1. //1.字节输入流读取文件
  2. FileInputStream fis = new FileInputStream("D:\\小图片.png");
  3. //2.获取response字节输出流
  4. ServletOutputStream os = response.getOutputStream();
  5. //3.使用便捷的方式完成流的copy
  6. IOUtils.copy(fis,os);
  7. //关闭流
  8. fis.close();

ps:使用这个简单的写法要pom里面导入对应的maven。要不然爆红用不了的

  1. <dependency>
  2. <groupId>commons-io</groupId>
  3. <artifactId>commons-io</artifactId>
  4. <version>2.6</version>
  5. </dependency>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/259426?site
推荐阅读
相关标签
  

闽ICP备14008679号