前面Servlet笔记当中我们讲了:客户端通过写URL相对应的路径,就能访问到我们部署到服务器当中项目的资源
总结: req (请求数据):通过把浏览器当中用户的请求数据通过key,value(数组格式)的形式存放的Map集合中,
我们通过调用集合的方法即可拿到用户请求的数据
response (响应数据):我们先通过io流先读取文件里面的数据(文本 or 照片 or视频....),然后把读取到的数据通过resp对象的输出流传递给浏览器(客户端)响应的数据
具体的方法看下面笔记即可
其实 客户端向服务器当中请求相对应的项目资源的时候,是有HTTP请求协议的, 并且我们服务器返回给客户端相应请求的资源的时候,也是有HTTP协议的: 但是我们协议到底放在哪了呢,其实Tomcat服务器帮我们封装到Reques 和 Response 对象当中了:
req :就是Reques对象 resp:就是Response对象
HttpServlet类 主要是对Servlet接口中的service()方法的封装
介绍完这两个对象的作用后,下面开始介绍这两个对象:
下面的演示:就完成了客户端和我们之间的交互问题
客户端向我们的demo8路径下发送资源请求: (默认get方式)
resp.setHeader 是解决中文乱码问题
Request对象介绍 Request获取客户端向服务端请求的数据:(获取客户端请求的数据信息,客户端的请求信息以请求行,头,体的格式存储在HTTP协议当中, 当客户端请求我们服务端的时候,其实HTTP协议是被Tomact服务器封装到req对象当中了 因此我们可以调用方法获取客户端请求的各个信息)
注意:这里面的方法 get请求方式和post请求方式都可以用
代码演示:
开启服务器后,浏览器(客户端)请求该项目下 /req1 路径下资源:
(get请求格式):
我们通过req的方法 拿到关于客户端的数据如下:
因为只有post请求才有请求体,因此我们用客户端post请求的方式演示请求头和请求体的方法吧:
写客户端: 这个a.html其实就是浏览器(客户端):因为HTML本身就是一个页面
这里通过流的方式拿到的是客户端全部的数据:(拿到后我们还要对数据进行分割,下面我们会讲到req对象已经通过把数据通过key value的形式封装到Map集合当中不再让我们进行对整行数据的分割了)
客户端请求路径下的资源:
一、Request通用方式获取请求参数
注意:用户端请求数据行当中:等号左边数据被封装成了Map集合中的key 右边数据被封装成了value (value:数组形式)
注意:这个Map集合是req对象封装的,而且这个Map集合对象是在req对象当中的(这个集合里面放的都是客户端的请求数据)
req对象帮我们把用户端的请求数据以key value的形式封装到Map集合当中的原因就是:
我们不用再直接把客户端请求数据拿到然后一点一点分割了 如:username=kitty&hobby=1&hobby=2 直接帮我们分割成key和value了 我们想用哪个数据的时候直接调用Map集合获取就可以了
我们假设客户端请求的参数是: username=zhangsan&hobby=1&hobby=2 (这里key:hobby就重复了 所以证明了value是数组的重要性):
request接收到客户端的请求数据后,会把参数帮我们变成key和value的形式,并且key重复的时候 value也不会发生覆盖 (把value变成了数组格式 存放key相同的value)存放到Map集合当中
假设客户端的请求数据如下(get请求方式):
服务端拿到浏览器的请求数据后,首先会把HTTP协议封装到req对象当中, 并且把请求数据帮我们分割然后存放到Map集合当中 (这个Map集合的value是数组):这时的Map集合当中已经被req对象封装好了数据,我们只需要拿到Map集合 调用方法取数据即可 如下的形式:
演示req另外两个常用方法:(常用)客户端请求服务器时首先会把HTTP请求协议封装到req对象当中, 并且把请求数据帮我们分割然后存放到Map集合当中 (这个Map集合的value是数组):
客户端请求的数据:
我们服务端通过req对象调用Map集合(注意:这个Map集合是在req对象当中 HTTP和Map集合是封装到req对象当中的 )中的方法即可把相对应的请求数据拿到手:
查看我们拿到的数据:
其实:这一套获取客户端请求数据的req对象调用的方法在post请求方法当中也是一模一样的,但客户端以post形式请求数据的时候,我们同样用这样的方法可以拿到客户端的请求数据演示如下:
客户端以post请求方式请求数据:
因此 我们就用到了标题:Request通用方法获取客户端请求参数数据:
最终写法可以如下:
客户端以post请求方式请求演示:
服务端我们获取到的客户端请求数据:
二、idea模板创建Servlet就是当我们服务端创建资源的时候直接把我们的Servlet模板创建如下的形式(就相当于一键生成一下模板的感觉):
发现当我们创建Servlet的时候 直接帮我们把get,post获取客户端请求的代码全敲出来了:
三、请求参数中文乱码 - post解决方案客户端请求数据如下:
我们演示在服务器获取到客户端请求的数据:
结果:我们本来应该拿到客户端请求的数据为君哥,但是这里确乱码了 (中文乱码):
解决中文乱码问题:
注意:这种方式只适用于:客户端以post形式请求
解决客户端以get请求方式请求中文乱码问题:
注: 这种方法get/post请求都可以转, 但post尽量用上面的方法
四、请求转发实现方式演示:
资源A:
资源B:
(只需要资源A中绑定上资源B的访问路径即可转发到资源B)
浏览器访问:
结果:转发成功资源B处理到了浏览器剩余的数据
资源间共享数据方法演示:
资源A (在资源A中存储数据):
资源B(在资源B中接收资源A储存的数据):
结果:
总结:也就是说只要写了这个方法,在该方法资源当中处理好上面的数据后,剩下的也会跑到该路径下的资源中去处理数据 (只要写就会跑进去处理相应的数据)
Response对象介绍 一、Response设置响应数据功能介绍具体的向客户端响应问题:看上面的Kitty,欢迎你, 上面写过~
二、Response完成重定向 因此以后到底用重定向还是请求转发 要看特点:符合哪个特点就用哪一个注意:这里的资源A给浏览器的能处理请求数据的资源B的地址 是自动帮浏览器(客户端)跳转到该资源B的路径下了
演示如下:
假设用户访问服务器中的资源A:(这里资源A不能处理请求数据)
注意:tomcat服务器有些版本:不再需要加上虚拟路径 也就是包名,直接写跳转的资源B路径即可
简化书写:
资源B:
用户通过资源A路径访问资源A:
结果:
所以说:客户端的地址栏是会发生变化的
三、资源路径问题
刚才上面讲了这里 重定向当中跳转资源路径的时候需要加上虚拟路径(也就是要在跳转资源路径之前加上项目路径 web-demo )
其实我们可以用动态获取该项目路径 web-demo (使用动态的好处就是以后我们项目名变化的时候这里也能动态的和我们变成项目路径)
四、Response响应字符 & 字节数据(以字符或字节的形式向客户端响应数据)
服务端向客户端响应的数据如下:
开启服务器后,客户端通过访问资源路径来访问资源数据 (浏览器访问默认为get请求):
(回忆:为什么这里直接访问资源路径就可以访问到资源了呢:因为tomcat服务器我们前面已经集成到idea当中了,并且这个web-demo的项目我们是部署到该tomcat服务器当中的,所以我们开启服务器后,客户端就能通过相应的地址访问到服务器当中的该路径下资源)
客户端响应到的数据:
我们也可以向用户端响应一些html的数据:
注意细节1:有的会出现我们的标签在客户端页面上展现的是字符串的形式:kitty
因此我们需要用下列方法修改问题:
注意细节2:响应数据为中文的时候的乱码情况客户端出现了乱码问题:
解决乱码方法:response.setContentType("text/html;charset=utf-8"); 要放在前面
假设我们这里演示:服务端把一张照片响应给客户端:
照片地址:
服务端:
注意这个IOUtils的包名是:下列这个包名下的IOUtils (没有copy方法说明包名导错了)
这里要记得:把io流给关一下流:fis.close(); (因为这个io流不是response对象的流,所以需要我们关闭) 【上面忘记关io流了】
完成流的copy:也就是说把io流读取到的文件里面的数据(文本or照片等)通过传给response对象的输出流传递输出给浏览器
客户端响应到的数据:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)